DownloadHelper: Support multiple track selection overrides

addTrackSelectionForSingleRenderer takes a list of legacy overrides,
which are then set on the supplied parameters one at a time to run
track selection. This allows multiple overrides for a single track
type to be applied in the download use case, despite it not being
possible to place such overrides directly into a single parameters.

For new style overrides, multiple overrides for the same track type
can be placed directly into a single parameters. Therefore we'll be
able to replace use of addTrackSelectionForSingleRenderer with use
of addTrackSelection, which is a much cleaner API. For this to work,
we need to make DownloadHelper apply multiple overrides in this case.

PiperOrigin-RevId: 432459834
This commit is contained in:
olly 2022-03-04 17:06:26 +00:00 committed by Ian Baker
parent 039de75f1f
commit b83c2cb8cb
2 changed files with 105 additions and 62 deletions

View File

@ -50,6 +50,7 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride;
import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.trackselection.ExoTrackSelection;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelectionOverride;
import com.google.android.exoplayer2.trackselection.TrackSelectionParameters; import com.google.android.exoplayer2.trackselection.TrackSelectionParameters;
import com.google.android.exoplayer2.trackselection.TrackSelectorResult; import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
@ -602,8 +603,9 @@ public final class DownloadHelper {
*/ */
public void replaceTrackSelections( public void replaceTrackSelections(
int periodIndex, TrackSelectionParameters trackSelectionParameters) { int periodIndex, TrackSelectionParameters trackSelectionParameters) {
assertPreparedWithMedia();
clearTrackSelections(periodIndex); clearTrackSelections(periodIndex);
addTrackSelection(periodIndex, trackSelectionParameters); addTrackSelectionInternal(periodIndex, trackSelectionParameters);
} }
/** /**
@ -617,8 +619,7 @@ public final class DownloadHelper {
public void addTrackSelection( public void addTrackSelection(
int periodIndex, TrackSelectionParameters trackSelectionParameters) { int periodIndex, TrackSelectionParameters trackSelectionParameters) {
assertPreparedWithMedia(); assertPreparedWithMedia();
trackSelector.setParameters(trackSelectionParameters); addTrackSelectionInternal(periodIndex, trackSelectionParameters);
runTrackSelection(periodIndex);
} }
/** /**
@ -649,7 +650,7 @@ public final class DownloadHelper {
TrackSelectionParameters parameters = TrackSelectionParameters parameters =
parametersBuilder.setPreferredAudioLanguage(language).build(); parametersBuilder.setPreferredAudioLanguage(language).build();
for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) { for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) {
addTrackSelection(periodIndex, parameters); addTrackSelectionInternal(periodIndex, parameters);
} }
} }
} }
@ -686,7 +687,7 @@ public final class DownloadHelper {
TrackSelectionParameters parameters = TrackSelectionParameters parameters =
parametersBuilder.setPreferredTextLanguage(language).build(); parametersBuilder.setPreferredTextLanguage(language).build();
for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) { for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) {
addTrackSelection(periodIndex, parameters); addTrackSelectionInternal(periodIndex, parameters);
} }
} }
} }
@ -713,12 +714,12 @@ public final class DownloadHelper {
builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ i != rendererIndex); builder.setRendererDisabled(/* rendererIndex= */ i, /* disabled= */ i != rendererIndex);
} }
if (overrides.isEmpty()) { if (overrides.isEmpty()) {
addTrackSelection(periodIndex, builder.build()); addTrackSelectionInternal(periodIndex, builder.build());
} else { } else {
TrackGroupArray trackGroupArray = mappedTrackInfos[periodIndex].getTrackGroups(rendererIndex); TrackGroupArray trackGroupArray = mappedTrackInfos[periodIndex].getTrackGroups(rendererIndex);
for (int i = 0; i < overrides.size(); i++) { for (int i = 0; i < overrides.size(); i++) {
builder.setSelectionOverride(rendererIndex, trackGroupArray, overrides.get(i)); builder.setSelectionOverride(rendererIndex, trackGroupArray, overrides.get(i));
addTrackSelection(periodIndex, builder.build()); addTrackSelectionInternal(periodIndex, builder.build());
} }
} }
} }
@ -770,8 +771,28 @@ public final class DownloadHelper {
return requestBuilder.setStreamKeys(streamKeys).build(); return requestBuilder.setStreamKeys(streamKeys).build();
} }
// Initialization of array of Lists. @RequiresNonNull({
@SuppressWarnings("unchecked") "trackGroupArrays",
"trackSelectionsByPeriodAndRenderer",
"mediaPreparer",
"mediaPreparer.timeline"
})
private void addTrackSelectionInternal(
int periodIndex, TrackSelectionParameters trackSelectionParameters) {
trackSelector.setParameters(trackSelectionParameters);
runTrackSelection(periodIndex);
// TrackSelectionParameters can contain multiple overrides for each track type. The track
// selector will only use one of them (because it's designed for playback), but for downloads we
// want to use all of them. Run selection again with each override being the only one of its
// type, to ensure that all of the desired tracks are included.
for (TrackSelectionOverride override : trackSelectionParameters.overrides.values()) {
trackSelector.setParameters(
trackSelectionParameters.buildUpon().setOverrideForType(override).build());
runTrackSelection(periodIndex);
}
}
@SuppressWarnings("unchecked") // Initialization of array of Lists.
private void onMediaPrepared() { private void onMediaPrepared() {
checkNotNull(mediaPreparer); checkNotNull(mediaPreparer);
checkNotNull(mediaPreparer.mediaPeriods); checkNotNull(mediaPreparer.mediaPeriods);

View File

@ -15,11 +15,11 @@
*/ */
package com.google.android.exoplayer2.offline; package com.google.android.exoplayer2.offline;
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper; import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
@ -37,9 +37,12 @@ import com.google.android.exoplayer2.testutil.FakeMediaSource;
import com.google.android.exoplayer2.testutil.FakeRenderer; import com.google.android.exoplayer2.testutil.FakeRenderer;
import com.google.android.exoplayer2.testutil.FakeTimeline; import com.google.android.exoplayer2.testutil.FakeTimeline;
import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition; import com.google.android.exoplayer2.testutil.FakeTimeline.TimelineWindowDefinition;
import com.google.android.exoplayer2.testutil.TestUtil;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.trackselection.ExoTrackSelection;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo; import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
import com.google.android.exoplayer2.trackselection.TrackSelectionOverride;
import com.google.android.exoplayer2.trackselection.TrackSelectionParameters;
import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Allocator;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import java.io.IOException; import java.io.IOException;
@ -63,12 +66,8 @@ public class DownloadHelperTest {
new Object[] {TEST_MANIFEST}, new Object[] {TEST_MANIFEST},
new TimelineWindowDefinition(/* periodCount= */ 2, /* id= */ new Object())); new TimelineWindowDefinition(/* periodCount= */ 2, /* id= */ new Object()));
private static final Format VIDEO_FORMAT_LOW = createVideoFormat(/* bitrate= */ 200_000); private static TrackGroup trackGroupVideoLow;
private static final Format VIDEO_FORMAT_HIGH = createVideoFormat(/* bitrate= */ 800_000); private static TrackGroup trackGroupVideoLowAndHigh;
private static final TrackGroup TRACK_GROUP_VIDEO_BOTH =
new TrackGroup(VIDEO_FORMAT_LOW, VIDEO_FORMAT_HIGH);
private static final TrackGroup TRACK_GROUP_VIDEO_SINGLE = new TrackGroup(VIDEO_FORMAT_LOW);
private static TrackGroup trackGroupAudioUs; private static TrackGroup trackGroupAudioUs;
private static TrackGroup trackGroupAudioZh; private static TrackGroup trackGroupAudioZh;
private static TrackGroup trackGroupTextUs; private static TrackGroup trackGroupTextUs;
@ -80,25 +79,29 @@ public class DownloadHelperTest {
@BeforeClass @BeforeClass
public static void staticSetUp() { public static void staticSetUp() {
Format audioFormatUs = createAudioFormat(/* language= */ "US"); Format videoFormatLow = createVideoFormat(/* bitrate= */ 200_000);
Format audioFormatZh = createAudioFormat(/* language= */ "ZH"); Format videoFormatHigh = createVideoFormat(/* bitrate= */ 800_000);
Format textFormatUs = createTextFormat(/* language= */ "US"); Format audioFormatEn = createAudioFormat(/* language= */ "en");
Format textFormatZh = createTextFormat(/* language= */ "ZH"); Format audioFormatDe = createAudioFormat(/* language= */ "de");
Format textFormatEn = createTextFormat(/* language= */ "en");
Format textFormatDe = createTextFormat(/* language= */ "de");
trackGroupAudioUs = new TrackGroup(audioFormatUs); trackGroupVideoLow = new TrackGroup(videoFormatLow);
trackGroupAudioZh = new TrackGroup(audioFormatZh); trackGroupVideoLowAndHigh = new TrackGroup(videoFormatLow, videoFormatHigh);
trackGroupTextUs = new TrackGroup(textFormatUs); trackGroupAudioUs = new TrackGroup(audioFormatEn);
trackGroupTextZh = new TrackGroup(textFormatZh); trackGroupAudioZh = new TrackGroup(audioFormatDe);
trackGroupTextUs = new TrackGroup(textFormatEn);
trackGroupTextZh = new TrackGroup(textFormatDe);
TrackGroupArray trackGroupArrayAll = TrackGroupArray trackGroupArrayAll =
new TrackGroupArray( new TrackGroupArray(
TRACK_GROUP_VIDEO_BOTH, trackGroupVideoLowAndHigh,
trackGroupAudioUs, trackGroupAudioUs,
trackGroupAudioZh, trackGroupAudioZh,
trackGroupTextUs, trackGroupTextUs,
trackGroupTextZh); trackGroupTextZh);
TrackGroupArray trackGroupArraySingle = TrackGroupArray trackGroupArraySingle =
new TrackGroupArray(TRACK_GROUP_VIDEO_SINGLE, trackGroupAudioUs); new TrackGroupArray(trackGroupVideoLow, trackGroupAudioUs);
trackGroupArrays = new TrackGroupArray[] {trackGroupArrayAll, trackGroupArraySingle}; trackGroupArrays = new TrackGroupArray[] {trackGroupArrayAll, trackGroupArraySingle};
testMediaItem = testMediaItem =
@ -126,18 +129,14 @@ public class DownloadHelperTest {
public void getManifest_returnsManifest() throws Exception { public void getManifest_returnsManifest() throws Exception {
prepareDownloadHelper(downloadHelper); prepareDownloadHelper(downloadHelper);
Object manifest = downloadHelper.getManifest(); assertThat(downloadHelper.getManifest()).isEqualTo(TEST_MANIFEST);
assertThat(manifest).isEqualTo(TEST_MANIFEST);
} }
@Test @Test
public void getPeriodCount_returnsPeriodCount() throws Exception { public void getPeriodCount_returnsPeriodCount() throws Exception {
prepareDownloadHelper(downloadHelper); prepareDownloadHelper(downloadHelper);
int periodCount = downloadHelper.getPeriodCount(); assertThat(downloadHelper.getPeriodCount()).isEqualTo(2);
assertThat(periodCount).isEqualTo(2);
} }
@Test @Test
@ -174,7 +173,7 @@ public class DownloadHelperTest {
assertThat(mappedTracks0.getTrackGroups(/* rendererIndex= */ 1).get(/* index= */ 1)) assertThat(mappedTracks0.getTrackGroups(/* rendererIndex= */ 1).get(/* index= */ 1))
.isEqualTo(trackGroupAudioZh); .isEqualTo(trackGroupAudioZh);
assertThat(mappedTracks0.getTrackGroups(/* rendererIndex= */ 2).get(/* index= */ 0)) assertThat(mappedTracks0.getTrackGroups(/* rendererIndex= */ 2).get(/* index= */ 0))
.isEqualTo(TRACK_GROUP_VIDEO_BOTH); .isEqualTo(trackGroupVideoLowAndHigh);
assertThat(mappedTracks1.getRendererCount()).isEqualTo(3); assertThat(mappedTracks1.getRendererCount()).isEqualTo(3);
assertThat(mappedTracks1.getRendererType(/* rendererIndex= */ 0)).isEqualTo(C.TRACK_TYPE_TEXT); assertThat(mappedTracks1.getRendererType(/* rendererIndex= */ 0)).isEqualTo(C.TRACK_TYPE_TEXT);
@ -186,7 +185,7 @@ public class DownloadHelperTest {
assertThat(mappedTracks1.getTrackGroups(/* rendererIndex= */ 1).get(/* index= */ 0)) assertThat(mappedTracks1.getTrackGroups(/* rendererIndex= */ 1).get(/* index= */ 0))
.isEqualTo(trackGroupAudioUs); .isEqualTo(trackGroupAudioUs);
assertThat(mappedTracks1.getTrackGroups(/* rendererIndex= */ 2).get(/* index= */ 0)) assertThat(mappedTracks1.getTrackGroups(/* rendererIndex= */ 2).get(/* index= */ 0))
.isEqualTo(TRACK_GROUP_VIDEO_SINGLE); .isEqualTo(trackGroupVideoLow);
} }
@Test @Test
@ -208,11 +207,11 @@ public class DownloadHelperTest {
assertSingleTrackSelectionEquals(selectedText0, trackGroupTextUs, 0); assertSingleTrackSelectionEquals(selectedText0, trackGroupTextUs, 0);
assertSingleTrackSelectionEquals(selectedAudio0, trackGroupAudioUs, 0); assertSingleTrackSelectionEquals(selectedAudio0, trackGroupAudioUs, 0);
assertSingleTrackSelectionEquals(selectedVideo0, TRACK_GROUP_VIDEO_BOTH, 1); assertSingleTrackSelectionEquals(selectedVideo0, trackGroupVideoLowAndHigh, 1);
assertThat(selectedText1).isEmpty(); assertThat(selectedText1).isEmpty();
assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0); assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0);
assertSingleTrackSelectionEquals(selectedVideo1, TRACK_GROUP_VIDEO_SINGLE, 0); assertSingleTrackSelectionEquals(selectedVideo1, trackGroupVideoLow, 0);
} }
@Test @Test
@ -241,7 +240,7 @@ public class DownloadHelperTest {
// Verify // Verify
assertThat(selectedText1).isEmpty(); assertThat(selectedText1).isEmpty();
assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0); assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0);
assertSingleTrackSelectionEquals(selectedVideo1, TRACK_GROUP_VIDEO_SINGLE, 0); assertSingleTrackSelectionEquals(selectedVideo1, trackGroupVideoLow, 0);
} }
@Test @Test
@ -249,9 +248,9 @@ public class DownloadHelperTest {
throws Exception { throws Exception {
prepareDownloadHelper(downloadHelper); prepareDownloadHelper(downloadHelper);
DefaultTrackSelector.Parameters parameters = DefaultTrackSelector.Parameters parameters =
new DefaultTrackSelector.ParametersBuilder(ApplicationProvider.getApplicationContext()) new DefaultTrackSelector.ParametersBuilder(getApplicationContext())
.setPreferredAudioLanguage("ZH") .setPreferredAudioLanguage("de")
.setPreferredTextLanguage("ZH") .setPreferredTextLanguage("de")
.setRendererDisabled(/* rendererIndex= */ 2, true) .setRendererDisabled(/* rendererIndex= */ 2, true)
.build(); .build();
@ -276,7 +275,7 @@ public class DownloadHelperTest {
assertThat(selectedText1).isEmpty(); assertThat(selectedText1).isEmpty();
assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0); assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0);
assertSingleTrackSelectionEquals(selectedVideo1, TRACK_GROUP_VIDEO_SINGLE, 0); assertSingleTrackSelectionEquals(selectedVideo1, trackGroupVideoLow, 0);
} }
@Test @Test
@ -285,10 +284,10 @@ public class DownloadHelperTest {
prepareDownloadHelper(downloadHelper); prepareDownloadHelper(downloadHelper);
// Select parameters to require some merging of track groups because the new parameters add // Select parameters to require some merging of track groups because the new parameters add
// all video tracks to initial video single track selection. // all video tracks to initial video single track selection.
DefaultTrackSelector.Parameters parameters = TrackSelectionParameters parameters =
new DefaultTrackSelector.ParametersBuilder(ApplicationProvider.getApplicationContext()) new TrackSelectionParameters.Builder(getApplicationContext())
.setPreferredAudioLanguage("ZH") .setPreferredAudioLanguage("de")
.setPreferredTextLanguage("US") .setPreferredTextLanguage("en")
.build(); .build();
// Add only to one period selection to verify second period selection is untouched. // Add only to one period selection to verify second period selection is untouched.
@ -310,11 +309,11 @@ public class DownloadHelperTest {
assertThat(selectedAudio0).hasSize(2); assertThat(selectedAudio0).hasSize(2);
assertTrackSelectionEquals(selectedAudio0.get(0), trackGroupAudioUs, 0); assertTrackSelectionEquals(selectedAudio0.get(0), trackGroupAudioUs, 0);
assertTrackSelectionEquals(selectedAudio0.get(1), trackGroupAudioZh, 0); assertTrackSelectionEquals(selectedAudio0.get(1), trackGroupAudioZh, 0);
assertSingleTrackSelectionEquals(selectedVideo0, TRACK_GROUP_VIDEO_BOTH, 0, 1); assertSingleTrackSelectionEquals(selectedVideo0, trackGroupVideoLowAndHigh, 0, 1);
assertThat(selectedText1).isEmpty(); assertThat(selectedText1).isEmpty();
assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0); assertSingleTrackSelectionEquals(selectedAudio1, trackGroupAudioUs, 0);
assertSingleTrackSelectionEquals(selectedVideo1, TRACK_GROUP_VIDEO_SINGLE, 0); assertSingleTrackSelectionEquals(selectedVideo1, trackGroupVideoLow, 0);
} }
@Test @Test
@ -325,7 +324,7 @@ public class DownloadHelperTest {
downloadHelper.clearTrackSelections(/* periodIndex= */ 1); downloadHelper.clearTrackSelections(/* periodIndex= */ 1);
// Add a non-default language, and a non-existing language (which will select the default). // Add a non-default language, and a non-existing language (which will select the default).
downloadHelper.addAudioLanguagesToSelection("ZH", "Klingonese"); downloadHelper.addAudioLanguagesToSelection("de", "Klingonese");
List<ExoTrackSelection> selectedText0 = List<ExoTrackSelection> selectedText0 =
downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 0); downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 0);
List<ExoTrackSelection> selectedAudio0 = List<ExoTrackSelection> selectedAudio0 =
@ -359,7 +358,7 @@ public class DownloadHelperTest {
// Add a non-default language, and a non-existing language (which will select the default). // Add a non-default language, and a non-existing language (which will select the default).
downloadHelper.addTextLanguagesToSelection( downloadHelper.addTextLanguagesToSelection(
/* selectUndeterminedTextLanguage= */ true, "ZH", "Klingonese"); /* selectUndeterminedTextLanguage= */ true, "de", "Klingonese");
List<ExoTrackSelection> selectedText0 = List<ExoTrackSelection> selectedText0 =
downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 0); downloadHelper.getTrackSelections(/* periodIndex= */ 0, /* rendererIndex= */ 0);
List<ExoTrackSelection> selectedAudio0 = List<ExoTrackSelection> selectedAudio0 =
@ -389,14 +388,13 @@ public class DownloadHelperTest {
prepareDownloadHelper(downloadHelper); prepareDownloadHelper(downloadHelper);
// Ensure we have track groups with multiple indices, renderers with multiple track groups and // Ensure we have track groups with multiple indices, renderers with multiple track groups and
// also renderers without any track groups. // also renderers without any track groups.
DefaultTrackSelector.Parameters parameters = TrackSelectionParameters parameters =
new DefaultTrackSelector.ParametersBuilder(ApplicationProvider.getApplicationContext()) new TrackSelectionParameters.Builder(getApplicationContext())
.setPreferredAudioLanguage("ZH") .setPreferredAudioLanguage("de")
.setPreferredTextLanguage("US") .setPreferredTextLanguage("en")
.build(); .build();
downloadHelper.addTrackSelection(/* periodIndex= */ 0, parameters); downloadHelper.addTrackSelection(/* periodIndex= */ 0, parameters);
byte[] data = new byte[10]; byte[] data = TestUtil.buildTestData(10);
Arrays.fill(data, (byte) 123);
DownloadRequest downloadRequest = downloadHelper.getDownloadRequest(data); DownloadRequest downloadRequest = downloadHelper.getDownloadRequest(data);
@ -407,13 +405,37 @@ public class DownloadHelperTest {
assertThat(downloadRequest.data).isEqualTo(data); assertThat(downloadRequest.data).isEqualTo(data);
assertThat(downloadRequest.streamKeys) assertThat(downloadRequest.streamKeys)
.containsExactly( .containsExactly(
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 0, /* trackIndex= */ 0), new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 0, /* streamIndex= */ 0),
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 0, /* trackIndex= */ 1), new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 0, /* streamIndex= */ 1),
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* trackIndex= */ 0), new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* streamIndex= */ 0),
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 2, /* trackIndex= */ 0), new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 2, /* streamIndex= */ 0),
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 3, /* trackIndex= */ 0), new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 3, /* streamIndex= */ 0),
new StreamKey(/* periodIndex= */ 1, /* groupIndex= */ 0, /* trackIndex= */ 0), new StreamKey(/* periodIndex= */ 1, /* groupIndex= */ 0, /* streamIndex= */ 0),
new StreamKey(/* periodIndex= */ 1, /* groupIndex= */ 1, /* trackIndex= */ 0)); new StreamKey(/* periodIndex= */ 1, /* groupIndex= */ 1, /* streamIndex= */ 0));
}
@Test
public void getDownloadRequest_createsDownloadRequest_withMultipleOverridesOfSameType()
throws Exception {
prepareDownloadHelper(downloadHelper);
TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext())
.addOverride(new TrackSelectionOverride(trackGroupAudioUs, /* trackIndex= */ 0))
.addOverride(new TrackSelectionOverride(trackGroupAudioZh, /* trackIndex= */ 0))
.setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, /* disabled= */ true)
.build();
downloadHelper.replaceTrackSelections(/* periodIndex= */ 0, parameters);
downloadHelper.clearTrackSelections(/* periodIndex= */ 1);
DownloadRequest downloadRequest = downloadHelper.getDownloadRequest(/* data= */ null);
assertThat(downloadRequest.streamKeys)
.containsExactly(
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 1, /* streamIndex= */ 0),
new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 2, /* streamIndex= */ 0));
} }
private static void prepareDownloadHelper(DownloadHelper downloadHelper) throws Exception { private static void prepareDownloadHelper(DownloadHelper downloadHelper) throws Exception {