From 34a802ef38e81389471d08c2574c6019d55d14fa Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 10 Jul 2024 06:52:29 -0700 Subject: [PATCH] Add support to MPEG4 codec in Mp4Muxer. Add support for MPEG4 codec to enable muxing video encoded with the mp4v-es codec. Use esdsBox method to generate esds box required for Mp4v box. PiperOrigin-RevId: 651000744 --- ...MuxerEndToEndParameterizedAndroidTest.java | 4 +- .../java/androidx/media3/muxer/Boxes.java | 15 ++- .../java/androidx/media3/muxer/BoxesTest.java | 30 ++++++ .../mp4/bbb_176x144_192kbps_15fps_mpeg4.mp4 | Bin 0 -> 46621 bytes .../bbb_176x144_192kbps_15fps_mpeg4.mp4.dump | 87 ++++++++++++++++++ .../video_sample_entry_box_mpeg4.dump | 2 + 6 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 libraries/test_data/src/test/assets/media/mp4/bbb_176x144_192kbps_15fps_mpeg4.mp4 create mode 100644 libraries/test_data/src/test/assets/muxerdumps/bbb_176x144_192kbps_15fps_mpeg4.mp4.dump create mode 100644 libraries/test_data/src/test/assets/muxerdumps/video_sample_entry_box_mpeg4.dump diff --git a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java index ecc171bcec..6ef69d9ec0 100644 --- a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java +++ b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java @@ -52,6 +52,7 @@ public class Mp4MuxerEndToEndParameterizedAndroidTest { private static final String H265_WITH_METADATA_TRACK_MP4 = "h265_with_metadata_track.mp4"; private static final String AV1_MP4 = "sample_av1.mp4"; private static final String AMR_WB = "bbb_mono_16kHz_23.05kbps_amrwb.3gp"; + private static final String MPEG4_MP4 = "bbb_176x144_192kbps_15fps_mpeg4.mp4"; @Parameters(name = "{0}") public static ImmutableList mediaSamples() { @@ -62,7 +63,8 @@ public class Mp4MuxerEndToEndParameterizedAndroidTest { H265_HDR10_MP4, H265_WITH_METADATA_TRACK_MP4, AV1_MP4, - AMR_WB); + AMR_WB, + MPEG4_MP4); } @Parameter public @MonotonicNonNull String inputFile; diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java b/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java index 9bc10cb89c..fe570c41a2 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java @@ -542,6 +542,7 @@ import java.util.List; String mimeType = checkNotNull(format.sampleMimeType); switch (mimeType) { case MimeTypes.AUDIO_AAC: + case MimeTypes.VIDEO_MP4V: return esdsBox(format); case MimeTypes.AUDIO_AMR_WB: return damrBox(/* mode= */ (short) 0x83FF); // mode set: all enabled @@ -1329,6 +1330,8 @@ import java.util.List; return "hvc1"; case MimeTypes.VIDEO_AV1: return "av01"; + case MimeTypes.VIDEO_MP4V: + return "mp4v-es"; default: throw new IllegalArgumentException("Unsupported format: " + mimeType); } @@ -1344,6 +1347,7 @@ import java.util.List; ByteBuffer csd0ByteBuffer = ByteBuffer.wrap(csd0); int peakBitrate = format.peakBitrate; int averageBitrate = format.averageBitrate; + boolean isVideo = MimeTypes.isVideo(format.sampleMimeType); int csd0Size = csd0ByteBuffer.limit(); ByteBuffer dsiSizeBuffer = getSizeBuffer(csd0Size); @@ -1358,17 +1362,18 @@ import java.util.List; contents.put(esdSizeBuffer); contents.putShort((short) 0x0000); // First 16 bits of ES_ID. - contents.put((byte) 0x00); // Last 8 bits of ES_ID. + contents.put(isVideo ? (byte) 0x1f : (byte) 0x00); // Last 8 bits of ES_ID. contents.put((byte) 0x04); // DecoderConfigDescrTag contents.put(dcdSizeBuffer); - contents.put((byte) 0x40); // objectTypeIndication + contents.put(isVideo ? (byte) 0x20 : (byte) 0x40); // objectTypeIndication // streamType (6 bits) | upStream (1 bit) | reserved = 1 (1 bit) - contents.put((byte) ((0x05 << 2) | 0x01)); // streamType AudioStream + contents.put((byte) ((isVideo ? (0x04 << 2) : (0x05 << 2)) | 0x01)); // streamType - contents.putShort((short) 0x03); // First 16 bits of buffer size (0x300). - contents.put((byte) 0x00); // Last 8 bits of buffer size (0x300). + int size = isVideo ? 0x017700 : 0x000300; + contents.putShort((short) ((size >> 8) & 0xFFFF)); // First 16 bits of buffer size. + contents.put((byte) 0x00); // Last 8 bits of buffer size. contents.putInt(peakBitrate != Format.NO_VALUE ? peakBitrate : 0); contents.putInt(averageBitrate != Format.NO_VALUE ? averageBitrate : 0); diff --git a/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java b/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java index 1b74bc912a..7c8ce48960 100644 --- a/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java +++ b/libraries/muxer/src/test/java/androidx/media3/muxer/BoxesTest.java @@ -30,6 +30,7 @@ import android.media.MediaCodec; import androidx.media3.common.C; import androidx.media3.common.ColorInfo; import androidx.media3.common.Format; +import androidx.media3.common.MimeTypes; import androidx.media3.common.util.Util; import androidx.media3.container.MdtaMetadataEntry; import androidx.media3.container.Mp4LocationData; @@ -396,6 +397,35 @@ public class BoxesTest { context, dumpableBox, MuxerTestUtil.getExpectedDumpFilePath("video_sample_entry_box_av1")); } + @Test + public void createVideoSampleEntryBox_forMPEG4_matchesExpected() throws IOException { + Format format = + new Format.Builder() + .setId(1) + .setSampleMimeType(MimeTypes.VIDEO_MP4V) + .setAverageBitrate(9200) + .setPeakBitrate(9200) + .setLanguage("und") + .setWidth(10) + .setMaxInputSize(49) + .setFrameRate(25) + .setHeight(12) + .setInitializationData( + ImmutableList.of( + BaseEncoding.base16() + .decode( + "000001B001000001B58913000001000000012000C48D88007D0584121443000001B24C61766335382E35342E313030"))) + .build(); + + ByteBuffer videoSampleEntryBox = Boxes.videoSampleEntry(format); + + DumpableMp4Box dumpableBox = new DumpableMp4Box(videoSampleEntryBox); + DumpFileAsserts.assertOutput( + context, + dumpableBox, + MuxerTestUtil.getExpectedDumpFilePath("video_sample_entry_box_mpeg4")); + } + @Test public void createVideoSampleEntryBox_withUnknownVideoFormat_throws() { // The video format contains an unknown MIME type. diff --git a/libraries/test_data/src/test/assets/media/mp4/bbb_176x144_192kbps_15fps_mpeg4.mp4 b/libraries/test_data/src/test/assets/media/mp4/bbb_176x144_192kbps_15fps_mpeg4.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..53d0c09b140b00a87c865ed2b2975192bad89679 GIT binary patch literal 46621 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 literal 0 HcmV?d00001 diff --git a/libraries/test_data/src/test/assets/muxerdumps/bbb_176x144_192kbps_15fps_mpeg4.mp4.dump b/libraries/test_data/src/test/assets/muxerdumps/bbb_176x144_192kbps_15fps_mpeg4.mp4.dump new file mode 100644 index 0000000000..708f85f29b --- /dev/null +++ b/libraries/test_data/src/test/assets/muxerdumps/bbb_176x144_192kbps_15fps_mpeg4.mp4.dump @@ -0,0 +1,87 @@ +seekMap: + isSeekable = true + duration = 933300 + getPosition(0) = [[timeUs=0, position=400052]] + getPosition(1) = [[timeUs=0, position=400052]] + getPosition(466650) = [[timeUs=0, position=400052]] + getPosition(933300) = [[timeUs=0, position=400052]] +numberOfTracks = 1 +track 0: + total output bytes = 45694 + sample count = 15 + format 0: + averageBitrate = 365552 + peakBitrate = 365552 + id = 1 + sampleMimeType = video/mp4v-es + maxInputSize = 9256 + width = 176 + height = 144 + frameRate = 16.072002 + colorInfo: + lumaBitdepth = 8 + chromaBitdepth = 8 + metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000] + initializationData: + data = length 47, hash DC4DD041 + sample 0: + time = 0 + flags = 1 + data = length 9226, hash 7C636E69 + sample 1: + time = 66655 + flags = 0 + data = length 2560, hash C7A69F47 + sample 2: + time = 133322 + flags = 0 + data = length 1720, hash 32B683D + sample 3: + time = 200000 + flags = 0 + data = length 2684, hash A77F20B0 + sample 4: + time = 266655 + flags = 0 + data = length 2966, hash CDB6D380 + sample 5: + time = 333322 + flags = 0 + data = length 3160, hash 5A1455FB + sample 6: + time = 400000 + flags = 0 + data = length 3128, hash 8F3EA8F2 + sample 7: + time = 466655 + flags = 0 + data = length 3164, hash 40A33F45 + sample 8: + time = 533322 + flags = 0 + data = length 3309, hash 4ACFEBD1 + sample 9: + time = 600000 + flags = 0 + data = length 3332, hash 7902F5A6 + sample 10: + time = 666655 + flags = 0 + data = length 3082, hash 57E4EBB9 + sample 11: + time = 733322 + flags = 0 + data = length 3210, hash FDA3CC0F + sample 12: + time = 800000 + flags = 0 + data = length 981, hash FA98FC90 + sample 13: + time = 866655 + flags = 0 + data = length 1611, hash 3F58EEE9 + sample 14: + time = 933322 + flags = 536870912 + data = length 1561, hash 24FA5A54 +tracksEnded = true diff --git a/libraries/test_data/src/test/assets/muxerdumps/video_sample_entry_box_mpeg4.dump b/libraries/test_data/src/test/assets/muxerdumps/video_sample_entry_box_mpeg4.dump new file mode 100644 index 0000000000..99f75b2061 --- /dev/null +++ b/libraries/test_data/src/test/assets/muxerdumps/video_sample_entry_box_mpeg4.dump @@ -0,0 +1,2 @@ +mp4v (186 bytes): + Data = length 178, hash DE771E7E