Commit b83c2cb8 by olly Committed by Ian Baker

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
parent 039de75f
...@@ -50,6 +50,7 @@ import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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);
......
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