Commit 50582417 by Corentin Zuber

Authorize multiple preffered language and text

parent cfb429d1
...@@ -450,6 +450,12 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -450,6 +450,12 @@ public class DefaultTrackSelector extends MappingTrackSelector {
return this; return this;
} }
@Override
public ParametersBuilder setPreferredAudioLanguage(String[] preferredAudioLanguage) {
super.setPreferredAudioLanguage(preferredAudioLanguage);
return this;
}
/** /**
* Sets the maximum allowed audio channel count. * Sets the maximum allowed audio channel count.
* *
...@@ -1015,7 +1021,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -1015,7 +1021,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
int viewportHeight, int viewportHeight,
boolean viewportOrientationMayChange, boolean viewportOrientationMayChange,
// Audio // Audio
@Nullable String preferredAudioLanguage, String[] preferredAudioLanguage,
int maxAudioChannelCount, int maxAudioChannelCount,
int maxAudioBitrate, int maxAudioBitrate,
boolean exceedAudioConstraintsIfNecessary, boolean exceedAudioConstraintsIfNecessary,
...@@ -1023,7 +1029,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -1023,7 +1029,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
boolean allowAudioMixedSampleRateAdaptiveness, boolean allowAudioMixedSampleRateAdaptiveness,
boolean allowAudioMixedChannelCountAdaptiveness, boolean allowAudioMixedChannelCountAdaptiveness,
// Text // Text
@Nullable String preferredTextLanguage, String[] preferredTextLanguage,
@C.RoleFlags int preferredTextRoleFlags, @C.RoleFlags int preferredTextRoleFlags,
boolean selectUndeterminedTextLanguage, boolean selectUndeterminedTextLanguage,
@C.SelectionFlags int disabledTextTrackSelectionFlags, @C.SelectionFlags int disabledTextTrackSelectionFlags,
...@@ -2619,11 +2625,16 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -2619,11 +2625,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
this.language = normalizeUndeterminedLanguageToNull(format.language); this.language = normalizeUndeterminedLanguageToNull(format.language);
isWithinRendererCapabilities = isWithinRendererCapabilities =
isSupported(formatSupport, /* allowExceedsCapabilities= */ false); isSupported(formatSupport, /* allowExceedsCapabilities= */ false);
preferredLanguageScore = int bestLanguageScore = 0;
getFormatLanguageScore( for (int i = 0; i < parameters.preferredAudioLanguage.length; i++) {
format, int score = getFormatLanguageScore(
parameters.preferredAudioLanguage, format,
/* allowUndeterminedFormatLanguage= */ false); parameters.preferredAudioLanguage[i],
/* allowUndeterminedFormatLanguage= */ false);
score = 1000 * score + parameters.preferredAudioLanguage.length - i; // Priorise the first items in array
bestLanguageScore = Math.max(bestLanguageScore, score);
}
preferredLanguageScore = bestLanguageScore;
isDefaultSelectionFlag = (format.selectionFlags & C.SELECTION_FLAG_DEFAULT) != 0; isDefaultSelectionFlag = (format.selectionFlags & C.SELECTION_FLAG_DEFAULT) != 0;
channelCount = format.channelCount; channelCount = format.channelCount;
sampleRate = format.sampleRate; sampleRate = format.sampleRate;
...@@ -2717,9 +2728,14 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -2717,9 +2728,14 @@ public class DefaultTrackSelector extends MappingTrackSelector {
format.selectionFlags & ~parameters.disabledTextTrackSelectionFlags; format.selectionFlags & ~parameters.disabledTextTrackSelectionFlags;
isDefault = (maskedSelectionFlags & C.SELECTION_FLAG_DEFAULT) != 0; isDefault = (maskedSelectionFlags & C.SELECTION_FLAG_DEFAULT) != 0;
isForced = (maskedSelectionFlags & C.SELECTION_FLAG_FORCED) != 0; isForced = (maskedSelectionFlags & C.SELECTION_FLAG_FORCED) != 0;
preferredLanguageScore = int bestLanguageScore = 0;
getFormatLanguageScore( for (int i = 0; i < parameters.preferredTextLanguage.length; i++) {
format, parameters.preferredTextLanguage, parameters.selectUndeterminedTextLanguage); int score = getFormatLanguageScore(
format, parameters.preferredTextLanguage[i], parameters.selectUndeterminedTextLanguage);
score = 1000 * score + parameters.preferredTextLanguage.length - i; // Priorise the first items in array
bestLanguageScore = Math.max(bestLanguageScore, score);
}
preferredLanguageScore = bestLanguageScore;
preferredRoleFlagsScore = preferredRoleFlagsScore =
Integer.bitCount(format.roleFlags & parameters.preferredTextRoleFlags); Integer.bitCount(format.roleFlags & parameters.preferredTextRoleFlags);
hasCaptionRoleFlags = hasCaptionRoleFlags =
...@@ -2730,7 +2746,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -2730,7 +2746,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined); getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined);
isWithinConstraints = isWithinConstraints =
preferredLanguageScore > 0 preferredLanguageScore > 0
|| (parameters.preferredTextLanguage == null && preferredRoleFlagsScore > 0) || (parameters.preferredTextLanguage.length == 0 && preferredRoleFlagsScore > 0)
|| isDefault || isDefault
|| (isForced && selectedAudioLanguageScore > 0); || (isForced && selectedAudioLanguageScore > 0);
} }
......
...@@ -19,12 +19,12 @@ import android.content.Context; ...@@ -19,12 +19,12 @@ import android.content.Context;
import android.os.Looper; import android.os.Looper;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.text.TextUtils;
import android.view.accessibility.CaptioningManager; import android.view.accessibility.CaptioningManager;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi; import androidx.annotation.RequiresApi;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
/** Constraint parameters for track selection. */ /** Constraint parameters for track selection. */
...@@ -36,8 +36,8 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -36,8 +36,8 @@ public class TrackSelectionParameters implements Parcelable {
*/ */
public static class Builder { public static class Builder {
@Nullable /* package */ String preferredAudioLanguage; /* package */ String[] preferredAudioLanguage;
@Nullable /* package */ String preferredTextLanguage; /* package */ String[] preferredTextLanguage;
@C.RoleFlags /* package */ int preferredTextRoleFlags; @C.RoleFlags /* package */ int preferredTextRoleFlags;
/* package */ boolean selectUndeterminedTextLanguage; /* package */ boolean selectUndeterminedTextLanguage;
@C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags; @C.SelectionFlags /* package */ int disabledTextTrackSelectionFlags;
...@@ -59,8 +59,8 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -59,8 +59,8 @@ public class TrackSelectionParameters implements Parcelable {
*/ */
@Deprecated @Deprecated
public Builder() { public Builder() {
preferredAudioLanguage = null; preferredAudioLanguage = new String[0];
preferredTextLanguage = null; preferredTextLanguage = new String[0];
preferredTextRoleFlags = 0; preferredTextRoleFlags = 0;
selectUndeterminedTextLanguage = false; selectUndeterminedTextLanguage = false;
disabledTextTrackSelectionFlags = 0; disabledTextTrackSelectionFlags = 0;
...@@ -86,6 +86,14 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -86,6 +86,14 @@ public class TrackSelectionParameters implements Parcelable {
* @return This builder. * @return This builder.
*/ */
public Builder setPreferredAudioLanguage(@Nullable String preferredAudioLanguage) { public Builder setPreferredAudioLanguage(@Nullable String preferredAudioLanguage) {
if (preferredAudioLanguage == null) {
return setPreferredAudioLanguage(new String[0]);
} else {
return setPreferredAudioLanguage(new String[] { preferredAudioLanguage });
}
}
public Builder setPreferredAudioLanguage(String[] preferredAudioLanguage) {
this.preferredAudioLanguage = preferredAudioLanguage; this.preferredAudioLanguage = preferredAudioLanguage;
return this; return this;
} }
...@@ -115,6 +123,14 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -115,6 +123,14 @@ public class TrackSelectionParameters implements Parcelable {
* @return This builder. * @return This builder.
*/ */
public Builder setPreferredTextLanguage(@Nullable String preferredTextLanguage) { public Builder setPreferredTextLanguage(@Nullable String preferredTextLanguage) {
if (preferredTextLanguage == null) {
return setPreferredTextLanguage(new String[0]);
} else {
return setPreferredTextLanguage(new String[]{preferredTextLanguage});
}
}
public Builder setPreferredTextLanguage(String[] preferredTextLanguage) {
this.preferredTextLanguage = preferredTextLanguage; this.preferredTextLanguage = preferredTextLanguage;
return this; return this;
} }
...@@ -185,7 +201,7 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -185,7 +201,7 @@ public class TrackSelectionParameters implements Parcelable {
preferredTextRoleFlags = C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND; preferredTextRoleFlags = C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND;
Locale preferredLocale = captioningManager.getLocale(); Locale preferredLocale = captioningManager.getLocale();
if (preferredLocale != null) { if (preferredLocale != null) {
preferredTextLanguage = Util.getLocaleLanguageTag(preferredLocale); preferredTextLanguage = new String[] { Util.getLocaleLanguageTag(preferredLocale) };
} }
} }
} }
...@@ -222,13 +238,13 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -222,13 +238,13 @@ public class TrackSelectionParameters implements Parcelable {
* {@code null} selects the default track, or the first track if there's no default. The default * {@code null} selects the default track, or the first track if there's no default. The default
* value is {@code null}. * value is {@code null}.
*/ */
@Nullable public final String preferredAudioLanguage; public final String[] preferredAudioLanguage;
/** /**
* The preferred language for text tracks as an IETF BCP 47 conformant tag. {@code null} selects * The preferred language for text tracks as an IETF BCP 47 conformant tag. {@code null} selects
* the default track if there is one, or no track otherwise. The default value is {@code null}, or * the default track if there is one, or no track otherwise. The default value is {@code null}, or
* the language of the accessibility {@link CaptioningManager} if enabled. * the language of the accessibility {@link CaptioningManager} if enabled.
*/ */
@Nullable public final String preferredTextLanguage; public final String[] preferredTextLanguage;
/** /**
* 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}, or {@link C#ROLE_FLAG_SUBTITLE}
...@@ -249,23 +265,37 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -249,23 +265,37 @@ public class TrackSelectionParameters implements Parcelable {
@C.SelectionFlags public final int disabledTextTrackSelectionFlags; @C.SelectionFlags public final int disabledTextTrackSelectionFlags;
/* package */ TrackSelectionParameters( /* package */ TrackSelectionParameters(
@Nullable String preferredAudioLanguage, String[] preferredAudioLanguage,
@Nullable String preferredTextLanguage, String[] preferredTextLanguage,
@C.RoleFlags int preferredTextRoleFlags, @C.RoleFlags int preferredTextRoleFlags,
boolean selectUndeterminedTextLanguage, boolean selectUndeterminedTextLanguage,
@C.SelectionFlags int disabledTextTrackSelectionFlags) { @C.SelectionFlags int disabledTextTrackSelectionFlags) {
// Audio // Audio
this.preferredAudioLanguage = Util.normalizeLanguageCode(preferredAudioLanguage); this.preferredAudioLanguage = new String[preferredAudioLanguage.length];
for (int i = 0; i < preferredAudioLanguage.length; i++) {
this.preferredAudioLanguage[i] = Util.normalizeLanguageCode(preferredAudioLanguage[i]);
}
// Text // Text
this.preferredTextLanguage = Util.normalizeLanguageCode(preferredTextLanguage); this.preferredTextLanguage = new String[preferredAudioLanguage.length];
for (int i = 0; i < preferredTextLanguage.length; i++) {
this.preferredTextLanguage[i] = Util.normalizeLanguageCode(preferredTextLanguage[i]);
}
this.preferredTextRoleFlags = preferredTextRoleFlags; this.preferredTextRoleFlags = preferredTextRoleFlags;
this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage; this.selectUndeterminedTextLanguage = selectUndeterminedTextLanguage;
this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags; this.disabledTextTrackSelectionFlags = disabledTextTrackSelectionFlags;
} }
/* package */ TrackSelectionParameters(Parcel in) { /* package */ TrackSelectionParameters(Parcel in) {
this.preferredAudioLanguage = in.readString(); int preferredAudioLanguageSize = in.readInt();
this.preferredTextLanguage = in.readString(); this.preferredAudioLanguage = new String[preferredAudioLanguageSize];
for (int i = 0; i < preferredAudioLanguageSize; i++) {
preferredAudioLanguage[i] = in.readString();
}
int preferredTextLanguageSize = in.readInt();
this.preferredTextLanguage = new String[preferredTextLanguageSize];
for (int i = 0; i < preferredTextLanguageSize; i++) {
preferredTextLanguage[i] = in.readString();
}
this.preferredTextRoleFlags = in.readInt(); this.preferredTextRoleFlags = in.readInt();
this.selectUndeterminedTextLanguage = Util.readBoolean(in); this.selectUndeterminedTextLanguage = Util.readBoolean(in);
this.disabledTextTrackSelectionFlags = in.readInt(); this.disabledTextTrackSelectionFlags = in.readInt();
...@@ -286,8 +316,8 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -286,8 +316,8 @@ public class TrackSelectionParameters implements Parcelable {
return false; return false;
} }
TrackSelectionParameters other = (TrackSelectionParameters) obj; TrackSelectionParameters other = (TrackSelectionParameters) obj;
return TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage) return Arrays.equals(preferredAudioLanguage, other.preferredAudioLanguage)
&& TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage) && Arrays.equals(preferredTextLanguage, other.preferredTextLanguage)
&& preferredTextRoleFlags == other.preferredTextRoleFlags && preferredTextRoleFlags == other.preferredTextRoleFlags
&& selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage && selectUndeterminedTextLanguage == other.selectUndeterminedTextLanguage
&& disabledTextTrackSelectionFlags == other.disabledTextTrackSelectionFlags; && disabledTextTrackSelectionFlags == other.disabledTextTrackSelectionFlags;
...@@ -296,8 +326,8 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -296,8 +326,8 @@ public class TrackSelectionParameters implements Parcelable {
@Override @Override
public int hashCode() { public int hashCode() {
int result = 1; int result = 1;
result = 31 * result + (preferredAudioLanguage == null ? 0 : preferredAudioLanguage.hashCode()); result = 31 * result + Arrays.hashCode(preferredAudioLanguage);
result = 31 * result + (preferredTextLanguage == null ? 0 : preferredTextLanguage.hashCode()); result = 31 * result + Arrays.hashCode(preferredTextLanguage);
result = 31 * result + preferredTextRoleFlags; result = 31 * result + preferredTextRoleFlags;
result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0); result = 31 * result + (selectUndeterminedTextLanguage ? 1 : 0);
result = 31 * result + disabledTextTrackSelectionFlags; result = 31 * result + disabledTextTrackSelectionFlags;
...@@ -313,8 +343,14 @@ public class TrackSelectionParameters implements Parcelable { ...@@ -313,8 +343,14 @@ public class TrackSelectionParameters implements Parcelable {
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeString(preferredAudioLanguage); dest.writeInt(preferredAudioLanguage.length);
dest.writeString(preferredTextLanguage); for (String s : preferredAudioLanguage) {
dest.writeString(s);
}
dest.writeInt(preferredTextLanguage.length);
for (String s : preferredTextLanguage) {
dest.writeString(s);
}
dest.writeInt(preferredTextRoleFlags); dest.writeInt(preferredTextRoleFlags);
Util.writeBoolean(dest, selectUndeterminedTextLanguage); Util.writeBoolean(dest, selectUndeterminedTextLanguage);
dest.writeInt(disabledTextTrackSelectionFlags); dest.writeInt(disabledTextTrackSelectionFlags);
......
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