From 625ff234e4a7ee49e305fa8a0e6d0625e4a0bd3b Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 17 Feb 2025 08:09:15 -0800 Subject: [PATCH] Update CSD and apvC box logic Update the CSD to contain only the APVDecoderConfigurationRecord and the apvC box to be a full box. The apv clip is also updated to be consistent with the new [specification](https://github.com/AcademySoftwareFoundation/openapv/blob/main/readme/apv_isobmff.md#isobmff-binding-for-apv). The clip is provided by the openAPV team under BSD-3 license. PiperOrigin-RevId: 727868656 (cherry picked from commit 653470f73be98e01e972513ec80e58c2d36cbb3a) --- .../media3/extractor/mp4/BoxParser.java | 9 ++++----- .../java/androidx/media3/muxer/Boxes.java | 8 +++++++- .../mp4/sample_with_apvc.mp4.0.dump | 8 ++++---- .../mp4/sample_with_apvc.mp4.1.dump | 8 ++++---- .../mp4/sample_with_apvc.mp4.2.dump | 8 ++++---- .../mp4/sample_with_apvc.mp4.3.dump | 8 ++++---- ...ding_within_gop_sample_dependencies.0.dump | 8 ++++---- ...ding_within_gop_sample_dependencies.1.dump | 8 ++++---- ...ding_within_gop_sample_dependencies.2.dump | 8 ++++---- ...ding_within_gop_sample_dependencies.3.dump | 8 ++++---- ...op_sample_dependencies.unknown_length.dump | 8 ++++---- .../sample_with_apvc.mp4.unknown_length.dump | 8 ++++---- .../assets/media/mp4/sample_with_apvc.mp4 | Bin 8457930 -> 8457938 bytes .../muxerdumps/sample_with_apvc.mp4.dump | 6 +++--- 14 files changed, 54 insertions(+), 49 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java index 0305fd8749..3b2d17f88f 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/BoxParser.java @@ -1476,13 +1476,13 @@ public final class BoxParser { } else if (childAtomType == Mp4Box.TYPE_apvC) { mimeType = MimeTypes.VIDEO_APV; - int childAtomBodySize = childAtomSize - Mp4Box.HEADER_SIZE; + int childAtomBodySize = childAtomSize - Mp4Box.FULL_HEADER_SIZE; byte[] initializationDataChunk = new byte[childAtomBodySize]; + parent.setPosition(childStartPosition + Mp4Box.FULL_HEADER_SIZE); // Skip version and flags. parent.readBytes(initializationDataChunk, /* offset= */ 0, childAtomBodySize); initializationData = ImmutableList.of(initializationDataChunk); - parent.setPosition(childStartPosition + Mp4Box.HEADER_SIZE); - ColorInfo colorInfo = parseApvc(parent); + ColorInfo colorInfo = parseApvc(new ParsableByteArray(initializationDataChunk)); bitdepthLuma = colorInfo.lumaBitdepth; bitdepthChroma = colorInfo.chromaBitdepth; @@ -1711,8 +1711,7 @@ public final class BoxParser { ColorInfo.Builder colorInfo = new ColorInfo.Builder(); ParsableBitArray bitArray = new ParsableBitArray(data.getData()); bitArray.setPosition(data.getPosition() * 8); // Convert byte to bit position. - bitArray.skipBytes(4); // skip version and flag (4 bytes) - // See APVDecoderConfigurationBox syntax. + // See APVDecoderConfigurationRecord syntax. bitArray.skipBytes(1); // configurationVersion int numConfigurationEntries = bitArray.readBits(8); // number_of_configuration_entry for (int i = 0; i < numConfigurationEntries; i++) { 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 9d86e08eac..c10324142c 100644 --- a/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java +++ b/libraries/muxer/src/main/java/androidx/media3/muxer/Boxes.java @@ -1523,7 +1523,13 @@ import org.checkerframework.checker.nullness.qual.PolyNull; byte[] csd0 = format.initializationData.get(0); checkArgument(csd0.length > 0, "csd-0 is empty for avpC box."); - return BoxUtils.wrapIntoBox("apvC", ByteBuffer.wrap(csd0)); + int versionAndFlags = 0; + ByteBuffer apvcBoxContent = ByteBuffer.allocate(csd0.length + BYTES_PER_INTEGER); + apvcBoxContent.putInt(versionAndFlags); + apvcBoxContent.put(csd0); + apvcBoxContent.flip(); + + return BoxUtils.wrapIntoBox("apvC", apvcBoxContent); } /** Returns the av1C box. */ diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.0.dump index 9de0f5f46a..01857ecd5d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.0.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 0 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.1.dump index 6c6c05809f..71967aaf0b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.1.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 1366655 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.2.dump index 143eecbd50..63c624e2c4 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.2.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 2766644 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.3.dump index 3c41a31c45..d73186211c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.3.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 4133288 flags = 536870913 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.0.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.0.dump index 9de0f5f46a..01857ecd5d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.0.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.0.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 0 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.1.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.1.dump index 6c6c05809f..71967aaf0b 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.1.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.1.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 1366655 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.2.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.2.dump index 143eecbd50..63c624e2c4 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.2.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.2.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 2766644 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.3.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.3.dump index 3c41a31c45..d73186211c 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.3.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.3.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 4133288 flags = 536870913 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.unknown_length.dump index 9de0f5f46a..01857ecd5d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.reading_within_gop_sample_dependencies.unknown_length.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 0 flags = 1 diff --git a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.unknown_length.dump b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.unknown_length.dump index 9de0f5f46a..01857ecd5d 100644 --- a/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.unknown_length.dump +++ b/libraries/test_data/src/test/assets/extractordumps/mp4/sample_with_apvc.mp4.unknown_length.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 - metadata = entries=[mdta: key=com.android.version, value=14, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3816721470, modification time=3816721470, timescale=10000] + lumaBitdepth = 10 + chromaBitdepth = 10 + metadata = entries=[mdta: key=com.android.version, value=15, xyz: latitude=0.0, longitude=-180.0, Mp4Timestamp: creation time=3821418903, modification time=3821418903, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 0 flags = 1 diff --git a/libraries/test_data/src/test/assets/media/mp4/sample_with_apvc.mp4 b/libraries/test_data/src/test/assets/media/mp4/sample_with_apvc.mp4 index f3dfe287d6cbd9a73170d48eccd0d3dc92216708..e49f595a0b55fa17b2f0d014d4319f73cae17b28 100644 GIT binary patch delta 434 zcmZ9EOEX(>9ESggaFV!0RZA!$s#>IoTUCh$achg-TpA=CggBzfky11{GtVcmkX3gU zJ^;hQ+QPD*pfkQh$I^*K7v7m?-rvmcnfK~9rauNrBr?dvL>Ae|n6Y3bhg|Z=$3_7U zDC8kUJmN9MlwhZnGM-RQ1(i6c!bvqxso@#5Jm&><)YE{Amo(BuGj3XFrHytvctt0# z>EaFD^x&bFw|MEJp8TB!!UvIt^b0Vwx69A4aSOk`OuPM%&Kvt@?%O7R|qy_y7O^ delta 426 zcmZ9F$1+1<0EPb$lIWcvdhepw=)Lz6B}9!YBv*8DXTGJCg>0Dd5R8o{u=E6GynvOp zix~@xGv~~lZ_atWL;Ir2iv~aZ(Gox)I`kL_BA5_D2_u{cB8eiJ7-ESdo&<~}l0-5l zQb;9@bTY^!i)?bpC69axD5QvDN+_j_a?DgvNfp)9P)i;4G|)&B%~)uml{VVxpp!1T z>7kcC`Wax5A%+=YlrhGcV3H}OnPHYW=CQKCB1Jxak9rg zF5Ji*;Ng%Xjyd6!GtRl-67PdjtTWzAPNzo*u_Jjl?W&9Si>u~u`MPwTG*+L>pj?{# byh8Jq@%<>oj9Zr7zfl-ek9dj;Ql7P6Z6uaf diff --git a/libraries/test_data/src/test/assets/muxerdumps/sample_with_apvc.mp4.dump b/libraries/test_data/src/test/assets/muxerdumps/sample_with_apvc.mp4.dump index ad2d6ee6af..9d39154d90 100644 --- a/libraries/test_data/src/test/assets/muxerdumps/sample_with_apvc.mp4.dump +++ b/libraries/test_data/src/test/assets/muxerdumps/sample_with_apvc.mp4.dump @@ -19,11 +19,11 @@ track 0: height = 480 frameRate = 30.00 colorInfo: - lumaBitdepth = 8 - chromaBitdepth = 8 + lumaBitdepth = 10 + chromaBitdepth = 10 metadata = entries=[Mp4Timestamp: creation time=100000000, modification time=500000000, timescale=10000] initializationData: - data = length 22, hash 5F550605 + data = length 18, hash 77EBC81 sample 0: time = 0 flags = 1