mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
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:
parent
0316c03319
commit
0206622370
2 changed files with 105 additions and 62 deletions
|
|
@ -32,6 +32,7 @@ import androidx.media3.common.StreamKey;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackGroup;
|
import androidx.media3.common.TrackGroup;
|
||||||
import androidx.media3.common.TrackGroupArray;
|
import androidx.media3.common.TrackGroupArray;
|
||||||
|
import androidx.media3.common.TrackSelectionOverride;
|
||||||
import androidx.media3.common.TrackSelectionParameters;
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
import androidx.media3.common.util.Assertions;
|
import androidx.media3.common.util.Assertions;
|
||||||
import androidx.media3.common.util.UnstableApi;
|
import androidx.media3.common.util.UnstableApi;
|
||||||
|
|
@ -605,8 +606,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -620,8 +622,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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -652,7 +653,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -689,7 +690,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -716,12 +717,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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -773,8 +774,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);
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package androidx.media3.exoplayer.offline;
|
package androidx.media3.exoplayer.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;
|
||||||
|
|
@ -27,6 +28,8 @@ import androidx.media3.common.StreamKey;
|
||||||
import androidx.media3.common.Timeline;
|
import androidx.media3.common.Timeline;
|
||||||
import androidx.media3.common.TrackGroup;
|
import androidx.media3.common.TrackGroup;
|
||||||
import androidx.media3.common.TrackGroupArray;
|
import androidx.media3.common.TrackGroupArray;
|
||||||
|
import androidx.media3.common.TrackSelectionOverride;
|
||||||
|
import androidx.media3.common.TrackSelectionParameters;
|
||||||
import androidx.media3.exoplayer.Renderer;
|
import androidx.media3.exoplayer.Renderer;
|
||||||
import androidx.media3.exoplayer.RenderersFactory;
|
import androidx.media3.exoplayer.RenderersFactory;
|
||||||
import androidx.media3.exoplayer.offline.DownloadHelper.Callback;
|
import androidx.media3.exoplayer.offline.DownloadHelper.Callback;
|
||||||
|
|
@ -41,7 +44,7 @@ import androidx.media3.test.utils.FakeMediaSource;
|
||||||
import androidx.media3.test.utils.FakeRenderer;
|
import androidx.media3.test.utils.FakeRenderer;
|
||||||
import androidx.media3.test.utils.FakeTimeline;
|
import androidx.media3.test.utils.FakeTimeline;
|
||||||
import androidx.media3.test.utils.FakeTimeline.TimelineWindowDefinition;
|
import androidx.media3.test.utils.FakeTimeline.TimelineWindowDefinition;
|
||||||
import androidx.test.core.app.ApplicationProvider;
|
import androidx.media3.test.utils.TestUtil;
|
||||||
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
import androidx.test.ext.junit.runners.AndroidJUnit4;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -64,12 +67,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;
|
||||||
|
|
@ -81,25 +80,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 =
|
||||||
|
|
@ -127,18 +130,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
|
||||||
|
|
@ -175,7 +174,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);
|
||||||
|
|
@ -187,7 +186,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
|
||||||
|
|
@ -209,11 +208,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
|
||||||
|
|
@ -242,7 +241,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
|
||||||
|
|
@ -250,9 +249,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();
|
||||||
|
|
||||||
|
|
@ -277,7 +276,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
|
||||||
|
|
@ -286,10 +285,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.
|
||||||
|
|
@ -311,11 +310,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
|
||||||
|
|
@ -326,7 +325,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 =
|
||||||
|
|
@ -360,7 +359,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 =
|
||||||
|
|
@ -390,14 +389,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);
|
||||||
|
|
||||||
|
|
@ -408,13 +406,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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue