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