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 { public class TrackSelectionParameters {
method public androidx.media3.common.TrackSelectionParameters.Builder buildUpon(); 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 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(); method @CallSuper public android.os.Bundle toBundle();
field public final com.google.common.collect.ImmutableSet<java.lang.Integer> disabledTrackTypes; field public final com.google.common.collect.ImmutableSet<java.lang.Integer> disabledTrackTypes;
field public final boolean forceHighestSupportedBitrate; field public final boolean forceHighestSupportedBitrate;
field public final boolean forceLowestBitrate; field public final boolean forceLowestBitrate;
field @androidx.media3.common.C.SelectionFlags public final int ignoredTextSelectionFlags; field @androidx.media3.common.C.SelectionFlags public final int ignoredTextSelectionFlags;
field public final boolean isViewportSizeLimitedByPhysicalDisplaySize;
field public final int maxAudioBitrate; field public final int maxAudioBitrate;
field public final int maxAudioChannelCount; field public final int maxAudioChannelCount;
field public final int maxVideoBitrate; 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 public final com.google.common.collect.ImmutableList<java.lang.String> preferredVideoMimeTypes;
field @androidx.media3.common.C.RoleFlags public final int preferredVideoRoleFlags; field @androidx.media3.common.C.RoleFlags public final int preferredVideoRoleFlags;
field public final boolean selectUndeterminedTextLanguage; field public final boolean selectUndeterminedTextLanguage;
field public final boolean usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
field public final int viewportHeight; field public final int viewportHeight;
field public final boolean viewportOrientationMayChange; field public final boolean viewportOrientationMayChange;
field public final int viewportWidth; field public final int viewportWidth;
} }
public static class TrackSelectionParameters.Builder { 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.Builder addOverride(androidx.media3.common.TrackSelectionOverride);
method public androidx.media3.common.TrackSelectionParameters build(); method public androidx.media3.common.TrackSelectionParameters build();
method public androidx.media3.common.TrackSelectionParameters.Builder clearOverride(androidx.media3.common.TrackGroup); 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 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 setPreferredAudioRoleFlags(@androidx.media3.common.C.RoleFlags int);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredTextLanguage(@Nullable String); 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 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 setPreferredTextRoleFlags(@androidx.media3.common.C.RoleFlags int);
method public androidx.media3.common.TrackSelectionParameters.Builder setPreferredVideoMimeType(@Nullable String); 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 setSelectUndeterminedTextLanguage(boolean);
method public androidx.media3.common.TrackSelectionParameters.Builder setTrackTypeDisabled(@androidx.media3.common.C.TrackType int, 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 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 { public final class Tracks {

View File

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

View File

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

View File

@ -159,7 +159,7 @@ public abstract class SimpleBasePlayer extends BasePlayer {
seekForwardIncrementMs = C.DEFAULT_SEEK_FORWARD_INCREMENT_MS; seekForwardIncrementMs = C.DEFAULT_SEEK_FORWARD_INCREMENT_MS;
maxSeekToPreviousPositionMs = C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS; maxSeekToPreviousPositionMs = C.DEFAULT_MAX_SEEK_TO_PREVIOUS_POSITION_MS;
playbackParameters = PlaybackParameters.DEFAULT; playbackParameters = PlaybackParameters.DEFAULT;
trackSelectionParameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; trackSelectionParameters = TrackSelectionParameters.DEFAULT;
audioAttributes = AudioAttributes.DEFAULT; audioAttributes = AudioAttributes.DEFAULT;
volume = 1f; volume = 1f;
videoSize = VideoSize.UNKNOWN; 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 static java.lang.annotation.RetentionPolicy.SOURCE;
import android.content.Context; import android.content.Context;
import android.graphics.Point;
import android.os.Bundle; import android.os.Bundle;
import android.os.Looper;
import android.view.accessibility.CaptioningManager; import android.view.accessibility.CaptioningManager;
import androidx.annotation.CallSuper; import androidx.annotation.CallSuper;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
@ -37,6 +35,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
import com.google.errorprone.annotations.InlineMe;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.Target; import java.lang.annotation.Target;
@ -44,7 +43,6 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Set; import java.util.Set;
import org.checkerframework.checker.initialization.qual.UnknownInitialization; import org.checkerframework.checker.initialization.qual.UnknownInitialization;
import org.checkerframework.checker.nullness.qual.EnsuresNonNull; import org.checkerframework.checker.nullness.qual.EnsuresNonNull;
@ -88,6 +86,7 @@ public class TrackSelectionParameters {
private int minVideoBitrate; private int minVideoBitrate;
private int viewportWidth; private int viewportWidth;
private int viewportHeight; private int viewportHeight;
private boolean isViewportSizeLimitedByPhysicalDisplaySize;
private boolean viewportOrientationMayChange; private boolean viewportOrientationMayChange;
private ImmutableList<String> preferredVideoMimeTypes; private ImmutableList<String> preferredVideoMimeTypes;
private ImmutableList<String> preferredVideoLanguages; private ImmutableList<String> preferredVideoLanguages;
@ -102,6 +101,7 @@ public class TrackSelectionParameters {
// Text // Text
private ImmutableList<String> preferredTextLanguages; private ImmutableList<String> preferredTextLanguages;
private @C.RoleFlags int preferredTextRoleFlags; private @C.RoleFlags int preferredTextRoleFlags;
private boolean usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
private @C.SelectionFlags int ignoredTextSelectionFlags; private @C.SelectionFlags int ignoredTextSelectionFlags;
private boolean selectUndeterminedTextLanguage; private boolean selectUndeterminedTextLanguage;
// Image // Image
@ -112,12 +112,7 @@ public class TrackSelectionParameters {
private HashMap<TrackGroup, TrackSelectionOverride> overrides; private HashMap<TrackGroup, TrackSelectionOverride> overrides;
private HashSet<@C.TrackType Integer> disabledTrackTypes; private HashSet<@C.TrackType Integer> disabledTrackTypes;
/** /** Creates a builder with default initial values. */
* @deprecated {@link Context} constraints will not be set using this constructor. Use {@link
* #Builder(Context)} instead.
*/
@UnstableApi
@Deprecated
public Builder() { public Builder() {
// Video // Video
maxVideoWidth = Integer.MAX_VALUE; maxVideoWidth = Integer.MAX_VALUE;
@ -126,6 +121,7 @@ public class TrackSelectionParameters {
maxVideoBitrate = Integer.MAX_VALUE; maxVideoBitrate = Integer.MAX_VALUE;
viewportWidth = Integer.MAX_VALUE; viewportWidth = Integer.MAX_VALUE;
viewportHeight = Integer.MAX_VALUE; viewportHeight = Integer.MAX_VALUE;
isViewportSizeLimitedByPhysicalDisplaySize = true;
viewportOrientationMayChange = true; viewportOrientationMayChange = true;
preferredVideoMimeTypes = ImmutableList.of(); preferredVideoMimeTypes = ImmutableList.of();
preferredVideoLanguages = ImmutableList.of(); preferredVideoLanguages = ImmutableList.of();
@ -140,6 +136,7 @@ public class TrackSelectionParameters {
// Text // Text
preferredTextLanguages = ImmutableList.of(); preferredTextLanguages = ImmutableList.of();
preferredTextRoleFlags = 0; preferredTextRoleFlags = 0;
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = true;
ignoredTextSelectionFlags = 0; ignoredTextSelectionFlags = 0;
selectUndeterminedTextLanguage = false; selectUndeterminedTextLanguage = false;
// Image // Image
@ -152,15 +149,12 @@ public class TrackSelectionParameters {
} }
/** /**
* Creates a builder with default initial values. * @deprecated Use {@link #Builder()} instead.
*
* @param context Any context.
*/ */
@SuppressWarnings({"deprecation", "method.invocation"}) // Methods invoked are setter only. @Deprecated
@InlineMe(replacement = "this()")
public Builder(Context context) { public Builder(Context context) {
this(); this();
setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(context);
setViewportSizeToPhysicalDisplaySize(context, /* viewportOrientationMayChange= */ true);
} }
/** Creates a builder with the initial values specified in {@code initialValues}. */ /** Creates a builder with the initial values specified in {@code initialValues}. */
@ -173,26 +167,25 @@ public class TrackSelectionParameters {
@UnstableApi @UnstableApi
protected Builder(Bundle bundle) { protected Builder(Bundle bundle) {
// Video // Video
maxVideoWidth = bundle.getInt(FIELD_MAX_VIDEO_WIDTH, DEFAULT_WITHOUT_CONTEXT.maxVideoWidth); maxVideoWidth = bundle.getInt(FIELD_MAX_VIDEO_WIDTH, DEFAULT.maxVideoWidth);
maxVideoHeight = maxVideoHeight = bundle.getInt(FIELD_MAX_VIDEO_HEIGHT, DEFAULT.maxVideoHeight);
bundle.getInt(FIELD_MAX_VIDEO_HEIGHT, DEFAULT_WITHOUT_CONTEXT.maxVideoHeight); maxVideoFrameRate = bundle.getInt(FIELD_MAX_VIDEO_FRAMERATE, DEFAULT.maxVideoFrameRate);
maxVideoFrameRate = maxVideoBitrate = bundle.getInt(FIELD_MAX_VIDEO_BITRATE, DEFAULT.maxVideoBitrate);
bundle.getInt(FIELD_MAX_VIDEO_FRAMERATE, DEFAULT_WITHOUT_CONTEXT.maxVideoFrameRate); minVideoWidth = bundle.getInt(FIELD_MIN_VIDEO_WIDTH, DEFAULT.minVideoWidth);
maxVideoBitrate = minVideoHeight = bundle.getInt(FIELD_MIN_VIDEO_HEIGHT, DEFAULT.minVideoHeight);
bundle.getInt(FIELD_MAX_VIDEO_BITRATE, DEFAULT_WITHOUT_CONTEXT.maxVideoBitrate); minVideoFrameRate = bundle.getInt(FIELD_MIN_VIDEO_FRAMERATE, DEFAULT.minVideoFrameRate);
minVideoWidth = bundle.getInt(FIELD_MIN_VIDEO_WIDTH, DEFAULT_WITHOUT_CONTEXT.minVideoWidth); minVideoBitrate = bundle.getInt(FIELD_MIN_VIDEO_BITRATE, DEFAULT.minVideoBitrate);
minVideoHeight = viewportWidth = bundle.getInt(FIELD_VIEWPORT_WIDTH, DEFAULT.viewportWidth);
bundle.getInt(FIELD_MIN_VIDEO_HEIGHT, DEFAULT_WITHOUT_CONTEXT.minVideoHeight); viewportHeight = bundle.getInt(FIELD_VIEWPORT_HEIGHT, DEFAULT.viewportHeight);
minVideoFrameRate = isViewportSizeLimitedByPhysicalDisplaySize =
bundle.getInt(FIELD_MIN_VIDEO_FRAMERATE, DEFAULT_WITHOUT_CONTEXT.minVideoFrameRate); viewportWidth == Integer.MAX_VALUE
minVideoBitrate = && viewportHeight == Integer.MAX_VALUE
bundle.getInt(FIELD_MIN_VIDEO_BITRATE, DEFAULT_WITHOUT_CONTEXT.minVideoBitrate); && bundle.getBoolean(
viewportWidth = bundle.getInt(FIELD_VIEWPORT_WIDTH, DEFAULT_WITHOUT_CONTEXT.viewportWidth); FIELD_IS_VIEWPORT_SIZE_LIMITED_BY_PHYSICAL_DISPLAY_SIZE,
viewportHeight = bundle.getInt(FIELD_VIEWPORT_HEIGHT, DEFAULT_WITHOUT_CONTEXT.viewportHeight); DEFAULT.isViewportSizeLimitedByPhysicalDisplaySize);
viewportOrientationMayChange = viewportOrientationMayChange =
bundle.getBoolean( bundle.getBoolean(
FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, DEFAULT.viewportOrientationMayChange);
DEFAULT_WITHOUT_CONTEXT.viewportOrientationMayChange);
preferredVideoMimeTypes = preferredVideoMimeTypes =
ImmutableList.copyOf( ImmutableList.copyOf(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_VIDEO_MIMETYPES), new String[0])); firstNonNull(bundle.getStringArray(FIELD_PREFERRED_VIDEO_MIMETYPES), new String[0]));
@ -200,20 +193,16 @@ public class TrackSelectionParameters {
ImmutableList.copyOf( ImmutableList.copyOf(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_VIDEO_LANGUAGES), new String[0])); firstNonNull(bundle.getStringArray(FIELD_PREFERRED_VIDEO_LANGUAGES), new String[0]));
preferredVideoRoleFlags = preferredVideoRoleFlags =
bundle.getInt( bundle.getInt(FIELD_PREFERRED_VIDEO_ROLE_FLAGS, DEFAULT.preferredVideoRoleFlags);
FIELD_PREFERRED_VIDEO_ROLE_FLAGS, DEFAULT_WITHOUT_CONTEXT.preferredVideoRoleFlags);
// Audio // Audio
String[] preferredAudioLanguages1 = String[] preferredAudioLanguages1 =
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_AUDIO_LANGUAGES), new String[0]); firstNonNull(bundle.getStringArray(FIELD_PREFERRED_AUDIO_LANGUAGES), new String[0]);
preferredAudioLanguages = normalizeLanguageCodes(preferredAudioLanguages1); preferredAudioLanguages = normalizeLanguageCodes(preferredAudioLanguages1);
preferredAudioRoleFlags = preferredAudioRoleFlags =
bundle.getInt( bundle.getInt(FIELD_PREFERRED_AUDIO_ROLE_FLAGS, DEFAULT.preferredAudioRoleFlags);
FIELD_PREFERRED_AUDIO_ROLE_FLAGS, DEFAULT_WITHOUT_CONTEXT.preferredAudioRoleFlags);
maxAudioChannelCount = maxAudioChannelCount =
bundle.getInt( bundle.getInt(FIELD_MAX_AUDIO_CHANNEL_COUNT, DEFAULT.maxAudioChannelCount);
FIELD_MAX_AUDIO_CHANNEL_COUNT, DEFAULT_WITHOUT_CONTEXT.maxAudioChannelCount); maxAudioBitrate = bundle.getInt(FIELD_MAX_AUDIO_BITRATE, DEFAULT.maxAudioBitrate);
maxAudioBitrate =
bundle.getInt(FIELD_MAX_AUDIO_BITRATE, DEFAULT_WITHOUT_CONTEXT.maxAudioBitrate);
preferredAudioMimeTypes = preferredAudioMimeTypes =
ImmutableList.copyOf( ImmutableList.copyOf(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_AUDIO_MIME_TYPES), new String[0])); firstNonNull(bundle.getStringArray(FIELD_PREFERRED_AUDIO_MIME_TYPES), new String[0]));
@ -223,29 +212,29 @@ public class TrackSelectionParameters {
normalizeLanguageCodes( normalizeLanguageCodes(
firstNonNull(bundle.getStringArray(FIELD_PREFERRED_TEXT_LANGUAGES), new String[0])); firstNonNull(bundle.getStringArray(FIELD_PREFERRED_TEXT_LANGUAGES), new String[0]));
preferredTextRoleFlags = preferredTextRoleFlags =
bundle.getInt( bundle.getInt(FIELD_PREFERRED_TEXT_ROLE_FLAGS, DEFAULT.preferredTextRoleFlags);
FIELD_PREFERRED_TEXT_ROLE_FLAGS, DEFAULT_WITHOUT_CONTEXT.preferredTextRoleFlags); usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager =
preferredTextLanguages.isEmpty()
&& preferredTextRoleFlags == 0
&& bundle.getBoolean(
FIELD_USE_PREFERRED_TEXT_LANGUAGES_AND_ROLE_FLAGS_FROM_CAPTIONING_MANAGER,
DEFAULT.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager);
ignoredTextSelectionFlags = ignoredTextSelectionFlags =
bundle.getInt( bundle.getInt(FIELD_IGNORED_TEXT_SELECTION_FLAGS, DEFAULT.ignoredTextSelectionFlags);
FIELD_IGNORED_TEXT_SELECTION_FLAGS,
DEFAULT_WITHOUT_CONTEXT.ignoredTextSelectionFlags);
selectUndeterminedTextLanguage = selectUndeterminedTextLanguage =
bundle.getBoolean( bundle.getBoolean(
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, DEFAULT.selectUndeterminedTextLanguage);
DEFAULT_WITHOUT_CONTEXT.selectUndeterminedTextLanguage);
// Image // Image
isPrioritizeImageOverVideoEnabled = isPrioritizeImageOverVideoEnabled =
bundle.getBoolean( bundle.getBoolean(
FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED, FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED, DEFAULT.isPrioritizeImageOverVideoEnabled);
DEFAULT_WITHOUT_CONTEXT.isPrioritizeImageOverVideoEnabled);
// General // General
forceLowestBitrate = forceLowestBitrate =
bundle.getBoolean(FIELD_FORCE_LOWEST_BITRATE, DEFAULT_WITHOUT_CONTEXT.forceLowestBitrate); bundle.getBoolean(FIELD_FORCE_LOWEST_BITRATE, DEFAULT.forceLowestBitrate);
forceHighestSupportedBitrate = forceHighestSupportedBitrate =
bundle.getBoolean( bundle.getBoolean(
FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, DEFAULT.forceHighestSupportedBitrate);
DEFAULT_WITHOUT_CONTEXT.forceHighestSupportedBitrate);
@Nullable @Nullable
List<Bundle> overrideBundleList = bundle.getParcelableArrayList(FIELD_SELECTION_OVERRIDES); List<Bundle> overrideBundleList = bundle.getParcelableArrayList(FIELD_SELECTION_OVERRIDES);
List<TrackSelectionOverride> overrideList = List<TrackSelectionOverride> overrideList =
@ -309,6 +298,8 @@ public class TrackSelectionParameters {
minVideoBitrate = parameters.minVideoBitrate; minVideoBitrate = parameters.minVideoBitrate;
viewportWidth = parameters.viewportWidth; viewportWidth = parameters.viewportWidth;
viewportHeight = parameters.viewportHeight; viewportHeight = parameters.viewportHeight;
isViewportSizeLimitedByPhysicalDisplaySize =
parameters.isViewportSizeLimitedByPhysicalDisplaySize;
viewportOrientationMayChange = parameters.viewportOrientationMayChange; viewportOrientationMayChange = parameters.viewportOrientationMayChange;
preferredVideoMimeTypes = parameters.preferredVideoMimeTypes; preferredVideoMimeTypes = parameters.preferredVideoMimeTypes;
preferredVideoLanguages = parameters.preferredVideoLanguages; preferredVideoLanguages = parameters.preferredVideoLanguages;
@ -323,6 +314,8 @@ public class TrackSelectionParameters {
// Text // Text
preferredTextLanguages = parameters.preferredTextLanguages; preferredTextLanguages = parameters.preferredTextLanguages;
preferredTextRoleFlags = parameters.preferredTextRoleFlags; preferredTextRoleFlags = parameters.preferredTextRoleFlags;
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager =
parameters.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
ignoredTextSelectionFlags = parameters.ignoredTextSelectionFlags; ignoredTextSelectionFlags = parameters.ignoredTextSelectionFlags;
selectUndeterminedTextLanguage = parameters.selectUndeterminedTextLanguage; selectUndeterminedTextLanguage = parameters.selectUndeterminedTextLanguage;
// Image // Image
@ -441,20 +434,31 @@ public class TrackSelectionParameters {
} }
/** /**
* Equivalent to calling {@link #setViewportSize(int, int, boolean)} with the viewport size * Sets whether the viewport size should be assumed to the physical display size if no other
* obtained from {@link Util#getCurrentDisplayModeSize(Context)}. * 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 * @param viewportOrientationMayChange Whether the viewport orientation may change during
* playback. * playback.
* @return This builder. * @return This builder.
*/ */
@CanIgnoreReturnValue @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( public Builder setViewportSizeToPhysicalDisplaySize(
Context context, boolean viewportOrientationMayChange) { Context context, boolean viewportOrientationMayChange) {
// Assume the viewport is fullscreen. return setViewportSizeToPhysicalDisplaySize(viewportOrientationMayChange);
Point viewportSize = Util.getCurrentDisplayModeSize(context);
return setViewportSize(viewportSize.x, viewportSize.y, viewportOrientationMayChange);
} }
/** /**
@ -484,6 +488,7 @@ public class TrackSelectionParameters {
this.viewportWidth = viewportWidth; this.viewportWidth = viewportWidth;
this.viewportHeight = viewportHeight; this.viewportHeight = viewportHeight;
this.viewportOrientationMayChange = viewportOrientationMayChange; this.viewportOrientationMayChange = viewportOrientationMayChange;
this.isViewportSizeLimitedByPhysicalDisplaySize = false;
return this; return this;
} }
@ -657,33 +662,29 @@ public class TrackSelectionParameters {
// Text // Text
/** /**
* Sets the preferred language and role flags for text tracks based on the accessibility * Sets whether the preferred languages and the preferred role flags for text tracks should be
* settings of {@link CaptioningManager}. * 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. * @return This builder.
*/ */
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings() {
usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = true;
preferredTextLanguages = ImmutableList.of();
preferredTextRoleFlags = 0;
return this;
}
/**
* @deprecated Use {@link #setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings()}
* instead.
*/
@Deprecated
@CanIgnoreReturnValue
public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings( public Builder setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings(
Context context) { Context context) {
if (Util.SDK_INT < 23 && Looper.myLooper() == null) { return setPreferredTextLanguageAndRoleFlagsToCaptioningManagerSettings();
// 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;
} }
/** /**
@ -710,6 +711,7 @@ public class TrackSelectionParameters {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Builder setPreferredTextLanguages(String... preferredTextLanguages) { public Builder setPreferredTextLanguages(String... preferredTextLanguages) {
this.preferredTextLanguages = normalizeLanguageCodes(preferredTextLanguages); this.preferredTextLanguages = normalizeLanguageCodes(preferredTextLanguages);
this.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = false;
return this; return this;
} }
@ -722,6 +724,7 @@ public class TrackSelectionParameters {
@CanIgnoreReturnValue @CanIgnoreReturnValue
public Builder setPreferredTextRoleFlags(@C.RoleFlags int preferredTextRoleFlags) { public Builder setPreferredTextRoleFlags(@C.RoleFlags int preferredTextRoleFlags) {
this.preferredTextRoleFlags = preferredTextRoleFlags; this.preferredTextRoleFlags = preferredTextRoleFlags;
this.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager = false;
return this; return this;
} }
@ -1080,35 +1083,21 @@ public class TrackSelectionParameters {
} }
} }
/** /** An instance with default parameters. */
* An instance with default values, except those obtained from the {@link Context}. @UnstableApi public static final TrackSelectionParameters DEFAULT = new Builder().build();
*
* <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();
/** /**
* @deprecated This instance is not configured using {@link Context} constraints. Use {@link * @deprecated Use {@link #DEFAULT} instead.
* #getDefaults(Context)} instead.
*/ */
@UnstableApi @Deprecated @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) { public static TrackSelectionParameters getDefaults(Context context) {
return new Builder(context).build(); return DEFAULT;
} }
// Video // Video
@ -1172,6 +1161,13 @@ public class TrackSelectionParameters {
*/ */
public final int viewportHeight; 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 * 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 * 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. * 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 * 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 * value is an empty list.
* enabled.
*/ */
public final ImmutableList<String> preferredTextLanguages; public final ImmutableList<String> preferredTextLanguages;
/** /**
* The preferred {@link C.RoleFlags} for text tracks. {@code 0} selects the default track if there * 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} * is one, or no track otherwise. The default value is {@code 0}.
* | {@link C#ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND} if the accessibility {@link CaptioningManager}
* is enabled.
*/ */
public final @C.RoleFlags int preferredTextRoleFlags; 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 * 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). * 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.minVideoBitrate = builder.minVideoBitrate;
this.viewportWidth = builder.viewportWidth; this.viewportWidth = builder.viewportWidth;
this.viewportHeight = builder.viewportHeight; this.viewportHeight = builder.viewportHeight;
this.isViewportSizeLimitedByPhysicalDisplaySize =
builder.isViewportSizeLimitedByPhysicalDisplaySize;
this.viewportOrientationMayChange = builder.viewportOrientationMayChange; this.viewportOrientationMayChange = builder.viewportOrientationMayChange;
this.preferredVideoMimeTypes = builder.preferredVideoMimeTypes; this.preferredVideoMimeTypes = builder.preferredVideoMimeTypes;
this.preferredVideoLanguages = builder.preferredVideoLanguages; this.preferredVideoLanguages = builder.preferredVideoLanguages;
@ -1321,6 +1324,8 @@ public class TrackSelectionParameters {
// Text // Text
this.preferredTextLanguages = builder.preferredTextLanguages; this.preferredTextLanguages = builder.preferredTextLanguages;
this.preferredTextRoleFlags = builder.preferredTextRoleFlags; this.preferredTextRoleFlags = builder.preferredTextRoleFlags;
this.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager =
builder.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager;
this.ignoredTextSelectionFlags = builder.ignoredTextSelectionFlags; this.ignoredTextSelectionFlags = builder.ignoredTextSelectionFlags;
this.selectUndeterminedTextLanguage = builder.selectUndeterminedTextLanguage; this.selectUndeterminedTextLanguage = builder.selectUndeterminedTextLanguage;
// Image // Image
@ -1359,6 +1364,8 @@ public class TrackSelectionParameters {
&& viewportOrientationMayChange == other.viewportOrientationMayChange && viewportOrientationMayChange == other.viewportOrientationMayChange
&& viewportWidth == other.viewportWidth && viewportWidth == other.viewportWidth
&& viewportHeight == other.viewportHeight && viewportHeight == other.viewportHeight
&& isViewportSizeLimitedByPhysicalDisplaySize
== other.isViewportSizeLimitedByPhysicalDisplaySize
&& preferredVideoMimeTypes.equals(other.preferredVideoMimeTypes) && preferredVideoMimeTypes.equals(other.preferredVideoMimeTypes)
&& preferredVideoLanguages.equals(other.preferredVideoLanguages) && preferredVideoLanguages.equals(other.preferredVideoLanguages)
&& preferredVideoRoleFlags == other.preferredVideoRoleFlags && preferredVideoRoleFlags == other.preferredVideoRoleFlags
@ -1372,6 +1379,8 @@ public class TrackSelectionParameters {
// Text // Text
&& preferredTextLanguages.equals(other.preferredTextLanguages) && preferredTextLanguages.equals(other.preferredTextLanguages)
&& preferredTextRoleFlags == other.preferredTextRoleFlags && preferredTextRoleFlags == other.preferredTextRoleFlags
&& usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager
== other.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager
&& ignoredTextSelectionFlags == other.ignoredTextSelectionFlags && ignoredTextSelectionFlags == other.ignoredTextSelectionFlags
&& selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage
// Image // Image
@ -1398,6 +1407,7 @@ public class TrackSelectionParameters {
result = 31 * result + (viewportOrientationMayChange ? 1 : 0); result = 31 * result + (viewportOrientationMayChange ? 1 : 0);
result = 31 * result + viewportWidth; result = 31 * result + viewportWidth;
result = 31 * result + viewportHeight; result = 31 * result + viewportHeight;
result = 31 * result + (isViewportSizeLimitedByPhysicalDisplaySize ? 1 : 0);
result = 31 * result + preferredVideoMimeTypes.hashCode(); result = 31 * result + preferredVideoMimeTypes.hashCode();
result = 31 * result + preferredVideoLanguages.hashCode(); result = 31 * result + preferredVideoLanguages.hashCode();
result = 31 * result + preferredVideoRoleFlags; result = 31 * result + preferredVideoRoleFlags;
@ -1411,6 +1421,7 @@ public class TrackSelectionParameters {
// Text // Text
result = 31 * result + preferredTextLanguages.hashCode(); result = 31 * result + preferredTextLanguages.hashCode();
result = 31 * result + preferredTextRoleFlags; result = 31 * result + preferredTextRoleFlags;
result = 31 * result + (usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager ? 1 : 0);
result = 31 * result + ignoredTextSelectionFlags; result = 31 * result + ignoredTextSelectionFlags;
result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0); result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0);
// Image // Image
@ -1456,6 +1467,11 @@ public class TrackSelectionParameters {
private static final String FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED = private static final String FIELD_IS_PREFER_IMAGE_OVER_VIDEO_ENABLED =
Util.intToStringMaxRadix(31); Util.intToStringMaxRadix(31);
private static final String FIELD_PREFERRED_VIDEO_LANGUAGES = Util.intToStringMaxRadix(32); 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()} * 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_MIN_VIDEO_BITRATE, minVideoBitrate);
bundle.putInt(FIELD_VIEWPORT_WIDTH, viewportWidth); bundle.putInt(FIELD_VIEWPORT_WIDTH, viewportWidth);
bundle.putInt(FIELD_VIEWPORT_HEIGHT, viewportHeight); 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.putBoolean(FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, viewportOrientationMayChange);
bundle.putStringArray( bundle.putStringArray(
FIELD_PREFERRED_VIDEO_MIMETYPES, preferredVideoMimeTypes.toArray(new String[0])); FIELD_PREFERRED_VIDEO_MIMETYPES, preferredVideoMimeTypes.toArray(new String[0]));
@ -1500,6 +1519,9 @@ public class TrackSelectionParameters {
bundle.putStringArray( bundle.putStringArray(
FIELD_PREFERRED_TEXT_LANGUAGES, preferredTextLanguages.toArray(new String[0])); FIELD_PREFERRED_TEXT_LANGUAGES, preferredTextLanguages.toArray(new String[0]));
bundle.putInt(FIELD_PREFERRED_TEXT_ROLE_FLAGS, preferredTextRoleFlags); 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.putInt(FIELD_IGNORED_TEXT_SELECTION_FLAGS, ignoredTextSelectionFlags);
bundle.putBoolean(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, selectUndeterminedTextLanguage); bundle.putBoolean(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, selectUndeterminedTextLanguage);
bundle.putInt(FIELD_AUDIO_OFFLOAD_MODE_PREFERENCE, audioOffloadPreferences.audioOffloadMode); 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); /* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f); PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
AudioAttributes audioAttributes = AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build(); new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400); VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);
@ -309,7 +306,7 @@ public final class ForwardingSimpleBasePlayerTest {
.setSeekForwardIncrementMs(2000) .setSeekForwardIncrementMs(2000)
.setMaxSeekToPreviousPositionMs(8000) .setMaxSeekToPreviousPositionMs(8000)
.setPlaybackParameters(PlaybackParameters.DEFAULT) .setPlaybackParameters(PlaybackParameters.DEFAULT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT) .setTrackSelectionParameters(TrackSelectionParameters.DEFAULT)
.setAudioAttributes(AudioAttributes.DEFAULT) .setAudioAttributes(AudioAttributes.DEFAULT)
.setVolume(1f) .setVolume(1f)
.setVideoSize(VideoSize.UNKNOWN) .setVideoSize(VideoSize.UNKNOWN)
@ -349,10 +346,7 @@ public final class ForwardingSimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED); /* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f); PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
AudioAttributes audioAttributes = AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build(); new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400); VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);

View File

@ -101,7 +101,7 @@ public class SimpleBasePlayerTest {
.setSeekForwardIncrementMs(4000) .setSeekForwardIncrementMs(4000)
.setMaxSeekToPreviousPositionMs(3000) .setMaxSeekToPreviousPositionMs(3000)
.setPlaybackParameters(new PlaybackParameters(/* speed= */ 2f)) .setPlaybackParameters(new PlaybackParameters(/* speed= */ 2f))
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT) .setTrackSelectionParameters(TrackSelectionParameters.DEFAULT)
.setAudioAttributes( .setAudioAttributes(
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build()) new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build())
.setVolume(0.5f) .setVolume(0.5f)
@ -280,10 +280,7 @@ public class SimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED); /* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f); PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
AudioAttributes audioAttributes = AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build(); new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400); VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);
@ -945,10 +942,7 @@ public class SimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED); /* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f); PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
AudioAttributes audioAttributes = AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build(); new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400); VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400);
@ -1368,7 +1362,7 @@ public class SimpleBasePlayerTest {
.setSeekForwardIncrementMs(2000) .setSeekForwardIncrementMs(2000)
.setMaxSeekToPreviousPositionMs(8000) .setMaxSeekToPreviousPositionMs(8000)
.setPlaybackParameters(PlaybackParameters.DEFAULT) .setPlaybackParameters(PlaybackParameters.DEFAULT)
.setTrackSelectionParameters(TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT) .setTrackSelectionParameters(TrackSelectionParameters.DEFAULT)
.setAudioAttributes(AudioAttributes.DEFAULT) .setAudioAttributes(AudioAttributes.DEFAULT)
.setVolume(1f) .setVolume(1f)
.setVideoSize(VideoSize.UNKNOWN) .setVideoSize(VideoSize.UNKNOWN)
@ -1407,10 +1401,7 @@ public class SimpleBasePlayerTest {
/* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED); /* message= */ null, /* cause= */ null, PlaybackException.ERROR_CODE_DECODING_FAILED);
PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f); PlaybackParameters playbackParameters = new PlaybackParameters(/* speed= */ 2f);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT TrackSelectionParameters.DEFAULT.buildUpon().setMaxVideoBitrate(1000).build();
.buildUpon()
.setMaxVideoBitrate(1000)
.build();
AudioAttributes audioAttributes = AudioAttributes audioAttributes =
new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build(); new AudioAttributes.Builder().setContentType(C.AUDIO_CONTENT_TYPE_MOVIE).build();
VideoSize videoSize = new VideoSize(/* width= */ 200, /* height= */ 400); 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_DISABLED;
import static androidx.media3.common.TrackSelectionParameters.AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED; 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 static com.google.common.truth.Truth.assertThat;
import android.os.Bundle; import android.os.Bundle;
@ -40,7 +39,7 @@ public final class TrackSelectionParametersTest {
@Test @Test
public void defaultValue_withoutChange_isAsExpected() { public void defaultValue_withoutChange_isAsExpected() {
TrackSelectionParameters parameters = TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT; TrackSelectionParameters parameters = TrackSelectionParameters.DEFAULT;
// Video // Video
assertThat(parameters.maxVideoWidth).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.maxVideoWidth).isEqualTo(Integer.MAX_VALUE);
@ -53,6 +52,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.minVideoBitrate).isEqualTo(0); assertThat(parameters.minVideoBitrate).isEqualTo(0);
assertThat(parameters.viewportWidth).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.viewportWidth).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.isViewportSizeLimitedByPhysicalDisplaySize).isTrue();
assertThat(parameters.viewportOrientationMayChange).isTrue(); assertThat(parameters.viewportOrientationMayChange).isTrue();
assertThat(parameters.preferredVideoMimeTypes).isEmpty(); assertThat(parameters.preferredVideoMimeTypes).isEmpty();
// Audio // Audio
@ -67,6 +67,7 @@ public final class TrackSelectionParametersTest {
// Text // Text
assertThat(parameters.preferredAudioMimeTypes).isEmpty(); assertThat(parameters.preferredAudioMimeTypes).isEmpty();
assertThat(parameters.preferredTextLanguages).isEmpty(); assertThat(parameters.preferredTextLanguages).isEmpty();
assertThat(parameters.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager).isTrue();
assertThat(parameters.preferredTextRoleFlags).isEqualTo(0); assertThat(parameters.preferredTextRoleFlags).isEqualTo(0);
assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(0); assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(0);
assertThat(parameters.selectUndeterminedTextLanguage).isFalse(); assertThat(parameters.selectUndeterminedTextLanguage).isFalse();
@ -90,7 +91,7 @@ public final class TrackSelectionParametersTest {
new Format.Builder().setId(4).build(), new Format.Builder().setId(5).build()), new Format.Builder().setId(4).build(), new Format.Builder().setId(5).build()),
/* trackIndices= */ ImmutableList.of(1)); /* trackIndices= */ ImmutableList.of(1));
TrackSelectionParameters parameters = TrackSelectionParameters parameters =
TrackSelectionParameters.DEFAULT_WITHOUT_CONTEXT TrackSelectionParameters.DEFAULT
.buildUpon() .buildUpon()
// Video // Video
.setMaxVideoSize(/* maxVideoWidth= */ 0, /* maxVideoHeight= */ 1) .setMaxVideoSize(/* maxVideoWidth= */ 0, /* maxVideoHeight= */ 1)
@ -149,6 +150,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.minVideoBitrate).isEqualTo(7); assertThat(parameters.minVideoBitrate).isEqualTo(7);
assertThat(parameters.viewportWidth).isEqualTo(8); assertThat(parameters.viewportWidth).isEqualTo(8);
assertThat(parameters.viewportHeight).isEqualTo(9); assertThat(parameters.viewportHeight).isEqualTo(9);
assertThat(parameters.isViewportSizeLimitedByPhysicalDisplaySize).isFalse();
assertThat(parameters.viewportOrientationMayChange).isTrue(); assertThat(parameters.viewportOrientationMayChange).isTrue();
assertThat(parameters.preferredVideoMimeTypes) assertThat(parameters.preferredVideoMimeTypes)
.containsExactly(MimeTypes.VIDEO_AV1, MimeTypes.VIDEO_H264) .containsExactly(MimeTypes.VIDEO_AV1, MimeTypes.VIDEO_H264)
@ -168,6 +170,7 @@ public final class TrackSelectionParametersTest {
// Text // Text
assertThat(parameters.preferredTextLanguages).containsExactly("de", "en").inOrder(); assertThat(parameters.preferredTextLanguages).containsExactly("de", "en").inOrder();
assertThat(parameters.preferredTextRoleFlags).isEqualTo(C.ROLE_FLAG_CAPTION); assertThat(parameters.preferredTextRoleFlags).isEqualTo(C.ROLE_FLAG_CAPTION);
assertThat(parameters.usePreferredTextLanguagesAndRoleFlagsFromCaptioningManager).isFalse();
assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(C.SELECTION_FLAG_AUTOSELECT); assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(C.SELECTION_FLAG_AUTOSELECT);
assertThat(parameters.selectUndeterminedTextLanguage).isTrue(); assertThat(parameters.selectUndeterminedTextLanguage).isTrue();
// Image // Image
@ -185,7 +188,7 @@ public final class TrackSelectionParametersTest {
@Test @Test
public void setMaxVideoSizeSd_defaultBuilder_parametersVideoSizeAreSd() { public void setMaxVideoSizeSd_defaultBuilder_parametersVideoSizeAreSd() {
TrackSelectionParameters parameters = TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext()).setMaxVideoSizeSd().build(); new TrackSelectionParameters.Builder().setMaxVideoSizeSd().build();
assertThat(parameters.maxVideoWidth).isEqualTo(1279); assertThat(parameters.maxVideoWidth).isEqualTo(1279);
assertThat(parameters.maxVideoHeight).isEqualTo(719); assertThat(parameters.maxVideoHeight).isEqualTo(719);
@ -194,7 +197,7 @@ public final class TrackSelectionParametersTest {
@Test @Test
public void clearVideoSizeConstraints_withSdConstrains_clearConstrains() { public void clearVideoSizeConstraints_withSdConstrains_clearConstrains() {
TrackSelectionParameters parameters = TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.setMaxVideoSizeSd() .setMaxVideoSizeSd()
.clearVideoSizeConstraints() .clearVideoSizeConstraints()
.build(); .build();
@ -206,7 +209,7 @@ public final class TrackSelectionParametersTest {
@Test @Test
public void clearViewPortConstraints_withConstrains_clearConstrains() { public void clearViewPortConstraints_withConstrains_clearConstrains() {
TrackSelectionParameters parameters = TrackSelectionParameters parameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.setViewportSize( .setViewportSize(
/* viewportWidth= */ 1, /* viewportWidth= */ 1,
/* viewportHeight= */ 2, /* viewportHeight= */ 2,
@ -216,6 +219,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.viewportWidth).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.viewportWidth).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE); assertThat(parameters.viewportHeight).isEqualTo(Integer.MAX_VALUE);
assertThat(parameters.isViewportSizeLimitedByPhysicalDisplaySize).isFalse();
assertThat(parameters.viewportOrientationMayChange).isTrue(); assertThat(parameters.viewportOrientationMayChange).isTrue();
} }
@ -225,7 +229,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride( new TrackSelectionOverride(
newTrackGroupWithIds(3, 4), /* trackIndices= */ ImmutableList.of(1)); newTrackGroupWithIds(3, 4), /* trackIndices= */ ImmutableList.of(1));
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()).addOverride(override).build(); new TrackSelectionParameters.Builder().addOverride(override).build();
TrackSelectionParameters fromBundle = TrackSelectionParameters fromBundle =
TrackSelectionParameters.fromBundle(trackSelectionParameters.toBundle()); TrackSelectionParameters.fromBundle(trackSelectionParameters.toBundle());
@ -238,7 +242,7 @@ public final class TrackSelectionParametersTest {
@Test @Test
public void roundTripViaBundle_withLegacyPreferenceFields_yieldsEqualInstance() { public void roundTripViaBundle_withLegacyPreferenceFields_yieldsEqualInstance() {
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.setAudioOffloadPreferences( .setAudioOffloadPreferences(
new AudioOffloadPreferences.Builder() new AudioOffloadPreferences.Builder()
.setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED) .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
@ -266,7 +270,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(newTrackGroupWithIds(2), /* trackIndex= */ 0); new TrackSelectionOverride(newTrackGroupWithIds(2), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.addOverride(override1) .addOverride(override1)
.addOverride(override2) .addOverride(override2)
.build(); .build();
@ -285,7 +289,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(trackGroup, /* trackIndices= */ ImmutableList.of(1)); new TrackSelectionOverride(trackGroup, /* trackIndices= */ ImmutableList.of(1));
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.addOverride(override1) .addOverride(override1)
.addOverride(override2) .addOverride(override2)
.build(); .build();
@ -302,7 +306,7 @@ public final class TrackSelectionParametersTest {
new TrackSelectionOverride(newTrackGroupWithIds(2), /* trackIndex= */ 0); new TrackSelectionOverride(newTrackGroupWithIds(2), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.setOverrideForType(override1) .setOverrideForType(override1)
.setOverrideForType(override2) .setOverrideForType(override2)
.build(); .build();
@ -318,7 +322,7 @@ public final class TrackSelectionParametersTest {
TrackSelectionOverride override2 = TrackSelectionOverride override2 =
new TrackSelectionOverride(newTrackGroupWithIds(1), /* trackIndex= */ 0); new TrackSelectionOverride(newTrackGroupWithIds(1), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.addOverride(override1) .addOverride(override1)
.addOverride(override2) .addOverride(override2)
.clearOverridesOfType(C.TRACK_TYPE_AUDIO) .clearOverridesOfType(C.TRACK_TYPE_AUDIO)
@ -335,7 +339,7 @@ public final class TrackSelectionParametersTest {
TrackSelectionOverride override2 = TrackSelectionOverride override2 =
new TrackSelectionOverride(newTrackGroupWithIds(1), /* trackIndex= */ 0); new TrackSelectionOverride(newTrackGroupWithIds(1), /* trackIndex= */ 0);
TrackSelectionParameters trackSelectionParameters = TrackSelectionParameters trackSelectionParameters =
new TrackSelectionParameters.Builder(getApplicationContext()) new TrackSelectionParameters.Builder()
.addOverride(override1) .addOverride(override1)
.addOverride(override2) .addOverride(override2)
.clearOverride(override2.mediaTrackGroup) .clearOverride(override2.mediaTrackGroup)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -89,6 +89,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule; import org.mockito.junit.MockitoRule;
import org.robolectric.shadows.ShadowDisplay;
import org.robolectric.shadows.ShadowDisplayManager;
/** Unit tests for {@link DefaultTrackSelector}. */ /** Unit tests for {@link DefaultTrackSelector}. */
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
@ -171,7 +173,7 @@ public final class DefaultTrackSelectorTest {
public void setUp() { public void setUp() {
when(bandwidthMeter.getBitrateEstimate()).thenReturn(1000000L); when(bandwidthMeter.getBitrateEstimate()).thenReturn(1000000L);
Context context = ApplicationProvider.getApplicationContext(); Context context = ApplicationProvider.getApplicationContext();
defaultParameters = Parameters.getDefaults(context); defaultParameters = Parameters.DEFAULT;
trackSelector = new DefaultTrackSelector(context); trackSelector = new DefaultTrackSelector(context);
trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.init(invalidationListener, bandwidthMeter);
} }
@ -2517,6 +2519,127 @@ public final class DefaultTrackSelectorTest {
assertFixedSelection(result.selections[0], trackGroups, formatDV); 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 @Test
public void public void
selectTracks_withSingleTrackAndOffloadPreferenceEnabled_returnsRendererConfigOffloadModeEnabledGaplessRequired() selectTracks_withSingleTrackAndOffloadPreferenceEnabled_returnsRendererConfigOffloadModeEnabledGaplessRequired()
@ -3295,7 +3418,7 @@ public final class DefaultTrackSelectorTest {
* variables. * variables.
*/ */
private static Parameters buildParametersForEqualsTest() { private static Parameters buildParametersForEqualsTest() {
return Parameters.DEFAULT_WITHOUT_CONTEXT return Parameters.DEFAULT
.buildUpon() .buildUpon()
// Video // Video
.setMaxVideoSize(/* maxVideoWidth= */ 0, /* maxVideoHeight= */ 1) .setMaxVideoSize(/* maxVideoWidth= */ 0, /* maxVideoHeight= */ 1)

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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