diff --git a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java index 2a8e7935cf..6f8ec784b5 100644 --- a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java +++ b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java @@ -46,7 +46,7 @@ import org.junit.runners.Parameterized.Parameters; /** End to end instrumentation tests for {@link Mp4Muxer}. */ @RunWith(Parameterized.class) public class Mp4MuxerEndToEndTest { - private static final String H264_MP4 = "sample.mp4"; + private static final String H264_MP4 = "sample_no_bframes.mp4"; private static final String H265_HDR10_MP4 = "hdr10-720p.mp4"; private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4"; private static final String AV1_MP4 = "sample_av1.mp4"; diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java index 8aa1167857..2c63d8fd1d 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Muxer.java @@ -242,6 +242,8 @@ public final class Mp4Muxer { *

The samples are cached and are written in batches so the caller must not change/release the * {@link ByteBuffer} and the {@link BufferInfo} after calling this method. * + *

Note: Out of order B-frames are currently not supported. + * * @param trackToken The {@link TrackToken} for which this sample is being written. * @param byteBuffer The encoded sample. * @param bufferInfo The {@link BufferInfo} related to this sample. diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java index 532d7b38c6..f1602e92a9 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Mp4Writer.java @@ -15,8 +15,11 @@ */ package androidx.media3.muxer; +import static androidx.media3.common.util.Assertions.checkArgument; + import android.media.MediaCodec; import android.media.MediaCodec.BufferInfo; +import androidx.media3.common.C; import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.muxer.Mp4Muxer.TrackToken; @@ -74,9 +77,10 @@ import java.util.List; public final List writtenChunkSampleCounts; public final Deque pendingSamplesBufferInfo; public final Deque pendingSamplesByteBuffer; - public boolean hadKeyframe = false; + private long lastSamplePresentationTimeUs; + /** Creates an instance with {@code sortKey} set to 1. */ public Track(Format format) { this(format, /* sortKey= */ 1); @@ -96,9 +100,13 @@ import java.util.List; writtenChunkSampleCounts = new ArrayList<>(); pendingSamplesBufferInfo = new ArrayDeque<>(); pendingSamplesByteBuffer = new ArrayDeque<>(); + lastSamplePresentationTimeUs = C.TIME_UNSET; } public void writeSampleData(ByteBuffer byteBuffer, BufferInfo bufferInfo) throws IOException { + checkArgument( + bufferInfo.presentationTimeUs > lastSamplePresentationTimeUs, + "Out of order B-frames are not supported"); // TODO: b/279931840 - Confirm whether muxer should throw when writing empty samples. // Skip empty samples. if (bufferInfo.size == 0 || byteBuffer.remaining() == 0) { @@ -109,12 +117,14 @@ import java.util.List; hadKeyframe = true; } + // The video track must start with a key frame. if (!hadKeyframe && MimeTypes.isVideo(format.sampleMimeType)) { return; } pendingSamplesBufferInfo.addLast(bufferInfo); pendingSamplesByteBuffer.addLast(byteBuffer); + lastSamplePresentationTimeUs = bufferInfo.presentationTimeUs; } @Override diff --git a/libraries/muxer/src/test/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java b/libraries/muxer/src/test/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java index 6daf3f3cd3..99a6f65c56 100644 --- a/libraries/muxer/src/test/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java +++ b/libraries/muxer/src/test/java/androidx/media3/muxer/Mp4MuxerEndToEndTest.java @@ -17,6 +17,7 @@ package androidx.media3.muxer; import static androidx.media3.muxer.MuxerTestUtil.FAKE_VIDEO_FORMAT; import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertThrows; import android.media.MediaCodec.BufferInfo; import android.util.Pair; @@ -62,12 +63,10 @@ public class Mp4MuxerEndToEndTest { String outputFilePath = temporaryFolder.newFile().getPath(); Mp4Muxer mp4Muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build(); mp4Muxer.setModificationTime(/* timestampMs= */ 500_000_000L); - Pair track1Sample1 = MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 100L); Pair track1Sample2 = MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 200L); - Pair track2Sample1 = MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 100L); Pair track2Sample2 = @@ -104,12 +103,10 @@ public class Mp4MuxerEndToEndTest { String outputFilePath = temporaryFolder.newFile().getPath(); Mp4Muxer mp4Muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build(); mp4Muxer.setModificationTime(/* timestampMs= */ 500_000_000L); - Pair track1Sample1 = MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 0L); Pair track1Sample2 = MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 100L); - Pair track2Sample1 = MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 100L); Pair track2Sample2 = @@ -136,4 +133,27 @@ public class Mp4MuxerEndToEndTest { fakeExtractorOutput, MuxerTestUtil.getExpectedDumpFilePath("mp4_with_different_tracks_offset.mp4")); } + + @Test + public void writeSampleData_withOutOfOrderSampleTimestamps_throws() throws IOException { + String outputFilePath = temporaryFolder.newFile().getPath(); + Mp4Muxer mp4Muxer = new Mp4Muxer.Builder(new FileOutputStream(outputFilePath)).build(); + Pair track1Sample1 = + MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 0L); + Pair track1Sample2 = + MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 2000L); + Pair track1Sample3 = + MuxerTestUtil.getFakeSampleAndSampleInfo(/* presentationTimeUs= */ 1000L); + try { + TrackToken track1 = mp4Muxer.addTrack(/* sortKey= */ 0, FAKE_VIDEO_FORMAT); + mp4Muxer.writeSampleData(track1, track1Sample1.first, track1Sample1.second); + mp4Muxer.writeSampleData(track1, track1Sample2.first, track1Sample2.second); + + assertThrows( + IllegalArgumentException.class, + () -> mp4Muxer.writeSampleData(track1, track1Sample3.first, track1Sample3.second)); + } finally { + mp4Muxer.close(); + } + } } diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_no_bframes.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_no_bframes.mp4 new file mode 100644 index 0000000000..1f3982dd05 Binary files /dev/null and b/libraries/test_data/src/test/assets/media/mp4/sample_no_bframes.mp4 differ diff --git a/libraries/test_data/src/test/assets/muxerdumps/sample.mp4.dump b/libraries/test_data/src/test/assets/muxerdumps/sample_no_bframes.mp4.dump similarity index 81% rename from libraries/test_data/src/test/assets/muxerdumps/sample.mp4.dump rename to libraries/test_data/src/test/assets/muxerdumps/sample_no_bframes.mp4.dump index 9c88ea3fdc..8a46920b0c 100644 --- a/libraries/test_data/src/test/assets/muxerdumps/sample.mp4.dump +++ b/libraries/test_data/src/test/assets/muxerdumps/sample_no_bframes.mp4.dump @@ -7,149 +7,10 @@ seekMap: getPosition(1065600) = [[timeUs=0, position=44]] numberOfTracks = 2 track 0: - total output bytes = 89876 - sample count = 30 - format 0: - id = 1 - sampleMimeType = video/avc - codecs = avc1.64001F - maxInputSize = 36722 - width = 1080 - height = 720 - frameRate = 32.113037 - colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[Mp4Timestamp: creation time=2083344800, modification time=2083344800, timescale=10000] - initializationData: - data = length 29, hash 4746B5D9 - data = length 10, hash 7A0D0F2B - sample 0: - time = 0 - flags = 1 - data = length 36692, hash D216076E - sample 1: - time = 66722 - flags = 0 - data = length 5312, hash D45D3CA0 - sample 2: - time = 33355 - flags = 0 - data = length 599, hash 1BE7812D - sample 3: - time = 200200 - flags = 0 - data = length 7735, hash 4490F110 - sample 4: - time = 133455 - flags = 0 - data = length 987, hash 560B5036 - sample 5: - time = 100100 - flags = 0 - data = length 673, hash ED7CD8C7 - sample 6: - time = 166822 - flags = 0 - data = length 523, hash 3020DF50 - sample 7: - time = 333655 - flags = 0 - data = length 6061, hash 736C72B2 - sample 8: - time = 266922 - flags = 0 - data = length 992, hash FE132F23 - sample 9: - time = 233555 - flags = 0 - data = length 623, hash 5B2C1816 - sample 10: - time = 300300 - flags = 0 - data = length 421, hash 742E69C1 - sample 11: - time = 433755 - flags = 0 - data = length 4899, hash F72F86A1 - sample 12: - time = 400400 - flags = 0 - data = length 568, hash 519A8E50 - sample 13: - time = 367022 - flags = 0 - data = length 620, hash 3990AA39 - sample 14: - time = 567222 - flags = 0 - data = length 5450, hash F06EC4AA - sample 15: - time = 500500 - flags = 0 - data = length 1051, hash 92DFA63A - sample 16: - time = 467122 - flags = 0 - data = length 874, hash 69587FB4 - sample 17: - time = 533855 - flags = 0 - data = length 781, hash 36BE495B - sample 18: - time = 700700 - flags = 0 - data = length 4725, hash AC0C8CD3 - sample 19: - time = 633955 - flags = 0 - data = length 1022, hash 5D8BFF34 - sample 20: - time = 600600 - flags = 0 - data = length 790, hash 99413A99 - sample 21: - time = 667322 - flags = 0 - data = length 610, hash 5E129290 - sample 22: - time = 834155 - flags = 0 - data = length 2751, hash 769974CB - sample 23: - time = 767422 - flags = 0 - data = length 745, hash B78A477A - sample 24: - time = 734055 - flags = 0 - data = length 621, hash CF741E7A - sample 25: - time = 800800 - flags = 0 - data = length 505, hash 1DB4894E - sample 26: - time = 967622 - flags = 0 - data = length 1268, hash C15348DC - sample 27: - time = 900900 - flags = 0 - data = length 880, hash C2DE85D0 - sample 28: - time = 867522 - flags = 0 - data = length 530, hash C98BC6A8 - sample 29: - time = 934255 - flags = 536870912 - data = length 568, hash 4FE5C8EA -track 1: total output bytes = 9529 sample count = 45 format 0: - peakBitrate = 200000 - id = 2 + id = 1 sampleMimeType = audio/mp4a-latm codecs = mp4a.40.2 maxInputSize = 294 @@ -339,4 +200,145 @@ track 1: time = 1065666 flags = 536870913 data = length 6, hash 31B22286 +track 1: + total output bytes = 301392 + sample count = 30 + format 0: + id = 2 + sampleMimeType = video/avc + codecs = avc1.640034 + maxInputSize = 22910 + width = 1080 + height = 720 + frameRate = 31.004547 + colorInfo: + colorSpace = 1 + colorRange = 2 + colorTransfer = 3 + lumaBitdepth = 8 + chromaBitdepth = 8 + metadata = entries=[Mp4Timestamp: creation time=2083344800, modification time=2083344800, timescale=10000] + initializationData: + data = length 23, hash 33E412EE + data = length 9, hash FBAFBC0C + sample 0: + time = 0 + flags = 1 + data = length 7744, hash DDF91733 + sample 1: + time = 33355 + flags = 0 + data = length 1168, hash 89E48A20 + sample 2: + time = 66722 + flags = 0 + data = length 960, hash D4AD9EF0 + sample 3: + time = 100100 + flags = 0 + data = length 976, hash CD49C23C + sample 4: + time = 133455 + flags = 0 + data = length 1360, hash 337B78A9 + sample 5: + time = 166822 + flags = 0 + data = length 2288, hash 5D5FD1C8 + sample 6: + time = 200200 + flags = 0 + data = length 3856, hash 3D7DCD46 + sample 7: + time = 233555 + flags = 0 + data = length 4048, hash 47C78814 + sample 8: + time = 266922 + flags = 0 + data = length 6144, hash 8FD9AD7D + sample 9: + time = 300300 + flags = 0 + data = length 7632, hash 4245F848 + sample 10: + time = 333655 + flags = 0 + data = length 9792, hash B2B9AB4B + sample 11: + time = 367022 + flags = 0 + data = length 14496, hash E0F2E0BA + sample 12: + time = 400400 + flags = 0 + data = length 17664, hash 3E3189E + sample 13: + time = 433755 + flags = 0 + data = length 5712, hash CA808ECF + sample 14: + time = 467122 + flags = 0 + data = length 9776, hash C875D1AA + sample 15: + time = 500500 + flags = 0 + data = length 17712, hash 69AE17D4 + sample 16: + time = 533855 + flags = 0 + data = length 11440, hash 7370E78C + sample 17: + time = 567222 + flags = 0 + data = length 8544, hash 5A581986 + sample 18: + time = 600600 + flags = 0 + data = length 19904, hash 98AB5C44 + sample 19: + time = 633955 + flags = 0 + data = length 14352, hash 74B754E3 + sample 20: + time = 667322 + flags = 0 + data = length 9568, hash 369746A6 + sample 21: + time = 700700 + flags = 0 + data = length 12192, hash E0F8A71A + sample 22: + time = 734055 + flags = 0 + data = length 22880, hash 75E833BA + sample 23: + time = 767422 + flags = 0 + data = length 16832, hash E8BFCFE3 + sample 24: + time = 800800 + flags = 0 + data = length 5120, hash E04AEF94 + sample 25: + time = 834155 + flags = 0 + data = length 9888, hash 1166103E + sample 26: + time = 867522 + flags = 0 + data = length 17024, hash F9A96740 + sample 27: + time = 900900 + flags = 0 + data = length 20864, hash DF9E88B8 + sample 28: + time = 934255 + flags = 0 + data = length 7216, hash BE22BE2F + sample 29: + time = 967622 + flags = 536870912 + data = length 14240, hash E190BF31 tracksEnded = true diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_capture_fps.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_capture_fps.dump index a87a5fe199..a468e549af 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_capture_fps.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_capture_fps.dump @@ -7,149 +7,150 @@ seekMap: getPosition(1065600) = [[timeUs=0, position=44]] numberOfTracks = 2 track 0: - total output bytes = 89876 + total output bytes = 301392 sample count = 30 format 0: id = 1 sampleMimeType = video/avc - codecs = avc1.64001F - maxInputSize = 36722 + codecs = avc1.640034 + maxInputSize = 22910 width = 1080 height = 720 - frameRate = 32.113037 + frameRate = 31.004547 colorInfo: + colorSpace = 1 colorRange = 2 + colorTransfer = 3 lumaBitdepth = 8 chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.capture.fps, value=60.0, xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=3547558895, modification time=3547558895, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, mdta: key=com.android.capture.fps, value=60.0, xyz: latitude=40.68, longitude=-74.4999, Mp4Timestamp: creation time=3785416745, modification time=3785416745, timescale=10000] initializationData: - data = length 29, hash 4746B5D9 - data = length 10, hash 7A0D0F2B + data = length 23, hash 33E412EE + data = length 9, hash FBAFBC0C sample 0: time = 0 flags = 1 - data = length 36692, hash D216076E + data = length 7744, hash DDF91733 sample 1: - time = 66722 - flags = 0 - data = length 5312, hash D45D3CA0 - sample 2: time = 33355 flags = 0 - data = length 599, hash 1BE7812D - sample 3: - time = 200200 + data = length 1168, hash 89E48A20 + sample 2: + time = 66722 flags = 0 - data = length 7735, hash 4490F110 + data = length 960, hash D4AD9EF0 + sample 3: + time = 100100 + flags = 0 + data = length 976, hash CD49C23C sample 4: time = 133455 flags = 0 - data = length 987, hash 560B5036 + data = length 1360, hash 337B78A9 sample 5: - time = 100100 - flags = 0 - data = length 673, hash ED7CD8C7 - sample 6: time = 166822 flags = 0 - data = length 523, hash 3020DF50 - sample 7: - time = 333655 + data = length 2288, hash 5D5FD1C8 + sample 6: + time = 200200 flags = 0 - data = length 6061, hash 736C72B2 + data = length 3856, hash 3D7DCD46 + sample 7: + time = 233555 + flags = 0 + data = length 4048, hash 47C78814 sample 8: time = 266922 flags = 0 - data = length 992, hash FE132F23 + data = length 6144, hash 8FD9AD7D sample 9: - time = 233555 - flags = 0 - data = length 623, hash 5B2C1816 - sample 10: time = 300300 flags = 0 - data = length 421, hash 742E69C1 - sample 11: - time = 433755 + data = length 7632, hash 4245F848 + sample 10: + time = 333655 flags = 0 - data = length 4899, hash F72F86A1 + data = length 9792, hash B2B9AB4B + sample 11: + time = 367022 + flags = 0 + data = length 14496, hash E0F2E0BA sample 12: time = 400400 flags = 0 - data = length 568, hash 519A8E50 + data = length 17664, hash 3E3189E sample 13: - time = 367022 + time = 433755 flags = 0 - data = length 620, hash 3990AA39 + data = length 5712, hash CA808ECF sample 14: - time = 567222 + time = 467122 flags = 0 - data = length 5450, hash F06EC4AA + data = length 9776, hash C875D1AA sample 15: time = 500500 flags = 0 - data = length 1051, hash 92DFA63A + data = length 17712, hash 69AE17D4 sample 16: - time = 467122 - flags = 0 - data = length 874, hash 69587FB4 - sample 17: time = 533855 flags = 0 - data = length 781, hash 36BE495B - sample 18: - time = 700700 + data = length 11440, hash 7370E78C + sample 17: + time = 567222 flags = 0 - data = length 4725, hash AC0C8CD3 + data = length 8544, hash 5A581986 + sample 18: + time = 600600 + flags = 0 + data = length 19904, hash 98AB5C44 sample 19: time = 633955 flags = 0 - data = length 1022, hash 5D8BFF34 + data = length 14352, hash 74B754E3 sample 20: - time = 600600 - flags = 0 - data = length 790, hash 99413A99 - sample 21: time = 667322 flags = 0 - data = length 610, hash 5E129290 - sample 22: - time = 834155 + data = length 9568, hash 369746A6 + sample 21: + time = 700700 flags = 0 - data = length 2751, hash 769974CB + data = length 12192, hash E0F8A71A + sample 22: + time = 734055 + flags = 0 + data = length 22880, hash 75E833BA sample 23: time = 767422 flags = 0 - data = length 745, hash B78A477A + data = length 16832, hash E8BFCFE3 sample 24: - time = 734055 - flags = 0 - data = length 621, hash CF741E7A - sample 25: time = 800800 flags = 0 - data = length 505, hash 1DB4894E - sample 26: - time = 967622 + data = length 5120, hash E04AEF94 + sample 25: + time = 834155 flags = 0 - data = length 1268, hash C15348DC + data = length 9888, hash 1166103E + sample 26: + time = 867522 + flags = 0 + data = length 17024, hash F9A96740 sample 27: time = 900900 flags = 0 - data = length 880, hash C2DE85D0 + data = length 20864, hash DF9E88B8 sample 28: - time = 867522 - flags = 0 - data = length 530, hash C98BC6A8 - sample 29: time = 934255 + flags = 0 + data = length 7216, hash BE22BE2F + sample 29: + time = 967622 flags = 536870912 - data = length 568, hash 4FE5C8EA + data = length 14240, hash E190BF31 track 1: total output bytes = 9529 sample count = 45 format 0: - peakBitrate = 200000 id = 2 sampleMimeType = audio/mp4a-latm codecs = mp4a.40.2 @@ -157,7 +158,7 @@ track 1: channelCount = 1 sampleRate = 44100 language = und - metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=3547558895, modification time=3547558895, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, xyz: latitude=40.68, longitude=-74.4999, Mp4Timestamp: creation time=3785416745, modification time=3785416745, timescale=10000] initializationData: data = length 2, hash 5F7 sample 0: diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_creation_time.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_creation_time.dump index c79fb2b92a..afe5517c88 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_creation_time.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_creation_time.dump @@ -7,149 +7,150 @@ seekMap: getPosition(1065600) = [[timeUs=0, position=44]] numberOfTracks = 2 track 0: - total output bytes = 89876 + total output bytes = 301392 sample count = 30 format 0: id = 1 sampleMimeType = video/avc - codecs = avc1.64001F - maxInputSize = 36722 + codecs = avc1.640034 + maxInputSize = 22910 width = 1080 height = 720 - frameRate = 32.113037 + frameRate = 31.004547 colorInfo: + colorSpace = 1 colorRange = 2 + colorTransfer = 3 lumaBitdepth = 8 chromaBitdepth = 8 - metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=2000000000, modification time=2000000000, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, xyz: latitude=40.68, longitude=-74.4999, Mp4Timestamp: creation time=2000000000, modification time=2000000000, timescale=10000] initializationData: - data = length 29, hash 4746B5D9 - data = length 10, hash 7A0D0F2B + data = length 23, hash 33E412EE + data = length 9, hash FBAFBC0C sample 0: time = 0 flags = 1 - data = length 36692, hash D216076E + data = length 7744, hash DDF91733 sample 1: - time = 66722 - flags = 0 - data = length 5312, hash D45D3CA0 - sample 2: time = 33355 flags = 0 - data = length 599, hash 1BE7812D - sample 3: - time = 200200 + data = length 1168, hash 89E48A20 + sample 2: + time = 66722 flags = 0 - data = length 7735, hash 4490F110 + data = length 960, hash D4AD9EF0 + sample 3: + time = 100100 + flags = 0 + data = length 976, hash CD49C23C sample 4: time = 133455 flags = 0 - data = length 987, hash 560B5036 + data = length 1360, hash 337B78A9 sample 5: - time = 100100 - flags = 0 - data = length 673, hash ED7CD8C7 - sample 6: time = 166822 flags = 0 - data = length 523, hash 3020DF50 - sample 7: - time = 333655 + data = length 2288, hash 5D5FD1C8 + sample 6: + time = 200200 flags = 0 - data = length 6061, hash 736C72B2 + data = length 3856, hash 3D7DCD46 + sample 7: + time = 233555 + flags = 0 + data = length 4048, hash 47C78814 sample 8: time = 266922 flags = 0 - data = length 992, hash FE132F23 + data = length 6144, hash 8FD9AD7D sample 9: - time = 233555 - flags = 0 - data = length 623, hash 5B2C1816 - sample 10: time = 300300 flags = 0 - data = length 421, hash 742E69C1 - sample 11: - time = 433755 + data = length 7632, hash 4245F848 + sample 10: + time = 333655 flags = 0 - data = length 4899, hash F72F86A1 + data = length 9792, hash B2B9AB4B + sample 11: + time = 367022 + flags = 0 + data = length 14496, hash E0F2E0BA sample 12: time = 400400 flags = 0 - data = length 568, hash 519A8E50 + data = length 17664, hash 3E3189E sample 13: - time = 367022 + time = 433755 flags = 0 - data = length 620, hash 3990AA39 + data = length 5712, hash CA808ECF sample 14: - time = 567222 + time = 467122 flags = 0 - data = length 5450, hash F06EC4AA + data = length 9776, hash C875D1AA sample 15: time = 500500 flags = 0 - data = length 1051, hash 92DFA63A + data = length 17712, hash 69AE17D4 sample 16: - time = 467122 - flags = 0 - data = length 874, hash 69587FB4 - sample 17: time = 533855 flags = 0 - data = length 781, hash 36BE495B - sample 18: - time = 700700 + data = length 11440, hash 7370E78C + sample 17: + time = 567222 flags = 0 - data = length 4725, hash AC0C8CD3 + data = length 8544, hash 5A581986 + sample 18: + time = 600600 + flags = 0 + data = length 19904, hash 98AB5C44 sample 19: time = 633955 flags = 0 - data = length 1022, hash 5D8BFF34 + data = length 14352, hash 74B754E3 sample 20: - time = 600600 - flags = 0 - data = length 790, hash 99413A99 - sample 21: time = 667322 flags = 0 - data = length 610, hash 5E129290 - sample 22: - time = 834155 + data = length 9568, hash 369746A6 + sample 21: + time = 700700 flags = 0 - data = length 2751, hash 769974CB + data = length 12192, hash E0F8A71A + sample 22: + time = 734055 + flags = 0 + data = length 22880, hash 75E833BA sample 23: time = 767422 flags = 0 - data = length 745, hash B78A477A + data = length 16832, hash E8BFCFE3 sample 24: - time = 734055 - flags = 0 - data = length 621, hash CF741E7A - sample 25: time = 800800 flags = 0 - data = length 505, hash 1DB4894E - sample 26: - time = 967622 + data = length 5120, hash E04AEF94 + sample 25: + time = 834155 flags = 0 - data = length 1268, hash C15348DC + data = length 9888, hash 1166103E + sample 26: + time = 867522 + flags = 0 + data = length 17024, hash F9A96740 sample 27: time = 900900 flags = 0 - data = length 880, hash C2DE85D0 + data = length 20864, hash DF9E88B8 sample 28: - time = 867522 - flags = 0 - data = length 530, hash C98BC6A8 - sample 29: time = 934255 + flags = 0 + data = length 7216, hash BE22BE2F + sample 29: + time = 967622 flags = 536870912 - data = length 568, hash 4FE5C8EA + data = length 14240, hash E190BF31 track 1: total output bytes = 9529 sample count = 45 format 0: - peakBitrate = 200000 id = 2 sampleMimeType = audio/mp4a-latm codecs = mp4a.40.2 @@ -157,7 +158,7 @@ track 1: channelCount = 1 sampleRate = 44100 language = und - metadata = entries=[xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=2000000000, modification time=2000000000, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, xyz: latitude=40.68, longitude=-74.4999, Mp4Timestamp: creation time=2000000000, modification time=2000000000, timescale=10000] initializationData: data = length 2, hash 5F7 sample 0: diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_custom_metadata.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_custom_metadata.dump index a4e64dbad9..78e7d8e67c 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_custom_metadata.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_custom_metadata.dump @@ -7,149 +7,150 @@ seekMap: getPosition(1065600) = [[timeUs=0, position=44]] numberOfTracks = 2 track 0: - total output bytes = 89876 + total output bytes = 301392 sample count = 30 format 0: id = 1 sampleMimeType = video/avc - codecs = avc1.64001F - maxInputSize = 36722 + codecs = avc1.640034 + maxInputSize = 22910 width = 1080 height = 720 - frameRate = 32.113037 + frameRate = 31.004547 colorInfo: + colorSpace = 1 colorRange = 2 + colorTransfer = 3 lumaBitdepth = 8 chromaBitdepth = 8 - metadata = entries=[mdta: key=StringKey, value=StringValue, mdta: key=FloatKey, value=600.0, xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=3547558895, modification time=3547558895, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, mdta: key=StringKey, value=StringValue, mdta: key=FloatKey, value=600.0, xyz: latitude=40.68, longitude=-74.4999, Mp4Timestamp: creation time=3785416745, modification time=3785416745, timescale=10000] initializationData: - data = length 29, hash 4746B5D9 - data = length 10, hash 7A0D0F2B + data = length 23, hash 33E412EE + data = length 9, hash FBAFBC0C sample 0: time = 0 flags = 1 - data = length 36692, hash D216076E + data = length 7744, hash DDF91733 sample 1: - time = 66722 - flags = 0 - data = length 5312, hash D45D3CA0 - sample 2: time = 33355 flags = 0 - data = length 599, hash 1BE7812D - sample 3: - time = 200200 + data = length 1168, hash 89E48A20 + sample 2: + time = 66722 flags = 0 - data = length 7735, hash 4490F110 + data = length 960, hash D4AD9EF0 + sample 3: + time = 100100 + flags = 0 + data = length 976, hash CD49C23C sample 4: time = 133455 flags = 0 - data = length 987, hash 560B5036 + data = length 1360, hash 337B78A9 sample 5: - time = 100100 - flags = 0 - data = length 673, hash ED7CD8C7 - sample 6: time = 166822 flags = 0 - data = length 523, hash 3020DF50 - sample 7: - time = 333655 + data = length 2288, hash 5D5FD1C8 + sample 6: + time = 200200 flags = 0 - data = length 6061, hash 736C72B2 + data = length 3856, hash 3D7DCD46 + sample 7: + time = 233555 + flags = 0 + data = length 4048, hash 47C78814 sample 8: time = 266922 flags = 0 - data = length 992, hash FE132F23 + data = length 6144, hash 8FD9AD7D sample 9: - time = 233555 - flags = 0 - data = length 623, hash 5B2C1816 - sample 10: time = 300300 flags = 0 - data = length 421, hash 742E69C1 - sample 11: - time = 433755 + data = length 7632, hash 4245F848 + sample 10: + time = 333655 flags = 0 - data = length 4899, hash F72F86A1 + data = length 9792, hash B2B9AB4B + sample 11: + time = 367022 + flags = 0 + data = length 14496, hash E0F2E0BA sample 12: time = 400400 flags = 0 - data = length 568, hash 519A8E50 + data = length 17664, hash 3E3189E sample 13: - time = 367022 + time = 433755 flags = 0 - data = length 620, hash 3990AA39 + data = length 5712, hash CA808ECF sample 14: - time = 567222 + time = 467122 flags = 0 - data = length 5450, hash F06EC4AA + data = length 9776, hash C875D1AA sample 15: time = 500500 flags = 0 - data = length 1051, hash 92DFA63A + data = length 17712, hash 69AE17D4 sample 16: - time = 467122 - flags = 0 - data = length 874, hash 69587FB4 - sample 17: time = 533855 flags = 0 - data = length 781, hash 36BE495B - sample 18: - time = 700700 + data = length 11440, hash 7370E78C + sample 17: + time = 567222 flags = 0 - data = length 4725, hash AC0C8CD3 + data = length 8544, hash 5A581986 + sample 18: + time = 600600 + flags = 0 + data = length 19904, hash 98AB5C44 sample 19: time = 633955 flags = 0 - data = length 1022, hash 5D8BFF34 + data = length 14352, hash 74B754E3 sample 20: - time = 600600 - flags = 0 - data = length 790, hash 99413A99 - sample 21: time = 667322 flags = 0 - data = length 610, hash 5E129290 - sample 22: - time = 834155 + data = length 9568, hash 369746A6 + sample 21: + time = 700700 flags = 0 - data = length 2751, hash 769974CB + data = length 12192, hash E0F8A71A + sample 22: + time = 734055 + flags = 0 + data = length 22880, hash 75E833BA sample 23: time = 767422 flags = 0 - data = length 745, hash B78A477A + data = length 16832, hash E8BFCFE3 sample 24: - time = 734055 - flags = 0 - data = length 621, hash CF741E7A - sample 25: time = 800800 flags = 0 - data = length 505, hash 1DB4894E - sample 26: - time = 967622 + data = length 5120, hash E04AEF94 + sample 25: + time = 834155 flags = 0 - data = length 1268, hash C15348DC + data = length 9888, hash 1166103E + sample 26: + time = 867522 + flags = 0 + data = length 17024, hash F9A96740 sample 27: time = 900900 flags = 0 - data = length 880, hash C2DE85D0 + data = length 20864, hash DF9E88B8 sample 28: - time = 867522 - flags = 0 - data = length 530, hash C98BC6A8 - sample 29: time = 934255 + flags = 0 + data = length 7216, hash BE22BE2F + sample 29: + time = 967622 flags = 536870912 - data = length 568, hash 4FE5C8EA + data = length 14240, hash E190BF31 track 1: total output bytes = 9529 sample count = 45 format 0: - peakBitrate = 200000 id = 2 sampleMimeType = audio/mp4a-latm codecs = mp4a.40.2 @@ -157,7 +158,7 @@ track 1: channelCount = 1 sampleRate = 44100 language = und - metadata = entries=[mdta: key=StringKey, value=StringValue, mdta: key=FloatKey, value=600.0, xyz: latitude=40.68, longitude=-74.5, Mp4Timestamp: creation time=3547558895, modification time=3547558895, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, mdta: key=StringKey, value=StringValue, mdta: key=FloatKey, value=600.0, xyz: latitude=40.68, longitude=-74.4999, Mp4Timestamp: creation time=3785416745, modification time=3785416745, timescale=10000] initializationData: data = length 2, hash 5F7 sample 0: diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_location_metadata.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_location_metadata.dump index caa091288e..2e6e8e762e 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_location_metadata.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/with_location_metadata.dump @@ -7,149 +7,150 @@ seekMap: getPosition(1065600) = [[timeUs=0, position=44]] numberOfTracks = 2 track 0: - total output bytes = 89876 + total output bytes = 301392 sample count = 30 format 0: id = 1 sampleMimeType = video/avc - codecs = avc1.64001F - maxInputSize = 36722 + codecs = avc1.640034 + maxInputSize = 22910 width = 1080 height = 720 - frameRate = 32.113037 + frameRate = 31.004547 colorInfo: + colorSpace = 1 colorRange = 2 + colorTransfer = 3 lumaBitdepth = 8 chromaBitdepth = 8 - metadata = entries=[xyz: latitude=45.0, longitude=-90.0, Mp4Timestamp: creation time=3547558895, modification time=3547558895, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, xyz: latitude=45.0, longitude=-90.0, Mp4Timestamp: creation time=3785416745, modification time=3785416745, timescale=10000] initializationData: - data = length 29, hash 4746B5D9 - data = length 10, hash 7A0D0F2B + data = length 23, hash 33E412EE + data = length 9, hash FBAFBC0C sample 0: time = 0 flags = 1 - data = length 36692, hash D216076E + data = length 7744, hash DDF91733 sample 1: - time = 66722 - flags = 0 - data = length 5312, hash D45D3CA0 - sample 2: time = 33355 flags = 0 - data = length 599, hash 1BE7812D - sample 3: - time = 200200 + data = length 1168, hash 89E48A20 + sample 2: + time = 66722 flags = 0 - data = length 7735, hash 4490F110 + data = length 960, hash D4AD9EF0 + sample 3: + time = 100100 + flags = 0 + data = length 976, hash CD49C23C sample 4: time = 133455 flags = 0 - data = length 987, hash 560B5036 + data = length 1360, hash 337B78A9 sample 5: - time = 100100 - flags = 0 - data = length 673, hash ED7CD8C7 - sample 6: time = 166822 flags = 0 - data = length 523, hash 3020DF50 - sample 7: - time = 333655 + data = length 2288, hash 5D5FD1C8 + sample 6: + time = 200200 flags = 0 - data = length 6061, hash 736C72B2 + data = length 3856, hash 3D7DCD46 + sample 7: + time = 233555 + flags = 0 + data = length 4048, hash 47C78814 sample 8: time = 266922 flags = 0 - data = length 992, hash FE132F23 + data = length 6144, hash 8FD9AD7D sample 9: - time = 233555 - flags = 0 - data = length 623, hash 5B2C1816 - sample 10: time = 300300 flags = 0 - data = length 421, hash 742E69C1 - sample 11: - time = 433755 + data = length 7632, hash 4245F848 + sample 10: + time = 333655 flags = 0 - data = length 4899, hash F72F86A1 + data = length 9792, hash B2B9AB4B + sample 11: + time = 367022 + flags = 0 + data = length 14496, hash E0F2E0BA sample 12: time = 400400 flags = 0 - data = length 568, hash 519A8E50 + data = length 17664, hash 3E3189E sample 13: - time = 367022 + time = 433755 flags = 0 - data = length 620, hash 3990AA39 + data = length 5712, hash CA808ECF sample 14: - time = 567222 + time = 467122 flags = 0 - data = length 5450, hash F06EC4AA + data = length 9776, hash C875D1AA sample 15: time = 500500 flags = 0 - data = length 1051, hash 92DFA63A + data = length 17712, hash 69AE17D4 sample 16: - time = 467122 - flags = 0 - data = length 874, hash 69587FB4 - sample 17: time = 533855 flags = 0 - data = length 781, hash 36BE495B - sample 18: - time = 700700 + data = length 11440, hash 7370E78C + sample 17: + time = 567222 flags = 0 - data = length 4725, hash AC0C8CD3 + data = length 8544, hash 5A581986 + sample 18: + time = 600600 + flags = 0 + data = length 19904, hash 98AB5C44 sample 19: time = 633955 flags = 0 - data = length 1022, hash 5D8BFF34 + data = length 14352, hash 74B754E3 sample 20: - time = 600600 - flags = 0 - data = length 790, hash 99413A99 - sample 21: time = 667322 flags = 0 - data = length 610, hash 5E129290 - sample 22: - time = 834155 + data = length 9568, hash 369746A6 + sample 21: + time = 700700 flags = 0 - data = length 2751, hash 769974CB + data = length 12192, hash E0F8A71A + sample 22: + time = 734055 + flags = 0 + data = length 22880, hash 75E833BA sample 23: time = 767422 flags = 0 - data = length 745, hash B78A477A + data = length 16832, hash E8BFCFE3 sample 24: - time = 734055 - flags = 0 - data = length 621, hash CF741E7A - sample 25: time = 800800 flags = 0 - data = length 505, hash 1DB4894E - sample 26: - time = 967622 + data = length 5120, hash E04AEF94 + sample 25: + time = 834155 flags = 0 - data = length 1268, hash C15348DC + data = length 9888, hash 1166103E + sample 26: + time = 867522 + flags = 0 + data = length 17024, hash F9A96740 sample 27: time = 900900 flags = 0 - data = length 880, hash C2DE85D0 + data = length 20864, hash DF9E88B8 sample 28: - time = 867522 - flags = 0 - data = length 530, hash C98BC6A8 - sample 29: time = 934255 + flags = 0 + data = length 7216, hash BE22BE2F + sample 29: + time = 967622 flags = 536870912 - data = length 568, hash 4FE5C8EA + data = length 14240, hash E190BF31 track 1: total output bytes = 9529 sample count = 45 format 0: - peakBitrate = 200000 id = 2 sampleMimeType = audio/mp4a-latm codecs = mp4a.40.2 @@ -157,7 +158,7 @@ track 1: channelCount = 1 sampleRate = 44100 language = und - metadata = entries=[xyz: latitude=45.0, longitude=-90.0, Mp4Timestamp: creation time=3547558895, modification time=3547558895, timescale=10000] + metadata = entries=[mdta: key=com.android.version, value=13, xyz: latitude=45.0, longitude=-90.0, Mp4Timestamp: creation time=3785416745, modification time=3785416745, timescale=10000] initializationData: data = length 2, hash 5F7 sample 0: diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java index 487b250d23..2951342b6c 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java @@ -17,7 +17,6 @@ package androidx.media3.transformer; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_FORMAT; -import static androidx.media3.transformer.AndroidTestUtil.MP4_ASSET_URI_STRING; import static org.junit.Assume.assumeTrue; import android.content.Context; @@ -40,7 +39,7 @@ import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class TransformerWithInAppMuxerEndToEndTest { private static final String MP4_FILE_ASSET_DIRECTORY = "asset:///media/mp4/"; - private static final String H264_MP4 = "sample.mp4"; + private static final String H264_MP4 = "sample_no_bframes.mp4"; private static final String H265_MP4 = "h265_with_metadata_track.mp4"; @Parameters(name = "{0}") @@ -90,7 +89,7 @@ public class TransformerWithInAppMuxerEndToEndTest { ChannelMixingAudioProcessor channelMixingAudioProcessor = new ChannelMixingAudioProcessor(); channelMixingAudioProcessor.putChannelMixingMatrix( ChannelMixingMatrix.create(/* inputChannelCount= */ 1, /* outputChannelCount= */ 2)); - MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_ASSET_URI_STRING)); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_FILE_ASSET_DIRECTORY + H264_MP4)); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(mediaItem) .setEffects( diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java index 8d73979570..99b1ae0597 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/TransformerWithInAppMuxerEndToEndTest.java @@ -16,7 +16,6 @@ package androidx.media3.transformer; import static androidx.media3.common.util.Assertions.checkNotNull; -import static androidx.media3.transformer.TestUtil.ASSET_URI_PREFIX; import static androidx.media3.transformer.TestUtil.FILE_AUDIO_VIDEO; import static com.google.common.truth.Truth.assertThat; @@ -44,8 +43,7 @@ import org.junit.runner.RunWith; /** End-to-end test for {@link Transformer} with {@link InAppMuxer}. */ @RunWith(AndroidJUnit4.class) public class TransformerWithInAppMuxerEndToEndTest { - private static final String XMP_SAMPLE_DATA = "media/xmp/sample_datetime_xmp.xmp"; - + private static final String MP4_FILE = "asset:///media/mp4/sample_no_bframes.mp4"; @Rule public final TemporaryFolder outputDir = new TemporaryFolder(); private final Context context = ApplicationProvider.getApplicationContext(); @@ -70,7 +68,7 @@ public class TransformerWithInAppMuxerEndToEndTest { .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setMuxerFactory(inAppMuxerFactory) .build(); - MediaItem mediaItem = MediaItem.fromUri(Uri.parse(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_FILE)); transformer.start(mediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -89,7 +87,8 @@ public class TransformerWithInAppMuxerEndToEndTest { @Test public void transmux_withXmpData_completesSuccessfully() throws Exception { - byte[] xmpData = androidx.media3.test.utils.TestUtil.getByteArray(context, XMP_SAMPLE_DATA); + String xmpSampleData = "media/xmp/sample_datetime_xmp.xmp"; + byte[] xmpData = androidx.media3.test.utils.TestUtil.getByteArray(context, xmpSampleData); Muxer.Factory inAppMuxerFactory = new InAppMuxer.Factory( DefaultMuxer.Factory.DEFAULT_MAX_DELAY_BETWEEN_SAMPLES_MS, @@ -99,7 +98,7 @@ public class TransformerWithInAppMuxerEndToEndTest { .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setMuxerFactory(inAppMuxerFactory) .build(); - MediaItem mediaItem = MediaItem.fromUri(Uri.parse(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_FILE)); transformer.start(mediaItem, outputPath); ExportResult exportResult = TransformerTestRunner.runLooper(transformer); @@ -127,7 +126,7 @@ public class TransformerWithInAppMuxerEndToEndTest { .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setMuxerFactory(inAppMuxerFactory) .build(); - MediaItem mediaItem = MediaItem.fromUri(Uri.parse(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_FILE)); transformer.start(mediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -156,7 +155,7 @@ public class TransformerWithInAppMuxerEndToEndTest { .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setMuxerFactory(inAppMuxerFactory) .build(); - MediaItem mediaItem = MediaItem.fromUri(Uri.parse(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_FILE)); transformer.start(mediaItem, outputPath); TransformerTestRunner.runLooper(transformer); @@ -201,7 +200,7 @@ public class TransformerWithInAppMuxerEndToEndTest { .setClock(new FakeClock(/* isAutoAdvancing= */ true)) .setMuxerFactory(inAppMuxerFactory) .build(); - MediaItem mediaItem = MediaItem.fromUri(Uri.parse(ASSET_URI_PREFIX + FILE_AUDIO_VIDEO)); + MediaItem mediaItem = MediaItem.fromUri(Uri.parse(MP4_FILE)); transformer.start(mediaItem, outputPath); TransformerTestRunner.runLooper(transformer);