From 04ce83691e6d19e1c73cc4810e30c1505403eec1 Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 16 Feb 2024 08:00:23 -0800 Subject: [PATCH] Fix failure to write negative PTS sample Fixes an issue caused by no support for negative audio PTS and edit lists in FrameworkMuxer, Android versions before 11 PiperOrigin-RevId: 607690507 (cherry picked from commit e43f96687c3c6d13907da1a5c53e90ffa57d624c) --- RELEASENOTES.md | 3 + .../media/mp4/iibbibb_editlist_videoonly.mp4 | Bin 0 -> 48511 bytes .../media/mp4/long_edit_list_audioonly.mp4 | Bin 0 -> 38754 bytes .../transmuxed.dump | 95 ++++ .../transmuxed.dump | 423 ++++++++++++++++++ .../transformer/TransformerEndToEndTest.java | 117 +++++ .../media3/transformer/FrameworkMuxer.java | 17 + .../transformer/MediaItemExportTest.java | 78 ++++ .../androidx/media3/transformer/TestUtil.java | 5 +- 9 files changed, 737 insertions(+), 1 deletion(-) create mode 100644 libraries/test_data/src/test/assets/media/mp4/iibbibb_editlist_videoonly.mp4 create mode 100644 libraries/test_data/src/test/assets/media/mp4/long_edit_list_audioonly.mp4 create mode 100644 libraries/test_data/src/test/assets/transformerdumps/mp4/iibbibb_editlist_videoonly.mp4/transmuxed.dump create mode 100644 libraries/test_data/src/test/assets/transformerdumps/mp4/long_edit_list_audioonly.mp4/transmuxed.dump diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2c6be59899..3f74bd7298 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,9 @@ * Effect: * Improved PQ to SDR tone-mapping by converting color spaces. +* Transformer: + * Add workaround for exception thrown due to `MediaMuxer` not supporting + negative presentation timestamps before API 30. * UI: * Fallback to include audio track language name if `Locale` cannot identify a display name diff --git a/libraries/test_data/src/test/assets/media/mp4/iibbibb_editlist_videoonly.mp4 b/libraries/test_data/src/test/assets/media/mp4/iibbibb_editlist_videoonly.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..2dd1701472d99e9e300553a680cc24ac2818fa01 GIT binary patch literal 48511 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\FkN7ed~~MF9VoU9GQjmRh4Njd0}N!F09l> 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

#=)CDF&*dr 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 Ps~HCq11keF6Vv|!^?jN& literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/media/mp4/long_edit_list_audioonly.mp4 b/libraries/test_data/src/test/assets/media/mp4/long_edit_list_audioonly.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..bf78e9d4d14be37cf991b0c603d7bd3e7f6c7b4b GIT binary patch literal 38754 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 30) { + // TODO: b/324842222 - Mp4Extractor doesn't interpret Transformer's generated output as + // "gapless" audio. The generated file should have encoderDelay = 742 and first + // sample PTS of 0. + assertThat(audioTrack.lastFormat.encoderDelay).isEqualTo(0); + assertThat(audioTrack.getSampleTimeUs(/* index= */ 0)).isEqualTo(-16_826); + assertThat(audioTrack.getSampleTimeUs(/* index= */ expectedSampleCount - 1)) + .isEqualTo(1_538_911); + } else { + // Edit lists are not supported b/142580952 : sample times start from zero, + // and output duration will be longer than input duration by encoder delay. + assertThat(audioTrack.lastFormat.encoderDelay).isEqualTo(0); + assertThat(audioTrack.getSampleTimeUs(/* index= */ 0)).isEqualTo(0); + assertThat(audioTrack.getSampleTimeUs(/* index= */ expectedSampleCount - 1)) + .isEqualTo(1_555_736); + } + } + + @Test + public void transmux_audioWithEditListUsingInAppMuxer_preservesDuration() throws Exception { + String testId = "transmux_AudioWithEditListUsingInAppMuxer_preservesDuration"; + Context context = ApplicationProvider.getApplicationContext(); + Transformer transformer = + new Transformer.Builder(context) + .setMuxerFactory(new InAppMuxer.Factory.Builder().build()) + .build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse("asset:///media/mp4/long_edit_list_audioonly.mp4")); + + ExportTestResult exportTestResult = + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, mediaItem); + + Mp4Extractor mp4Extractor = new Mp4Extractor(new DefaultSubtitleParserFactory()); + FakeExtractorOutput fakeExtractorOutput = + TestUtil.extractAllSamplesFromFilePath(mp4Extractor, exportTestResult.filePath); + // TODO: b/324903070 - The generated output file has incorrect duration. + assertThat(fakeExtractorOutput.seekMap.getDurationUs()).isEqualTo(1_555_700); + assertThat(fakeExtractorOutput.numberOfTracks).isEqualTo(1); + FakeTrackOutput audioTrack = fakeExtractorOutput.trackOutputs.get(0); + int expectedSampleCount = 68; + audioTrack.assertSampleCount(expectedSampleCount); + // TODO: b/324903070 - InAppMuxer doesn't write edit lists to support gapless audio muxing. + // Output incorrectly starts at encoderDelay 0, PTS 0 + assertThat(audioTrack.lastFormat.encoderDelay).isEqualTo(0); + assertThat(audioTrack.getSampleTimeUs(/* index= */ 0)).isEqualTo(0); + // TODO: b/270583563 - InAppMuxer always uses 1 / 48_000 timebase for audio. + // The audio file in this test is 44_100 Hz, with timebase for audio of 1 / 44_100 and + // each sample duration is exactly 1024 / 44_100, with no rounding errors. + // Since InAppMuxer uses a different timebase for audio, some rounding errors are introduced + // and MP4 sample durations are off. + // TODO: b/324903070 - expectedLastSampleTimeUs & expectedDurationUs are incorrect. + // Last sample time cannot be greater than total duration. + assertThat(audioTrack.getSampleTimeUs(/* index= */ expectedSampleCount - 1)) + .isEqualTo(1_555_708); + } + + @Test + public void transmux_videoWithEditList_trimsFirstIDRFrameDuration() throws Exception { + String testId = "transmux_videoWithEditList_trimsFirstIDRFrameDuration"; + Context context = ApplicationProvider.getApplicationContext(); + assumeTrue( + "MediaMuxer doesn't support B frames reliably on older SDK versions", Util.SDK_INT >= 29); + Transformer transformer = new Transformer.Builder(context).build(); + MediaItem mediaItem = + MediaItem.fromUri(Uri.parse("asset:///media/mp4/iibbibb_editlist_videoonly.mp4")); + + ExportTestResult exportTestResult = + new TransformerAndroidTestRunner.Builder(context, transformer) + .build() + .run(testId, mediaItem); + + Mp4Extractor mp4Extractor = new Mp4Extractor(new DefaultSubtitleParserFactory()); + FakeExtractorOutput fakeExtractorOutput = + TestUtil.extractAllSamplesFromFilePath(mp4Extractor, exportTestResult.filePath); + assertThat(fakeExtractorOutput.numberOfTracks).isEqualTo(1); + + // TODO: b/324842222 - Duration isn't written correctly when transmuxing, and differs + // between SDK versions. Do not assert for duration yet. + FakeTrackOutput videoTrack = fakeExtractorOutput.trackOutputs.get(0); + int expectedSampleCount = 13; + videoTrack.assertSampleCount(expectedSampleCount); + assertThat(videoTrack.getSampleTimeUs(/* index= */ 0)).isEqualTo(0); + int sampleIndexWithLargestSampleTime = 10; + assertThat(videoTrack.getSampleTimeUs(sampleIndexWithLargestSampleTime)).isEqualTo(11_500_000); + assertThat(videoTrack.getSampleTimeUs(/* index= */ expectedSampleCount - 1)) + .isEqualTo(9_500_000); + } + private static AudioProcessor createSonic(float pitch) { SonicAudioProcessor sonic = new SonicAudioProcessor(); sonic.setPitch(pitch); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java index 638dbc74e9..fd7665789c 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/FrameworkMuxer.java @@ -91,6 +91,7 @@ import java.nio.ByteBuffer; private final long videoDurationUs; private final MediaCodec.BufferInfo bufferInfo; private final SparseLongArray trackIndexToLastPresentationTimeUs; + private final SparseLongArray trackIndexToPresentationTimeOffsetUs; private int videoTrackIndex; @@ -103,6 +104,7 @@ import java.nio.ByteBuffer; this.videoDurationUs = Util.msToUs(videoDurationMs); bufferInfo = new MediaCodec.BufferInfo(); trackIndexToLastPresentationTimeUs = new SparseLongArray(); + trackIndexToPresentationTimeOffsetUs = new SparseLongArray(); videoTrackIndex = C.INDEX_UNSET; } @@ -153,6 +155,9 @@ import java.nio.ByteBuffer; if (!isStarted) { isStarted = true; + if (Util.SDK_INT < 30 && presentationTimeUs < 0) { + trackIndexToPresentationTimeOffsetUs.put(trackIndex, -presentationTimeUs); + } try { mediaMuxer.start(); } catch (RuntimeException e) { @@ -163,6 +168,9 @@ import java.nio.ByteBuffer; int offset = data.position(); int size = data.limit() - offset; + long presentationTimeOffsetUs = trackIndexToPresentationTimeOffsetUs.get(trackIndex); + presentationTimeUs += presentationTimeOffsetUs; + bufferInfo.set(offset, size, presentationTimeUs, TransformerUtil.getMediaCodecFlags(flags)); long lastSamplePresentationTimeUs = trackIndexToLastPresentationTimeUs.get(trackIndex); // writeSampleData blocks on old API versions, so check here to avoid calling the method. @@ -174,6 +182,15 @@ import java.nio.ByteBuffer; + lastSamplePresentationTimeUs + ") unsupported on this API version"); trackIndexToLastPresentationTimeUs.put(trackIndex, presentationTimeUs); + + checkState( + presentationTimeOffsetUs == 0 || presentationTimeUs >= lastSamplePresentationTimeUs, + "Samples not in presentation order (" + + presentationTimeUs + + " < " + + lastSamplePresentationTimeUs + + ") unsupported when using negative PTS workaround"); + try { mediaMuxer.writeSampleData(trackIndex, data, bufferInfo); } catch (RuntimeException e) { diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java index 169e12637d..171d8fb478 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/MediaItemExportTest.java @@ -19,15 +19,18 @@ package androidx.media3.transformer; import static androidx.media3.test.utils.robolectric.RobolectricUtil.runLooperUntil; import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_DECODED; import static androidx.media3.transformer.AssetLoader.SUPPORTED_OUTPUT_TYPE_ENCODED; +import static androidx.media3.transformer.DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS; import static androidx.media3.transformer.ExportResult.OPTIMIZATION_ABANDONED_KEYFRAME_PLACEMENT_OPTIMAL_FOR_TRIM; import static androidx.media3.transformer.ExportResult.OPTIMIZATION_FAILED_EXTRACTION_FAILED; import static androidx.media3.transformer.TestUtil.ASSET_URI_PREFIX; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_NB; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_AMR_WB; +import static androidx.media3.transformer.TestUtil.FILE_AUDIO_ELST_SKIP_500MS; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_RAW; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO_INCREASING_TIMESTAMPS_15S; import static androidx.media3.transformer.TestUtil.FILE_UNKNOWN_DURATION; +import static androidx.media3.transformer.TestUtil.FILE_VIDEO_ELST_TRIM_IDR_DURATION; import static androidx.media3.transformer.TestUtil.FILE_VIDEO_ONLY; import static androidx.media3.transformer.TestUtil.FILE_WITH_SEF_SLOW_MOTION; import static androidx.media3.transformer.TestUtil.FILE_WITH_SUBTITLES; @@ -66,6 +69,7 @@ import androidx.media3.common.Format; import androidx.media3.common.MediaItem; import androidx.media3.common.MimeTypes; import androidx.media3.common.audio.SonicAudioProcessor; +import androidx.media3.effect.Contrast; import androidx.media3.effect.Presentation; import androidx.media3.effect.ScaleAndRotateTransformation; import androidx.media3.exoplayer.source.DefaultMediaSourceFactory; @@ -101,6 +105,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowMediaCodec; /** @@ -1381,6 +1386,79 @@ public final class MediaItemExportTest { assertThat(illegalStateException.get()).isNotNull(); } + @Test + @Config(minSdk = 30) + // This test requires Android SDK >= 30 for MediaMuxer negative PTS support. + public void transmux_audioWithEditList_api30_correctDuration() throws Exception { + Transformer transformer = + createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ELST_SKIP_500MS); + + transformer.start(mediaItem, outputDir.newFile().getPath()); + ExportResult result = TransformerTestRunner.runLooper(transformer); + + // TODO: b/324245196 - Update this test when bugs are fixed. + // Duration is actually 68267 / 44100 = 1548ms. + // Last frame PTS is 67866 / 44100 = 1.53891 which rounds down to 1538ms. + assertThat(result.durationMs).isEqualTo(1538); + // TODO: b/325020444 - Update this test when bugs are fixed. + // Dump incorrectly includes the last clipped audio sample from input file. + DumpFileAsserts.assertOutput( + context, + muxerFactory.getCreatedMuxer(), + getDumpFileName( + /* originalFileName= */ FILE_AUDIO_ELST_SKIP_500MS, + /* modifications...= */ "transmuxed")); + } + + @Test + @Config(minSdk = 21, maxSdk = 29) + // This test requires Android SDK < 30 with no MediaMuxer negative PTS support. + public void transmux_audioWithEditList_api29_frameworkMuxerDoesNotThrow() throws Exception { + // Do not use CapturingMuxer.Factory(), as this test checks for a workaround in + // FrameworkMuxer. + Transformer transformer = + createTransformerBuilder( + new FrameworkMuxer.Factory(DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS, C.TIME_UNSET), + /* enableFallback= */ false) + .build(); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_AUDIO_ELST_SKIP_500MS); + + transformer.start(mediaItem, outputDir.newFile().getPath()); + ExportResult result = TransformerTestRunner.runLooper(transformer); + + // TODO: b/324842222 - Update this test when bugs are fixed. + // The result.durationMs is incorrect in this test because + // FrameworkMuxer workaround doesn't propagate changed timestamps to MuxerWrapper. + assertThat(result.durationMs).isEqualTo(1538); + assertThat(result.exportException).isNull(); + } + + @Test + @Config(minSdk = 25) + // This test requires Android SDK < 30 for lack of MediaMuxer negative PTS support + // and SDK >= 25 for B-frame support. + public void transmux_trimsFirstIDRDuration() throws Exception { + Transformer transformer = + createTransformerBuilder(muxerFactory, /* enableFallback= */ false).build(); + MediaItem mediaItem = MediaItem.fromUri(ASSET_URI_PREFIX + FILE_VIDEO_ELST_TRIM_IDR_DURATION); + + transformer.start(mediaItem, outputDir.newFile().getPath()); + ExportResult result = TransformerTestRunner.runLooper(transformer); + + // TODO: b/324245196 - Update this test when bugs are fixed. + // Duration is actually 12_500. Last frame PTS is 11_500. + assertThat(result.durationMs).isEqualTo(11_500); + int inputFrameCount = 13; + assertThat(result.videoFrameCount).isEqualTo(inputFrameCount); + DumpFileAsserts.assertOutput( + context, + muxerFactory.getCreatedMuxer(), + getDumpFileName( + /* originalFileName= */ FILE_VIDEO_ELST_TRIM_IDR_DURATION, + /* modifications...= */ "transmuxed")); + } + private static final class SlowExtractorsFactory implements ExtractorsFactory { private final long delayBetweenReadsMs; diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java index 751baad79e..7907629196 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TestUtil.java @@ -53,6 +53,9 @@ public final class TestUtil { public static final String FILE_AUDIO_AMR_NB = "amr/sample_nb.amr"; public static final String FILE_AUDIO_AC3_UNSUPPORTED_BY_MUXER = "mp4/sample_ac3.mp4"; public static final String FILE_UNKNOWN_DURATION = "mp4/sample_fragmented.mp4"; + public static final String FILE_AUDIO_ELST_SKIP_500MS = "mp4/long_edit_list_audioonly.mp4"; + public static final String FILE_VIDEO_ELST_TRIM_IDR_DURATION = + "mp4/iibbibb_editlist_videoonly.mp4"; private static final String DUMP_FILE_OUTPUT_DIRECTORY = "transformerdumps"; private static final String DUMP_FILE_EXTENSION = "dump"; @@ -60,7 +63,7 @@ public final class TestUtil { private TestUtil() {} public static Transformer.Builder createTransformerBuilder( - CapturingMuxer.Factory muxerFactory, boolean enableFallback) { + Muxer.Factory muxerFactory, boolean enableFallback) { Context context = ApplicationProvider.getApplicationContext(); return new Transformer.Builder(context) .setClock(new FakeClock(/* isAutoAdvancing= */ true))