From f1327c4125b2328c5fecd10b763529f120694383 Mon Sep 17 00:00:00 2001 From: Khang NT Date: Sun, 28 Oct 2018 10:58:43 +0530 Subject: [PATCH] [Customize] Allow ExtractorMediaSource specify addition track selection flags --- .../com/google/android/exoplayer2/Format.java | 31 +++++++++++++++++++ .../source/ExtractorMediaPeriod.java | 4 +++ .../source/ExtractorMediaSource.java | 19 ++++++++++-- .../android/exoplayer2/util/EventLogger.java | 2 ++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Format.java b/library/core/src/main/java/com/google/android/exoplayer2/Format.java index 3456fc39a2f..21ff10c9147 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Format.java @@ -1274,6 +1274,37 @@ public Format copyWithRotationDegrees(int rotationDegrees) { metadata); } + public Format copyWithSelectionFlag(@C.SelectionFlags int selectionFlags) { + return new Format( + id, + label, + containerMimeType, + sampleMimeType, + codecs, + bitrate, + maxInputSize, + width, + height, + frameRate, + rotationDegrees, + pixelWidthHeightRatio, + projectionData, + stereoMode, + colorInfo, + channelCount, + sampleRate, + pcmEncoding, + encoderDelay, + encoderPadding, + selectionFlags, + language, + accessibilityChannel, + subsampleOffsetUs, + initializationData, + drmInitData, + metadata); + } + /** * Returns the number of pixels if this is a video format whose {@link #width} and {@link #height} * are known, or {@link #NO_VALUE} otherwise diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java index 31daf65d386..2961ed8d146 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaPeriod.java @@ -86,6 +86,7 @@ interface Listener { private final Listener listener; private final Allocator allocator; private final @Nullable String customCacheKey; + private final @C.SelectionFlags int additionSelectionFlag; private final long continueLoadingCheckIntervalBytes; private final Loader loader; private final ExtractorHolder extractorHolder; @@ -144,6 +145,7 @@ public ExtractorMediaPeriod( Listener listener, Allocator allocator, @Nullable String customCacheKey, + @C.SelectionFlags int additionSelectionFlag, int continueLoadingCheckIntervalBytes) { this.uri = uri; this.dataSource = dataSource; @@ -152,6 +154,7 @@ public ExtractorMediaPeriod( this.listener = listener; this.allocator = allocator; this.customCacheKey = customCacheKey; + this.additionSelectionFlag = additionSelectionFlag; this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes; loader = new Loader("Loader:ExtractorMediaPeriod"); extractorHolder = new ExtractorHolder(extractors); @@ -653,6 +656,7 @@ private void maybeFinishPrepare() { durationUs = seekMap.getDurationUs(); for (int i = 0; i < trackCount; i++) { Format trackFormat = sampleQueues[i].getUpstreamFormat(); + trackFormat = trackFormat.copyWithSelectionFlag(trackFormat.selectionFlags | additionSelectionFlag); trackArray[i] = new TrackGroup(trackFormat); String mimeType = trackFormat.sampleMimeType; boolean isAudioVideo = MimeTypes.isVideo(mimeType) || MimeTypes.isAudio(mimeType); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index 66af3a7e62b..0e46378482a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -78,6 +78,7 @@ public static final class Factory implements AdsMediaSource.MediaSourceFactory { private @Nullable ExtractorsFactory extractorsFactory; private @Nullable String customCacheKey; + private @C.SelectionFlags int additionSelectionFlag; private @Nullable Object tag; private LoadErrorHandlingPolicy loadErrorHandlingPolicy; private int continueLoadingCheckIntervalBytes; @@ -140,6 +141,11 @@ public Factory setTag(Object tag) { return this; } + public Factory setAdditionSelectionFlag(@C.SelectionFlags int additionSelectionFlag) { + this.additionSelectionFlag = additionSelectionFlag; + return this; + } + /** * Sets the minimum number of times to retry if a loading error occurs. See {@link * #setLoadErrorHandlingPolicy} for the default value. @@ -209,6 +215,7 @@ public ExtractorMediaSource createMediaSource(Uri uri) { extractorsFactory, loadErrorHandlingPolicy, customCacheKey, + additionSelectionFlag, continueLoadingCheckIntervalBytes, tag); } @@ -244,6 +251,7 @@ public int[] getSupportedTypes() { private final ExtractorsFactory extractorsFactory; private final LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy; private final String customCacheKey; + private final @C.SelectionFlags int additionSelectionFlag; private final int continueLoadingCheckIntervalBytes; private final @Nullable Object tag; @@ -269,7 +277,7 @@ public ExtractorMediaSource( ExtractorsFactory extractorsFactory, Handler eventHandler, EventListener eventListener) { - this(uri, dataSourceFactory, extractorsFactory, eventHandler, eventListener, null); + this(uri, dataSourceFactory, extractorsFactory, eventHandler, eventListener, null, 0); } /** @@ -292,7 +300,8 @@ public ExtractorMediaSource( ExtractorsFactory extractorsFactory, Handler eventHandler, EventListener eventListener, - String customCacheKey) { + String customCacheKey, + int additionSelectionFlag) { this( uri, dataSourceFactory, @@ -300,6 +309,7 @@ public ExtractorMediaSource( eventHandler, eventListener, customCacheKey, + additionSelectionFlag, DEFAULT_LOADING_CHECK_INTERVAL_BYTES); } @@ -326,6 +336,7 @@ public ExtractorMediaSource( Handler eventHandler, EventListener eventListener, String customCacheKey, + int additionSelectionFlag, int continueLoadingCheckIntervalBytes) { this( uri, @@ -333,6 +344,7 @@ public ExtractorMediaSource( extractorsFactory, new DefaultLoadErrorHandlingPolicy(), customCacheKey, + additionSelectionFlag, continueLoadingCheckIntervalBytes, /* tag= */ null); if (eventListener != null && eventHandler != null) { @@ -346,6 +358,7 @@ private ExtractorMediaSource( ExtractorsFactory extractorsFactory, LoadErrorHandlingPolicy loadableLoadErrorHandlingPolicy, @Nullable String customCacheKey, + @C.SelectionFlags int additionSelectionFlag, int continueLoadingCheckIntervalBytes, @Nullable Object tag) { this.uri = uri; @@ -353,6 +366,7 @@ private ExtractorMediaSource( this.extractorsFactory = extractorsFactory; this.loadableLoadErrorHandlingPolicy = loadableLoadErrorHandlingPolicy; this.customCacheKey = customCacheKey; + this.additionSelectionFlag = additionSelectionFlag; this.continueLoadingCheckIntervalBytes = continueLoadingCheckIntervalBytes; this.timelineDurationUs = C.TIME_UNSET; this.tag = tag; @@ -387,6 +401,7 @@ public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator) { this, allocator, customCacheKey, + additionSelectionFlag, continueLoadingCheckIntervalBytes); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index 25f3a0c100c..f15d13b8c22 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -158,6 +158,8 @@ public void onTimelineChanged(EventTime eventTime, @Player.TimelineChangeReason + window.isSeekable + ", " + window.isDynamic + + ", " + + window.tag + "]"); } if (windowCount > MAX_TIMELINE_ITEM_LINES) {