Commit 67cde97a by olly Committed by Oliver Woodman

Move code unrelated to mapping to DefaultTrackSelector

Issue: #3915

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=192759210
parent 0ee39637
...@@ -29,10 +29,10 @@ import android.widget.CheckedTextView; ...@@ -29,10 +29,10 @@ import android.widget.CheckedTextView;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride;
import com.google.android.exoplayer2.trackselection.FixedTrackSelection; import com.google.android.exoplayer2.trackselection.FixedTrackSelection;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.SelectionOverride;
import com.google.android.exoplayer2.trackselection.RandomTrackSelection; import com.google.android.exoplayer2.trackselection.RandomTrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import java.util.Arrays; import java.util.Arrays;
...@@ -46,7 +46,7 @@ import java.util.Arrays; ...@@ -46,7 +46,7 @@ import java.util.Arrays;
private static final TrackSelection.Factory FIXED_FACTORY = new FixedTrackSelection.Factory(); private static final TrackSelection.Factory FIXED_FACTORY = new FixedTrackSelection.Factory();
private static final TrackSelection.Factory RANDOM_FACTORY = new RandomTrackSelection.Factory(); private static final TrackSelection.Factory RANDOM_FACTORY = new RandomTrackSelection.Factory();
private final MappingTrackSelector selector; private final DefaultTrackSelector selector;
private final TrackSelection.Factory adaptiveTrackSelectionFactory; private final TrackSelection.Factory adaptiveTrackSelectionFactory;
private MappedTrackInfo trackInfo; private MappedTrackInfo trackInfo;
...@@ -63,11 +63,11 @@ import java.util.Arrays; ...@@ -63,11 +63,11 @@ import java.util.Arrays;
/** /**
* @param selector The track selector. * @param selector The track selector.
* @param adaptiveTrackSelectionFactory A factory for adaptive {@link TrackSelection}s, or null * @param adaptiveTrackSelectionFactory A factory for adaptive {@link TrackSelection}s, or null if
* if the selection helper should not support adaptive tracks. * the selection helper should not support adaptive tracks.
*/ */
public TrackSelectionHelper(MappingTrackSelector selector, public TrackSelectionHelper(
TrackSelection.Factory adaptiveTrackSelectionFactory) { DefaultTrackSelector selector, TrackSelection.Factory adaptiveTrackSelectionFactory) {
this.selector = selector; this.selector = selector;
this.adaptiveTrackSelectionFactory = adaptiveTrackSelectionFactory; this.adaptiveTrackSelectionFactory = adaptiveTrackSelectionFactory;
} }
......
...@@ -668,7 +668,7 @@ public final class ExoPlayerTest { ...@@ -668,7 +668,7 @@ public final class ExoPlayerTest {
.start() .start()
.blockUntilEnded(TIMEOUT_MS); .blockUntilEnded(TIMEOUT_MS);
List<FakeTrackSelection> createdTrackSelections = trackSelector.getSelectedTrackSelections(); List<FakeTrackSelection> createdTrackSelections = trackSelector.getAllTrackSelections();
int numSelectionsEnabled = 0; int numSelectionsEnabled = 0;
// Assert that all tracks selection are disabled at the end of the playback. // Assert that all tracks selection are disabled at the end of the playback.
for (FakeTrackSelection trackSelection : createdTrackSelections) { for (FakeTrackSelection trackSelection : createdTrackSelections) {
...@@ -676,9 +676,7 @@ public final class ExoPlayerTest { ...@@ -676,9 +676,7 @@ public final class ExoPlayerTest {
numSelectionsEnabled += trackSelection.enableCount; numSelectionsEnabled += trackSelection.enableCount;
} }
// There are 2 renderers, and track selections are made once (1 period). // There are 2 renderers, and track selections are made once (1 period).
// Track selections are not reused, so there are 2 track selections made.
assertThat(createdTrackSelections).hasSize(2); assertThat(createdTrackSelections).hasSize(2);
// There should be 2 track selections enabled in total.
assertThat(numSelectionsEnabled).isEqualTo(2); assertThat(numSelectionsEnabled).isEqualTo(2);
} }
...@@ -699,7 +697,7 @@ public final class ExoPlayerTest { ...@@ -699,7 +697,7 @@ public final class ExoPlayerTest {
.start() .start()
.blockUntilEnded(TIMEOUT_MS); .blockUntilEnded(TIMEOUT_MS);
List<FakeTrackSelection> createdTrackSelections = trackSelector.getSelectedTrackSelections(); List<FakeTrackSelection> createdTrackSelections = trackSelector.getAllTrackSelections();
int numSelectionsEnabled = 0; int numSelectionsEnabled = 0;
// Assert that all tracks selection are disabled at the end of the playback. // Assert that all tracks selection are disabled at the end of the playback.
for (FakeTrackSelection trackSelection : createdTrackSelections) { for (FakeTrackSelection trackSelection : createdTrackSelections) {
...@@ -707,9 +705,7 @@ public final class ExoPlayerTest { ...@@ -707,9 +705,7 @@ public final class ExoPlayerTest {
numSelectionsEnabled += trackSelection.enableCount; numSelectionsEnabled += trackSelection.enableCount;
} }
// There are 2 renderers, and track selections are made twice (2 periods). // There are 2 renderers, and track selections are made twice (2 periods).
// Track selections are not reused, so there are 4 track selections made.
assertThat(createdTrackSelections).hasSize(4); assertThat(createdTrackSelections).hasSize(4);
// There should be 4 track selections enabled in total.
assertThat(numSelectionsEnabled).isEqualTo(4); assertThat(numSelectionsEnabled).isEqualTo(4);
} }
...@@ -739,23 +735,21 @@ public final class ExoPlayerTest { ...@@ -739,23 +735,21 @@ public final class ExoPlayerTest {
.start() .start()
.blockUntilEnded(TIMEOUT_MS); .blockUntilEnded(TIMEOUT_MS);
List<FakeTrackSelection> createdTrackSelections = trackSelector.getSelectedTrackSelections(); List<FakeTrackSelection> createdTrackSelections = trackSelector.getAllTrackSelections();
int numSelectionsEnabled = 0; int numSelectionsEnabled = 0;
// Assert that all tracks selection are disabled at the end of the playback. // Assert that all tracks selection are disabled at the end of the playback.
for (FakeTrackSelection trackSelection : createdTrackSelections) { for (FakeTrackSelection trackSelection : createdTrackSelections) {
assertThat(trackSelection.isEnabled).isFalse(); assertThat(trackSelection.isEnabled).isFalse();
numSelectionsEnabled += trackSelection.enableCount; numSelectionsEnabled += trackSelection.enableCount;
} }
// There are 2 renderers, and track selections are made twice. // There are 2 renderers, and track selections are made twice. The second time one renderer is
// Track selections are not reused, so there are 4 track selections made. // disabled, so only one out of the two track selections is enabled.
assertThat(createdTrackSelections).hasSize(4); assertThat(createdTrackSelections).hasSize(4);
// Initially there are 2 track selections enabled.
// The second time one renderer is disabled, so only 1 track selection should be enabled.
assertThat(numSelectionsEnabled).isEqualTo(3); assertThat(numSelectionsEnabled).isEqualTo(3);
} }
@Test @Test
public void testAllActivatedTrackSelectionAreReleasedWhenTrackSelectionsAreUsed() public void testAllActivatedTrackSelectionAreReleasedWhenTrackSelectionsAreReused()
throws Exception { throws Exception {
Timeline timeline = new FakeTimeline(/* windowCount= */ 1); Timeline timeline = new FakeTimeline(/* windowCount= */ 1);
MediaSource mediaSource = MediaSource mediaSource =
...@@ -780,18 +774,17 @@ public final class ExoPlayerTest { ...@@ -780,18 +774,17 @@ public final class ExoPlayerTest {
.start() .start()
.blockUntilEnded(TIMEOUT_MS); .blockUntilEnded(TIMEOUT_MS);
List<FakeTrackSelection> createdTrackSelections = trackSelector.getSelectedTrackSelections(); List<FakeTrackSelection> createdTrackSelections = trackSelector.getAllTrackSelections();
int numSelectionsEnabled = 0; int numSelectionsEnabled = 0;
// Assert that all tracks selection are disabled at the end of the playback. // Assert that all tracks selection are disabled at the end of the playback.
for (FakeTrackSelection trackSelection : createdTrackSelections) { for (FakeTrackSelection trackSelection : createdTrackSelections) {
assertThat(trackSelection.isEnabled).isFalse(); assertThat(trackSelection.isEnabled).isFalse();
numSelectionsEnabled += trackSelection.enableCount; numSelectionsEnabled += trackSelection.enableCount;
} }
// There are 2 renderers, and track selections are made twice. // There are 2 renderers, and track selections are made twice. The second time one renderer is
// TrackSelections are reused, so there are only 2 track selections made for 2 renderers. // disabled, and the selector re-uses the previous selection for the enabled renderer. So we
// expect two track selections, one of which will have been enabled twice.
assertThat(createdTrackSelections).hasSize(2); assertThat(createdTrackSelections).hasSize(2);
// Initially there are 2 track selections enabled.
// The second time one renderer is disabled, so only 1 track selection should be enabled.
assertThat(numSelectionsEnabled).isEqualTo(3); assertThat(numSelectionsEnabled).isEqualTo(3);
} }
......
...@@ -17,10 +17,12 @@ package com.google.android.exoplayer2.trackselection; ...@@ -17,10 +17,12 @@ package com.google.android.exoplayer2.trackselection;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import android.util.Pair;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.RendererConfiguration;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
...@@ -90,25 +92,28 @@ public final class MappingTrackSelectorTest { ...@@ -90,25 +92,28 @@ public final class MappingTrackSelectorTest {
} }
/** /**
* A {@link MappingTrackSelector} that returns a fixed result from * A {@link MappingTrackSelector} that stashes the {@link MappedTrackInfo} passed to {@link
* {@link #selectTracks(RendererCapabilities[], TrackGroupArray[], int[][][])}. * #selectTracks(RendererCapabilities[], MappedTrackInfo)}.
*/ */
private static final class FakeMappingTrackSelector extends MappingTrackSelector { private static final class FakeMappingTrackSelector extends MappingTrackSelector {
private TrackGroupArray[] lastRendererTrackGroupArrays; private MappedTrackInfo lastMappedTrackInfo;
@Override @Override
protected TrackSelection[] selectTracks(RendererCapabilities[] rendererCapabilities, protected Pair<RendererConfiguration[], TrackSelection[]> selectTracks(
TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) RendererCapabilities[] rendererCapabilities, MappedTrackInfo mappedTrackInfo)
throws ExoPlaybackException { throws ExoPlaybackException {
lastRendererTrackGroupArrays = rendererTrackGroupArrays; lastMappedTrackInfo = mappedTrackInfo;
return new TrackSelection[rendererCapabilities.length]; return Pair.create(
new RendererConfiguration[rendererCapabilities.length],
new TrackSelection[rendererCapabilities.length]);
} }
public void assertMappedTrackGroups(int rendererIndex, TrackGroup... expected) { public void assertMappedTrackGroups(int rendererIndex, TrackGroup... expected) {
assertThat(lastRendererTrackGroupArrays[rendererIndex].length).isEqualTo(expected.length); TrackGroupArray rendererTrackGroupArray = lastMappedTrackInfo.getTrackGroups(rendererIndex);
assertThat(rendererTrackGroupArray.length).isEqualTo(expected.length);
for (int i = 0; i < expected.length; i++) { for (int i = 0; i < expected.length; i++) {
assertThat(lastRendererTrackGroupArrays[rendererIndex].get(i)).isEqualTo(expected[i]); assertThat(rendererTrackGroupArray.get(i)).isEqualTo(expected[i]);
} }
} }
......
...@@ -394,25 +394,30 @@ public final class DashTestRunner { ...@@ -394,25 +394,30 @@ public final class DashTestRunner {
} }
@Override @Override
protected TrackSelection[] selectTracks(RendererCapabilities[] rendererCapabilities, protected TrackSelection[] selectAllTracks(
TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) RendererCapabilities[] rendererCapabilities, MappedTrackInfo mappedTrackInfo)
throws ExoPlaybackException { throws ExoPlaybackException {
Assertions.checkState(rendererCapabilities[VIDEO_RENDERER_INDEX].getTrackType() Assertions.checkState(rendererCapabilities[VIDEO_RENDERER_INDEX].getTrackType()
== C.TRACK_TYPE_VIDEO); == C.TRACK_TYPE_VIDEO);
Assertions.checkState(rendererCapabilities[AUDIO_RENDERER_INDEX].getTrackType() Assertions.checkState(rendererCapabilities[AUDIO_RENDERER_INDEX].getTrackType()
== C.TRACK_TYPE_AUDIO); == C.TRACK_TYPE_AUDIO);
Assertions.checkState(rendererTrackGroupArrays[VIDEO_RENDERER_INDEX].length == 1); TrackGroupArray videoTrackGroups = mappedTrackInfo.getTrackGroups(VIDEO_RENDERER_INDEX);
Assertions.checkState(rendererTrackGroupArrays[AUDIO_RENDERER_INDEX].length == 1); TrackGroupArray audioTrackGroups = mappedTrackInfo.getTrackGroups(AUDIO_RENDERER_INDEX);
Assertions.checkState(videoTrackGroups.length == 1);
Assertions.checkState(audioTrackGroups.length == 1);
TrackSelection[] selections = new TrackSelection[rendererCapabilities.length]; TrackSelection[] selections = new TrackSelection[rendererCapabilities.length];
selections[VIDEO_RENDERER_INDEX] = new RandomTrackSelection( selections[VIDEO_RENDERER_INDEX] =
rendererTrackGroupArrays[VIDEO_RENDERER_INDEX].get(0), new RandomTrackSelection(
getVideoTrackIndices(rendererTrackGroupArrays[VIDEO_RENDERER_INDEX].get(0), videoTrackGroups.get(0),
rendererFormatSupports[VIDEO_RENDERER_INDEX][0], videoFormatIds, getVideoTrackIndices(
canIncludeAdditionalVideoFormats), videoTrackGroups.get(0),
0 /* seed */); mappedTrackInfo.getRendererTrackSupport(VIDEO_RENDERER_INDEX)[0],
selections[AUDIO_RENDERER_INDEX] = new FixedTrackSelection( videoFormatIds,
rendererTrackGroupArrays[AUDIO_RENDERER_INDEX].get(0), canIncludeAdditionalVideoFormats),
getTrackIndex(rendererTrackGroupArrays[AUDIO_RENDERER_INDEX].get(0), audioFormatId)); 0 /* seed */);
selections[AUDIO_RENDERER_INDEX] =
new FixedTrackSelection(
audioTrackGroups.get(0), getTrackIndex(audioTrackGroups.get(0), audioFormatId));
includedAdditionalVideoFormats = includedAdditionalVideoFormats =
selections[VIDEO_RENDERER_INDEX].length() > videoFormatIds.length; selections[VIDEO_RENDERER_INDEX].length() > videoFormatIds.length;
return selections; return selections;
......
...@@ -21,14 +21,15 @@ import com.google.android.exoplayer2.RendererCapabilities; ...@@ -21,14 +21,15 @@ import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** A fake {@link DefaultTrackSelector} that returns {@link FakeTrackSelection}s. */ /** A fake {@link MappingTrackSelector} that returns {@link FakeTrackSelection}s. */
public class FakeTrackSelector extends DefaultTrackSelector { public class FakeTrackSelector extends DefaultTrackSelector {
private final List<FakeTrackSelection> selectedTrackSelections = new ArrayList<>(); private final List<FakeTrackSelection> trackSelections = new ArrayList<>();
private final boolean mayReuseTrackSelection; private final boolean mayReuseTrackSelection;
public FakeTrackSelector() { public FakeTrackSelector() {
...@@ -45,39 +46,35 @@ public class FakeTrackSelector extends DefaultTrackSelector { ...@@ -45,39 +46,35 @@ public class FakeTrackSelector extends DefaultTrackSelector {
} }
@Override @Override
protected TrackSelection[] selectTracks( protected TrackSelection[] selectAllTracks(
RendererCapabilities[] rendererCapabilities, RendererCapabilities[] rendererCapabilities, MappedTrackInfo mappedTrackInfo)
TrackGroupArray[] rendererTrackGroupArrays,
int[][][] rendererFormatSupports)
throws ExoPlaybackException { throws ExoPlaybackException {
List<FakeTrackSelection> resultList = new ArrayList<>(); TrackSelection[] selections = new TrackSelection[mappedTrackInfo.length];
for (TrackGroupArray trackGroupArray : rendererTrackGroupArrays) { for (int i = 0; i < mappedTrackInfo.length; i++) {
TrackGroup trackGroup = trackGroupArray.get(0); TrackGroupArray trackGroupArray = mappedTrackInfo.getTrackGroups(i);
FakeTrackSelection trackSelectionForRenderer = reuseOrCreateTrackSelection(trackGroup); boolean hasTracks = trackGroupArray.length > 0;
resultList.add(trackSelectionForRenderer); selections[i] = hasTracks ? reuseOrCreateTrackSelection(trackGroupArray.get(0)) : null;
} }
return resultList.toArray(new TrackSelection[resultList.size()]); return selections;
} }
@NonNull @NonNull
private FakeTrackSelection reuseOrCreateTrackSelection(TrackGroup trackGroup) { private FakeTrackSelection reuseOrCreateTrackSelection(TrackGroup trackGroup) {
FakeTrackSelection trackSelectionForRenderer = null;
if (mayReuseTrackSelection) { if (mayReuseTrackSelection) {
for (FakeTrackSelection selectedTrackSelection : selectedTrackSelections) { for (FakeTrackSelection trackSelection : trackSelections) {
if (selectedTrackSelection.getTrackGroup().equals(trackGroup)) { if (trackSelection.getTrackGroup().equals(trackGroup)) {
trackSelectionForRenderer = selectedTrackSelection; return trackSelection;
} }
} }
} }
if (trackSelectionForRenderer == null) { FakeTrackSelection trackSelection = new FakeTrackSelection(trackGroup);
trackSelectionForRenderer = new FakeTrackSelection(trackGroup); trackSelections.add(trackSelection);
selectedTrackSelections.add(trackSelectionForRenderer); return trackSelection;
}
return trackSelectionForRenderer;
} }
/** Returns list of all {@link FakeTrackSelection}s that this track selector has made so far. */ /** Returns list of all {@link FakeTrackSelection}s that this track selector has made so far. */
public List<FakeTrackSelection> getSelectedTrackSelections() { public List<FakeTrackSelection> getAllTrackSelections() {
return selectedTrackSelections; return trackSelections;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment