Commit 9f7abd4f by Ian Baker

Merge pull request #10047 from LuGO0:9432/added-filtering-for-forced-text-tracks

PiperOrigin-RevId: 439262085
parents bba102a4 c9ce23a1
...@@ -98,6 +98,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -98,6 +98,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text // Text
private ImmutableList<String> preferredTextLanguages; private ImmutableList<String> preferredTextLanguages;
private @C.RoleFlags int preferredTextRoleFlags; private @C.RoleFlags int preferredTextRoleFlags;
private @C.SelectionFlags int ignoredTextSelectionFlags;
private boolean selectUndeterminedTextLanguage; private boolean selectUndeterminedTextLanguage;
// General // General
private boolean forceLowestBitrate; private boolean forceLowestBitrate;
...@@ -130,6 +131,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -130,6 +131,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text // Text
preferredTextLanguages = ImmutableList.of(); preferredTextLanguages = ImmutableList.of();
preferredTextRoleFlags = 0; preferredTextRoleFlags = 0;
ignoredTextSelectionFlags = 0;
selectUndeterminedTextLanguage = false; selectUndeterminedTextLanguage = false;
// General // General
forceLowestBitrate = false; forceLowestBitrate = false;
...@@ -228,6 +230,10 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -228,6 +230,10 @@ public class TrackSelectionParameters implements Bundleable {
bundle.getInt( bundle.getInt(
keyForField(FIELD_PREFERRED_TEXT_ROLE_FLAGS), keyForField(FIELD_PREFERRED_TEXT_ROLE_FLAGS),
DEFAULT_WITHOUT_CONTEXT.preferredTextRoleFlags); DEFAULT_WITHOUT_CONTEXT.preferredTextRoleFlags);
ignoredTextSelectionFlags =
bundle.getInt(
keyForField(FIELD_IGNORED_TEXT_SELECTION_FLAGS),
DEFAULT_WITHOUT_CONTEXT.ignoredTextSelectionFlags);
selectUndeterminedTextLanguage = selectUndeterminedTextLanguage =
bundle.getBoolean( bundle.getBoolean(
keyForField(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE), keyForField(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE),
...@@ -291,6 +297,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -291,6 +297,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text // Text
preferredTextLanguages = parameters.preferredTextLanguages; preferredTextLanguages = parameters.preferredTextLanguages;
preferredTextRoleFlags = parameters.preferredTextRoleFlags; preferredTextRoleFlags = parameters.preferredTextRoleFlags;
ignoredTextSelectionFlags = parameters.ignoredTextSelectionFlags;
selectUndeterminedTextLanguage = parameters.selectUndeterminedTextLanguage; selectUndeterminedTextLanguage = parameters.selectUndeterminedTextLanguage;
// General // General
forceLowestBitrate = parameters.forceLowestBitrate; forceLowestBitrate = parameters.forceLowestBitrate;
...@@ -614,6 +621,18 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -614,6 +621,18 @@ public class TrackSelectionParameters implements Bundleable {
} }
/** /**
* Sets a bitmask of selection flags that are ignored for text track selections.
*
* @param ignoredTextSelectionFlags A bitmask of {@link C.SelectionFlags} that are ignored for
* text track selections.
* @return This builder.
*/
public Builder setIgnoredTextSelectionFlags(@C.SelectionFlags int ignoredTextSelectionFlags) {
this.ignoredTextSelectionFlags = ignoredTextSelectionFlags;
return this;
}
/**
* Sets whether a text track with undetermined language should be selected if no track with * Sets whether a text track with undetermined language should be selected if no track with
* {@link #setPreferredTextLanguages(String...) a preferred language} is available, or if the * {@link #setPreferredTextLanguages(String...) a preferred language} is available, or if the
* preferred language is unset. * preferred language is unset.
...@@ -896,6 +915,11 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -896,6 +915,11 @@ public class TrackSelectionParameters implements Bundleable {
*/ */
public final @C.RoleFlags int preferredTextRoleFlags; public final @C.RoleFlags int preferredTextRoleFlags;
/** /**
* 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).
*/
public final @C.SelectionFlags int ignoredTextSelectionFlags;
/**
* Whether a text track with undetermined language should be selected if no track with {@link * Whether a text track with undetermined language should be selected if no track with {@link
* #preferredTextLanguages} is available, or if {@link #preferredTextLanguages} is unset. The * #preferredTextLanguages} is available, or if {@link #preferredTextLanguages} is unset. The
* default value is {@code false}. * default value is {@code false}.
...@@ -947,6 +971,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -947,6 +971,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text // Text
this.preferredTextLanguages = builder.preferredTextLanguages; this.preferredTextLanguages = builder.preferredTextLanguages;
this.preferredTextRoleFlags = builder.preferredTextRoleFlags; this.preferredTextRoleFlags = builder.preferredTextRoleFlags;
this.ignoredTextSelectionFlags = builder.ignoredTextSelectionFlags;
this.selectUndeterminedTextLanguage = builder.selectUndeterminedTextLanguage; this.selectUndeterminedTextLanguage = builder.selectUndeterminedTextLanguage;
// General // General
this.forceLowestBitrate = builder.forceLowestBitrate; this.forceLowestBitrate = builder.forceLowestBitrate;
...@@ -990,8 +1015,10 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -990,8 +1015,10 @@ public class TrackSelectionParameters implements Bundleable {
&& maxAudioChannelCount == other.maxAudioChannelCount && maxAudioChannelCount == other.maxAudioChannelCount
&& maxAudioBitrate == other.maxAudioBitrate && maxAudioBitrate == other.maxAudioBitrate
&& preferredAudioMimeTypes.equals(other.preferredAudioMimeTypes) && preferredAudioMimeTypes.equals(other.preferredAudioMimeTypes)
// Text
&& preferredTextLanguages.equals(other.preferredTextLanguages) && preferredTextLanguages.equals(other.preferredTextLanguages)
&& preferredTextRoleFlags == other.preferredTextRoleFlags && preferredTextRoleFlags == other.preferredTextRoleFlags
&& ignoredTextSelectionFlags == other.ignoredTextSelectionFlags
&& selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage
// General // General
&& forceLowestBitrate == other.forceLowestBitrate && forceLowestBitrate == other.forceLowestBitrate
...@@ -1026,6 +1053,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -1026,6 +1053,7 @@ public class TrackSelectionParameters implements Bundleable {
// Text // Text
result = 31 * result + preferredTextLanguages.hashCode(); result = 31 * result + preferredTextLanguages.hashCode();
result = 31 * result + preferredTextRoleFlags; result = 31 * result + preferredTextRoleFlags;
result = 31 * result + ignoredTextSelectionFlags;
result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0); result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0);
// General // General
result = 31 * result + (forceLowestBitrate ? 1 : 0); result = 31 * result + (forceLowestBitrate ? 1 : 0);
...@@ -1040,11 +1068,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -1040,11 +1068,7 @@ public class TrackSelectionParameters implements Bundleable {
@Documented @Documented
@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.SOURCE)
@IntDef({ @IntDef({
FIELD_PREFERRED_AUDIO_LANGUAGES, // Video
FIELD_PREFERRED_AUDIO_ROLE_FLAGS,
FIELD_PREFERRED_TEXT_LANGUAGES,
FIELD_PREFERRED_TEXT_ROLE_FLAGS,
FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE,
FIELD_MAX_VIDEO_WIDTH, FIELD_MAX_VIDEO_WIDTH,
FIELD_MAX_VIDEO_HEIGHT, FIELD_MAX_VIDEO_HEIGHT,
FIELD_MAX_VIDEO_FRAMERATE, FIELD_MAX_VIDEO_FRAMERATE,
...@@ -1057,14 +1081,23 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -1057,14 +1081,23 @@ public class TrackSelectionParameters implements Bundleable {
FIELD_VIEWPORT_HEIGHT, FIELD_VIEWPORT_HEIGHT,
FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE, FIELD_VIEWPORT_ORIENTATION_MAY_CHANGE,
FIELD_PREFERRED_VIDEO_MIMETYPES, 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_CHANNEL_COUNT,
FIELD_MAX_AUDIO_BITRATE, FIELD_MAX_AUDIO_BITRATE,
FIELD_PREFERRED_AUDIO_MIME_TYPES, 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_LOWEST_BITRATE,
FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE, FIELD_FORCE_HIGHEST_SUPPORTED_BITRATE,
FIELD_SELECTION_OVERRIDES, FIELD_SELECTION_OVERRIDES,
FIELD_DISABLED_TRACK_TYPE, FIELD_DISABLED_TRACK_TYPE,
FIELD_PREFERRED_VIDEO_ROLE_FLAGS
}) })
private @interface FieldNumber {} private @interface FieldNumber {}
...@@ -1093,6 +1126,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -1093,6 +1126,7 @@ public class TrackSelectionParameters implements Bundleable {
private static final int FIELD_SELECTION_OVERRIDES = 23; private static final int FIELD_SELECTION_OVERRIDES = 23;
private static final int FIELD_DISABLED_TRACK_TYPE = 24; private static final int FIELD_DISABLED_TRACK_TYPE = 24;
private static final int FIELD_PREFERRED_VIDEO_ROLE_FLAGS = 25; private static final int FIELD_PREFERRED_VIDEO_ROLE_FLAGS = 25;
private static final int FIELD_IGNORED_TEXT_SELECTION_FLAGS = 26;
@Override @Override
public Bundle toBundle() { public Bundle toBundle() {
...@@ -1129,6 +1163,7 @@ public class TrackSelectionParameters implements Bundleable { ...@@ -1129,6 +1163,7 @@ public class TrackSelectionParameters implements Bundleable {
bundle.putStringArray( bundle.putStringArray(
keyForField(FIELD_PREFERRED_TEXT_LANGUAGES), preferredTextLanguages.toArray(new String[0])); keyForField(FIELD_PREFERRED_TEXT_LANGUAGES), preferredTextLanguages.toArray(new String[0]));
bundle.putInt(keyForField(FIELD_PREFERRED_TEXT_ROLE_FLAGS), preferredTextRoleFlags); bundle.putInt(keyForField(FIELD_PREFERRED_TEXT_ROLE_FLAGS), preferredTextRoleFlags);
bundle.putInt(keyForField(FIELD_IGNORED_TEXT_SELECTION_FLAGS), ignoredTextSelectionFlags);
bundle.putBoolean( bundle.putBoolean(
keyForField(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE), selectUndeterminedTextLanguage); keyForField(FIELD_SELECT_UNDETERMINED_TEXT_LANGUAGE), selectUndeterminedTextLanguage);
// General // General
......
...@@ -60,6 +60,7 @@ public final class TrackSelectionParametersTest { ...@@ -60,6 +60,7 @@ public final class TrackSelectionParametersTest {
assertThat(parameters.preferredAudioMimeTypes).isEmpty(); assertThat(parameters.preferredAudioMimeTypes).isEmpty();
assertThat(parameters.preferredTextLanguages).isEmpty(); assertThat(parameters.preferredTextLanguages).isEmpty();
assertThat(parameters.preferredTextRoleFlags).isEqualTo(0); assertThat(parameters.preferredTextRoleFlags).isEqualTo(0);
assertThat(parameters.ignoredTextSelectionFlags).isEqualTo(0);
assertThat(parameters.selectUndeterminedTextLanguage).isFalse(); assertThat(parameters.selectUndeterminedTextLanguage).isFalse();
// General // General
assertThat(parameters.forceLowestBitrate).isFalse(); assertThat(parameters.forceLowestBitrate).isFalse();
...@@ -102,6 +103,7 @@ public final class TrackSelectionParametersTest { ...@@ -102,6 +103,7 @@ public final class TrackSelectionParametersTest {
// Text // Text
.setPreferredTextLanguages("de", "en") .setPreferredTextLanguages("de", "en")
.setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION) .setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
.setIgnoredTextSelectionFlags(C.SELECTION_FLAG_AUTOSELECT)
.setSelectUndeterminedTextLanguage(true) .setSelectUndeterminedTextLanguage(true)
// General // General
.setForceLowestBitrate(false) .setForceLowestBitrate(false)
...@@ -145,6 +147,7 @@ public final class TrackSelectionParametersTest { ...@@ -145,6 +147,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.ignoredTextSelectionFlags).isEqualTo(C.SELECTION_FLAG_AUTOSELECT);
assertThat(parameters.selectUndeterminedTextLanguage).isTrue(); assertThat(parameters.selectUndeterminedTextLanguage).isTrue();
// General // General
assertThat(parameters.forceLowestBitrate).isFalse(); assertThat(parameters.forceLowestBitrate).isFalse();
......
...@@ -1129,7 +1129,7 @@ public final class DefaultTrackSelectorTest { ...@@ -1129,7 +1129,7 @@ public final class DefaultTrackSelectorTest {
// selected. // selected.
trackGroups = wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault); trackGroups = wrapFormats(defaultOnly, noFlag, forcedOnly, forcedDefault);
trackSelector.setParameters( trackSelector.setParameters(
defaultParameters.buildUpon().setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT)); defaultParameters.buildUpon().setIgnoredTextSelectionFlags(C.SELECTION_FLAG_DEFAULT));
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections[0]); assertNoSelection(result.selections[0]);
...@@ -1140,8 +1140,7 @@ public final class DefaultTrackSelectorTest { ...@@ -1140,8 +1140,7 @@ public final class DefaultTrackSelectorTest {
trackSelector trackSelector
.getParameters() .getParameters()
.buildUpon() .buildUpon()
.setDisabledTextTrackSelectionFlags( .setIgnoredTextSelectionFlags(C.SELECTION_FLAG_DEFAULT | C.SELECTION_FLAG_FORCED));
C.SELECTION_FLAG_DEFAULT | C.SELECTION_FLAG_FORCED));
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertNoSelection(result.selections[0]); assertNoSelection(result.selections[0]);
...@@ -1159,7 +1158,7 @@ public final class DefaultTrackSelectorTest { ...@@ -1159,7 +1158,7 @@ public final class DefaultTrackSelectorTest {
trackSelector trackSelector
.getParameters() .getParameters()
.buildUpon() .buildUpon()
.setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_DEFAULT)); .setIgnoredTextSelectionFlags(C.SELECTION_FLAG_DEFAULT));
result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE); result = trackSelector.selectTracks(textRendererCapabilities, trackGroups, periodId, TIMELINE);
assertFixedSelection(result.selections[0], trackGroups, noFlag); assertFixedSelection(result.selections[0], trackGroups, noFlag);
} }
...@@ -2370,7 +2369,7 @@ public final class DefaultTrackSelectorTest { ...@@ -2370,7 +2369,7 @@ public final class DefaultTrackSelectorTest {
.setPreferredTextLanguages("de", "en") .setPreferredTextLanguages("de", "en")
.setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION) .setPreferredTextRoleFlags(C.ROLE_FLAG_CAPTION)
.setSelectUndeterminedTextLanguage(true) .setSelectUndeterminedTextLanguage(true)
.setDisabledTextTrackSelectionFlags(C.SELECTION_FLAG_AUTOSELECT) .setIgnoredTextSelectionFlags(C.SELECTION_FLAG_AUTOSELECT)
// General // General
.setForceLowestBitrate(false) .setForceLowestBitrate(false)
.setForceHighestSupportedBitrate(true) .setForceHighestSupportedBitrate(true)
......
...@@ -59,6 +59,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; ...@@ -59,6 +59,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.ExoPlayerLibraryInfo;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ForwardingPlayer; import com.google.android.exoplayer2.ForwardingPlayer;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Player.Events; import com.google.android.exoplayer2.Player.Events;
...@@ -1130,8 +1131,11 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -1130,8 +1131,11 @@ public class StyledPlayerControlView extends FrameLayout {
if (!trackGroupInfo.isTrackSupported(trackIndex)) { if (!trackGroupInfo.isTrackSupported(trackIndex)) {
continue; continue;
} }
String trackName = Format trackFormat = trackGroupInfo.getTrackFormat(trackIndex);
trackNameProvider.getTrackName(trackGroupInfo.getTrackFormat(trackIndex)); if ((trackFormat.selectionFlags & C.SELECTION_FLAG_FORCED) != 0) {
continue;
}
String trackName = trackNameProvider.getTrackName(trackFormat);
tracks.add(new TrackInformation(tracksInfo, trackGroupIndex, trackIndex, trackName)); tracks.add(new TrackInformation(tracksInfo, trackGroupIndex, trackIndex, trackName));
} }
} }
...@@ -1870,7 +1874,8 @@ public class StyledPlayerControlView extends FrameLayout { ...@@ -1870,7 +1874,8 @@ public class StyledPlayerControlView extends FrameLayout {
player.setTrackSelectionParameters( player.setTrackSelectionParameters(
trackSelectionParameters trackSelectionParameters
.buildUpon() .buildUpon()
.setTrackTypeDisabled(C.TRACK_TYPE_TEXT, /* disabled= */ true) .clearOverridesOfType(C.TRACK_TYPE_TEXT)
.setIgnoredTextSelectionFlags(~C.SELECTION_FLAG_FORCED)
.build()); .build());
settingsWindow.dismiss(); settingsWindow.dismiss();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment