5555import com .google .android .exoplayer2 .extractor .wav .WavExtractor ;
5656import com .google .android .exoplayer2 .upstream .DataReader ;
5757import com .google .android .exoplayer2 .util .ParsableByteArray ;
58+ import com .google .android .exoplayer2 .util .TimestampAdjuster ;
5859import com .google .android .exoplayer2 .util .Util ;
5960import com .google .android .exoplayer2 .video .ColorInfo ;
6061
@@ -759,7 +760,6 @@ private ParsingException(ParserException cause) {
759760 */
760761 public static final String PARAMETER_IN_BAND_CRYPTO_INFO =
761762 "android.media.mediaparser.inBandCryptoInfo" ;
762-
763763 /**
764764 * Sets whether supplemental data should be included as part of the sample data. {@code boolean}
765765 * expected. Default value is {@code false}. See {@link #SAMPLE_FLAG_HAS_SUPPLEMENTAL_DATA} for
@@ -769,6 +769,31 @@ private ParsingException(ParserException cause) {
769769 */
770770 public static final String PARAMETER_INCLUDE_SUPPLEMENTAL_DATA =
771771 "android.media.mediaparser.includeSupplementalData" ;
772+ /**
773+ * Sets whether sample timestamps may start from non-zero offsets. {@code boolean} expected.
774+ * Default value is {@code false}.
775+ *
776+ * <p>When set to true, sample timestamps will not be offset to start from zero, and the media
777+ * provided timestamps will be used instead. For example, transport stream sample timestamps
778+ * will not be converted to a zero-based timebase.
779+ *
780+ * @hide
781+ */
782+ public static final String PARAMETER_IGNORE_TIMESTAMP_OFFSET =
783+ "android.media.mediaparser.ignoreTimestampOffset" ;
784+ /**
785+ * Sets whether each track type should be eagerly exposed. {@code boolean} expected. Default
786+ * value is {@code false}.
787+ *
788+ * <p>When set to true, each track type will be eagerly exposed through a call to {@link
789+ * OutputConsumer#onTrackDataFound} containing a single-value {@link MediaFormat}. The key for
790+ * the track type is {@code "track-type-string"}, and the possible values are {@code "video"},
791+ * {@code "audio"}, {@code "text"}, {@code "metadata"}, and {@code "unknown"}.
792+ *
793+ * @hide
794+ */
795+ public static final String PARAMETER_EAGERLY_EXPOSE_TRACKTYPE =
796+ "android.media.mediaparser.eagerlyExposeTrackType" ;
772797
773798 // Private constants.
774799
@@ -930,6 +955,8 @@ public static List<String> getParserNames(@NonNull MediaFormat mediaFormat) {
930955 @ Nullable private final Constructor <DrmInitData .SchemeInitData > mSchemeInitDataConstructor ;
931956 private boolean mInBandCryptoInfo ;
932957 private boolean mIncludeSupplementalData ;
958+ private boolean mIgnoreTimestampOffset ;
959+ private boolean mEagerlyExposeTrackType ;
933960 private String mParserName ;
934961 private Extractor mExtractor ;
935962 private ExtractorInput mExtractorInput ;
@@ -983,6 +1010,12 @@ public MediaParser setParameter(
9831010 if (PARAMETER_INCLUDE_SUPPLEMENTAL_DATA .equals (parameterName )) {
9841011 mIncludeSupplementalData = (boolean ) value ;
9851012 }
1013+ if (PARAMETER_IGNORE_TIMESTAMP_OFFSET .equals (parameterName )) {
1014+ mIgnoreTimestampOffset = (boolean ) value ;
1015+ }
1016+ if (PARAMETER_EAGERLY_EXPOSE_TRACKTYPE .equals (parameterName )) {
1017+ mEagerlyExposeTrackType = (boolean ) value ;
1018+ }
9861019 mParserParameters .put (parameterName , value );
9871020 return this ;
9881021 }
@@ -1159,6 +1192,10 @@ private void removePendingSeek() {
11591192
11601193 private Extractor createExtractor (String parserName ) {
11611194 int flags = 0 ;
1195+ TimestampAdjuster timestampAdjuster = null ;
1196+ if (mIgnoreTimestampOffset ) {
1197+ timestampAdjuster = new TimestampAdjuster (TimestampAdjuster .DO_NOT_OFFSET );
1198+ }
11621199 switch (parserName ) {
11631200 case PARSER_NAME_MATROSKA :
11641201 flags =
@@ -1180,7 +1217,7 @@ private Extractor createExtractor(String parserName) {
11801217 ? FragmentedMp4Extractor
11811218 .FLAG_WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME
11821219 : 0 ;
1183- return new FragmentedMp4Extractor (flags );
1220+ return new FragmentedMp4Extractor (flags , timestampAdjuster );
11841221 case PARSER_NAME_MP4 :
11851222 flags |=
11861223 getBooleanParameter (PARAMETER_MP4_IGNORE_EDIT_LISTS )
@@ -1238,7 +1275,12 @@ private Extractor createExtractor(String parserName) {
12381275 : TS_MODE_HLS .equals (tsMode )
12391276 ? TsExtractor .MODE_HLS
12401277 : TsExtractor .MODE_MULTI_PMT ;
1241- return new TsExtractor (hlsMode , flags );
1278+ return new TsExtractor (
1279+ hlsMode ,
1280+ timestampAdjuster != null
1281+ ? timestampAdjuster
1282+ : new TimestampAdjuster (/* firstSampleTimestampUs= */ 0 ),
1283+ new DefaultTsPayloadReaderFactory (flags ));
12421284 case PARSER_NAME_FLV :
12431285 return new FlvExtractor ();
12441286 case PARSER_NAME_OGG :
@@ -1340,8 +1382,15 @@ private ExtractorOutputAdapter() {
13401382 public TrackOutput track (int id , int type ) {
13411383 TrackOutput trackOutput = mTrackOutputAdapters .get (id );
13421384 if (trackOutput == null ) {
1343- trackOutput = new TrackOutputAdapter (mTrackOutputAdapters .size ());
1385+ int trackIndex = mTrackOutputAdapters .size ();
1386+ trackOutput = new TrackOutputAdapter (trackIndex );
13441387 mTrackOutputAdapters .put (id , trackOutput );
1388+ if (mEagerlyExposeTrackType ) {
1389+ MediaFormat mediaFormat = new MediaFormat ();
1390+ mediaFormat .setString ("track-type-string" , toTypeString (type ));
1391+ mOutputConsumer .onTrackDataFound (
1392+ trackIndex , new TrackData (mediaFormat , /* drmInitData= */ null ));
1393+ }
13451394 }
13461395 return trackOutput ;
13471396 }
@@ -1662,6 +1711,21 @@ private static MediaFormat toMediaFormat(Format format) {
16621711 return result ;
16631712 }
16641713
1714+ private static String toTypeString (int type ) {
1715+ switch (type ) {
1716+ case C .TRACK_TYPE_VIDEO :
1717+ return "video" ;
1718+ case C .TRACK_TYPE_AUDIO :
1719+ return "audio" ;
1720+ case C .TRACK_TYPE_TEXT :
1721+ return "text" ;
1722+ case C .TRACK_TYPE_METADATA :
1723+ return "metadata" ;
1724+ default :
1725+ return "unknown" ;
1726+ }
1727+ }
1728+
16651729 private static void setPcmEncoding (Format format , MediaFormat result ) {
16661730 int exoPcmEncoding = format .pcmEncoding ;
16671731 setOptionalMediaFormatInt (result , "exo-pcm-encoding" , format .pcmEncoding );
@@ -1800,6 +1864,8 @@ private static Constructor<DrmInitData.SchemeInitData> getSchemeInitDataConstruc
18001864 expectedTypeByParameterName .put (PARAMETER_TS_ENABLE_HDMV_DTS_AUDIO_STREAMS , Boolean .class );
18011865 expectedTypeByParameterName .put (PARAMETER_IN_BAND_CRYPTO_INFO , Boolean .class );
18021866 expectedTypeByParameterName .put (PARAMETER_INCLUDE_SUPPLEMENTAL_DATA , Boolean .class );
1867+ expectedTypeByParameterName .put (PARAMETER_IGNORE_TIMESTAMP_OFFSET , Boolean .class );
1868+ expectedTypeByParameterName .put (PARAMETER_EAGERLY_EXPOSE_TRACKTYPE , Boolean .class );
18031869 EXPECTED_TYPE_BY_PARAMETER_NAME = Collections .unmodifiableMap (expectedTypeByParameterName );
18041870 }
18051871}
0 commit comments