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 selectTracks( MappedTrackInfo mappedTrackInfo, @Capabilities int[][][] rendererFormatSupports, - @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports) - throws ExoPlaybackException { + @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports, + MediaPeriodId mediaPeriodId, + Timeline timeline) { int rendererCount = mappedTrackInfo.getRendererCount(); lastMappedTrackInfo = mappedTrackInfo; return Pair.create( @@ -156,7 +157,6 @@ public final class MappingTrackSelectorTest { assertThat(rendererTrackGroupArray.get(i)).isEqualTo(expected[i]); } } - } /** diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackSelector.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackSelector.java index 3b44e62107..15d613563e 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackSelector.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeTrackSelector.java @@ -18,6 +18,8 @@ package com.google.android.exoplayer2.testutil; import androidx.test.core.app.ApplicationProvider; import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport; import com.google.android.exoplayer2.RendererCapabilities.Capabilities; +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.trackselection.DefaultTrackSelector; @@ -85,7 +87,10 @@ public class FakeTrackSelector extends DefaultTrackSelector { @Override public TrackSelection[] createTrackSelections( - TrackSelection.@NullableType Definition[] definitions, BandwidthMeter bandwidthMeter) { + TrackSelection.@NullableType Definition[] definitions, + BandwidthMeter bandwidthMeter, + MediaPeriodId mediaPeriodId, + Timeline timeline) { TrackSelection[] selections = new TrackSelection[definitions.length]; for (int i = 0; i < definitions.length; i++) { TrackSelection.Definition definition = definitions[i];