From 9dfd72b6c62a56c569fad7af88fad61a549d2e17 Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 13 Aug 2024 03:47:52 -0700 Subject: [PATCH] Move atom parsing logic from `Atom` to `AtomParsers` This is groundwork to moving `Atom` to the `container` library, which we want to do before making it public (so it can be used by `muxer` in future). PiperOrigin-RevId: 662453520 --- .../androidx/media3/extractor/mp4/Atom.java | 10 -------- .../media3/extractor/mp4/AtomParsers.java | 20 ++++++++++++---- .../extractor/mp4/FragmentedMp4Extractor.java | 24 +++++++++---------- .../media3/extractor/mp4/MetadataUtil.java | 2 +- .../media3/extractor/mp4/PsshAtomUtil.java | 2 +- .../extractor/mp4/PsshAtomUtilTest.java | 4 ++-- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Atom.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Atom.java index 6f4537ddbe..9b5c255d2c 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Atom.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/Atom.java @@ -586,16 +586,6 @@ import java.util.List; } } - /** Parses the version number out of the additional integer component of a full atom. */ - public static int parseFullAtomVersion(int fullAtomInt) { - return 0x000000FF & (fullAtomInt >> 24); - } - - /** Parses the atom flags out of the additional integer component of a full atom. */ - public static int parseFullAtomFlags(int fullAtomInt) { - return 0x00FFFFFF & fullAtomInt; - } - /** * Converts a numeric atom type to the corresponding four character string. * diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java index 7a4c01fbd3..2a93dd8297 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java @@ -104,6 +104,16 @@ import java.util.Objects; /** The magic signature for an Opus Identification header, as defined in RFC-7845. */ private static final byte[] opusMagic = Util.getUtf8Bytes("OpusHead"); + /** Parses the version number out of the additional integer component of a full atom. */ + public static int parseFullAtomVersion(int fullAtomInt) { + return 0x000000FF & (fullAtomInt >> 24); + } + + /** Parses the atom flags out of the additional integer component of a full atom. */ + public static int parseFullAtomFlags(int fullAtomInt) { + return 0x00FFFFFF & fullAtomInt; + } + /** * Parse the trak atoms in a moov atom (defined in ISO/IEC 14496-12). * @@ -198,7 +208,7 @@ import java.util.Objects; public static Mp4TimestampData parseMvhd(ParsableByteArray mvhd) { mvhd.setPosition(Atom.HEADER_SIZE); int fullAtom = mvhd.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = parseFullAtomVersion(fullAtom); long creationTimestampSeconds; long modificationTimestampSeconds; if (version == 0) { @@ -840,7 +850,7 @@ import java.util.Objects; private static TkhdData parseTkhd(ParsableByteArray tkhd) { tkhd.setPosition(Atom.HEADER_SIZE); int fullAtom = tkhd.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = parseFullAtomVersion(fullAtom); tkhd.skipBytes(version == 0 ? 8 : 16); int trackId = tkhd.readInt(); @@ -927,7 +937,7 @@ import java.util.Objects; private static Pair parseMdhd(ParsableByteArray mdhd) { mdhd.setPosition(Atom.HEADER_SIZE); int fullAtom = mdhd.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = parseFullAtomVersion(fullAtom); mdhd.skipBytes(version == 0 ? 8 : 16); long timescale = mdhd.readUnsignedInt(); mdhd.skipBytes(version == 0 ? 4 : 8); @@ -1636,7 +1646,7 @@ import java.util.Objects; ParsableByteArray elstData = elstAtom.data; elstData.setPosition(Atom.HEADER_SIZE); int fullAtom = elstData.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = parseFullAtomVersion(fullAtom); int entryCount = elstData.readUnsignedIntToInt(); long[] editListDurations = new long[entryCount]; long[] editListMediaTimes = new long[entryCount]; @@ -2188,7 +2198,7 @@ import java.util.Objects; int childAtomType = parent.readInt(); if (childAtomType == Atom.TYPE_tenc) { int fullAtom = parent.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = parseFullAtomVersion(fullAtom); parent.skipBytes(1); // reserved = 0. int defaultCryptByteBlock = 0; int defaultSkipByteBlock = 0; diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java index c47f731a02..04203a3597 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/FragmentedMp4Extractor.java @@ -777,7 +777,7 @@ public class FragmentedMp4Extractor implements Extractor { } atom.setPosition(Atom.HEADER_SIZE); int fullAtom = atom.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = AtomParsers.parseFullAtomVersion(fullAtom); String schemeIdUri; String value; long timescale; @@ -883,7 +883,7 @@ public class FragmentedMp4Extractor implements Extractor { private static long parseMehd(ParsableByteArray mehd) { mehd.setPosition(Atom.HEADER_SIZE); int fullAtom = mehd.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = AtomParsers.parseFullAtomVersion(fullAtom); return version == 0 ? mehd.readUnsignedInt() : mehd.readUnsignedLongToLong(); } @@ -1005,7 +1005,7 @@ public class FragmentedMp4Extractor implements Extractor { int vectorSize = encryptionBox.perSampleIvSize; saiz.setPosition(Atom.HEADER_SIZE); int fullAtom = saiz.readInt(); - int flags = Atom.parseFullAtomFlags(fullAtom); + int flags = AtomParsers.parseFullAtomFlags(fullAtom); if ((flags & 0x01) == 1) { saiz.skipBytes(8); } @@ -1049,7 +1049,7 @@ public class FragmentedMp4Extractor implements Extractor { private static void parseSaio(ParsableByteArray saio, TrackFragment out) throws ParserException { saio.setPosition(Atom.HEADER_SIZE); int fullAtom = saio.readInt(); - int flags = Atom.parseFullAtomFlags(fullAtom); + int flags = AtomParsers.parseFullAtomFlags(fullAtom); if ((flags & 0x01) == 1) { saio.skipBytes(8); } @@ -1061,7 +1061,7 @@ public class FragmentedMp4Extractor implements Extractor { "Unexpected saio entry count: " + entryCount, /* cause= */ null); } - int version = Atom.parseFullAtomVersion(fullAtom); + int version = AtomParsers.parseFullAtomVersion(fullAtom); out.auxiliaryDataPosition += version == 0 ? saio.readUnsignedInt() : saio.readUnsignedLongToLong(); } @@ -1083,7 +1083,7 @@ public class FragmentedMp4Extractor implements Extractor { ParsableByteArray tfhd, SparseArray trackBundles, boolean haveSideloadedTrack) { tfhd.setPosition(Atom.HEADER_SIZE); int fullAtom = tfhd.readInt(); - int atomFlags = Atom.parseFullAtomFlags(fullAtom); + int atomFlags = AtomParsers.parseFullAtomFlags(fullAtom); int trackId = tfhd.readInt(); @Nullable TrackBundle trackBundle = @@ -1132,7 +1132,7 @@ public class FragmentedMp4Extractor implements Extractor { private static long parseTfdt(ParsableByteArray tfdt) { tfdt.setPosition(Atom.HEADER_SIZE); int fullAtom = tfdt.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = AtomParsers.parseFullAtomVersion(fullAtom); return version == 1 ? tfdt.readUnsignedLongToLong() : tfdt.readUnsignedInt(); } @@ -1175,7 +1175,7 @@ public class FragmentedMp4Extractor implements Extractor { throws ParserException { trun.setPosition(Atom.HEADER_SIZE); int fullAtom = trun.readInt(); - int atomFlags = Atom.parseFullAtomFlags(fullAtom); + int atomFlags = AtomParsers.parseFullAtomFlags(fullAtom); Track track = trackBundle.moovSampleTable.track; TrackFragment fragment = trackBundle.fragment; @@ -1286,7 +1286,7 @@ public class FragmentedMp4Extractor implements Extractor { throws ParserException { senc.setPosition(Atom.HEADER_SIZE + offset); int fullAtom = senc.readInt(); - int flags = Atom.parseFullAtomFlags(fullAtom); + int flags = AtomParsers.parseFullAtomFlags(fullAtom); if ((flags & 0x01 /* override_track_encryption_box_parameters */) != 0) { // TODO: Implement this. @@ -1339,7 +1339,7 @@ public class FragmentedMp4Extractor implements Extractor { } sbgp.setPosition(Atom.HEADER_SIZE); - int sbgpVersion = Atom.parseFullAtomVersion(sbgp.readInt()); + int sbgpVersion = AtomParsers.parseFullAtomVersion(sbgp.readInt()); sbgp.skipBytes(4); // grouping_type == seig. if (sbgpVersion == 1) { sbgp.skipBytes(4); // grouping_type_parameter. @@ -1350,7 +1350,7 @@ public class FragmentedMp4Extractor implements Extractor { } sgpd.setPosition(Atom.HEADER_SIZE); - int sgpdVersion = Atom.parseFullAtomVersion(sgpd.readInt()); + int sgpdVersion = AtomParsers.parseFullAtomVersion(sgpd.readInt()); sgpd.skipBytes(4); // grouping_type == seig. if (sgpdVersion == 1) { if (sgpd.readUnsignedInt() == 0) { @@ -1407,7 +1407,7 @@ public class FragmentedMp4Extractor implements Extractor { throws ParserException { atom.setPosition(Atom.HEADER_SIZE); int fullAtom = atom.readInt(); - int version = Atom.parseFullAtomVersion(fullAtom); + int version = AtomParsers.parseFullAtomVersion(fullAtom); atom.skipBytes(4); long timescale = atom.readUnsignedInt(); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/MetadataUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/MetadataUtil.java index 06d4e637a5..957dc1c48a 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/MetadataUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/MetadataUtil.java @@ -350,7 +350,7 @@ import com.google.common.collect.ImmutableList; int atomType = data.readInt(); if (atomType == Atom.TYPE_data) { int fullVersionInt = data.readInt(); - int flags = Atom.parseFullAtomFlags(fullVersionInt); + int flags = AtomParsers.parseFullAtomFlags(fullVersionInt); @Nullable String mimeType = flags == 13 ? "image/jpeg" : flags == 14 ? "image/png" : null; if (mimeType == null) { Log.w(TAG, "Unrecognized cover art flags: " + flags); diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/PsshAtomUtil.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/PsshAtomUtil.java index 16cff78e1f..7abf61eaf9 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/PsshAtomUtil.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/PsshAtomUtil.java @@ -175,7 +175,7 @@ public final class PsshAtomUtil { Log.w(TAG, "Atom type is not pssh: " + atomType); return null; } - int atomVersion = Atom.parseFullAtomVersion(atomData.readInt()); + int atomVersion = AtomParsers.parseFullAtomVersion(atomData.readInt()); if (atomVersion > 1) { Log.w(TAG, "Unsupported pssh version: " + atomVersion); return null; diff --git a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/PsshAtomUtilTest.java b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/PsshAtomUtilTest.java index e60650fa04..f103d9fabe 100644 --- a/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/PsshAtomUtilTest.java +++ b/libraries/extractor/src/test/java/androidx/media3/extractor/mp4/PsshAtomUtilTest.java @@ -17,8 +17,8 @@ package androidx.media3.extractor.mp4; import static androidx.media3.common.C.WIDEVINE_UUID; import static androidx.media3.extractor.mp4.Atom.TYPE_pssh; -import static androidx.media3.extractor.mp4.Atom.parseFullAtomFlags; -import static androidx.media3.extractor.mp4.Atom.parseFullAtomVersion; +import static androidx.media3.extractor.mp4.AtomParsers.parseFullAtomFlags; +import static androidx.media3.extractor.mp4.AtomParsers.parseFullAtomVersion; import static com.google.common.truth.Truth.assertThat; import androidx.media3.common.C;