diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5c02cbc567..c8efd4c1f5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -25,6 +25,7 @@ ([#8103](https://github.com/google/ExoPlayer/issues/8103)). * Track selection: * Add option to specify multiple preferred audio or text languages. + * Forward `Timeline` and `MediaPeriodId` to `TrackSelection.Factory`. * UI: * Show overflow button in `StyledPlayerControlView` only when there is not enough space. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java index ba8a799381..19b6389a6a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadHelper.java @@ -1070,7 +1070,10 @@ public final class DownloadHelper { @Override public @NullableType TrackSelection[] createTrackSelections( - @NullableType Definition[] definitions, BandwidthMeter bandwidthMeter) { + @NullableType Definition[] definitions, + BandwidthMeter bandwidthMeter, + MediaPeriodId mediaPeriodId, + Timeline timeline) { @NullableType TrackSelection[] selections = new TrackSelection[definitions.length]; for (int i = 0; i < definitions.length; i++) { selections[i] = diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java index 3173188cac..e6ad3e869d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveTrackSelection.java @@ -21,6 +21,8 @@ import androidx.annotation.CallSuper; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.chunk.MediaChunk; import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; @@ -129,7 +131,10 @@ public class AdaptiveTrackSelection extends BaseTrackSelection { @Override public final @NullableType TrackSelection[] createTrackSelections( - @NullableType Definition[] definitions, BandwidthMeter bandwidthMeter) { + @NullableType Definition[] definitions, + BandwidthMeter bandwidthMeter, + MediaPeriodId mediaPeriodId, + Timeline timeline) { TrackSelection[] selections = new TrackSelection[definitions.length]; int totalFixedBandwidth = 0; for (int i = 0; i < definitions.length; i++) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java index c9f0e290c9..8aec101e6d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java @@ -34,6 +34,8 @@ import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport; import com.google.android.exoplayer2.RendererCapabilities.Capabilities; import com.google.android.exoplayer2.RendererCapabilities.FormatSupport; import com.google.android.exoplayer2.RendererConfiguration; +import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.util.Assertions; @@ -1603,7 +1605,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { selectTracks( MappedTrackInfo mappedTrackInfo, @Capabilities int[][][] rendererFormatSupports, - @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports) + @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports, + MediaPeriodId mediaPeriodId, + Timeline timeline) throws ExoPlaybackException { Parameters params = parametersReference.get(); int rendererCount = mappedTrackInfo.getRendererCount(); @@ -1636,7 +1640,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { @NullableType TrackSelection[] rendererTrackSelections = - trackSelectionFactory.createTrackSelections(definitions, getBandwidthMeter()); + trackSelectionFactory.createTrackSelections( + definitions, getBandwidthMeter(), mediaPeriodId, timeline); // Initialize the renderer configurations to the default configuration for all renderers with // selections, and null otherwise. @@ -1665,8 +1670,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Track selection prior to overrides and disabled flags being applied. /** - * Called from {@link #selectTracks(MappedTrackInfo, int[][][], int[])} to make a track selection - * for each renderer, prior to overrides and disabled flags being applied. + * Called from {@link #selectTracks(MappedTrackInfo, int[][][], int[], MediaPeriodId, Timeline)} + * to make a track selection for each renderer, prior to overrides and disabled flags being + * applied. * *
The implementation should not account for overrides and disabled flags. Track selections
* generated by this method will be overridden to account for these properties.
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java
index fefad00cbd..91b21bac65 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/FixedTrackSelection.java
@@ -17,6 +17,8 @@ package com.google.android.exoplayer2.trackselection;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.Timeline;
+import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.chunk.MediaChunk;
import com.google.android.exoplayer2.source.chunk.MediaChunkIterator;
@@ -57,7 +59,10 @@ public final class FixedTrackSelection extends BaseTrackSelection {
@Override
public @NullableType TrackSelection[] createTrackSelections(
- @NullableType Definition[] definitions, BandwidthMeter bandwidthMeter) {
+ @NullableType Definition[] definitions,
+ BandwidthMeter bandwidthMeter,
+ MediaPeriodId mediaPeriodId,
+ Timeline timeline) {
return TrackSelectionUtil.createTrackSelectionsForDefinitions(
definitions,
definition ->
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java
index 16c63353ee..3086027e1d 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java
@@ -355,7 +355,7 @@ public abstract class MappingTrackSelector extends TrackSelector {
public final TrackSelectorResult selectTracks(
RendererCapabilities[] rendererCapabilities,
TrackGroupArray trackGroups,
- MediaPeriodId periodId,
+ MediaPeriodId mediaPeriodId,
Timeline timeline)
throws ExoPlaybackException {
// Structures into which data will be written during the selection. The extra item at the end
@@ -431,7 +431,11 @@ public abstract class MappingTrackSelector extends TrackSelector {
Pair<@NullableType RendererConfiguration[], @NullableType TrackSelection[]> result =
selectTracks(
- mappedTrackInfo, rendererFormatSupports, rendererMixedMimeTypeAdaptationSupports);
+ mappedTrackInfo,
+ rendererFormatSupports,
+ rendererMixedMimeTypeAdaptationSupports,
+ mediaPeriodId,
+ timeline);
return new TrackSelectorResult(result.first, result.second, mappedTrackInfo);
}
@@ -443,6 +447,9 @@ public abstract class MappingTrackSelector extends TrackSelector {
* renderer, track group and track (in that order).
* @param rendererMixedMimeTypeAdaptationSupport The {@link AdaptiveSupport} for mixed MIME type
* adaptation for the renderer.
+ * @param mediaPeriodId The {@link MediaPeriodId} of the period for which tracks are to be
+ * selected.
+ * @param timeline The {@link Timeline} holding the period for which tracks are to be selected.
* @return A pair consisting of the track selections and configurations for each renderer. A null
* configuration indicates the renderer should be disabled, in which case the track selection
* will also be null. A track selection may also be null for a non-disabled renderer if {@link
@@ -453,7 +460,9 @@ public abstract class MappingTrackSelector extends TrackSelector {
selectTracks(
MappedTrackInfo mappedTrackInfo,
@Capabilities int[][][] rendererFormatSupports,
- @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupport)
+ @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupport,
+ MediaPeriodId mediaPeriodId,
+ Timeline timeline)
throws ExoPlaybackException;
/**
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java
index 4b9b72715a..5f0ab76d6f 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/RandomTrackSelection.java
@@ -18,6 +18,8 @@ package com.google.android.exoplayer2.trackselection;
import android.os.SystemClock;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
+import com.google.android.exoplayer2.Timeline;
+import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.chunk.MediaChunk;
import com.google.android.exoplayer2.source.chunk.MediaChunkIterator;
@@ -51,7 +53,10 @@ public final class RandomTrackSelection extends BaseTrackSelection {
@Override
public @NullableType TrackSelection[] createTrackSelections(
- @NullableType Definition[] definitions, BandwidthMeter bandwidthMeter) {
+ @NullableType Definition[] definitions,
+ BandwidthMeter bandwidthMeter,
+ MediaPeriodId mediaPeriodId,
+ Timeline timeline) {
return TrackSelectionUtil.createTrackSelectionsForDefinitions(
definitions,
definition -> new RandomTrackSelection(definition.group, definition.tracks, random));
diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java
index 5e703438f8..c41d19f083 100644
--- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java
+++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelection.java
@@ -18,6 +18,8 @@ package com.google.android.exoplayer2.trackselection;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
+import com.google.android.exoplayer2.Timeline;
+import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.chunk.Chunk;
import com.google.android.exoplayer2.source.chunk.MediaChunk;
@@ -84,12 +86,18 @@ public interface TrackSelection {
*
* @param definitions A {@link Definition} array. May include null values.
* @param bandwidthMeter A {@link BandwidthMeter} which can be used to select tracks.
+ * @param mediaPeriodId The {@link MediaPeriodId} of the period for which tracks are to be
+ * selected.
+ * @param timeline The {@link Timeline} holding the period for which tracks are to be selected.
* @return The created selections. Must have the same length as {@code definitions} and may
* include null values.
*/
@NullableType
TrackSelection[] createTrackSelections(
- @NullableType Definition[] definitions, BandwidthMeter bandwidthMeter);
+ @NullableType Definition[] definitions,
+ BandwidthMeter bandwidthMeter,
+ MediaPeriodId mediaPeriodId,
+ Timeline timeline);
}
/**
diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java
index 5d5508f3cd..2abff49fd0 100644
--- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java
+++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/MappingTrackSelectorTest.java
@@ -131,7 +131,7 @@ public final class MappingTrackSelectorTest {
/**
* A {@link MappingTrackSelector} that stashes the {@link MappedTrackInfo} passed to {@link
- * #selectTracks(MappedTrackInfo, int[][][], int[])}.
+ * #selectTracks(MappedTrackInfo, int[][][], int[], MediaPeriodId, Timeline)}.
*/
private static final class FakeMappingTrackSelector extends MappingTrackSelector {
@@ -141,8 +141,9 @@ public final class MappingTrackSelectorTest {
protected Pair