DownloadHelper: Accept generic TrackSelectionParameters
DownloadHelper is in the ExoPlayer module, so there's no reason why it can't use ExoPlayer specific track selections. That said, we want our UI components to operate on generic TrackSelectionParameters, and we want such UI components to be useful for selecting tracks for download. To keep this interop, it's necessary to have DownloadHelper accept generic TrackSelectionParameters, or to require application code to convert them. The first approach seems preferable! PiperOrigin-RevId: 432158846
This commit is contained in:
parent
733cd609a0
commit
2cb2f6ded4
@ -31,6 +31,11 @@
|
||||
instead. You can also continue to use `ExoPlayer.getCurrentTrackGroups`
|
||||
and `ExoPlayer.getCurrentTrackSelections`, although these methods remain
|
||||
deprecated.
|
||||
* Remove `DownloadHelper`
|
||||
`DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT` and
|
||||
`DEFAULT_TRACK_SELECTOR_PARAMETERS` constants. Use
|
||||
`getDefaultTrackSelectorParameters(Context)` instead when possible, and
|
||||
`DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT` otherwise.
|
||||
|
||||
### 2.17.0 (2022-02-24)
|
||||
|
||||
|
@ -47,10 +47,10 @@ import com.google.android.exoplayer2.source.chunk.MediaChunk;
|
||||
import com.google.android.exoplayer2.source.chunk.MediaChunkIterator;
|
||||
import com.google.android.exoplayer2.trackselection.BaseTrackSelection;
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.Parameters;
|
||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector.SelectionOverride;
|
||||
import com.google.android.exoplayer2.trackselection.ExoTrackSelection;
|
||||
import com.google.android.exoplayer2.trackselection.MappingTrackSelector.MappedTrackInfo;
|
||||
import com.google.android.exoplayer2.trackselection.TrackSelectionParameters;
|
||||
import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
|
||||
import com.google.android.exoplayer2.upstream.Allocator;
|
||||
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
||||
@ -83,8 +83,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
* <li>Prepare the helper using {@link #prepare(Callback)} and wait for the callback.
|
||||
* <li>Optional: Inspect the selected tracks using {@link #getMappedTrackInfo(int)} and {@link
|
||||
* #getTrackSelections(int, int)}, and make adjustments using {@link
|
||||
* #clearTrackSelections(int)}, {@link #replaceTrackSelections(int, Parameters)} and {@link
|
||||
* #addTrackSelection(int, Parameters)}.
|
||||
* #clearTrackSelections(int)}, {@link #replaceTrackSelections(int, TrackSelectionParameters)}
|
||||
* and {@link #addTrackSelection(int, TrackSelectionParameters)}.
|
||||
* <li>Create a download request for the selected track using {@link #getDownloadRequest(byte[])}.
|
||||
* <li>Release the helper using {@link #release()}.
|
||||
* </ol>
|
||||
@ -97,30 +97,18 @@ public final class DownloadHelper {
|
||||
*
|
||||
* <p>If possible, use {@link #getDefaultTrackSelectorParameters(Context)} instead.
|
||||
*
|
||||
* @see Parameters#DEFAULT_WITHOUT_CONTEXT
|
||||
* @see DefaultTrackSelector.Parameters#DEFAULT_WITHOUT_CONTEXT
|
||||
*/
|
||||
public static final Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT =
|
||||
Parameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setForceHighestSupportedBitrate(true).build();
|
||||
|
||||
/**
|
||||
* @deprecated This instance does not have {@link Context} constraints. Use {@link
|
||||
* #getDefaultTrackSelectorParameters(Context)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public static final Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT =
|
||||
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT;
|
||||
|
||||
/**
|
||||
* @deprecated This instance does not have {@link Context} constraints. Use {@link
|
||||
* #getDefaultTrackSelectorParameters(Context)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public static final DefaultTrackSelector.Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS =
|
||||
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT;
|
||||
public static final DefaultTrackSelector.Parameters
|
||||
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT =
|
||||
DefaultTrackSelector.Parameters.DEFAULT_WITHOUT_CONTEXT
|
||||
.buildUpon()
|
||||
.setForceHighestSupportedBitrate(true)
|
||||
.build();
|
||||
|
||||
/** Returns the default parameters used for track selection for downloading. */
|
||||
public static DefaultTrackSelector.Parameters getDefaultTrackSelectorParameters(Context context) {
|
||||
return Parameters.getDefaults(context)
|
||||
return DefaultTrackSelector.Parameters.getDefaults(context)
|
||||
.buildUpon()
|
||||
.setForceHighestSupportedBitrate(true)
|
||||
.build();
|
||||
@ -188,7 +176,7 @@ public final class DownloadHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory)} instead.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@ -207,7 +195,7 @@ public final class DownloadHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory, DrmSessionManager)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@ -216,17 +204,17 @@ public final class DownloadHelper {
|
||||
DataSource.Factory dataSourceFactory,
|
||||
RenderersFactory renderersFactory,
|
||||
@Nullable DrmSessionManager drmSessionManager,
|
||||
DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||
TrackSelectionParameters trackSelectionParameters) {
|
||||
return forMediaItem(
|
||||
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_MPD).build(),
|
||||
trackSelectorParameters,
|
||||
trackSelectionParameters,
|
||||
renderersFactory,
|
||||
dataSourceFactory,
|
||||
drmSessionManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory)} instead.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@ -245,7 +233,7 @@ public final class DownloadHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory, DrmSessionManager)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@ -254,17 +242,17 @@ public final class DownloadHelper {
|
||||
DataSource.Factory dataSourceFactory,
|
||||
RenderersFactory renderersFactory,
|
||||
@Nullable DrmSessionManager drmSessionManager,
|
||||
DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||
TrackSelectionParameters trackSelectionParameters) {
|
||||
return forMediaItem(
|
||||
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_M3U8).build(),
|
||||
trackSelectorParameters,
|
||||
trackSelectionParameters,
|
||||
renderersFactory,
|
||||
dataSourceFactory,
|
||||
drmSessionManager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory)} instead.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@ -280,7 +268,7 @@ public final class DownloadHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory)} instead.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
@ -299,7 +287,7 @@ public final class DownloadHelper {
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory,
|
||||
* @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory,
|
||||
* DataSource.Factory, DrmSessionManager)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@ -308,10 +296,10 @@ public final class DownloadHelper {
|
||||
DataSource.Factory dataSourceFactory,
|
||||
RenderersFactory renderersFactory,
|
||||
@Nullable DrmSessionManager drmSessionManager,
|
||||
DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||
TrackSelectionParameters trackSelectionParameters) {
|
||||
return forMediaItem(
|
||||
new MediaItem.Builder().setUri(uri).setMimeType(MimeTypes.APPLICATION_SS).build(),
|
||||
trackSelectorParameters,
|
||||
trackSelectionParameters,
|
||||
renderersFactory,
|
||||
dataSourceFactory,
|
||||
drmSessionManager);
|
||||
@ -369,7 +357,7 @@ public final class DownloadHelper {
|
||||
* @param mediaItem A {@link MediaItem}.
|
||||
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||
* selected.
|
||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||
* @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
|
||||
* downloading.
|
||||
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
|
||||
* streams. This argument is required for adaptive streams and ignored for progressive
|
||||
@ -381,12 +369,12 @@ public final class DownloadHelper {
|
||||
*/
|
||||
public static DownloadHelper forMediaItem(
|
||||
MediaItem mediaItem,
|
||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
||||
TrackSelectionParameters trackSelectionParameters,
|
||||
@Nullable RenderersFactory renderersFactory,
|
||||
@Nullable DataSource.Factory dataSourceFactory) {
|
||||
return forMediaItem(
|
||||
mediaItem,
|
||||
trackSelectorParameters,
|
||||
trackSelectionParameters,
|
||||
renderersFactory,
|
||||
dataSourceFactory,
|
||||
/* drmSessionManager= */ null);
|
||||
@ -398,7 +386,7 @@ public final class DownloadHelper {
|
||||
* @param mediaItem A {@link MediaItem}.
|
||||
* @param renderersFactory A {@link RenderersFactory} creating the renderers for which tracks are
|
||||
* selected.
|
||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||
* @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
|
||||
* downloading.
|
||||
* @param dataSourceFactory A {@link DataSource.Factory} used to load the manifest for adaptive
|
||||
* streams. This argument is required for adaptive streams and ignored for progressive
|
||||
@ -412,7 +400,7 @@ public final class DownloadHelper {
|
||||
*/
|
||||
public static DownloadHelper forMediaItem(
|
||||
MediaItem mediaItem,
|
||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
||||
TrackSelectionParameters trackSelectionParameters,
|
||||
@Nullable RenderersFactory renderersFactory,
|
||||
@Nullable DataSource.Factory dataSourceFactory,
|
||||
@Nullable DrmSessionManager drmSessionManager) {
|
||||
@ -424,7 +412,7 @@ public final class DownloadHelper {
|
||||
? null
|
||||
: createMediaSourceInternal(
|
||||
mediaItem, castNonNull(dataSourceFactory), drmSessionManager),
|
||||
trackSelectorParameters,
|
||||
trackSelectionParameters,
|
||||
renderersFactory != null
|
||||
? getRendererCapabilities(renderersFactory)
|
||||
: new RendererCapabilities[0]);
|
||||
@ -480,7 +468,7 @@ public final class DownloadHelper {
|
||||
* @param mediaItem The media item.
|
||||
* @param mediaSource A {@link MediaSource} for which tracks are selected, or null if no track
|
||||
* selection needs to be made.
|
||||
* @param trackSelectorParameters {@link DefaultTrackSelector.Parameters} for selecting tracks for
|
||||
* @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for
|
||||
* downloading.
|
||||
* @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks
|
||||
* are selected.
|
||||
@ -488,12 +476,12 @@ public final class DownloadHelper {
|
||||
public DownloadHelper(
|
||||
MediaItem mediaItem,
|
||||
@Nullable MediaSource mediaSource,
|
||||
DefaultTrackSelector.Parameters trackSelectorParameters,
|
||||
TrackSelectionParameters trackSelectionParameters,
|
||||
RendererCapabilities[] rendererCapabilities) {
|
||||
this.localConfiguration = checkNotNull(mediaItem.localConfiguration);
|
||||
this.mediaSource = mediaSource;
|
||||
this.trackSelector =
|
||||
new DefaultTrackSelector(trackSelectorParameters, new DownloadTrackSelection.Factory());
|
||||
new DefaultTrackSelector(trackSelectionParameters, new DownloadTrackSelection.Factory());
|
||||
this.rendererCapabilities = rendererCapabilities;
|
||||
this.scratchSet = new SparseIntArray();
|
||||
trackSelector.init(/* listener= */ () -> {}, new FakeBandwidthMeter());
|
||||
@ -609,13 +597,13 @@ public final class DownloadHelper {
|
||||
* completes.
|
||||
*
|
||||
* @param periodIndex The period index for which the track selection is replaced.
|
||||
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new
|
||||
* @param trackSelectionParameters The {@link TrackSelectionParameters} to obtain the new
|
||||
* selection of tracks.
|
||||
*/
|
||||
public void replaceTrackSelections(
|
||||
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||
int periodIndex, TrackSelectionParameters trackSelectionParameters) {
|
||||
clearTrackSelections(periodIndex);
|
||||
addTrackSelection(periodIndex, trackSelectorParameters);
|
||||
addTrackSelection(periodIndex, trackSelectionParameters);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -623,13 +611,13 @@ public final class DownloadHelper {
|
||||
* completes.
|
||||
*
|
||||
* @param periodIndex The period index this track selection is added for.
|
||||
* @param trackSelectorParameters The {@link DefaultTrackSelector.Parameters} to obtain the new
|
||||
* @param trackSelectionParameters The {@link TrackSelectionParameters} to obtain the new
|
||||
* selection of tracks.
|
||||
*/
|
||||
public void addTrackSelection(
|
||||
int periodIndex, DefaultTrackSelector.Parameters trackSelectorParameters) {
|
||||
int periodIndex, TrackSelectionParameters trackSelectionParameters) {
|
||||
assertPreparedWithMedia();
|
||||
trackSelector.setParameters(trackSelectorParameters);
|
||||
trackSelector.setParameters(trackSelectionParameters);
|
||||
runTrackSelection(periodIndex);
|
||||
}
|
||||
|
||||
@ -643,19 +631,25 @@ public final class DownloadHelper {
|
||||
*/
|
||||
public void addAudioLanguagesToSelection(String... languages) {
|
||||
assertPreparedWithMedia();
|
||||
for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) {
|
||||
DefaultTrackSelector.ParametersBuilder parametersBuilder =
|
||||
|
||||
TrackSelectionParameters.Builder parametersBuilder =
|
||||
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon();
|
||||
MappedTrackInfo mappedTrackInfo = mappedTrackInfos[periodIndex];
|
||||
int rendererCount = mappedTrackInfo.getRendererCount();
|
||||
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
|
||||
if (mappedTrackInfo.getRendererType(rendererIndex) != C.TRACK_TYPE_AUDIO) {
|
||||
parametersBuilder.setRendererDisabled(rendererIndex, /* disabled= */ true);
|
||||
}
|
||||
// Prefer highest supported bitrate for downloads.
|
||||
parametersBuilder.setForceHighestSupportedBitrate(true);
|
||||
// Disable all non-audio track types supported by the renderers.
|
||||
for (RendererCapabilities capabilities : rendererCapabilities) {
|
||||
@C.TrackType int trackType = capabilities.getTrackType();
|
||||
parametersBuilder.setTrackTypeDisabled(
|
||||
trackType, /* disabled= */ trackType != C.TRACK_TYPE_AUDIO);
|
||||
}
|
||||
|
||||
// Add a track selection to each period for each of the languages.
|
||||
int periodCount = getPeriodCount();
|
||||
for (String language : languages) {
|
||||
parametersBuilder.setPreferredAudioLanguage(language);
|
||||
addTrackSelection(periodIndex, parametersBuilder.build());
|
||||
TrackSelectionParameters parameters =
|
||||
parametersBuilder.setPreferredAudioLanguage(language).build();
|
||||
for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) {
|
||||
addTrackSelection(periodIndex, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -673,20 +667,26 @@ public final class DownloadHelper {
|
||||
public void addTextLanguagesToSelection(
|
||||
boolean selectUndeterminedTextLanguage, String... languages) {
|
||||
assertPreparedWithMedia();
|
||||
for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) {
|
||||
DefaultTrackSelector.ParametersBuilder parametersBuilder =
|
||||
|
||||
TrackSelectionParameters.Builder parametersBuilder =
|
||||
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon();
|
||||
MappedTrackInfo mappedTrackInfo = mappedTrackInfos[periodIndex];
|
||||
int rendererCount = mappedTrackInfo.getRendererCount();
|
||||
for (int rendererIndex = 0; rendererIndex < rendererCount; rendererIndex++) {
|
||||
if (mappedTrackInfo.getRendererType(rendererIndex) != C.TRACK_TYPE_TEXT) {
|
||||
parametersBuilder.setRendererDisabled(rendererIndex, /* disabled= */ true);
|
||||
}
|
||||
}
|
||||
parametersBuilder.setSelectUndeterminedTextLanguage(selectUndeterminedTextLanguage);
|
||||
// Prefer highest supported bitrate for downloads.
|
||||
parametersBuilder.setForceHighestSupportedBitrate(true);
|
||||
// Disable all non-text track types supported by the renderers.
|
||||
for (RendererCapabilities capabilities : rendererCapabilities) {
|
||||
@C.TrackType int trackType = capabilities.getTrackType();
|
||||
parametersBuilder.setTrackTypeDisabled(
|
||||
trackType, /* disabled= */ trackType != C.TRACK_TYPE_TEXT);
|
||||
}
|
||||
|
||||
// Add a track selection to each period for each of the languages.
|
||||
int periodCount = getPeriodCount();
|
||||
for (String language : languages) {
|
||||
parametersBuilder.setPreferredTextLanguage(language);
|
||||
addTrackSelection(periodIndex, parametersBuilder.build());
|
||||
TrackSelectionParameters parameters =
|
||||
parametersBuilder.setPreferredTextLanguage(language).build();
|
||||
for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) {
|
||||
addTrackSelection(periodIndex, parameters);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1516,13 +1516,17 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param parameters Initial {@link Parameters}.
|
||||
* @param parameters Initial {@link TrackSelectionParameters}.
|
||||
* @param trackSelectionFactory A factory for {@link ExoTrackSelection}s.
|
||||
*/
|
||||
public DefaultTrackSelector(
|
||||
Parameters parameters, ExoTrackSelection.Factory trackSelectionFactory) {
|
||||
TrackSelectionParameters parameters, ExoTrackSelection.Factory trackSelectionFactory) {
|
||||
this.trackSelectionFactory = trackSelectionFactory;
|
||||
parametersReference = new AtomicReference<>(parameters);
|
||||
parametersReference =
|
||||
new AtomicReference<>(
|
||||
parameters instanceof Parameters
|
||||
? (Parameters) parameters
|
||||
: Parameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().set(parameters).build());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user