Also plumb new Timeline through to TrackSelector.selectTracks() so periodId is useful
------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=214650418
This commit is contained in:
parent
3073d38a5a
commit
d487b599f8
@ -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;
|
||||
|
||||
|
@ -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()) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
* <li>When the player is created it will initialize the track selector by calling {@link
|
||||
* #init(InvalidationListener, BandwidthMeter)}.
|
||||
* <li>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.
|
||||
* <li>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;
|
||||
* <h3>Renderer configuration</h3>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* <h3>Threading model</h3>
|
||||
*
|
||||
@ -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.
|
||||
*/
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user