From d487b599f8404a6af0a50f606e8acff237e45d1e Mon Sep 17 00:00:00 2001 From: cblay Date: Wed, 26 Sep 2018 12:36:47 -0700 Subject: [PATCH] Also plumb new Timeline through to TrackSelector.selectTracks() so periodId is useful ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=214650418 --- .../android/exoplayer2/ExoPlayerImpl.java | 3 +- .../exoplayer2/ExoPlayerImplInternal.java | 5 +- .../android/exoplayer2/MediaPeriodHolder.java | 8 +- .../trackselection/MappingTrackSelector.java | 4 +- .../trackselection/TrackSelector.java | 29 ++-- .../DefaultTrackSelectorTest.java | 162 ++++++++++++------ .../MappingTrackSelectorTest.java | 18 +- .../trackselection/TrackSelectorTest.java | 4 +- 8 files changed, 152 insertions(+), 81 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 96e7703559..5d565cdc90 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -51,7 +51,8 @@ import java.util.concurrent.CopyOnWriteArraySet; * This empty track selector result can only be used for {@link PlaybackInfo#trackSelectorResult} * when the player does not have any track selection made (such as when player is reset, or when * player seeks to an unprepared period). It will not be used as result of any {@link - * TrackSelector#selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId)} operation. + * TrackSelector#selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId, Timeline)} + * operation. */ /* package */ final TrackSelectorResult emptyTrackSelectorResult; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index d861020d26..1d5125384f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -998,7 +998,7 @@ import java.util.Collections; // The reselection did not change any prepared periods. return; } - if (periodHolder.selectTracks(playbackSpeed)) { + if (periodHolder.selectTracks(playbackSpeed, playbackInfo.timeline)) { // Selected tracks have changed for this period. break; } @@ -1531,7 +1531,8 @@ import java.util.Collections; return; } MediaPeriodHolder loadingPeriodHolder = queue.getLoadingPeriod(); - loadingPeriodHolder.handlePrepared(mediaClock.getPlaybackParameters().speed); + loadingPeriodHolder.handlePrepared( + mediaClock.getPlaybackParameters().speed, playbackInfo.timeline); updateLoadControlTrackSelection( loadingPeriodHolder.trackGroups, loadingPeriodHolder.trackSelectorResult); if (!queue.hasPlayingPeriod()) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java index 70c9354e71..a59ee61088 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodHolder.java @@ -140,10 +140,10 @@ import com.google.android.exoplayer2.util.Log; return !prepared ? 0 : mediaPeriod.getNextLoadPositionUs(); } - public void handlePrepared(float playbackSpeed) throws ExoPlaybackException { + public void handlePrepared(float playbackSpeed, Timeline timeline) throws ExoPlaybackException { prepared = true; trackGroups = mediaPeriod.getTrackGroups(); - selectTracks(playbackSpeed); + selectTracks(playbackSpeed, timeline); long newStartPositionUs = applyTrackSelection(info.startPositionUs, false); rendererPositionOffsetUs += info.startPositionUs - newStartPositionUs; info = info.copyWithStartPositionUs(newStartPositionUs); @@ -160,9 +160,9 @@ import com.google.android.exoplayer2.util.Log; mediaPeriod.continueLoading(loadingPeriodPositionUs); } - public boolean selectTracks(float playbackSpeed) throws ExoPlaybackException { + public boolean selectTracks(float playbackSpeed, Timeline timeline) throws ExoPlaybackException { TrackSelectorResult selectorResult = - trackSelector.selectTracks(rendererCapabilities, trackGroups, info.id); + trackSelector.selectTracks(rendererCapabilities, trackGroups, info.id, timeline); if (selectorResult.isEquivalent(periodTrackSelectorResult)) { return false; } 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 ce5dff8556..81fbc16630 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 @@ -23,6 +23,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RendererCapabilities; 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; @@ -330,7 +331,8 @@ public abstract class MappingTrackSelector extends TrackSelector { public final TrackSelectorResult selectTracks( RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, - MediaPeriodId periodId) + MediaPeriodId periodId, + Timeline timeline) throws ExoPlaybackException { // Structures into which data will be written during the selection. The extra item at the end // of each array is to store data associated with track groups that cannot be associated with diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java index bc2460036c..2a66186b29 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/TrackSelector.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.RendererCapabilities; 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.TrackGroupArray; import com.google.android.exoplayer2.upstream.BandwidthMeter; @@ -41,9 +42,9 @@ import com.google.android.exoplayer2.util.Assertions; *
  • When the player is created it will initialize the track selector by calling {@link * #init(InvalidationListener, BandwidthMeter)}. *
  • When the player needs to make a track selection it will call {@link - * #selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId)}. This typically - * occurs at the start of playback, when the player starts to buffer a new period of the media - * being played, and when the track selector invalidates its previous selections. + * #selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId, Timeline)}. This + * typically occurs at the start of playback, when the player starts to buffer a new period of + * the media being played, and when the track selector invalidates its previous selections. *
  • The player may perform a track selection well in advance of the selected tracks becoming * active, where active is defined to mean that the renderers are actually consuming media * corresponding to the selection that was made. For example when playing media containing @@ -67,14 +68,14 @@ import com.google.android.exoplayer2.util.Assertions; *

    Renderer configuration

    * * The {@link TrackSelectorResult} returned by {@link #selectTracks(RendererCapabilities[], - * TrackGroupArray, MediaPeriodId)} contains not only {@link TrackSelection}s for each renderer, but - * also {@link RendererConfiguration}s defining configuration parameters that the renderers should - * apply when consuming the corresponding media. Whilst it may seem counter-intuitive for a track - * selector to also specify renderer configuration information, in practice the two are tightly - * bound together. It may only be possible to play a certain combination tracks if the renderers are - * configured in a particular way. Equally, it may only be possible to configure renderers in a - * particular way if certain tracks are selected. Hence it makes sense to determined the track - * selection and corresponding renderer configurations in a single step. + * TrackGroupArray, MediaPeriodId, Timeline)} contains not only {@link TrackSelection}s for each + * renderer, but also {@link RendererConfiguration}s defining configuration parameters that the + * renderers should apply when consuming the corresponding media. Whilst it may seem counter- + * intuitive for a track selector to also specify renderer configuration information, in practice + * the two are tightly bound together. It may only be possible to play a certain combination tracks + * if the renderers are configured in a particular way. Equally, it may only be possible to + * configure renderers in a particular way if certain tracks are selected. Hence it makes sense to + * determined the track selection and corresponding renderer configurations in a single step. * *

    Threading model

    * @@ -119,18 +120,20 @@ public abstract class TrackSelector { * are to be selected. * @param trackGroups The available track groups. * @param periodId 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 {@link TrackSelectorResult} describing the track selections. * @throws ExoPlaybackException If an error occurs selecting tracks. */ public abstract TrackSelectorResult selectTracks( RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, - MediaPeriodId periodId) + MediaPeriodId periodId, + Timeline timeline) throws ExoPlaybackException; /** * Called by the player when a {@link TrackSelectorResult} previously generated by {@link - * #selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId)} is activated. + * #selectTracks(RendererCapabilities[], TrackGroupArray, MediaPeriodId, Timeline)} is activated. * * @param info The value of {@link TrackSelectorResult#info} in the activated selection. */ diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java index 4b1357c1a6..ee3d2cf9b0 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelectorTest.java @@ -37,9 +37,11 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; 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.testutil.FakeTimeline; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.ParametersBuilder; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; @@ -49,6 +51,7 @@ import com.google.android.exoplayer2.util.MimeTypes; import java.util.HashMap; import java.util.Map; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -91,14 +94,20 @@ public final class DefaultTrackSelectorTest { }; private static final TrackSelection[] TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER = new TrackSelection[] {new FixedTrackSelection(VIDEO_TRACK_GROUP, 0), null}; - private static final MediaPeriodId PERIOD_ID = new MediaPeriodId(/* periodUid= */ new Object()); + private static final Timeline TIMELINE = new FakeTimeline(/* windowCount= */ 1); - @Mock - private InvalidationListener invalidationListener; + private static MediaPeriodId periodId; + + @Mock private InvalidationListener invalidationListener; @Mock private BandwidthMeter bandwidthMeter; private DefaultTrackSelector trackSelector; + @BeforeClass + public static void setUpBeforeClass() { + periodId = new MediaPeriodId(TIMELINE.getUidOfPeriod(/* periodIndex= */ 0)); + } + @Before public void setUp() { initMocks(this); @@ -179,7 +188,7 @@ public final class DefaultTrackSelectorTest { .buildUponParameters() .setSelectionOverride(0, new TrackGroupArray(VIDEO_TRACK_GROUP), null)); TrackSelectorResult result = - trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); assertTrackSelections(result, new TrackSelection[] {null, TRACK_SELECTIONS[1]}); assertThat(result.rendererConfigurations) .isEqualTo(new RendererConfiguration[] {null, DEFAULT}); @@ -196,7 +205,7 @@ public final class DefaultTrackSelectorTest { .setSelectionOverride(0, new TrackGroupArray(VIDEO_TRACK_GROUP), null) .clearSelectionOverride(0, new TrackGroupArray(VIDEO_TRACK_GROUP))); TrackSelectorResult result = - trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); assertTrackSelections(result, TRACK_SELECTIONS); assertThat(result.rendererConfigurations) .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); @@ -215,7 +224,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( RENDERER_CAPABILITIES, new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP, VIDEO_TRACK_GROUP), - PERIOD_ID); + periodId, + TIMELINE); assertTrackSelections(result, TRACK_SELECTIONS); assertThat(result.rendererConfigurations) .isEqualTo(new RendererConfiguration[] {DEFAULT, DEFAULT}); @@ -228,7 +238,7 @@ public final class DefaultTrackSelectorTest { trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.setParameters(trackSelector.buildUponParameters().setRendererDisabled(1, true)); TrackSelectorResult result = - trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); assertTrackSelections(result, new TrackSelection[] {TRACK_SELECTIONS[0], null}); assertThat(new RendererConfiguration[] {DEFAULT, null}) .isEqualTo(result.rendererConfigurations); @@ -245,7 +255,7 @@ public final class DefaultTrackSelectorTest { .setRendererDisabled(1, true) .setRendererDisabled(1, false)); TrackSelectorResult result = - trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); assertTrackSelections(result, TRACK_SELECTIONS); assertThat(new RendererConfiguration[] {DEFAULT, DEFAULT}) .isEqualTo(result.rendererConfigurations); @@ -258,7 +268,7 @@ public final class DefaultTrackSelectorTest { trackSelector.init(invalidationListener, bandwidthMeter); TrackSelectorResult result = trackSelector.selectTracks( - RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, PERIOD_ID); + RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, periodId, TIMELINE); assertTrackSelections(result, TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER); assertThat(new RendererConfiguration[] {DEFAULT, DEFAULT}) .isEqualTo(result.rendererConfigurations); @@ -272,7 +282,7 @@ public final class DefaultTrackSelectorTest { trackSelector.setParameters(trackSelector.buildUponParameters().setRendererDisabled(1, true)); TrackSelectorResult result = trackSelector.selectTracks( - RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, PERIOD_ID); + RENDERER_CAPABILITIES_WITH_NO_SAMPLE_RENDERER, TRACK_GROUPS, periodId, TIMELINE); assertTrackSelections(result, TRACK_SELECTIONS_WITH_NO_SAMPLE_RENDERER); assertThat(new RendererConfiguration[] {DEFAULT, null}) .isEqualTo(result.rendererConfigurations); @@ -335,7 +345,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup(formatWithSelectionFlag, audioFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(formatWithSelectionFlag); } @@ -359,7 +370,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, wrapFormats(frAudioFormat, enAudioFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(enAudioFormat); } @@ -384,7 +396,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, wrapFormats(frAudioFormat, enAudioFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(enAudioFormat); } @@ -408,7 +421,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {mappedAudioRendererCapabilities}, singleTrackGroup(exceededFormat, supportedFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFormat); } @@ -427,7 +441,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup(audioFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(audioFormat); } @@ -450,7 +465,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup(audioFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0)).isNull(); } @@ -479,7 +495,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {mappedAudioRendererCapabilities}, singleTrackGroup(exceededWithSelectionFlagFormat, supportedFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFormat); } @@ -511,7 +528,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {mappedAudioRendererCapabilities}, singleTrackGroup(exceededEnFormat, supportedFrFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFrFormat); } @@ -543,7 +561,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {mappedAudioRendererCapabilities}, singleTrackGroup(exceededDefaultSelectionEnFormat, supportedFrFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(supportedFrFormat); } @@ -566,7 +585,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup(higherChannelFormat, lowerChannelFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(higherChannelFormat); } @@ -589,7 +609,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup(higherSampleRateFormat, lowerSampleRateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(higherSampleRateFormat); } @@ -612,7 +633,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup(lowerBitrateFormat, higherBitrateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(higherBitrateFormat); } @@ -637,7 +659,8 @@ public final class DefaultTrackSelectorTest { new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup( higherChannelLowerSampleRateFormat, lowerChannelHigherSampleRateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(higherChannelLowerSampleRateFormat); @@ -663,7 +686,8 @@ public final class DefaultTrackSelectorTest { new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup( higherSampleRateLowerBitrateFormat, lowerSampleRateHigherBitrateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(higherSampleRateLowerBitrateFormat); @@ -687,7 +711,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup(higherChannelFormat, lowerChannelFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerChannelFormat); } @@ -710,7 +735,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup(higherSampleRateFormat, lowerSampleRateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerSampleRateFormat); } @@ -733,7 +759,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup(lowerBitrateFormat, higherBitrateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerBitrateFormat); } @@ -758,7 +785,8 @@ public final class DefaultTrackSelectorTest { new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup( higherChannelLowerSampleRateFormat, lowerChannelHigherSampleRateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(lowerChannelHigherSampleRateFormat); @@ -784,7 +812,8 @@ public final class DefaultTrackSelectorTest { new RendererCapabilities[] {ALL_AUDIO_FORMAT_EXCEEDED_RENDERER_CAPABILITIES}, singleTrackGroup( higherSampleRateLowerBitrateFormat, lowerSampleRateHigherBitrateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()) .isEqualTo(lowerSampleRateHigherBitrateFormat); @@ -808,20 +837,24 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilities, wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedDefault); // Ditto. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(forcedOnly, noFlag, defaultOnly), PERIOD_ID); + textRendererCapabilities, + wrapFormats(forcedOnly, noFlag, defaultOnly), + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(defaultOnly); // With no language preference and no text track flagged as default, the first forced should be // selected. result = trackSelector.selectTracks( - textRendererCapabilities, wrapFormats(forcedOnly, noFlag), PERIOD_ID); + textRendererCapabilities, wrapFormats(forcedOnly, noFlag), periodId, TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedOnly); trackSelector.setParameters( @@ -835,7 +868,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilities, wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedOnly); trackSelector.setParameters( @@ -847,7 +881,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilities, wrapFormats(forcedDefault, forcedOnly, defaultOnly, noFlag, forcedOnlySpanish), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedOnlySpanish); trackSelector.setParameters( @@ -863,7 +898,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilities, wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0)).isNull(); trackSelector.setParameters( @@ -875,7 +911,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilities, wrapFormats(forcedOnly, forcedDefault, defaultOnly, noFlag), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(forcedDefault); trackSelector.setParameters( @@ -892,7 +929,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilities, wrapFormats(noFlag, forcedOnly, forcedDefault, defaultOnly), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(noFlag); } @@ -915,7 +953,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilites, wrapFormats(spanish, german, undeterminedUnd, undeterminedNull), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0)).isNull(); trackSelector.setParameters( @@ -924,7 +963,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilites, wrapFormats(spanish, german, undeterminedUnd, undeterminedNull), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(undeterminedUnd); ParametersBuilder builder = new ParametersBuilder().setPreferredTextLanguage("spa"); @@ -933,14 +973,16 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilites, wrapFormats(spanish, german, undeterminedUnd, undeterminedNull), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(spanish); result = trackSelector.selectTracks( textRendererCapabilites, wrapFormats(german, undeterminedUnd, undeterminedNull), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0)).isNull(); trackSelector.setParameters(builder.setSelectUndeterminedTextLanguage(true).build()); @@ -948,15 +990,18 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( textRendererCapabilites, wrapFormats(german, undeterminedUnd, undeterminedNull), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(undeterminedUnd); result = trackSelector.selectTracks( - textRendererCapabilites, wrapFormats(german, undeterminedNull), PERIOD_ID); + textRendererCapabilites, wrapFormats(german, undeterminedNull), periodId, TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(undeterminedNull); - result = trackSelector.selectTracks(textRendererCapabilites, wrapFormats(german), PERIOD_ID); + result = + trackSelector.selectTracks( + textRendererCapabilites, wrapFormats(german), periodId, TIMELINE); assertThat(result.selections.get(0)).isNull(); } @@ -985,21 +1030,24 @@ public final class DefaultTrackSelectorTest { // Without an explicit language preference, nothing should be selected. TrackSelectorResult result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); + trackSelector.selectTracks( + rendererCapabilities, wrapFormats(english, german), periodId, TIMELINE); assertThat(result.selections.get(0)).isNull(); assertThat(result.selections.get(1)).isNull(); // Explicit language preference for english. First renderer should be used. trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("en")); result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); + trackSelector.selectTracks( + rendererCapabilities, wrapFormats(english, german), periodId, TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(english); assertThat(result.selections.get(1)).isNull(); // Explicit language preference for German. Second renderer should be used. trackSelector.setParameters(trackSelector.buildUponParameters().setPreferredTextLanguage("de")); result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); + trackSelector.selectTracks( + rendererCapabilities, wrapFormats(english, german), periodId, TIMELINE); assertThat(result.selections.get(0)).isNull(); assertThat(result.selections.get(1).getFormat(0)).isSameAs(german); } @@ -1024,7 +1072,8 @@ public final class DefaultTrackSelectorTest { trackSelector.selectTracks( new RendererCapabilities[] {ALL_AUDIO_FORMAT_SUPPORTED_RENDERER_CAPABILITIES}, singleTrackGroup(lowerBitrateFormat, higherBitrateFormat), - PERIOD_ID); + periodId, + TIMELINE); assertThat(result.selections.get(0).getSelectedFormat()).isEqualTo(lowerBitrateFormat); } @@ -1043,7 +1092,7 @@ public final class DefaultTrackSelectorTest { TrackGroupArray trackGroupArray = singleTrackGroup(AUDIO_FORMAT, AUDIO_FORMAT); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray, PERIOD_ID); + new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray, periodId, TIMELINE); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); @@ -1072,7 +1121,7 @@ public final class DefaultTrackSelectorTest { new SelectionOverride(/* groupIndex= */ 0, /* tracks= */ 1, 2))); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray, PERIOD_ID); + new RendererCapabilities[] {AUDIO_CAPABILITIES}, trackGroupArray, periodId, TIMELINE); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); @@ -1105,7 +1154,8 @@ public final class DefaultTrackSelectorTest { // Without an explicit language preference, prefer the first renderer. TrackSelectorResult result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); + trackSelector.selectTracks( + rendererCapabilities, wrapFormats(english, german), periodId, TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(english); assertThat(result.selections.get(1)).isNull(); @@ -1113,7 +1163,8 @@ public final class DefaultTrackSelectorTest { trackSelector.setParameters( trackSelector.buildUponParameters().setPreferredAudioLanguage("en")); result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); + trackSelector.selectTracks( + rendererCapabilities, wrapFormats(english, german), periodId, TIMELINE); assertThat(result.selections.get(0).getFormat(0)).isSameAs(english); assertThat(result.selections.get(1)).isNull(); @@ -1121,7 +1172,8 @@ public final class DefaultTrackSelectorTest { trackSelector.setParameters( trackSelector.buildUponParameters().setPreferredAudioLanguage("de")); result = - trackSelector.selectTracks(rendererCapabilities, wrapFormats(english, german), PERIOD_ID); + trackSelector.selectTracks( + rendererCapabilities, wrapFormats(english, german), periodId, TIMELINE); assertThat(result.selections.get(0)).isNull(); assertThat(result.selections.get(1).getFormat(0)).isSameAs(german); } @@ -1140,7 +1192,7 @@ public final class DefaultTrackSelectorTest { TrackGroupArray trackGroupArray = singleTrackGroup(VIDEO_FORMAT, VIDEO_FORMAT); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray, PERIOD_ID); + new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray, periodId, TIMELINE); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); @@ -1169,7 +1221,7 @@ public final class DefaultTrackSelectorTest { new SelectionOverride(/* groupIndex= */ 0, /* tracks= */ 1, 2))); TrackSelectorResult result = trackSelector.selectTracks( - new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray, PERIOD_ID); + new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroupArray, periodId, TIMELINE); assertThat(result.length).isEqualTo(1); assertThat(result.selections.get(0)).isEqualTo(adaptiveTrackSelection); 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 3899ebfd37..140a9733b3 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 @@ -23,10 +23,13 @@ import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.RendererCapabilities; 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.testutil.FakeTimeline; import com.google.android.exoplayer2.util.MimeTypes; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @@ -52,7 +55,14 @@ public final class MappingTrackSelectorTest { Format.NO_VALUE, 2, 44100, null, null, 0, null)); private static final TrackGroupArray TRACK_GROUPS = new TrackGroupArray( VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP); - private static final MediaPeriodId PERIOD_ID = new MediaPeriodId(/* periodUid= */ new Object()); + private static final Timeline TIMELINE = new FakeTimeline(/* windowCount= */ 1); + + private static MediaPeriodId periodId; + + @BeforeClass + public static void setUpBeforeClass() { + periodId = new MediaPeriodId(TIMELINE.getUidOfPeriod(/* periodIndex= */ 0)); + } /** * Tests that the video and audio track groups are mapped onto the correct renderers. @@ -60,7 +70,7 @@ public final class MappingTrackSelectorTest { @Test public void testMapping() throws ExoPlaybackException { FakeMappingTrackSelector trackSelector = new FakeMappingTrackSelector(); - trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, PERIOD_ID); + trackSelector.selectTracks(RENDERER_CAPABILITIES, TRACK_GROUPS, periodId, TIMELINE); trackSelector.assertMappedTrackGroups(0, VIDEO_TRACK_GROUP); trackSelector.assertMappedTrackGroups(1, AUDIO_TRACK_GROUP); } @@ -74,7 +84,7 @@ public final class MappingTrackSelectorTest { FakeMappingTrackSelector trackSelector = new FakeMappingTrackSelector(); RendererCapabilities[] reverseOrderRendererCapabilities = new RendererCapabilities[] { AUDIO_CAPABILITIES, VIDEO_CAPABILITIES}; - trackSelector.selectTracks(reverseOrderRendererCapabilities, TRACK_GROUPS, PERIOD_ID); + trackSelector.selectTracks(reverseOrderRendererCapabilities, TRACK_GROUPS, periodId, TIMELINE); trackSelector.assertMappedTrackGroups(0, AUDIO_TRACK_GROUP); trackSelector.assertMappedTrackGroups(1, VIDEO_TRACK_GROUP); } @@ -88,7 +98,7 @@ public final class MappingTrackSelectorTest { FakeMappingTrackSelector trackSelector = new FakeMappingTrackSelector(); TrackGroupArray multiTrackGroups = new TrackGroupArray(VIDEO_TRACK_GROUP, AUDIO_TRACK_GROUP, VIDEO_TRACK_GROUP); - trackSelector.selectTracks(RENDERER_CAPABILITIES, multiTrackGroups, PERIOD_ID); + trackSelector.selectTracks(RENDERER_CAPABILITIES, multiTrackGroups, periodId, TIMELINE); trackSelector.assertMappedTrackGroups(0, VIDEO_TRACK_GROUP, VIDEO_TRACK_GROUP); trackSelector.assertMappedTrackGroups(1, AUDIO_TRACK_GROUP); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java index 781f2b4fc9..3b88c00e2e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/trackselection/TrackSelectorTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.fail; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.RendererCapabilities; +import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.TrackSelector.InvalidationListener; @@ -44,7 +45,8 @@ public class TrackSelectorTest { public TrackSelectorResult selectTracks( RendererCapabilities[] rendererCapabilities, TrackGroupArray trackGroups, - MediaPeriodId periodId) + MediaPeriodId periodId, + Timeline timeline) throws ExoPlaybackException { throw new UnsupportedOperationException(); }