Automatically show closed captioning/hearing impaired text track

This commit is contained in:
Yannick RUI 2019-08-08 09:17:55 +02:00
parent a9b93d7ec2
commit 73d6a0f2bd
2 changed files with 42 additions and 1 deletions

View file

@ -432,6 +432,12 @@ public class DefaultTrackSelector extends MappingTrackSelector {
return this; return this;
} }
@Override
public ParametersBuilder setPreferredRoleFlags(int preferredRoleFlags) {
super.setPreferredRoleFlags(preferredRoleFlags);
return this;
}
@Override @Override
public ParametersBuilder setSelectUndeterminedTextLanguage( public ParametersBuilder setSelectUndeterminedTextLanguage(
boolean selectUndeterminedTextLanguage) { boolean selectUndeterminedTextLanguage) {
@ -642,6 +648,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
allowAudioMixedSampleRateAdaptiveness, allowAudioMixedSampleRateAdaptiveness,
// Text // Text
preferredTextLanguage, preferredTextLanguage,
preferredRoleFlags,
selectUndeterminedTextLanguage, selectUndeterminedTextLanguage,
disabledTextTrackSelectionFlags, disabledTextTrackSelectionFlags,
// General // General
@ -837,6 +844,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
/* allowAudioMixedSampleRateAdaptiveness= */ false, /* allowAudioMixedSampleRateAdaptiveness= */ false,
// Text // Text
TrackSelectionParameters.DEFAULT.preferredTextLanguage, TrackSelectionParameters.DEFAULT.preferredTextLanguage,
TrackSelectionParameters.DEFAULT.preferredRoleFlags,
TrackSelectionParameters.DEFAULT.selectUndeterminedTextLanguage, TrackSelectionParameters.DEFAULT.selectUndeterminedTextLanguage,
TrackSelectionParameters.DEFAULT.disabledTextTrackSelectionFlags, TrackSelectionParameters.DEFAULT.disabledTextTrackSelectionFlags,
// General // General
@ -869,6 +877,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
boolean allowAudioMixedSampleRateAdaptiveness, boolean allowAudioMixedSampleRateAdaptiveness,
// Text // Text
@Nullable String preferredTextLanguage, @Nullable String preferredTextLanguage,
int preferredRoleFlags,
boolean selectUndeterminedTextLanguage, boolean selectUndeterminedTextLanguage,
@C.SelectionFlags int disabledTextTrackSelectionFlags, @C.SelectionFlags int disabledTextTrackSelectionFlags,
// General // General
@ -882,6 +891,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
super( super(
preferredAudioLanguage, preferredAudioLanguage,
preferredTextLanguage, preferredTextLanguage,
preferredRoleFlags,
selectUndeterminedTextLanguage, selectUndeterminedTextLanguage,
disabledTextTrackSelectionFlags); disabledTextTrackSelectionFlags);
// Video // Video
@ -2590,6 +2600,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private final boolean isDefault; private final boolean isDefault;
private final boolean hasPreferredIsForcedFlag; private final boolean hasPreferredIsForcedFlag;
private final int preferredLanguageScore; private final int preferredLanguageScore;
private final int preferredRoleFlagsScore;
private final int selectedAudioLanguageScore; private final int selectedAudioLanguageScore;
public TextTrackScore( public TextTrackScore(
@ -2606,6 +2617,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
preferredLanguageScore = preferredLanguageScore =
getFormatLanguageScore( getFormatLanguageScore(
format, parameters.preferredTextLanguage, parameters.selectUndeterminedTextLanguage); format, parameters.preferredTextLanguage, parameters.selectUndeterminedTextLanguage);
preferredRoleFlagsScore = format.roleFlags & parameters.preferredRoleFlags;
// Prefer non-forced to forced if a preferred text language has been matched. Where both are // Prefer non-forced to forced if a preferred text language has been matched. Where both are
// provided the non-forced track will usually contain the forced subtitles as a subset. // provided the non-forced track will usually contain the forced subtitles as a subset.
// Otherwise, prefer a forced track. // Otherwise, prefer a forced track.
@ -2616,7 +2628,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
selectedAudioLanguageScore = selectedAudioLanguageScore =
getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined); getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined);
isWithinConstraints = isWithinConstraints =
preferredLanguageScore > 0 || isDefault || (isForced && selectedAudioLanguageScore > 0); (preferredLanguageScore > 0 || (parameters.preferredTextLanguage == null && selectedAudioLanguageScore > 0 && preferredRoleFlagsScore > 0)) || isDefault || (isForced && selectedAudioLanguageScore > 0);
} }
/** /**
@ -2634,6 +2646,9 @@ public class DefaultTrackSelector extends MappingTrackSelector {
if (this.preferredLanguageScore != other.preferredLanguageScore) { if (this.preferredLanguageScore != other.preferredLanguageScore) {
return compareInts(this.preferredLanguageScore, other.preferredLanguageScore); return compareInts(this.preferredLanguageScore, other.preferredLanguageScore);
} }
if (this.preferredRoleFlagsScore != other.preferredRoleFlagsScore) {
return compareInts(this.preferredRoleFlagsScore, other.preferredRoleFlagsScore);
}
if (this.isDefault != other.isDefault) { if (this.isDefault != other.isDefault) {
return this.isDefault ? 1 : -1; return this.isDefault ? 1 : -1;
} }

View file

@ -33,6 +33,7 @@ public class TrackSelectionParameters implements Parcelable {
@Nullable /* package */ String preferredAudioLanguage; @Nullable /* package */ String preferredAudioLanguage;
@Nullable /* package */ String preferredTextLanguage; @Nullable /* package */ String preferredTextLanguage;
@C.RoleFlags /* package */ int preferredRoleFlags;
/* package */ boolean selectUndeterminedTextLanguage; /* package */ boolean selectUndeterminedTextLanguage;
@C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags; @C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags;
@ -48,6 +49,7 @@ public class TrackSelectionParameters implements Parcelable {
/* package */ Builder(TrackSelectionParameters initialValues) { /* package */ Builder(TrackSelectionParameters initialValues) {
preferredAudioLanguage = initialValues.preferredAudioLanguage; preferredAudioLanguage = initialValues.preferredAudioLanguage;
preferredTextLanguage = initialValues.preferredTextLanguage; preferredTextLanguage = initialValues.preferredTextLanguage;
preferredRoleFlags = initialValues.preferredRoleFlags;
selectUndeterminedTextLanguage = initialValues.selectUndeterminedTextLanguage; selectUndeterminedTextLanguage = initialValues.selectUndeterminedTextLanguage;
disabledTextTrackSelectionFlags = initialValues.disabledTextTrackSelectionFlags; disabledTextTrackSelectionFlags = initialValues.disabledTextTrackSelectionFlags;
} }
@ -74,6 +76,17 @@ public class TrackSelectionParameters implements Parcelable {
return this; return this;
} }
/**
* See {@link TrackSelectionParameters#preferredRoleFlags}.
*
* @param preferredRoleFlags Preferred role flags.
* @return This builder.
*/
public Builder setPreferredRoleFlags(int preferredRoleFlags) {
this.preferredRoleFlags = preferredRoleFlags;
return this;
}
/** /**
* See {@link TrackSelectionParameters#selectUndeterminedTextLanguage}. * See {@link TrackSelectionParameters#selectUndeterminedTextLanguage}.
* *
@ -102,6 +115,7 @@ public class TrackSelectionParameters implements Parcelable {
preferredAudioLanguage, preferredAudioLanguage,
// Text // Text
preferredTextLanguage, preferredTextLanguage,
preferredRoleFlags,
selectUndeterminedTextLanguage, selectUndeterminedTextLanguage,
disabledTextTrackSelectionFlags); disabledTextTrackSelectionFlags);
} }
@ -121,6 +135,11 @@ public class TrackSelectionParameters implements Parcelable {
* the default track if there is one, or no track otherwise. The default value is {@code null}. * the default track if there is one, or no track otherwise. The default value is {@code null}.
*/ */
@Nullable public final String preferredTextLanguage; @Nullable public final String preferredTextLanguage;
/**
* The preferred role flags for text tracks. {@code 0} selects
* the default track if there is one, or no track otherwise. The default value is {@code 0}.
*/
@Nullable public final int preferredRoleFlags;
/** /**
* 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
* #preferredTextLanguage} is available, or if {@link #preferredTextLanguage} is unset. The * #preferredTextLanguage} is available, or if {@link #preferredTextLanguage} is unset. The
@ -138,6 +157,7 @@ public class TrackSelectionParameters implements Parcelable {
/* preferredAudioLanguage= */ null, /* preferredAudioLanguage= */ null,
// Text // Text
/* preferredTextLanguage= */ null, /* preferredTextLanguage= */ null,
/* preferredRoleFlags= */ 0,
/* selectUndeterminedTextLanguage= */ false, /* selectUndeterminedTextLanguage= */ false,
/* disabledTextTrackSelectionFlags= */ 0); /* disabledTextTrackSelectionFlags= */ 0);
} }
@ -145,12 +165,14 @@ public class TrackSelectionParameters implements Parcelable {
/* package */ TrackSelectionParameters( /* package */ TrackSelectionParameters(
@Nullable String preferredAudioLanguage, @Nullable String preferredAudioLanguage,
@Nullable String preferredTextLanguage, @Nullable String preferredTextLanguage,
int preferredRoleFlags,
boolean selectUndeterminedTextLanguage, boolean selectUndeterminedTextLanguage,
@C.SelectionFlags int disabledTextTrackSelectionFlags) { @C.SelectionFlags int disabledTextTrackSelectionFlags) {
// Audio // Audio
this.preferredAudioLanguage = Util.normalizeLanguageCode(preferredAudioLanguage); this.preferredAudioLanguage = Util.normalizeLanguageCode(preferredAudioLanguage);
// Text // Text
this.preferredTextLanguage = Util.normalizeLanguageCode(preferredTextLanguage); this.preferredTextLanguage = Util.normalizeLanguageCode(preferredTextLanguage);
this.preferredRoleFlags = preferredRoleFlags;
this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage; this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage;
this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags; this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags;
} }
@ -158,6 +180,7 @@ public class TrackSelectionParameters implements Parcelable {
/* package */ TrackSelectionParameters(Parcel in) { /* package */ TrackSelectionParameters(Parcel in) {
this.preferredAudioLanguage = in.readString(); this.preferredAudioLanguage = in.readString();
this.preferredTextLanguage = in.readString(); this.preferredTextLanguage = in.readString();
this.preferredRoleFlags = in.readInt();
this.selectUndeterminedTextLanguage = Util.readBoolean(in); this.selectUndeterminedTextLanguage = Util.readBoolean(in);
this.disabledTextTrackSelectionFlags = in.readInt(); this.disabledTextTrackSelectionFlags = in.readInt();
} }
@ -179,6 +202,7 @@ public class TrackSelectionParameters implements Parcelable {
TrackSelectionParameters other = (TrackSelectionParameters) obj; TrackSelectionParameters other = (TrackSelectionParameters) obj;
return TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage) return TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage)
&& TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage) && TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage)
&& preferredRoleFlags == other.preferredRoleFlags
&& selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage
&& disabledTextTrackSelectionFlags == other.disabledTextTrackSelectionFlags; && disabledTextTrackSelectionFlags == other.disabledTextTrackSelectionFlags;
} }
@ -188,6 +212,7 @@ public class TrackSelectionParameters implements Parcelable {
int result = 1; int result = 1;
result = 31 * result + (preferredAudioLanguage == null ? 0 : preferredAudioLanguage.hashCode()); result = 31 * result + (preferredAudioLanguage == null ? 0 : preferredAudioLanguage.hashCode());
result = 31 * result + (preferredTextLanguage == null ? 0 : preferredTextLanguage.hashCode()); result = 31 * result + (preferredTextLanguage == null ? 0 : preferredTextLanguage.hashCode());
result = 31 * result + (preferredRoleFlags);
result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0); result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0);
result = 31 * result + disabledTextTrackSelectionFlags; result = 31 * result + disabledTextTrackSelectionFlags;
return result; return result;
@ -204,6 +229,7 @@ public class TrackSelectionParameters implements Parcelable {
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeString(preferredAudioLanguage); dest.writeString(preferredAudioLanguage);
dest.writeString(preferredTextLanguage); dest.writeString(preferredTextLanguage);
dest.writeInt(preferredRoleFlags);
Util.writeBoolean(dest, selectUndeterminedTextLanguage); Util.writeBoolean(dest, selectUndeterminedTextLanguage);
dest.writeInt(disabledTextTrackSelectionFlags); dest.writeInt(disabledTextTrackSelectionFlags);
} }