From 0ac90855b478b3943663432da597f5bae5c84b1a Mon Sep 17 00:00:00 2001 From: rohks Date: Tue, 23 Jul 2024 07:15:50 -0700 Subject: [PATCH] Use `getDeclaredLength()` in `setDataSource` for `AssetFileDescriptor` Aligns `MediaExtractorCompat` with platform behavior by using `getDeclaredLength()` instead of `getLength()` when setting the data source. This ensures compatibility with asset files where the length is not predefined, even though it may result in reading across multiple logical files when backed by the same physical file. PiperOrigin-RevId: 655153390 --- .../androidx/media3/exoplayer/MediaExtractorCompat.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java index 327f4808b6..caa566e48c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaExtractorCompat.java @@ -197,7 +197,11 @@ public final class MediaExtractorCompat { * @throws IllegalStateException If this method is called twice on the same instance. */ public void setDataSource(AssetFileDescriptor assetFileDescriptor) throws IOException { - if (assetFileDescriptor.getLength() == AssetFileDescriptor.UNKNOWN_LENGTH) { + // Using getDeclaredLength() to match platform behavior, even though it may result in reading + // across multiple logical files when they share the same physical file. + // Reference implementation in platform MediaExtractor: + // https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/media/java/android/media/MediaExtractor.java;l=219-226;drc=3181772b27c6bf3e9625677d1d8afc89d938a60e + if (assetFileDescriptor.getDeclaredLength() == AssetFileDescriptor.UNKNOWN_LENGTH) { setDataSource(assetFileDescriptor.getFileDescriptor()); } else { setDataSource(