diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java index bf67d93ff5..c9902189f5 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java @@ -32,6 +32,7 @@ import androidx.media3.common.StreamKey; import androidx.media3.common.Timeline; import androidx.media3.common.TrackGroup; import androidx.media3.common.TrackGroupArray; +import androidx.media3.common.TrackSelectionParameters; import androidx.media3.common.util.Assertions; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; @@ -53,7 +54,6 @@ import androidx.media3.exoplayer.source.chunk.MediaChunk; import androidx.media3.exoplayer.source.chunk.MediaChunkIterator; import androidx.media3.exoplayer.trackselection.BaseTrackSelection; import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; -import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.Parameters; import androidx.media3.exoplayer.trackselection.DefaultTrackSelector.SelectionOverride; import androidx.media3.exoplayer.trackselection.ExoTrackSelection; import androidx.media3.exoplayer.trackselection.MappingTrackSelector.MappedTrackInfo; @@ -85,8 +85,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; *
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(); @@ -191,7 +179,7 @@ public final class DownloadHelper { } /** - * @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, + * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory, * DataSource.Factory)} instead. */ @SuppressWarnings("deprecation") @@ -210,7 +198,7 @@ public final class DownloadHelper { } /** - * @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, + * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory, * DataSource.Factory, DrmSessionManager)} instead. */ @Deprecated @@ -219,17 +207,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") @@ -248,7 +236,7 @@ public final class DownloadHelper { } /** - * @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, + * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory, * DataSource.Factory, DrmSessionManager)} instead. */ @Deprecated @@ -257,17 +245,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") @@ -283,7 +271,7 @@ public final class DownloadHelper { } /** - * @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, + * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory, * DataSource.Factory)} instead. */ @SuppressWarnings("deprecation") @@ -302,7 +290,7 @@ public final class DownloadHelper { } /** - * @deprecated Use {@link #forMediaItem(MediaItem, Parameters, RenderersFactory, + * @deprecated Use {@link #forMediaItem(MediaItem, TrackSelectionParameters, RenderersFactory, * DataSource.Factory, DrmSessionManager)} instead. */ @Deprecated @@ -311,10 +299,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); @@ -372,7 +360,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 @@ -384,12 +372,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); @@ -401,7 +389,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 @@ -415,7 +403,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) { @@ -427,7 +415,7 @@ public final class DownloadHelper { ? null : createMediaSourceInternal( mediaItem, castNonNull(dataSourceFactory), drmSessionManager), - trackSelectorParameters, + trackSelectionParameters, renderersFactory != null ? getRendererCapabilities(renderersFactory) : new RendererCapabilities[0]); @@ -483,7 +471,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. @@ -491,12 +479,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()); @@ -612,13 +600,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); } /** @@ -626,13 +614,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); } @@ -646,19 +634,25 @@ public final class DownloadHelper { */ public void addAudioLanguagesToSelection(String... languages) { assertPreparedWithMedia(); - for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) { - DefaultTrackSelector.ParametersBuilder 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); - } - } - for (String language : languages) { - parametersBuilder.setPreferredAudioLanguage(language); - addTrackSelection(periodIndex, parametersBuilder.build()); + + TrackSelectionParameters.Builder parametersBuilder = + DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon(); + // 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) { + TrackSelectionParameters parameters = + parametersBuilder.setPreferredAudioLanguage(language).build(); + for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) { + addTrackSelection(periodIndex, parameters); } } } @@ -676,20 +670,26 @@ public final class DownloadHelper { public void addTextLanguagesToSelection( boolean selectUndeterminedTextLanguage, String... languages) { assertPreparedWithMedia(); - for (int periodIndex = 0; periodIndex < mappedTrackInfos.length; periodIndex++) { - DefaultTrackSelector.ParametersBuilder 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); - for (String language : languages) { - parametersBuilder.setPreferredTextLanguage(language); - addTrackSelection(periodIndex, parametersBuilder.build()); + + TrackSelectionParameters.Builder parametersBuilder = + DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon(); + 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) { + TrackSelectionParameters parameters = + parametersBuilder.setPreferredTextLanguage(language).build(); + for (int periodIndex = 0; periodIndex < periodCount; periodIndex++) { + addTrackSelection(periodIndex, parameters); } } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java index 3f6d673a14..e6988c3c93 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java @@ -1524,13 +1524,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