Commit 5f488717 by Yannick RUI

Count the number of matches for role flags.

Select a track with matching role flags even if someone specifies a preferred role flgs without providing a preferred language
Prefer track without captions or describing music and sound flag when no role flag preference is provided.
parent 0c4df84e
......@@ -2695,6 +2695,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private final boolean isWithinRendererCapabilities;
private final boolean isDefault;
private final boolean hasPreferredIsForcedFlag;
private final boolean hasPreferredRoleFlags;
private final int hasCaptionRoleFlags;
private final int preferredLanguageScore;
private final int preferredRoleFlagsScore;
private final int selectedAudioLanguageScore;
......@@ -2713,18 +2715,21 @@ public class DefaultTrackSelector extends MappingTrackSelector {
preferredLanguageScore =
getFormatLanguageScore(
format, parameters.preferredTextLanguage, parameters.selectUndeterminedTextLanguage);
preferredRoleFlagsScore = format.roleFlags & parameters.preferredRoleFlags;
preferredRoleFlagsScore = Integer.bitCount(format.roleFlags & parameters.preferredRoleFlags);
// 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.
// Otherwise, prefer a forced track.
hasPreferredIsForcedFlag =
(preferredLanguageScore > 0 && !isForced) || (preferredLanguageScore == 0 && isForced);
hasPreferredRoleFlags = parameters.preferredRoleFlags > 0;
hasCaptionRoleFlags = Integer.bitCount(format.roleFlags
& (C.ROLE_FLAG_CAPTION | C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND));
boolean selectedAudioLanguageUndetermined =
normalizeUndeterminedLanguageToNull(selectedAudioLanguage) == null;
selectedAudioLanguageScore =
getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined);
isWithinConstraints =
(preferredLanguageScore > 0 || (parameters.preferredTextLanguage == null && selectedAudioLanguageScore > 0 && preferredRoleFlagsScore > 0)) || isDefault || (isForced && selectedAudioLanguageScore > 0);
(preferredLanguageScore > 0 || (parameters.preferredTextLanguage == null && preferredRoleFlagsScore > 0)) || isDefault || (isForced && selectedAudioLanguageScore > 0);
}
/**
......@@ -2742,16 +2747,23 @@ public class DefaultTrackSelector extends MappingTrackSelector {
if (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) {
return this.isDefault ? 1 : -1;
}
if (this.hasPreferredIsForcedFlag != other.hasPreferredIsForcedFlag) {
return this.hasPreferredIsForcedFlag ? 1 : -1;
}
return compareInts(this.selectedAudioLanguageScore, other.selectedAudioLanguageScore);
if (this.selectedAudioLanguageScore != other.selectedAudioLanguageScore) {
return compareInts(this.selectedAudioLanguageScore, other.selectedAudioLanguageScore);
}
// If no role flag preference is provided in the parameters, prefer tracks
// without C.ROLE_FLAG_CAPTION or C.ROLE_FLAG_DESCRIBES_MUSIC_AND_SOUND
// No specification means that non-captioning text tracks are preferred.
if (!this.hasPreferredRoleFlags) {
return compareInts(other.hasCaptionRoleFlags, this.hasCaptionRoleFlags);
}
return compareInts(this.preferredRoleFlagsScore, other.preferredRoleFlagsScore);
}
}
}
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