diff options
-rw-r--r-- | apex/media/framework/java/android/media/MediaParser.java | 49 |
1 files changed, 45 insertions, 4 deletions
diff --git a/apex/media/framework/java/android/media/MediaParser.java b/apex/media/framework/java/android/media/MediaParser.java index ddecfed68d9b..c1011ecb073b 100644 --- a/apex/media/framework/java/android/media/MediaParser.java +++ b/apex/media/framework/java/android/media/MediaParser.java @@ -468,7 +468,24 @@ public final class MediaParser { public @interface SampleFlags {} /** Indicates that the sample holds a synchronization sample. */ public static final int SAMPLE_FLAG_KEY_FRAME = MediaCodec.BUFFER_FLAG_KEY_FRAME; - /** Indicates that the sample has supplemental data. */ + /** + * Indicates that the sample has supplemental data. + * + * <p>Samples will not have this flag set unless the {@code + * "android.media.mediaparser.includeSupplementalData"} parameter is set to {@code true} via + * {@link #setParameter}. + * + * <p>Samples with supplemental data have the following sample data format: + * + * <ul> + * <li>If the {@code "android.media.mediaparser.inBandCryptoInfo"} parameter is set, all + * encryption information. + * <li>(4 bytes) {@code sample_data_size}: The size of the actual sample data, not including + * supplemental data or encryption information. + * <li>({@code sample_data_size} bytes): The media sample data. + * <li>(remaining bytes) The supplemental data. + * </ul> + */ public static final int SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA = 1 << 28; /** Indicates that the sample is known to contain the last media sample of the stream. */ public static final int SAMPLE_FLAG_LAST_SAMPLE = 1 << 29; @@ -579,7 +596,9 @@ public final class MediaParser { PARAMETER_TS_IGNORE_AVC_STREAM, PARAMETER_TS_IGNORE_SPLICE_INFO_STREAM, PARAMETER_TS_DETECT_ACCESS_UNITS, - PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS + PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS, + PARAMETER_IN_BAND_CRYPTO_INFO, + PARAMETER_INCLUDE_SUPPLEMENTAL_DATA }) public @interface ParameterName {} @@ -741,6 +760,16 @@ public final class MediaParser { public static final String PARAMETER_IN_BAND_CRYPTO_INFO = "android.media.mediaparser.inBandCryptoInfo"; + /** + * Sets whether supplemental data should be included as part of the sample data. {@code boolean} + * expected. Default value is {@code false}. See {@link #SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA} for + * information about the sample data format. + * + * @hide + */ + public static final String PARAMETER_INCLUDE_SUPPLEMENTAL_DATA = + "android.media.mediaparser.includeSupplementalData"; + // Private constants. private static final String TAG = "MediaParser"; @@ -900,6 +929,7 @@ public final class MediaParser { private final ParsableByteArrayAdapter mScratchParsableByteArrayAdapter; @Nullable private final Constructor<DrmInitData.SchemeInitData> mSchemeInitDataConstructor; private boolean mInBandCryptoInfo; + private boolean mIncludeSupplementalData; private String mParserName; private Extractor mExtractor; private ExtractorInput mExtractorInput; @@ -950,6 +980,9 @@ public final class MediaParser { if (PARAMETER_IN_BAND_CRYPTO_INFO.equals(parameterName)) { mInBandCryptoInfo = (boolean) value; } + if (PARAMETER_INCLUDE_SUPPLEMENTAL_DATA.equals(parameterName)) { + mIncludeSupplementalData = (boolean) value; + } mParserParameters.put(parameterName, value); return this; } @@ -1334,6 +1367,7 @@ public final class MediaParser { private int mEncryptionVectorSize; private boolean mHasSubsampleEncryptionData; private CryptoInfo.Pattern mEncryptionPattern; + private int mSkippedSupplementalDataBytes; private TrackOutputAdapter(int trackIndex) { mTrackIndex = trackIndex; @@ -1423,6 +1457,10 @@ public final class MediaParser { throw new IllegalStateException(); } } + } else if (sampleDataPart == SAMPLE_DATA_PART_SUPPLEMENTAL + && !mIncludeSupplementalData) { + mSkippedSupplementalDataBytes += length; + data.skipBytes(length); } else { outputSampleData(data, length); } @@ -1431,6 +1469,8 @@ public final class MediaParser { @Override public void sampleMetadata( long timeUs, int flags, int size, int offset, @Nullable CryptoData cryptoData) { + size -= mSkippedSupplementalDataBytes; + mSkippedSupplementalDataBytes = 0; mOutputConsumer.onSampleCompleted( mTrackIndex, timeUs, @@ -1690,13 +1730,13 @@ public final class MediaParser { } } - private static int getMediaParserFlags(int flags) { + private int getMediaParserFlags(int flags) { @SampleFlags int result = 0; result |= (flags & C.BUFFER_FLAG_ENCRYPTED) != 0 ? SAMPLE_FLAG_ENCRYPTED : 0; result |= (flags & C.BUFFER_FLAG_KEY_FRAME) != 0 ? SAMPLE_FLAG_KEY_FRAME : 0; result |= (flags & C.BUFFER_FLAG_DECODE_ONLY) != 0 ? SAMPLE_FLAG_DECODE_ONLY : 0; result |= - (flags & C.BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA) != 0 + (flags & C.BUFFER_FLAG_HAS_SUPPLEMENTAL_DATA) != 0 && mIncludeSupplementalData ? SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA : 0; result |= (flags & C.BUFFER_FLAG_LAST_SAMPLE) != 0 ? SAMPLE_FLAG_LAST_SAMPLE : 0; @@ -1759,6 +1799,7 @@ public final class MediaParser { expectedTypeByParameterName.put(PARAMETER_TS_DETECT_ACCESS_UNITS, Boolean.class); expectedTypeByParameterName.put(PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS, Boolean.class); expectedTypeByParameterName.put(PARAMETER_IN_BAND_CRYPTO_INFO, Boolean.class); + expectedTypeByParameterName.put(PARAMETER_INCLUDE_SUPPLEMENTAL_DATA, Boolean.class); EXPECTED_TYPE_BY_PARAMETER_NAME = Collections.unmodifiableMap(expectedTypeByParameterName); } } |