Convert context dependent TrackSelectionParameters to boolean

This avoids that these settings have to be resolved inline,
potentially blocking the main thread. They can be resolved at
the time of track selection on a background thread instead.

As a side effect, we can also remove the context parameter from
the Builder. Having the Context in the Builder is also a bad sign
in the first place because it implies the potentially blocking
calls can happen.

PiperOrigin-RevId: 720523139
This commit is contained in:
tonihei 2025-01-28 04:23:19 -08:00 committed by Copybara-Service
parent c058d97a97
commit ddcf455d03
27 changed files with 455 additions and 272 deletions

13
api.txt
View File

@ -1096,12 +1096,13 @@ package androidx.media3.common {
public class TrackSelectionParameters {
method public androidx.media3.common.TrackSelectionParameters.Builder buildUpon();
method public static androidx.media3.common.TrackSelectionParameters fromBundle(android.os.Bundle);
method public static androidx.media3.common.TrackSelectionParameters getDefaults(android.content.Context);
method @Deprecated public static androidx.media3.common.TrackSelectionParameters getDefaults(android.content.Context);
method @CallSuper public android.os.Bundle toBundle();
field public final com.google.common.collect.ImmutableSet<java.lang.Integer> disabledTrackTypes;
field public final boolean forceHighestSupportedBitrate;
field public final boolean forceLowestBitrate;
field @androidx.media3.common.C.SelectionFlags public final int ignoredTextSelectionFlags;
field public final boolean isViewportSizeLimitedByPhysicalDisplaySize;
field public final int maxAudioBitrate;
field public final int maxAudioChannelCount;
field public final int maxVideoBitrate;
@ -1121,13 +1122,15 @@ package androidx.media3.common {
field public final com.google.common.collect.ImmutableList<java.lang.String> preferredVideoMimeTypes;
field @androidx.media3.common.C.RoleFlags public final int preferredVideoRoleFlags;
field public final boolean selectUndeterminedTextLanguage;
field public final boolean usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
field public final int viewportHeight;
field public final boolean viewportOrientationMayChange;
field public final int viewportWidth;
}
public static class TrackSelectionParameters.Builder {
ctor public TrackSelectionParameters.Builder(android.content.Context);
ctor public TrackSelectionParameters.Builder();
ctor @Deprecated @com.google.errorprone.annotations.InlineMe(replacement="this()") public TrackSelectionParameters.Builder(android.content.Context);
method public androidx.media3.common.TrackSelectionParameters.Builder addOverride(androidx.media3.common.TrackSelectionOverride);
method public androidx.media3.common.TrackSelectionParameters build();
method public androidx.media3.common.TrackSelectionParameters.Builder clearOverride(androidx.media3.common.TrackGroup);
@ -1154,7 +1157,8 @@ package androidx.media3.common {
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredAudioMimeTypes(java.lang.String...);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredAudioRoleFlags(@androidx.media3.common.C.RoleFlags int);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextLanguage(@Nullable String);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings();
method @Deprecated public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(android.content.Context);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextLanguages(java.lang.String...);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextRoleFlags(@androidx.media3.common.C.RoleFlags int);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredVideoMimeType(@Nullable String);
@ -1163,7 +1167,8 @@ package androidx.media3.common {
method public androidx.media3.common.TrackSelectionParameters.Builder setSelectUndeterminedTextLanguage(boolean);
method public androidx.media3.common.TrackSelectionParameters.Builder setTrackTypeDisabled(@androidx.media3.common.C.TrackType int, boolean);
method public androidx.media3.common.TrackSelectionParameters.Builder setViewportSize(int, int, boolean);
method public androidx.media3.common.TrackSelectionParameters.Builder setViewportSizeToPhysicalDisplaySize(android.content.Context, boolean);
method @Deprecated public androidx.media3.common.TrackSelectionParameters.Builder setViewportSizeToPhysicalDisplaySize(android.content.Context, boolean);
method public androidx.media3.common.TrackSelectionParameters.Builder setViewportSizeToPhysicalDisplaySize(boolean);
}
public final class Tracks {

View File

@ -315,7 +315,7 @@ public class DownloadTracker {
TrackSelectionDialog.createForTracksAndParameters(
/* titleId= */ R.string.exo_download_description,
tracks,
DownloadHelper.getDefaultTrackSelectorParameters(context),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
/* allowAdaptiveSelections= */ false,
/* allowMultipleOverrides= */ true,
/* onTracksSelectedListener= */ this,

View File

@ -637,7 +637,7 @@ public final class CastPlayer extends BasePlayer {
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
return TrackSelectionParameters.DEFAULT;
}
@Override

View File

@ -159,7 +159,7 @@ public abstract class SimpleBasePlayer extends BasePlayer {
seekForwardIncrementMs = C.DEFAULT_SEEK_FORWARD_INCREMENT_MS;
maxSeekToPreviousPositionMs = C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS;
playbackParameters = PlaybackParameters.DEFAULT;
trackSelectionParameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
trackSelectionParameters = TrackSelectionParameters.DEFAULT;
audioAttributes = AudioAttributes.DEFAULT;
volume = 1f;
videoSize = VideoSize.UNKNOWN;

View File

@ -22,9 +22,7 @@ import static java.lang.annotation.ElementType.TYPE_USE;
import static java.lang.annotation.RetentionPolicy.SOURCE;
import android.content.Context;
import android.graphics.Point;
import android.os.Bundle;
import android.os.Looper;
import android.view.accessibility.CaptioningManager;
import androidx.annotation.CallSuper;
import androidx.annotation.IntDef;
@ -37,6 +35,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.primitives.Ints;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.InlineMe;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
@ -44,7 +43,6 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.checkerframework.checker.initialization.qual.UnknownInitialization;
import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
@ -88,6 +86,7 @@ public class TrackSelectionParameters {
private int minVideoBitrate;
private int viewportWidth;
private int viewportHeight;
private boolean isViewportSizeLimitedByPhysicalDisplaySize;
private boolean viewportOrientationMayChange;
private ImmutableList<String> preferredVideoMimeTypes;
private ImmutableList<String> preferredVideoLanguages;
@ -102,6 +101,7 @@ public class TrackSelectionParameters {
// Text
private ImmutableList<String> preferredTextLanguages;
private @C.RoleFlags int preferredTextRoleFlags;
private boolean usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
private @C.SelectionFlags int ignoredTextSelectionFlags;
private boolean selectUndeterminedTextLanguage;
// Image
@ -112,12 +112,7 @@ public class TrackSelectionParameters {
private HashMap<TrackGroup, TrackSelectionOverride> overrides;
private HashSet<@C.TrackType Integer> disabledTrackTypes;
/**
* @deprecated {@link Context} constraints will not be set using this constructor. Use {@link
* #Builder(Context)} instead.
*/
@UnstableApi
@Deprecated
/** Creates a builder with default initial values. */
public Builder() {
// Video
maxVideoWidth = Integer.MAX_VALUE;
@ -126,6 +121,7 @@ public class TrackSelectionParameters {
maxVideoBitrate = Integer.MAX_VALUE;
viewportWidth = Integer.MAX_VALUE;
viewportHeight = Integer.MAX_VALUE;
isViewportSizeLimitedByPhysicalDisplaySize = true;
viewportOrientationMayChange = true;
preferredVideoMimeTypes = ImmutableList.of();
preferredVideoLanguages = ImmutableList.of();
@ -140,6 +136,7 @@ public class TrackSelectionParameters {
// Text
preferredTextLanguages = ImmutableList.of();
preferredTextRoleFlags = 0;
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = true;
ignoredTextSelectionFlags = 0;
selectUndeterminedTextLanguage = false;
// Image
@ -152,15 +149,12 @@ public class TrackSelectionParameters {
}
/**
* Creates a builder with default initial values.
*
* @param context Any context.
* @deprecated Use {@link #Builder()} instead.
*/
@SuppressWarnings({"deprecation", "method.invocation"}) // Methods invoked are setter only.
@Deprecated
@InlineMe(replacement = "this()")
public Builder(Context context) {
this();
setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(context);
setViewportSizeToPhysicalDisplaySize(context, /* viewportOrientationMayChange= */ true);
}
/** Creates a builder with the initial values specified in {@code initialValues}. */
@ -173,26 +167,25 @@ public class TrackSelectionParameters {
@UnstableApi
protected Builder(Bundle bundle) {
// Video
maxVideoWidth = bundle.getInt(FIELD_MAX_VIDEO_WIDTH, DEFAULT_WITHOUT_CONTEXT.maxVideoWidth);
maxVideoHeight =
bundle.getInt(FIELD_MAX_VIDEO_HEIGHT, DEFAULT_WITHOUT_CONTEXT.maxVideoHeight);
maxVideoFrameRate =
bundle.getInt(FIELD_MAX_VIDEO_FRAMERATE, DEFAULT_WITHOUT_CONTEXT.maxVideoFrameRate);
maxVideoBitrate =
bundle.getInt(FIELD_MAX_VIDEO_BITRATE, DEFAULT_WITHOUT_CONTEXT.maxVideoBitrate);
minVideoWidth = bundle.getInt(FIELD_MIN_VIDEO_WIDTH, DEFAULT_WITHOUT_CONTEXT.minVideoWidth);
minVideoHeight =
bundle.getInt(FIELD_MIN_VIDEO_HEIGHT, DEFAULT_WITHOUT_CONTEXT.minVideoHeight);
minVideoFrameRate =
bundle.getInt(FIELD_MIN_VIDEO_FRAMERATE, DEFAULT_WITHOUT_CONTEXT.minVideoFrameRate);
minVideoBitrate =
bundle.getInt(FIELD_MIN_VIDEO_BITRATE, DEFAULT_WITHOUT_CONTEXT.minVideoBitrate);
viewportWidth = bundle.getInt(FIELD_VIEWPORT_WIDTH, DEFAULT_WITHOUT_CONTEXT.viewportWidth);
viewportHeight = bundle.getInt(FIELD_VIEWPORT_HEIGHT, DEFAULT_WITHOUT_CONTEXT.viewportHeight);
maxVideoWidth = bundle.getInt(FIELD_MAX_VIDEO_WIDTH, DEFAULT.maxVideoWidth);
maxVideoHeight = bundle.getInt(FIELD_MAX_VIDEO_HEIGHT, DEFAULT.maxVideoHeight);
maxVideoFrameRate = bundle.getInt(FIELD_MAX_VIDEO_FRAMERATE, DEFAULT.maxVideoFrameRate);
maxVideoBitrate = bundle.getInt(FIELD_MAX_VIDEO_BITRATE, DEFAULT.maxVideoBitrate);
minVideoWidth = bundle.getInt(FIELD_MIN_VIDEO_WIDTH, DEFAULT.minVideoWidth);
minVideoHeight = bundle.getInt(FIELD_MIN_VIDEO_HEIGHT, DEFAULT.minVideoHeight);
minVideoFrameRate = bundle.getInt(FIELD_MIN_VIDEO_FRAMERATE, DEFAULT.minVideoFrameRate);
minVideoBitrate = bundle.getInt(FIELD_MIN_VIDEO_BITRATE, DEFAULT.minVideoBitrate);
viewportWidth = bundle.getInt(FIELD_VIEWPORT_WIDTH, DEFAULT.viewportWidth);
viewportHeight = bundle.getInt(FIELD_VIEWPORT_HEIGHT, DEFAULT.viewportHeight);
isViewportSizeLimitedByPhysicalDisplaySize =
viewportWidth == Integer.MAX_VALUE
&& viewportHeight == Integer.MAX_VALUE
&& bundle.getBoolean(
FIELD_IS_VIEWPORT_SIZE_LIMITED_BY_PHYSICAL_DISPLAY_SIZE,
DEFAULT.isViewportSizeLimitedByPhysicalDisplaySize);
viewportOrientationMayChange =
bundle.getBoolean(
FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE,
DEFAULT_WITHOUT_CONTEXT.viewportOrientationMayChange);
FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, DEFAULT.viewportOrientationMayChange);
preferredVideoMimeTypes =
ImmutableList.copyOf(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_VIDEO_MIMETYPES), new String[0]));
@ -200,20 +193,16 @@ public class TrackSelectionParameters {
ImmutableList.copyOf(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_VIDEO_LANGUAGES), new String[0]));
preferredVideoRoleFlags =
bundle.getInt(
FIELD_PREFERRED_VIDEO_ROLE_FLAGS, DEFAULT_WITHOUT_CONTEXT.preferredVideoRoleFlags);
bundle.getInt(FIELD_PREFERRED_VIDEO_ROLE_FLAGS, DEFAULT.preferredVideoRoleFlags);
// Audio
String[] preferredAudioLanguages1 =
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_AUDIO_LANGUAGES), new String[0]);
preferredAudioLanguages = normalizeLanguageCodes(preferredAudioLanguages1);
preferredAudioRoleFlags =
bundle.getInt(
FIELD_PREFERRED_AUDIO_ROLE_FLAGS, DEFAULT_WITHOUT_CONTEXT.preferredAudioRoleFlags);
bundle.getInt(FIELD_PREFERRED_AUDIO_ROLE_FLAGS, DEFAULT.preferredAudioRoleFlags);
maxAudioChannelCount =
bundle.getInt(
FIELD_MAX_AUDIO_CHANNEL_COUNT, DEFAULT_WITHOUT_CONTEXT.maxAudioChannelCount);
maxAudioBitrate =
bundle.getInt(FIELD_MAX_AUDIO_BITRATE, DEFAULT_WITHOUT_CONTEXT.maxAudioBitrate);
bundle.getInt(FIELD_MAX_AUDIO_CHANNEL_COUNT, DEFAULT.maxAudioChannelCount);
maxAudioBitrate = bundle.getInt(FIELD_MAX_AUDIO_BITRATE, DEFAULT.maxAudioBitrate);
preferredAudioMimeTypes =
ImmutableList.copyOf(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_AUDIO_MIME_TYPES), new String[0]));
@ -223,29 +212,29 @@ public class TrackSelectionParameters {
normalizeLanguageCodes(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_TEXT_LANGUAGES), new String[0]));
preferredTextRoleFlags =
bundle.getInt(
FIELD_PREFERRED_TEXT_ROLE_FLAGS, DEFAULT_WITHOUT_CONTEXT.preferredTextRoleFlags);
bundle.getInt(FIELD_PREFERRED_TEXT_ROLE_FLAGS, DEFAULT.preferredTextRoleFlags);
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager =
preferredTextLanguages.isEmpty()
&& preferredTextRoleFlags == 0
&& bundle.getBoolean(
FIELD_USE_PREFERRED_TEXT_LANGUAGES_AND_ROLE_FLAGS_FROM_CAPTIONING_MANAGER,
DEFAULT.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager);
ignoredTextSelectionFlags =
bundle.getInt(
FIELD_IGNORED_TEXT_SELECTION_FLAGS,
DEFAULT_WITHOUT_CONTEXT.ignoredTextSelectionFlags);
bundle.getInt(FIELD_IGNORED_TEXT_SELECTION_FLAGS, DEFAULT.ignoredTextSelectionFlags);
selectUndeterminedTextLanguage =
bundle.getBoolean(
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE,
DEFAULT_WITHOUT_CONTEXT.selectUndeterminedTextLanguage);
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, DEFAULT.selectUndeterminedTextLanguage);
// Image
isPrioritizeImageOverVideoEnabled =
bundle.getBoolean(
FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED,
DEFAULT_WITHOUT_CONTEXT.isPrioritizeImageOverVideoEnabled);
FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED, DEFAULT.isPrioritizeImageOverVideoEnabled);
// General
forceLowestBitrate =
bundle.getBoolean(FIELD_FORCE_LOWEST_BITRATE, DEFAULT_WITHOUT_CONTEXT.forceLowestBitrate);
bundle.getBoolean(FIELD_FORCE_LOWEST_BITRATE, DEFAULT.forceLowestBitrate);
forceHighestSupportedBitrate =
bundle.getBoolean(
FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE,
DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate);
FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, DEFAULT.forceHighestSupportedBitrate);
@Nullable
List<Bundle> overrideBundleList = bundle.getParcelableArrayList(FIELD_SELECTION_OVERRIDES);
List<TrackSelectionOverride> overrideList =
@ -309,6 +298,8 @@ public class TrackSelectionParameters {
minVideoBitrate = parameters.minVideoBitrate;
viewportWidth = parameters.viewportWidth;
viewportHeight = parameters.viewportHeight;
isViewportSizeLimitedByPhysicalDisplaySize =
parameters.isViewportSizeLimitedByPhysicalDisplaySize;
viewportOrientationMayChange = parameters.viewportOrientationMayChange;
preferredVideoMimeTypes = parameters.preferredVideoMimeTypes;
preferredVideoLanguages = parameters.preferredVideoLanguages;
@ -323,6 +314,8 @@ public class TrackSelectionParameters {
// Text
preferredTextLanguages = parameters.preferredTextLanguages;
preferredTextRoleFlags = parameters.preferredTextRoleFlags;
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager =
parameters.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
ignoredTextSelectionFlags = parameters.ignoredTextSelectionFlags;
selectUndeterminedTextLanguage = parameters.selectUndeterminedTextLanguage;
// Image
@ -441,20 +434,31 @@ public class TrackSelectionParameters {
}
/**
* Equivalent to calling {@link #setViewportSize(int, int, boolean)} with the viewport size
* obtained from {@link Util#getCurrentDisplayModeSize(Context)}.
* Sets whether the viewport size should be assumed to the physical display size if no other
* specific viewport size constraint is specified. Constrains video track selections for
* adaptive content so that only tracks suitable for the viewport are selected.
*
* @param context Any context.
* @param viewportOrientationMayChange Whether the viewport orientation may change during
* playback.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setViewportSizeToPhysicalDisplaySize(boolean viewportOrientationMayChange) {
this.isViewportSizeLimitedByPhysicalDisplaySize = true;
this.viewportOrientationMayChange = viewportOrientationMayChange;
this.viewportHeight = Integer.MAX_VALUE;
this.viewportWidth = Integer.MAX_VALUE;
return this;
}
/**
* @deprecated Use {@link #setViewportSizeToPhysicalDisplaySize(boolean)} instead.
*/
@Deprecated
@CanIgnoreReturnValue
public Builder setViewportSizeToPhysicalDisplaySize(
Context context, boolean viewportOrientationMayChange) {
// Assume the viewport is fullscreen.
Point viewportSize = Util.getCurrentDisplayModeSize(context);
return setViewportSize(viewportSize.x, viewportSize.y, viewportOrientationMayChange);
return setViewportSizeToPhysicalDisplaySize(viewportOrientationMayChange);
}
/**
@ -484,6 +488,7 @@ public class TrackSelectionParameters {
this.viewportWidth = viewportWidth;
this.viewportHeight = viewportHeight;
this.viewportOrientationMayChange = viewportOrientationMayChange;
this.isViewportSizeLimitedByPhysicalDisplaySize = false;
return this;
}
@ -657,33 +662,29 @@ public class TrackSelectionParameters {
// Text
/**
* Sets the preferred language and role flags for text tracks based on the accessibility
* settings of {@link CaptioningManager}.
* Sets whether the preferred languages and the preferred role flags for text tracks should be
* set according the {@link CaptioningManager} preferences, if enabled in the system settings
* and no other explicit language or role flag preferences are specified.
*
* <p>Does nothing when the {@link CaptioningManager} is disabled.
*
* @param context A {@link Context}.
* @return This builder.
*/
@CanIgnoreReturnValue
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings() {
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = true;
preferredTextLanguages = ImmutableList.of();
preferredTextRoleFlags = 0;
return this;
}
/**
* @deprecated Use {@link #setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings()}
* instead.
*/
@Deprecated
@CanIgnoreReturnValue
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(
Context context) {
if (Util.SDK_INT < 23 && Looper.myLooper() == null) {
// Android platform bug (pre-Marshmallow) that causes RuntimeExceptions when
// CaptioningService is instantiated from a non-Looper thread. See [internal: b/143779904].
return this;
}
CaptioningManager captioningManager =
(CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
if (captioningManager == null || !captioningManager.isEnabled()) {
return this;
}
preferredTextRoleFlags = C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND;
Locale preferredLocale = captioningManager.getLocale();
if (preferredLocale != null) {
preferredTextLanguages = ImmutableList.of(Util.getLocaleLanguageTag(preferredLocale));
}
return this;
return setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings();
}
/**
@ -710,6 +711,7 @@ public class TrackSelectionParameters {
@CanIgnoreReturnValue
public Builder setPreferredTextLanguages(String... preferredTextLanguages) {
this.preferredTextLanguages = normalizeLanguageCodes(preferredTextLanguages);
this.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = false;
return this;
}
@ -722,6 +724,7 @@ public class TrackSelectionParameters {
@CanIgnoreReturnValue
public Builder setPreferredTextRoleFlags(@C.RoleFlags int preferredTextRoleFlags) {
this.preferredTextRoleFlags = preferredTextRoleFlags;
this.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = false;
return this;
}
@ -1080,35 +1083,21 @@ public class TrackSelectionParameters {
}
}
/**
* An instance with default values, except those obtained from the {@link Context}.
*
* <p>If possible, use {@link #getDefaults(Context)} instead.
*
* <p>This instance will not have the following settings:
*
* <ul>
* <li>{@link Builder#setViewportSizeToPhysicalDisplaySize(Context, boolean) Viewport
* constraints} configured for the primary display.
* <li>{@link Builder#setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)
* Preferred text language and role flags} configured to the accessibility settings of
* {@link CaptioningManager}.
* </ul>
*/
@UnstableApi
@SuppressWarnings("deprecation")
public static final TrackSelectionParameters DEFAULT_WITHOUT_CONTEXT = new Builder().build();
/** An instance with default parameters. */
@UnstableApi public static final TrackSelectionParameters DEFAULT = new Builder().build();
/**
* @deprecated This instance is not configured using {@link Context} constraints. Use {@link
* #getDefaults(Context)} instead.
* @deprecated Use {@link #DEFAULT} instead.
*/
@UnstableApi @Deprecated
public static final TrackSelectionParameters DEFAULT = DEFAULT_WITHOUT_CONTEXT;
public static final TrackSelectionParameters DEFAULT_WITHOUT_CONTEXT = DEFAULT;
/** Returns an instance configured with default values. */
/**
* @deprecated Use {@link #DEFAULT} instead.
*/
@Deprecated
public static TrackSelectionParameters getDefaults(Context context) {
return new Builder(context).build();
return DEFAULT;
}
// Video
@ -1172,6 +1161,13 @@ public class TrackSelectionParameters {
*/
public final int viewportHeight;
/**
* Whether the viewport size should be assumed to the physical display size if no other specific
* viewport size constraint is specified. Constrains video track selections for adaptive content
* so that only tracks suitable for the viewport are selected. The default value is {@code true}.
*/
public final boolean isViewportSizeLimitedByPhysicalDisplaySize;
/**
* Whether the viewport orientation may change during playback. Constrains video track selections
* for adaptive content so that only tracks suitable for the viewport are selected. The default
@ -1238,19 +1234,24 @@ public class TrackSelectionParameters {
/**
* The preferred languages for text tracks as IETF BCP 47 conformant tags in order of preference.
* An empty list selects the default track if there is one, or no track otherwise. The default
* value is an empty list, or the language of the accessibility {@link CaptioningManager} if
* enabled.
* value is an empty list.
*/
public final ImmutableList<String> preferredTextLanguages;
/**
* The preferred {@link C.RoleFlags} for text tracks. {@code 0} selects the default track if there
* is one, or no track otherwise. The default value is {@code 0}, or {@link C#ROLE_FLAG_SUBTITLE}
* | {@link C#ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND} if the accessibility {@link CaptioningManager}
* is enabled.
* is one, or no track otherwise. The default value is {@code 0}.
*/
public final @C.RoleFlags int preferredTextRoleFlags;
/**
* Whether the preferred languages and the preferred role flags for text tracks should be set
* according the {@link CaptioningManager} preferences, if enabled in the system settings and no
* other explicit language or role flag preferences are specified. The default value is {@code
* true}.
*/
public final boolean usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
/**
* Bitmask of selection flags that are ignored for text track selections. See {@link
* C.SelectionFlags}. The default value is {@code 0} (i.e., no flags are ignored).
@ -1307,6 +1308,8 @@ public class TrackSelectionParameters {
this.minVideoBitrate = builder.minVideoBitrate;
this.viewportWidth = builder.viewportWidth;
this.viewportHeight = builder.viewportHeight;
this.isViewportSizeLimitedByPhysicalDisplaySize =
builder.isViewportSizeLimitedByPhysicalDisplaySize;
this.viewportOrientationMayChange = builder.viewportOrientationMayChange;
this.preferredVideoMimeTypes = builder.preferredVideoMimeTypes;
this.preferredVideoLanguages = builder.preferredVideoLanguages;
@ -1321,6 +1324,8 @@ public class TrackSelectionParameters {
// Text
this.preferredTextLanguages = builder.preferredTextLanguages;
this.preferredTextRoleFlags = builder.preferredTextRoleFlags;
this.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager =
builder.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
this.ignoredTextSelectionFlags = builder.ignoredTextSelectionFlags;
this.selectUndeterminedTextLanguage = builder.selectUndeterminedTextLanguage;
// Image
@ -1359,6 +1364,8 @@ public class TrackSelectionParameters {
&& viewportOrientationMayChange == other.viewportOrientationMayChange
&& viewportWidth == other.viewportWidth
&& viewportHeight == other.viewportHeight
&& isViewportSizeLimitedByPhysicalDisplaySize
== other.isViewportSizeLimitedByPhysicalDisplaySize
&& preferredVideoMimeTypes.equals(other.preferredVideoMimeTypes)
&& preferredVideoLanguages.equals(other.preferredVideoLanguages)
&& preferredVideoRoleFlags == other.preferredVideoRoleFlags
@ -1372,6 +1379,8 @@ public class TrackSelectionParameters {
// Text
&& preferredTextLanguages.equals(other.preferredTextLanguages)
&& preferredTextRoleFlags == other.preferredTextRoleFlags
&& usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager
== other.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager
&& ignoredTextSelectionFlags == other.ignoredTextSelectionFlags
&& selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage
// Image
@ -1398,6 +1407,7 @@ public class TrackSelectionParameters {
result = 31 * result + (viewportOrientationMayChange ? 1 : 0);
result = 31 * result + viewportWidth;
result = 31 * result + viewportHeight;
result = 31 * result + (isViewportSizeLimitedByPhysicalDisplaySize ? 1 : 0);
result = 31 * result + preferredVideoMimeTypes.hashCode();
result = 31 * result + preferredVideoLanguages.hashCode();
result = 31 * result + preferredVideoRoleFlags;
@ -1411,6 +1421,7 @@ public class TrackSelectionParameters {
// Text
result = 31 * result + preferredTextLanguages.hashCode();
result = 31 * result + preferredTextRoleFlags;
result = 31 * result + (usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager ? 1 : 0);
result = 31 * result + ignoredTextSelectionFlags;
result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0);
// Image
@ -1456,6 +1467,11 @@ public class TrackSelectionParameters {
private static final String FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED =
Util.intToStringMaxRadix(31);
private static final String FIELD_PREFERRED_VIDEO_LANGUAGES = Util.intToStringMaxRadix(32);
private static final String FIELD_IS_VIEWPORT_SIZE_LIMITED_BY_PHYSICAL_DISPLAY_SIZE =
Util.intToStringMaxRadix(33);
private static final String
FIELD_USE_PREFERRED_TEXT_LANGUAGES_AND_ROLE_FLAGS_FROM_CAPTIONING_MANAGER =
Util.intToStringMaxRadix(34);
/**
* Defines a minimum field ID value for subclasses to use when implementing {@link #toBundle()}
@ -1482,6 +1498,9 @@ public class TrackSelectionParameters {
bundle.putInt(FIELD_MIN_VIDEO_BITRATE, minVideoBitrate);
bundle.putInt(FIELD_VIEWPORT_WIDTH, viewportWidth);
bundle.putInt(FIELD_VIEWPORT_HEIGHT, viewportHeight);
bundle.putBoolean(
FIELD_IS_VIEWPORT_SIZE_LIMITED_BY_PHYSICAL_DISPLAY_SIZE,
isViewportSizeLimitedByPhysicalDisplaySize);
bundle.putBoolean(FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, viewportOrientationMayChange);
bundle.putStringArray(
FIELD_PREFERRED_VIDEO_MIMETYPES, preferredVideoMimeTypes.toArray(new String[0]));
@ -1500,6 +1519,9 @@ public class TrackSelectionParameters {
bundle.putStringArray(
FIELD_PREFERRED_TEXT_LANGUAGES, preferredTextLanguages.toArray(new String[0]));
bundle.putInt(FIELD_PREFERRED_TEXT_ROLE_FLAGS, preferredTextRoleFlags);
bundle.putBoolean(
FIELD_USE_PREFERRED_TEXT_LANGUAGES_AND_ROLE_FLAGS_FROM_CAPTIONING_MANAGER,
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager);
bundle.putInt(FIELD_IGNORED_TEXT_SELECTION_FLAGS, ignoredTextSelectionFlags);
bundle.putBoolean(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, selectUndeterminedTextLanguage);
bundle.putInt(FIELD_AUDIO_OFFLOAD_MODE_PREFERENCE, audioOffloadPreferences.audioOffloadMode);

View File

@ -88,10 +88,7 @@ public final class ForwardingSimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);
@ -309,7 +306,7 @@ public final class ForwardingSimpleBasePlayerTest {
.setSeekForwardIncrementMs(2000)
.setMaxSeekToPreviousPositionMs(8000)
.setPlaybackParameters(PlaybackParameters.DEFAULT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT)
.setAudioAttributes(AudioAttributes.DEFAULT)
.setVolume(1f)
.setVideoSize(VideoSize.UNKNOWN)
@ -349,10 +346,7 @@ public final class ForwardingSimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);

View File

@ -101,7 +101,7 @@ public class SimpleBasePlayerTest {
.setSeekForwardIncrementMs(4000)
.setMaxSeekToPreviousPositionMs(3000)
.setPlaybackParameters(new PlaybackParameters(/* speed= */ 2f))
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT)
.setAudioAttributes(
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build())
.setVolume(0.5f)
@ -280,10 +280,7 @@ public class SimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);
@ -945,10 +942,7 @@ public class SimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);
@ -1368,7 +1362,7 @@ public class SimpleBasePlayerTest {
.setSeekForwardIncrementMs(2000)
.setMaxSeekToPreviousPositionMs(8000)
.setPlaybackParameters(PlaybackParameters.DEFAULT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT)
.setAudioAttributes(AudioAttributes.DEFAULT)
.setVolume(1f)
.setVideoSize(VideoSize.UNKNOWN)
@ -1407,10 +1401,7 @@ public class SimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);

View File

@ -17,7 +17,6 @@ package androidx.media3.common;
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_DISABLED;
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED;
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static com.google.common.truth.Truth.assertThat;
import android.os.Bundle;
@ -40,7 +39,7 @@ public final class TrackSelectionParametersTest {
@Test
public void defaultValue_withoutChange_isAsExpected() {
TrackSelectionParameters parameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
TrackSelectionParameters parameters = TrackSelectionParameters.DEFAULT;
// Video
assertThat(parameters.maxVideoWidth).isEqualTo(Integer.MAX_VALUE);
@ -53,6 +52,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.minVideoBitrate).isEqualTo(0);
assertThat(parameters.viewportWidth).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.isViewportSizeLimitedByPhysicalDisplaySize).isTrue();
assertThat(parameters.viewportOrientationMayChange).isTrue();
assertThat(parameters.preferredVideoMimeTypes).isEmpty();
// Audio
@ -67,6 +67,7 @@ public final class TrackSelectionParametersTest {
// Text
assertThat(parameters.preferredAudioMimeTypes).isEmpty();
assertThat(parameters.preferredTextLanguages).isEmpty();
assertThat(parameters.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager).isTrue();
assertThat(parameters.preferredTextRoleFlags).isEqualTo(0);
assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(0);
assertThat(parameters.selectUndeterminedTextLanguage).isFalse();
@ -90,7 +91,7 @@ public final class TrackSelectionParametersTest {
new Format.Builder().setId(4).build(), new Format.Builder().setId(5).build()),
/* trackIndices= */ ImmutableList.of(1));
TrackSelectionParameters parameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
TrackSelectionParameters.DEFAULT
.buildUpon()
// Video
.setMaxVideoSize(/* maxVideoWidth= */ 0, /* maxVideoHeight= */ 1)
@ -149,6 +150,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.minVideoBitrate).isEqualTo(7);
assertThat(parameters.viewportWidth).isEqualTo(8);
assertThat(parameters.viewportHeight).isEqualTo(9);
assertThat(parameters.isViewportSizeLimitedByPhysicalDisplaySize).isFalse();
assertThat(parameters.viewportOrientationMayChange).isTrue();
assertThat(parameters.preferredVideoMimeTypes)
.containsExactly(MimeTypes.VIDEO_AV1, MimeTypes.VIDEO_H264)
@ -168,6 +170,7 @@ public final class TrackSelectionParametersTest {
// Text
assertThat(parameters.preferredTextLanguages).containsExactly("de", "en").inOrder();
assertThat(parameters.preferredTextRoleFlags).isEqualTo(C.ROLE_FLAG_CAPTION);
assertThat(parameters.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager).isFalse();
assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(C.SELECTION_FLAG_AUTOSELECT);
assertThat(parameters.selectUndeterminedTextLanguage).isTrue();
// Image
@ -185,7 +188,7 @@ public final class TrackSelectionParametersTest {
@Test
public void setMaxVideoSizeSd_defaultBuilder_parametersVideoSizeAreSd() {
TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext()).setMaxVideoSizeSd().build();
new TrackSelectionParameters.Builder().setMaxVideoSizeSd().build();
assertThat(parameters.maxVideoWidth).isEqualTo(1279);
assertThat(parameters.maxVideoHeight).isEqualTo(719);
@ -194,7 +197,7 @@ public final class TrackSelectionParametersTest {
@Test
public void clearVideoSizeConstraints_withSdConstrains_clearConstrains() {
TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.setMaxVideoSizeSd()
.clearVideoSizeConstraints()
.build();
@ -206,7 +209,7 @@ public final class TrackSelectionParametersTest {
@Test
public void clearViewPortConstraints_withConstrains_clearConstrains() {
TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.setViewportSize(
/* viewportWidth= */ 1,
/* viewportHeight= */ 2,
@ -216,6 +219,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.viewportWidth).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.isViewportSizeLimitedByPhysicalDisplaySize).isFalse();
assertThat(parameters.viewportOrientationMayChange).isTrue();
}
@ -225,7 +229,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(
newTrackGroupWithIds(3, 4), /* trackIndices= */ ImmutableList.of(1));
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()).addOverride(override).build();
new TrackSelectionParameters.Builder().addOverride(override).build();
TrackSelectionParameters fromBundle =
TrackSelectionParameters.fromBundle(trackSelectionParameters.toBundle());
@ -238,7 +242,7 @@ public final class TrackSelectionParametersTest {
@Test
public void roundTripViaBundle_withLegacyPreferenceFields_yieldsEqualInstance() {
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.setAudioOffloadPreferences(
new AudioOffloadPreferences.Builder()
.setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
@ -266,7 +270,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(newTrackGroupWithIds(2), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.addOverride(override1)
.addOverride(override2)
.build();
@ -285,7 +289,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(trackGroup, /* trackIndices= */ ImmutableList.of(1));
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.addOverride(override1)
.addOverride(override2)
.build();
@ -302,7 +306,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(newTrackGroupWithIds(2), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.setOverrideForType(override1)
.setOverrideForType(override2)
.build();
@ -318,7 +322,7 @@ public final class TrackSelectionParametersTest {
TrackSelectionOverride override2 =
new TrackSelectionOverride(newTrackGroupWithIds(1), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.addOverride(override1)
.addOverride(override2)
.clearOverridesOfType(C.TRACK_TYPE_AUDIO)
@ -335,7 +339,7 @@ public final class TrackSelectionParametersTest {
TrackSelectionOverride override2 =
new TrackSelectionOverride(newTrackGroupWithIds(1), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext())
new TrackSelectionParameters.Builder()
.addOverride(override1)
.addOverride(override2)
.clearOverride(override2.mediaTrackGroup)

View File

@ -98,29 +98,27 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
@UnstableApi
public final class DownloadHelper {
/**
* Default track selection parameters for downloading, but without any {@link Context}
* constraints.
*
* <p>If possible, use {@link #getDefaultTrackSelectorParameters(Context)} instead.
*
* @see DefaultTrackSelector.Parameters#DEFAULT_WITHOUT_CONTEXT
*/
public static final DefaultTrackSelector.Parameters
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT =
DefaultTrackSelector.Parameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setForceHighestSupportedBitrate(true)
.setConstrainAudioChannelCountToDeviceCapabilities(false)
.build();
/** Default track selection parameters for downloading. */
public static final DefaultTrackSelector.Parameters DEFAULT_TRACK_SELECTOR_PARAMETERS =
DefaultTrackSelector.Parameters.DEFAULT
.buildUpon()
.setForceHighestSupportedBitrate(true)
.setConstrainAudioChannelCountToDeviceCapabilities(false)
.build();
/** Returns the default parameters used for track selection for downloading. */
/**
* @deprecated Use {@link #DEFAULT_TRACK_SELECTOR_PARAMETERS} instead.
*/
@Deprecated
public static final DefaultTrackSelector.Parameters
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT = DEFAULT_TRACK_SELECTOR_PARAMETERS;
/**
* @deprecated Use {@link #DEFAULT_TRACK_SELECTOR_PARAMETERS} instead.
*/
@Deprecated
public static DefaultTrackSelector.Parameters getDefaultTrackSelectorParameters(Context context) {
return DefaultTrackSelector.Parameters.getDefaults(context)
.buildUpon()
.setForceHighestSupportedBitrate(true)
.setConstrainAudioChannelCountToDeviceCapabilities(false)
.build();
return DEFAULT_TRACK_SELECTOR_PARAMETERS;
}
/** A callback to be notified when the {@link DownloadHelper} is prepared. */
@ -179,7 +177,7 @@ public final class DownloadHelper {
Assertions.checkArgument(isProgressive(checkNotNull(mediaItem.localConfiguration)));
return forMediaItem(
mediaItem,
getDefaultTrackSelectorParameters(context),
DEFAULT_TRACK_SELECTOR_PARAMETERS,
/* renderersFactory= */ null,
/* dataSourceFactory= */ null,
/* drmSessionManager= */ null);
@ -207,7 +205,7 @@ public final class DownloadHelper {
@Nullable DataSource.Factory dataSourceFactory) {
return forMediaItem(
mediaItem,
getDefaultTrackSelectorParameters(context),
DEFAULT_TRACK_SELECTOR_PARAMETERS,
renderersFactory,
dataSourceFactory,
/* drmSessionManager= */ null);
@ -541,7 +539,7 @@ public final class DownloadHelper {
assertPreparedWithMedia();
TrackSelectionParameters.Builder parametersBuilder =
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon();
DEFAULT_TRACK_SELECTOR_PARAMETERS.buildUpon();
// Prefer highest supported bitrate for downloads.
parametersBuilder.setForceHighestSupportedBitrate(true);
// Disable all non-audio track types supported by the renderers.
@ -581,7 +579,7 @@ public final class DownloadHelper {
assertPreparedWithMedia();
TrackSelectionParameters.Builder parametersBuilder =
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.buildUpon();
DEFAULT_TRACK_SELECTOR_PARAMETERS.buildUpon();
parametersBuilder.setSelectUndeterminedTextLanguage(selectUndeterminedTextLanguage);
// Prefer highest supported bitrate for downloads.
parametersBuilder.setForceHighestSupportedBitrate(true);

View File

@ -39,6 +39,7 @@ import android.text.TextUtils;
import android.util.Pair;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.accessibility.CaptioningManager;
import androidx.annotation.GuardedBy;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
@ -74,6 +75,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.Ordering;
import com.google.common.primitives.Ints;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.InlineMe;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@ -83,6 +85,7 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@ -136,12 +139,7 @@ public class DefaultTrackSelector extends MappingTrackSelector
private final Parameters.Builder delegate;
/**
* @deprecated {@link Context} constraints will not be set using this constructor. Use {@link
* #ParametersBuilder(Context)} instead.
*/
@Deprecated
@SuppressWarnings({"deprecation"})
/** Creates a builder with default initial values. */
public ParametersBuilder() {
delegate = new Parameters.Builder();
}
@ -301,6 +299,15 @@ public class DefaultTrackSelector extends MappingTrackSelector
return this;
}
@SuppressWarnings("deprecation") // Intentionally returning deprecated type
@CanIgnoreReturnValue
@Override
public ParametersBuilder setViewportSizeToPhysicalDisplaySize(
boolean viewportOrientationMayChange) {
delegate.setViewportSizeToPhysicalDisplaySize(viewportOrientationMayChange);
return this;
}
@SuppressWarnings("deprecation") // Intentionally returning deprecated type
@CanIgnoreReturnValue
@Override
@ -522,6 +529,14 @@ public class DefaultTrackSelector extends MappingTrackSelector
// Text
@SuppressWarnings("deprecation") // Intentionally returning deprecated type
@CanIgnoreReturnValue
@Override
public ParametersBuilder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings() {
delegate.setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings();
return this;
}
@SuppressWarnings("deprecation") // Intentionally returning deprecated type
@CanIgnoreReturnValue
@Override
@ -868,12 +883,7 @@ public class DefaultTrackSelector extends MappingTrackSelector
selectionOverrides;
private final SparseBooleanArray rendererDisabledFlags;
/**
* @deprecated {@link Context} constraints will not be set using this constructor. Use {@link
* #Builder(Context)} instead.
*/
@Deprecated
@SuppressWarnings({"deprecation"})
/** Creates a builder with default initial values. */
public Builder() {
super();
selectionOverrides = new SparseArray<>();
@ -882,15 +892,12 @@ public class DefaultTrackSelector extends MappingTrackSelector
}
/**
* Creates a builder with default initial values.
*
* @param context Any context.
* @deprecated Use {@link #Builder()} instead.
*/
@Deprecated
@InlineMe(replacement = "this()")
public Builder(Context context) {
super(context);
selectionOverrides = new SparseArray<>();
rendererDisabledFlags = new SparseBooleanArray();
init();
this();
}
/**
@ -931,7 +938,7 @@ public class DefaultTrackSelector extends MappingTrackSelector
private Builder(Bundle bundle) {
super(bundle);
init();
Parameters defaultValue = Parameters.DEFAULT_WITHOUT_CONTEXT;
Parameters defaultValue = Parameters.DEFAULT;
// Video
setExceedVideoConstraintsIfNecessary(
bundle.getBoolean(
@ -1132,6 +1139,14 @@ public class DefaultTrackSelector extends MappingTrackSelector
@CanIgnoreReturnValue
@Override
public Builder setViewportSizeToPhysicalDisplaySize(boolean viewportOrientationMayChange) {
super.setViewportSizeToPhysicalDisplaySize(viewportOrientationMayChange);
return this;
}
@CanIgnoreReturnValue
@Deprecated
@Override
public Builder setViewportSizeToPhysicalDisplaySize(
Context context, boolean viewportOrientationMayChange) {
super.setViewportSizeToPhysicalDisplaySize(context, viewportOrientationMayChange);
@ -1377,6 +1392,15 @@ public class DefaultTrackSelector extends MappingTrackSelector
@CanIgnoreReturnValue
@Override
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings() {
super.setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings();
return this;
}
@CanIgnoreReturnValue
@Deprecated
@SuppressWarnings("deprecation") // Calling deprecated super method.
@Override
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(
Context context) {
super.setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(context);
@ -1790,34 +1814,20 @@ public class DefaultTrackSelector extends MappingTrackSelector
}
}
/**
* An instance with default values, except those obtained from the {@link Context}.
*
* <p>If possible, use {@link #getDefaults(Context)} instead.
*
* <p>This instance will not have the following settings:
*
* <ul>
* <li>{@linkplain Builder#setViewportSizeToPhysicalDisplaySize(Context, boolean) Viewport
* constraints} configured for the primary display.
* <li>{@linkplain
* Builder#setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(Context)
* Preferred text language and role flags} configured to the accessibility settings of
* {@link android.view.accessibility.CaptioningManager}.
* </ul>
*/
@SuppressWarnings("deprecation")
public static final Parameters DEFAULT_WITHOUT_CONTEXT = new Builder().build();
/** An instance with default values. */
public static final Parameters DEFAULT = new Builder().build();
/**
* @deprecated This instance is not configured using {@link Context} constraints. Use {@link
* #getDefaults(Context)} instead.
* @deprecated Use {@link #DEFAULT} instead.
*/
@Deprecated public static final Parameters DEFAULT = DEFAULT_WITHOUT_CONTEXT;
@Deprecated public static final Parameters DEFAULT_WITHOUT_CONTEXT = DEFAULT;
/** Returns an instance configured with default values. */
/**
* @deprecated Use {@link #DEFAULT} instead.
*/
@Deprecated
public static Parameters getDefaults(Context context) {
return new Parameters.Builder(context).build();
return DEFAULT;
}
// Video
@ -2416,7 +2426,7 @@ public class DefaultTrackSelector extends MappingTrackSelector
* @param trackSelectionFactory A factory for {@link ExoTrackSelection}s.
*/
public DefaultTrackSelector(Context context, ExoTrackSelection.Factory trackSelectionFactory) {
this(context, Parameters.getDefaults(context), trackSelectionFactory);
this(context, Parameters.DEFAULT, trackSelectionFactory);
}
/**
@ -2471,9 +2481,7 @@ public class DefaultTrackSelector extends MappingTrackSelector
if (parameters instanceof Parameters) {
this.parameters = (Parameters) parameters;
} else {
Parameters defaultParameters =
context == null ? Parameters.DEFAULT_WITHOUT_CONTEXT : Parameters.getDefaults(context);
this.parameters = defaultParameters.buildUpon().set(parameters).build();
this.parameters = Parameters.DEFAULT.buildUpon().set(parameters).build();
}
this.audioAttributes = AudioAttributes.DEFAULT;
if (this.parameters.constrainAudioChannelCountToDeviceCapabilities && context == null) {
@ -2778,6 +2786,11 @@ public class DefaultTrackSelector extends MappingTrackSelector
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED) {
return null;
}
@Nullable
Point viewportSizeFromDisplay =
params.isViewportSizeLimitedByPhysicalDisplaySize && context != null
? Util.getCurrentDisplayModeSize(context)
: null;
return selectTracksForType(
C.TRACK_TYPE_VIDEO,
mappedTrackInfo,
@ -2789,7 +2802,8 @@ public class DefaultTrackSelector extends MappingTrackSelector
params,
support,
selectedAudioLanguage,
mixedMimeTypeSupports[rendererIndex]),
mixedMimeTypeSupports[rendererIndex],
viewportSizeFromDisplay),
VideoTrackInfo::compareSelections);
}
@ -2900,13 +2914,23 @@ public class DefaultTrackSelector extends MappingTrackSelector
if (params.audioOffloadPreferences.audioOffloadMode == AUDIO_OFFLOAD_MODE_REQUIRED) {
return null;
}
@Nullable
String preferredCaptioningLanguage =
params.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager
? getPreferredLanguageFromCaptioningManager(context)
: null;
return selectTracksForType(
C.TRACK_TYPE_TEXT,
mappedTrackInfo,
rendererFormatSupports,
(int rendererIndex, TrackGroup group, @Capabilities int[] support) ->
TextTrackInfo.createForTrackGroup(
rendererIndex, group, params, support, selectedAudioLanguage),
rendererIndex,
group,
params,
support,
selectedAudioLanguage,
preferredCaptioningLanguage),
TextTrackInfo::compareSelections);
}
@ -3478,6 +3502,23 @@ public class DefaultTrackSelector extends MappingTrackSelector
}
}
@Nullable
private static String getPreferredLanguageFromCaptioningManager(@Nullable Context context) {
if (context == null) {
return null;
}
CaptioningManager captioningManager =
(CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE);
if (captioningManager == null || !captioningManager.isEnabled()) {
return null;
}
Locale preferredLocale = captioningManager.getLocale();
if (preferredLocale == null) {
return null;
}
return Util.getLocaleLanguageTag(preferredLocale);
}
/** Base class for track selection information of a {@link Format}. */
private abstract static class TrackInfo<T extends TrackInfo<T>> {
/** Factory for {@link TrackInfo} implementations for a given {@link TrackGroup}. */
@ -3521,13 +3562,15 @@ public class DefaultTrackSelector extends MappingTrackSelector
Parameters params,
@Capabilities int[] formatSupport,
@Nullable String selectedAudioLanguage,
@AdaptiveSupport int mixedMimeTypeAdaptationSupport) {
@AdaptiveSupport int mixedMimeTypeAdaptationSupport,
@Nullable Point viewportSizeFromDisplay) {
int viewportWidth =
viewportSizeFromDisplay != null ? viewportSizeFromDisplay.x : params.viewportWidth;
int viewportHeight =
viewportSizeFromDisplay != null ? viewportSizeFromDisplay.y : params.viewportHeight;
int maxPixelsToRetainForViewport =
getMaxVideoPixelsToRetainForViewport(
trackGroup,
params.viewportWidth,
params.viewportHeight,
params.viewportOrientationMayChange);
trackGroup, viewportWidth, viewportHeight, params.viewportOrientationMayChange);
ImmutableList.Builder<VideoTrackInfo> listBuilder = ImmutableList.builder();
for (int i = 0; i < trackGroup.length; i++) {
int pixelCount = trackGroup.getFormat(i).getPixelCount();
@ -4018,7 +4061,8 @@ public class DefaultTrackSelector extends MappingTrackSelector
TrackGroup trackGroup,
Parameters params,
@Capabilities int[] formatSupport,
@Nullable String selectedAudioLanguage) {
@Nullable String selectedAudioLanguage,
@Nullable String preferredCaptioningLanguage) {
ImmutableList.Builder<TextTrackInfo> listBuilder = ImmutableList.builder();
for (int i = 0; i < trackGroup.length; i++) {
listBuilder.add(
@ -4028,7 +4072,8 @@ public class DefaultTrackSelector extends MappingTrackSelector
/* trackIndex= */ i,
params,
formatSupport[i],
selectedAudioLanguage));
selectedAudioLanguage,
preferredCaptioningLanguage));
}
return listBuilder.build();
}
@ -4049,7 +4094,8 @@ public class DefaultTrackSelector extends MappingTrackSelector
int trackIndex,
Parameters parameters,
@Capabilities int trackFormatSupport,
@Nullable String selectedAudioLanguage) {
@Nullable String selectedAudioLanguage,
@Nullable String preferredCaptioningLanguage) {
super(rendererIndex, trackGroup, trackIndex);
isWithinRendererCapabilities =
isFormatSupported(trackFormatSupport, /* allowExceedsCapabilities= */ false);
@ -4061,9 +4107,11 @@ public class DefaultTrackSelector extends MappingTrackSelector
// Compare against empty (unset) language if no preference is given to allow the selection of
// a text track with undetermined language.
ImmutableList<String> preferredLanguages =
parameters.preferredTextLanguages.isEmpty()
? ImmutableList.of("")
: parameters.preferredTextLanguages;
preferredCaptioningLanguage != null
? ImmutableList.of(preferredCaptioningLanguage)
: parameters.preferredTextLanguages.isEmpty()
? ImmutableList.of("")
: parameters.preferredTextLanguages;
for (int i = 0; i < preferredLanguages.size(); i++) {
int score =
getFormatLanguageScore(
@ -4076,8 +4124,11 @@ public class DefaultTrackSelector extends MappingTrackSelector
}
preferredLanguageIndex = bestLanguageIndex;
preferredLanguageScore = bestLanguageScore;
preferredRoleFlagsScore =
getRoleFlagMatchScore(format.roleFlags, parameters.preferredTextRoleFlags);
int preferredRoleFlags =
preferredCaptioningLanguage != null
? C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND
: parameters.preferredTextRoleFlags;
preferredRoleFlagsScore = getRoleFlagMatchScore(format.roleFlags, preferredRoleFlags);
hasCaptionRoleFlags =
(format.roleFlags & (C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND)) != 0;
boolean selectedAudioLanguageUndetermined =

View File

@ -183,7 +183,7 @@ public abstract class TrackSelector {
/** Returns the current parameters for track selection. */
public TrackSelectionParameters getParameters() {
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
return TrackSelectionParameters.DEFAULT;
}
/**

View File

@ -93,7 +93,7 @@ public class AudioCapabilitiesEndToEndTest {
applicationContext = ApplicationProvider.getApplicationContext();
audioManager = (AudioManager) applicationContext.getSystemService(Context.AUDIO_SERVICE);
shadowOf(audioManager).setOutputDevices(ImmutableList.of());
defaultParameters = Parameters.getDefaults(applicationContext);
defaultParameters = Parameters.DEFAULT;
selectedTracks = new ArrayList<>();
analyticsListenerReceivedCallbacks = new ArrayList<>();
}

View File

@ -129,7 +129,7 @@ public class DownloadHelperTest {
new DownloadHelper(
testMediaItem,
new TestMediaSource(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
new DefaultRendererCapabilitiesList.Factory(renderersFactory)
.createRendererCapabilitiesList());
}
@ -257,7 +257,7 @@ public class DownloadHelperTest {
throws Exception {
prepareDownloadHelper(downloadHelper);
DefaultTrackSelector.Parameters parameters =
new DefaultTrackSelector.ParametersBuilder(getApplicationContext())
new DefaultTrackSelector.Parameters.Builder()
.setPreferredAudioLanguage("de")
.setPreferredTextLanguage("de")
.setRendererDisabled(/* rendererIndex= */ 2, true)
@ -461,7 +461,7 @@ public class DownloadHelperTest {
DownloadHelper downloadHelper =
DownloadHelper.forMediaItem(
testMediaItem,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
renderersFactory,
new FakeDataSource.Factory());
@ -541,7 +541,7 @@ public class DownloadHelperTest {
downloadHelper.set(
DownloadHelper.forMediaItem(
testMediaItem,
TrackSelectionParameters.getDefaults(getApplicationContext()),
TrackSelectionParameters.DEFAULT,
renderersFactory,
new FakeDataSource.Factory()));
} catch (Throwable e) {
@ -572,7 +572,7 @@ public class DownloadHelperTest {
downloadHelper.set(
DownloadHelper.forMediaItem(
testMediaItem,
TrackSelectionParameters.getDefaults(getApplicationContext()),
TrackSelectionParameters.DEFAULT,
renderersFactory,
new FakeDataSource.Factory(),
new DefaultDrmSessionManager.Builder()
@ -619,7 +619,7 @@ public class DownloadHelperTest {
new DownloadHelper(
testMediaItem,
new FakeMediaSource(),
TrackSelectionParameters.getDefaults(getApplicationContext()),
TrackSelectionParameters.DEFAULT,
emptyRendererCapabilitiesList));
} catch (Throwable e) {
exception.set(e);

View File

@ -89,6 +89,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.shadows.ShadowDisplay;
import org.robolectric.shadows.ShadowDisplayManager;
/** Unit tests for {@link DefaultTrackSelector}. */
@RunWith(AndroidJUnit4.class)
@ -171,7 +173,7 @@ public final class DefaultTrackSelectorTest {
public void setUp() {
when(bandwidthMeter.getBitrateEstimate()).thenReturn(1000000L);
Context context = ApplicationProvider.getApplicationContext();
defaultParameters = Parameters.getDefaults(context);
defaultParameters = Parameters.DEFAULT;
trackSelector = new DefaultTrackSelector(context);
trackSelector.init(invalidationListener, bandwidthMeter);
}
@ -2517,6 +2519,127 @@ public final class DefaultTrackSelectorTest {
assertFixedSelection(result.selections[0], trackGroups, formatDV);
}
@Test
public void selectTracks_withViewportSize_selectsTrackWithinViewport() throws Exception {
Format formatH264Low =
new Format.Builder()
.setSampleMimeType(MimeTypes.VIDEO_H264)
.setAverageBitrate(400)
.setWidth(600)
.setHeight(400)
.build();
Format formatH264Mid =
new Format.Builder()
.setSampleMimeType(MimeTypes.VIDEO_H264)
.setAverageBitrate(800)
.setWidth(1200)
.setHeight(800)
.build();
Format formatH264High =
new Format.Builder()
.setSampleMimeType(MimeTypes.VIDEO_H264)
.setAverageBitrate(2000)
.setWidth(2400)
.setHeight(1600)
.build();
TrackGroup adaptiveGroup = new TrackGroup(formatH264Low, formatH264Mid, formatH264High);
TrackGroupArray trackGroups = new TrackGroupArray(adaptiveGroup);
// Choose a viewport between low and mid, so that the low resolution only fits if orientation
// changes are allowed.
trackSelector.setParameters(
defaultParameters
.buildUpon()
.setViewportSize(
/* viewportWidth= */ 450,
/* viewportHeight= */ 650,
/* viewportOrientationMayChange= */ true));
TrackSelectorResult result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertAdaptiveSelection(result.selections[0], adaptiveGroup, /* expectedTracks...= */ 1, 0);
trackSelector.setParameters(
defaultParameters
.buildUpon()
.setViewportSize(
/* viewportWidth= */ 450,
/* viewportHeight= */ 650,
/* viewportOrientationMayChange= */ false));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections[0], adaptiveGroup, /* expectedTrack= */ 0);
// Verify that selecting (almost) exactly one resolution does not include the next larger one.
trackSelector.setParameters(
defaultParameters
.buildUpon()
.setViewportSize(
/* viewportWidth= */ 1201,
/* viewportHeight= */ 801,
/* viewportOrientationMayChange= */ true));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertAdaptiveSelection(result.selections[0], adaptiveGroup, /* expectedTracks...= */ 1, 0);
}
@Test
public void selectTracks_withViewportSizeSetToPhysicalDisplaySize_selectsTrackWithinDisplaySize()
throws Exception {
Format formatH264Low =
new Format.Builder()
.setSampleMimeType(MimeTypes.VIDEO_H264)
.setAverageBitrate(400)
.setWidth(600)
.setHeight(400)
.build();
Format formatH264Mid =
new Format.Builder()
.setSampleMimeType(MimeTypes.VIDEO_H264)
.setAverageBitrate(800)
.setWidth(1200)
.setHeight(800)
.build();
Format formatH264High =
new Format.Builder()
.setSampleMimeType(MimeTypes.VIDEO_H264)
.setAverageBitrate(2000)
.setWidth(2400)
.setHeight(1600)
.build();
TrackGroup adaptiveGroup = new TrackGroup(formatH264Low, formatH264Mid, formatH264High);
TrackGroupArray trackGroups = new TrackGroupArray(adaptiveGroup);
// Choose a display size (450x650) between low and mid, so that the low resolution only fits if
// orientation changes are allowed.
ShadowDisplayManager.changeDisplay(
ShadowDisplay.getDefaultDisplay().getDisplayId(), "w450dp-h650dp-160dpi");
trackSelector.setParameters(
defaultParameters
.buildUpon()
.setViewportSizeToPhysicalDisplaySize(/* viewportOrientationMayChange= */ true));
TrackSelectorResult result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertAdaptiveSelection(result.selections[0], adaptiveGroup, /* expectedTracks...= */ 1, 0);
trackSelector.setParameters(
defaultParameters
.buildUpon()
.setViewportSizeToPhysicalDisplaySize(/* viewportOrientationMayChange= */ false));
result =
trackSelector.selectTracks(
new RendererCapabilities[] {VIDEO_CAPABILITIES}, trackGroups, periodId, TIMELINE);
assertThat(result.length).isEqualTo(1);
assertFixedSelection(result.selections[0], adaptiveGroup, /* expectedTrack= */ 0);
}
@Test
public void
selectTracks_withSingleTrackAndOffloadPreferenceEnabled_returnsRendererConfigOffloadModeEnabledGaplessRequired()
@ -3295,7 +3418,7 @@ public final class DefaultTrackSelectorTest {
* variables.
*/
private static Parameters buildParametersForEqualsTest() {
return Parameters.DEFAULT_WITHOUT_CONTEXT
return Parameters.DEFAULT
.buildUpon()
// Video
.setMaxVideoSize(/* maxVideoWidth= */ 0, /* maxVideoHeight= */ 1)

View File

@ -39,7 +39,7 @@ public final class DownloadHelperTest {
new FakeDataSource.Factory());
DownloadHelper.forMediaItem(
new MediaItem.Builder().setUri("http://uri").setMimeType(MimeTypes.APPLICATION_MPD).build(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
new FakeDataSource.Factory(),
/* drmSessionManager= */ DrmSessionManager.DRM_UNSUPPORTED);

View File

@ -44,7 +44,7 @@ public final class DownloadHelperTest {
.setUri("http://uri")
.setMimeType(MimeTypes.APPLICATION_M3U8)
.build(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
new FakeDataSource.Factory(),
/* drmSessionManager= */ null);

View File

@ -267,7 +267,7 @@ import androidx.media3.test.utils.StubExoPlayer;
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
return TrackSelectionParameters.DEFAULT;
}
@Override

View File

@ -38,7 +38,7 @@ public final class DownloadHelperTest {
new FakeDataSource.Factory());
DownloadHelper.forMediaItem(
new MediaItem.Builder().setUri("http://uri").setMimeType(MimeTypes.APPLICATION_SS).build(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS,
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
new FakeDataSource.Factory(),
/* drmSessionManager= */ null);

View File

@ -1986,7 +1986,7 @@ public class MediaController implements Player {
public final TrackSelectionParameters getTrackSelectionParameters() {
verifyApplicationThread();
if (!isConnected()) {
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
return TrackSelectionParameters.DEFAULT;
}
return impl.getTrackSelectionParameters();
}

View File

@ -1345,7 +1345,7 @@ import org.checkerframework.checker.initialization.qual.UnderInitialization;
@Override
public TrackSelectionParameters getTrackSelectionParameters() {
return TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
return TrackSelectionParameters.DEFAULT;
}
@Override
@ -2434,7 +2434,7 @@ import org.checkerframework.checker.initialization.qual.UnderInitialization;
seekForwardIncrementMs,
maxSeekToPreviousPositionMs,
/* currentTracks= */ Tracks.EMPTY,
/* parameters= */ TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
/* parameters= */ TrackSelectionParameters.DEFAULT);
return new ControllerInfo(
playerInfo,

View File

@ -462,7 +462,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
/* seekForwardIncrementMs= */ C.DEFAULT_SEEK_FORWARD_INCREMENT_MS,
/* maxSeekToPreviousPositionMs= */ C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS,
/* currentTracks= */ Tracks.EMPTY,
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
TrackSelectionParameters.DEFAULT);
@Nullable public final PlaybackException playerError;
@ -1003,7 +1003,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
if (!currentTracks.equals(Tracks.EMPTY)) {
bundle.putBundle(FIELD_CURRENT_TRACKS, currentTracks.toBundle());
}
if (!trackSelectionParameters.equals(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT)) {
if (!trackSelectionParameters.equals(TrackSelectionParameters.DEFAULT)) {
bundle.putBundle(FIELD_TRACK_SELECTION_PARAMETERS, trackSelectionParameters.toBundle());
}
return bundle;
@ -1117,7 +1117,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
Bundle trackSelectionParametersBundle = bundle.getBundle(FIELD_TRACK_SELECTION_PARAMETERS);
TrackSelectionParameters trackSelectionParameters =
trackSelectionParametersBundle == null
? TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
? TrackSelectionParameters.DEFAULT
: TrackSelectionParameters.fromBundle(trackSelectionParametersBundle);
return new PlayerInfo(
playerError,

View File

@ -1005,7 +1005,7 @@ public class MediaControllerListenerTest {
@Test
public void onTrackSelectionParametersChanged() throws Exception {
RemoteMediaSession.RemoteMockPlayer player = remoteSession.getMockPlayer();
player.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT);
player.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT);
MediaController controller = controllerTestRule.createController(remoteSession.getToken());
AtomicReference<TrackSelectionParameters> parametersFromParamRef = new AtomicReference<>();
AtomicReference<TrackSelectionParameters> parametersFromGetterRef = new AtomicReference<>();
@ -1031,10 +1031,7 @@ public class MediaControllerListenerTest {
threadTestRule.getHandler().postAndSync(() -> controller.addListener(listener));
TrackSelectionParameters parameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
.buildUpon()
.setMaxAudioBitrate(100)
.build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxAudioBitrate(100).build();
player.notifyTrackSelectionParametersChanged(parameters);
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();

View File

@ -2028,7 +2028,7 @@ public class MediaControllerTest {
.build();
Tracks currentTracks = new Tracks(trackGroups);
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxVideoSizeSd().build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoSizeSd().build();
Timeline timeline = MediaTestUtils.createTimeline(5);
int currentMediaItemIndex = 3;
MediaItem currentMediaItem =
@ -2249,7 +2249,7 @@ public class MediaControllerTest {
public void getTrackSelectionParameters_returnsTrackSelectionParametersOfPlayerInSession()
throws Exception {
TrackSelectionParameters parameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxVideoSizeSd().build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoSizeSd().build();
Bundle playerConfig =
new RemoteMediaSession.MockPlayerConfigBuilder()
.setTrackSelectionParameters(parameters)
@ -3066,7 +3066,7 @@ public class MediaControllerTest {
/* trackSupport= */ new int[1],
/* trackSelected= */ new boolean[1])));
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT
TrackSelectionParameters.DEFAULT
.buildUpon()
.addOverride(
new TrackSelectionOverride(playerTrackGroupForOverride, /* trackIndex= */ 0))

View File

@ -280,9 +280,7 @@ public class MediaSessionPermissionTest {
public void setTrackSelectionParameters() throws Exception {
testOnCommandRequest(
COMMAND_SET_TRACK_SELECTION_PARAMETERS,
controller ->
controller.setTrackSelectionParameters(
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT));
controller -> controller.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT));
}
@Test

View File

@ -862,7 +862,7 @@ public class MediaSessionPlayerTest {
@Test
public void setTrackSelectionParameters() throws Exception {
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxAudioBitrate(10).build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxAudioBitrate(10).build();
controller.setTrackSelectionParameters(trackSelectionParameters);

View File

@ -538,7 +538,7 @@ public class MockPlayerTest {
@Test
public void setTrackSelectionParameters() {
TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT.buildUpon().setMaxAudioBitrate(10).build();
TrackSelectionParameters.DEFAULT.buildUpon().setMaxAudioBitrate(10).build();
player.setTrackSelectionParameters(trackSelectionParameters);

View File

@ -371,7 +371,7 @@ public class MockPlayer implements Player {
commands = new Player.Commands.Builder().addAllCommands().build();
currentTracks = Tracks.EMPTY;
trackSelectionParameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT;
trackSelectionParameters = TrackSelectionParameters.DEFAULT;
}
@Override