From 814e43dbb9432e3adf6c4c278df50433260a461b Mon Sep 17 00:00:00 2001 From: ibaker Date: Tue, 7 Jun 2022 09:27:04 +0000 Subject: [PATCH] Use a shared `keyForField` implementation in track selection parameters The current setup with distinct, private `keyForField` implementations, leaves open the (theoretical) possibility of a clash in the `Bundle` keys used by the superclass and subclass. This change brings consistency with our only other extensible `Bundleable` type (`PlaybackException`). #minor-release PiperOrigin-RevId: 453385875 --- .../common/TrackSelectionParameters.java | 59 +++++---------- .../trackselection/DefaultTrackSelector.java | 72 +++++++------------ 2 files changed, 42 insertions(+), 89 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java index e7c4cbbc50..b7fe8176e3 100644 --- a/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java +++ b/libraries/common/src/main/java/androidx/media3/common/TrackSelectionParameters.java @@ -24,7 +24,6 @@ import android.graphics.Point; import android.os.Bundle; import android.os.Looper; import android.view.accessibility.CaptioningManager; -import androidx.annotation.IntDef; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.media3.common.util.BundleableUtil; @@ -34,9 +33,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.primitives.Ints; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -1073,42 +1069,6 @@ public class TrackSelectionParameters implements Bundleable { // Bundleable implementation - @Documented - @Retention(RetentionPolicy.SOURCE) - @IntDef({ - // Video - FIELD_MAX_VIDEO_WIDTH, - FIELD_MAX_VIDEO_HEIGHT, - FIELD_MAX_VIDEO_FRAMERATE, - FIELD_MAX_VIDEO_BITRATE, - FIELD_MIN_VIDEO_WIDTH, - FIELD_MIN_VIDEO_HEIGHT, - FIELD_MIN_VIDEO_FRAMERATE, - FIELD_MIN_VIDEO_BITRATE, - FIELD_VIEWPORT_WIDTH, - FIELD_VIEWPORT_HEIGHT, - FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, - FIELD_PREFERRED_VIDEO_MIMETYPES, - FIELD_PREFERRED_VIDEO_ROLE_FLAGS, - // Audio - FIELD_PREFERRED_AUDIO_LANGUAGES, - FIELD_PREFERRED_AUDIO_ROLE_FLAGS, - FIELD_MAX_AUDIO_CHANNEL_COUNT, - FIELD_MAX_AUDIO_BITRATE, - FIELD_PREFERRED_AUDIO_MIME_TYPES, - // Text - FIELD_PREFERRED_TEXT_LANGUAGES, - FIELD_PREFERRED_TEXT_ROLE_FLAGS, - FIELD_IGNORED_TEXT_SELECTION_FLAGS, - FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE, - // General - FIELD_FORCE_LOWEST_BITRATE, - FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, - FIELD_SELECTION_OVERRIDES, - FIELD_DISABLED_TRACK_TYPE, - }) - private @interface FieldNumber {} - private static final int FIELD_PREFERRED_AUDIO_LANGUAGES = 1; private static final int FIELD_PREFERRED_AUDIO_ROLE_FLAGS = 2; private static final int FIELD_PREFERRED_TEXT_LANGUAGES = 3; @@ -1136,6 +1096,15 @@ public class TrackSelectionParameters implements Bundleable { private static final int FIELD_PREFERRED_VIDEO_ROLE_FLAGS = 25; private static final int FIELD_IGNORED_TEXT_SELECTION_FLAGS = 26; + /** + * Defines a minimum field ID value for subclasses to use when implementing {@link #toBundle()} + * and {@link Bundleable.Creator}. + * + *

Subclasses should obtain keys for their {@link Bundle} representation by applying a + * non-negative offset on this constant and passing the result to {@link #keyForField(int)}. + */ + @UnstableApi protected static final int FIELD_CUSTOM_ID_BASE = 1000; + @Override public Bundle toBundle() { Bundle bundle = new Bundle(); @@ -1197,7 +1166,15 @@ public class TrackSelectionParameters implements Bundleable { public static final Creator CREATOR = TrackSelectionParameters::fromBundle; - private static String keyForField(@FieldNumber int field) { + /** + * Converts the given field number to a string which can be used as a field key when implementing + * {@link #toBundle()} and {@link Bundleable.Creator}. + * + *

Subclasses should use {@code field} values greater than or equal to {@link + * #FIELD_CUSTOM_ID_BASE}. + */ + @UnstableApi + protected static String keyForField(int field) { return Integer.toString(field, Character.MAX_RADIX); } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java index dbed6b4ffb..c85e40b24a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelector.java @@ -1688,50 +1688,30 @@ public class DefaultTrackSelector extends MappingTrackSelector { // Bundleable implementation. - @Documented - @Retention(RetentionPolicy.SOURCE) - @Target(TYPE_USE) - @IntDef({ - // Video - FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY, - FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS, - FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS, - FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS, - // Audio - FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY, - FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS, - FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS, - FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS, - FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS, - // General - FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY, - FIELD_TUNNELING_ENABLED, - FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS, - // Overrides - FIELD_SELECTION_OVERRIDES_RENDERER_INDICES, - FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS, - FIELD_SELECTION_OVERRIDES, - FIELD_RENDERER_DISABLED_INDICES, - }) - private @interface FieldNumber {} - - // Start at 1000 to avoid conflict with the base class fields. - private static final int FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY = 1000; - private static final int FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS = 1001; - private static final int FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS = 1002; - private static final int FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY = 1003; - private static final int FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS = 1004; - private static final int FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS = 1005; - private static final int FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS = 1006; - private static final int FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY = 1007; - private static final int FIELD_TUNNELING_ENABLED = 1008; - private static final int FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS = 1009; - private static final int FIELD_SELECTION_OVERRIDES_RENDERER_INDICES = 1010; - private static final int FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS = 1011; - private static final int FIELD_SELECTION_OVERRIDES = 1012; - private static final int FIELD_RENDERER_DISABLED_INDICES = 1013; - private static final int FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS = 1014; - private static final int FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS = 1015; + private static final int FIELD_EXCEED_VIDEO_CONSTRAINTS_IF_NECESSARY = FIELD_CUSTOM_ID_BASE; + private static final int FIELD_ALLOW_VIDEO_MIXED_MIME_TYPE_ADAPTIVENESS = + FIELD_CUSTOM_ID_BASE + 1; + private static final int FIELD_ALLOW_VIDEO_NON_SEAMLESS_ADAPTIVENESS = FIELD_CUSTOM_ID_BASE + 2; + private static final int FIELD_EXCEED_AUDIO_CONSTRAINTS_IF_NCESSARY = FIELD_CUSTOM_ID_BASE + 3; + private static final int FIELD_ALLOW_AUDIO_MIXED_MIME_TYPE_ADAPTIVENESS = + FIELD_CUSTOM_ID_BASE + 4; + private static final int FIELD_ALLOW_AUDIO_MIXED_SAMPLE_RATE_ADAPTIVENESS = + FIELD_CUSTOM_ID_BASE + 5; + private static final int FIELD_ALLOW_AUDIO_MIXED_CHANNEL_COUNT_ADAPTIVENESS = + FIELD_CUSTOM_ID_BASE + 6; + private static final int FIELD_EXCEED_RENDERER_CAPABILITIES_IF_NECESSARY = + FIELD_CUSTOM_ID_BASE + 7; + private static final int FIELD_TUNNELING_ENABLED = FIELD_CUSTOM_ID_BASE + 8; + private static final int FIELD_ALLOW_MULTIPLE_ADAPTIVE_SELECTIONS = FIELD_CUSTOM_ID_BASE + 9; + private static final int FIELD_SELECTION_OVERRIDES_RENDERER_INDICES = FIELD_CUSTOM_ID_BASE + 10; + private static final int FIELD_SELECTION_OVERRIDES_TRACK_GROUP_ARRAYS = + FIELD_CUSTOM_ID_BASE + 11; + private static final int FIELD_SELECTION_OVERRIDES = FIELD_CUSTOM_ID_BASE + 12; + private static final int FIELD_RENDERER_DISABLED_INDICES = FIELD_CUSTOM_ID_BASE + 13; + private static final int FIELD_ALLOW_VIDEO_MIXED_DECODER_SUPPORT_ADAPTIVENESS = + FIELD_CUSTOM_ID_BASE + 14; + private static final int FIELD_ALLOW_AUDIO_MIXED_DECODER_SUPPORT_ADAPTIVENESS = + FIELD_CUSTOM_ID_BASE + 15; @Override public Bundle toBundle() { @@ -1787,10 +1767,6 @@ public class DefaultTrackSelector extends MappingTrackSelector { public static final Creator CREATOR = bundle -> new Parameters.Builder(bundle).build(); - private static String keyForField(@FieldNumber int field) { - return Integer.toString(field, Character.MAX_RADIX); - } - /** * Bundles selection overrides in 3 arrays of equal length. Each triplet of matching indices is: * the selection override (stored in a sparse array as they can be null), the trackGroupArray of