From eb19aefa57d5d64dc5d7c4a88802e199653a7a1b Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 2 Aug 2024 02:49:28 -0700 Subject: [PATCH] Implement MP3 `ConstantBitrateSeeker.getDataEndPosition()` This is needed to correctly handle files with trailing non-MP3 data (which is indicated by the length in the `Info` frame being shorter than the overall length of the file). The test file was generated by appending 150kB of `DEADBEEF` onto the end of `test-cbr-info-header.mp3`, and the test asserts that the extracted samples are identical. Issue: androidx/media#1480 PiperOrigin-RevId: 658727595 (cherry picked from commit b09cea9e3a3f9a039b77c6e6db3ee5f450becc50) --- RELEASENOTES.md | 3 +++ .../extractor/mp3/ConstantBitrateSeeker.java | 4 +++- .../media3/extractor/mp3/Mp3ExtractorTest.java | 15 +++++++++++++++ .../test-cbr-info-header-trailing-garbage.mp3 | Bin 0 -> 158602 bytes 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 libraries/test_data/src/test/assets/media/mp3/test-cbr-info-header-trailing-garbage.mp3 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7a6c652695..c04474c949 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -7,6 +7,9 @@ * Transformer: * Track Selection: * Extractors: + * MP3: Fix `Searched too many bytes` error by correctly ignoring trailing + non-MP3 data based on the length field in an `Info` frame + ([#1480](https://github.com/androidx/media/issues/1480)). * Audio: * Video: * Text: diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java index e167d4bbe8..12f5761d99 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp3/ConstantBitrateSeeker.java @@ -25,6 +25,7 @@ import androidx.media3.extractor.MpegAudioUtil; /* package */ final class ConstantBitrateSeeker extends ConstantBitrateSeekMap implements Seeker { private final int bitrate; + private final long dataEndPosition; /** * Constructs an instance. @@ -60,6 +61,7 @@ import androidx.media3.extractor.MpegAudioUtil; boolean allowSeeksIfLengthUnknown) { super(inputLength, firstFramePosition, bitrate, frameSize, allowSeeksIfLengthUnknown); this.bitrate = bitrate; + dataEndPosition = inputLength != C.LENGTH_UNSET ? inputLength : C.INDEX_UNSET; } @Override @@ -69,7 +71,7 @@ import androidx.media3.extractor.MpegAudioUtil; @Override public long getDataEndPosition() { - return C.INDEX_UNSET; + return dataEndPosition; } @Override diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java index 8900629912..d18d7e678d 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp3/Mp3ExtractorTest.java @@ -54,6 +54,21 @@ public final class Mp3ExtractorTest { Mp3Extractor::new, "media/mp3/test-cbr-info-header-pcut-frame.mp3", simulationConfig); } + // https://github.com/androidx/media/issues/1480 + @Test + public void mp3SampleWithInfoHeaderAndTrailingGarbage() throws Exception { + // This test file is test-cbr-info-header.mp3 with 150kB of 0xDEADBEEF garbage appended on the + // end. The test asserts that the extracted samples are the same as for + // test-cbr-info-header.mp3. + ExtractorAsserts.assertBehavior( + Mp3Extractor::new, + "media/mp3/test-cbr-info-header-trailing-garbage.mp3", + new AssertionConfig.Builder() + .setDumpFilesPrefix("extractordumps/mp3/test-cbr-info-header.mp3") + .build(), + simulationConfig); + } + @Test public void mp3SampleWithCbrSeeker() throws Exception { ExtractorAsserts.assertBehavior( diff --git a/libraries/test_data/src/test/assets/media/mp3/test-cbr-info-header-trailing-garbage.mp3 b/libraries/test_data/src/test/assets/media/mp3/test-cbr-info-header-trailing-garbage.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cb2cf6528dae680a3b222b07554dd23dc6ff5511 GIT binary patch literal 158602 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 z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE z41fVJ00zJS7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9QfB`T72EYIq00UqE T41fVJ00zJS7ytwR9}N5#U^lrL literal 0 HcmV?d00001