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 e16ca96a3a..9a3c81fdf6 100644 --- a/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java +++ b/libraries/muxer/src/androidTest/java/androidx/media3/muxer/Mp4MuxerEndToEndParameterizedAndroidTest.java @@ -54,6 +54,7 @@ public class Mp4MuxerEndToEndParameterizedAndroidTest { "bbb_800x640_768kbps_30fps_avc_2b_firstpts_10_sec.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 APV_MP4 = "sample_with_apvc.mp4"; private static final String AV1_MP4 = "sample_av1.mp4"; private static final String MPEG4_MP4 = "bbb_176x144_192kbps_15fps_mpeg4.mp4"; @@ -75,6 +76,7 @@ public class Mp4MuxerEndToEndParameterizedAndroidTest { H264_WITH_FIRST_PTS_10_SEC, H265_HDR10_MP4, H265_WITH_METADATA_TRACK_MP4, + APV_MP4, AV1_MP4, MPEG4_MP4, VP9_WEB, 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 cc8201a5d5..a7e929b957 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java @@ -705,6 +705,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull; return hvcCBox(format); case MimeTypes.VIDEO_AV1: return av1CBox(format); + case MimeTypes.VIDEO_APV: + return apvCBox(format); case MimeTypes.VIDEO_MP4V: return esdsBox(format); case MimeTypes.VIDEO_VP9: @@ -1499,6 +1501,18 @@ import org.checkerframework.checker.nullness.qual.PolyNull; return BoxUtils.wrapIntoBox("hvcC", contents); } + /** Returns the apvC box. */ + private static ByteBuffer apvCBox(Format format) { + // For APV, the entire codec-specific box is packed into csd-0. + checkArgument( + !format.initializationData.isEmpty(), "csd-0 is not found in the format for avpC box"); + + byte[] csd0 = format.initializationData.get(0); + checkArgument(csd0.length > 0, "csd-0 is empty for avpC box."); + + return BoxUtils.wrapIntoBox("apvC", ByteBuffer.wrap(csd0)); + } + /** Returns the av1C box. */ private static ByteBuffer av1CBox(Format format) { // For AV1, the entire codec-specific box is packed into csd-0. @@ -1675,6 +1689,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull; return "hvc1"; case MimeTypes.VIDEO_AV1: return "av01"; + case MimeTypes.VIDEO_APV: + return "apv1"; case MimeTypes.VIDEO_MP4V: return "mp4v-es"; case MimeTypes.VIDEO_VP9: diff --git a/libraries/muxer/src/main/java/androidx/media3/muxer/FragmentedMp4Muxer.java b/libraries/muxer/src/main/java/androidx/media3/muxer/FragmentedMp4Muxer.java index 1c9877de86..0c6551139a 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/FragmentedMp4Muxer.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/FragmentedMp4Muxer.java @@ -46,6 +46,7 @@ import java.nio.ByteBuffer; *
  • H.264 (AVC) *
  • H.265 (HEVC) *
  • VP9 + *
  • APV * *
  • Audio Codecs: * *
  • Audio Codecs: *