Commit 560c8c87 by tonihei Committed by Oliver Woodman

Simplify and improve text selection logic.

This changes the logic in the following ways:
 - If no preferred language is matched, prefer better scores for the selected
   audio language.
 - If a preferred language is matched, always prefer the better match
   irrespective of default or forced flags.
 - If a preferred language score and the isForced flag is the same, prefer
   tracks with a better selected audio language match.

PiperOrigin-RevId: 259707430
parent 9bc44977
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
provided ([#6325](https://github.com/google/ExoPlayer/issues/6325)). provided ([#6325](https://github.com/google/ExoPlayer/issues/6325)).
* Add `HttpDataSource.getResponseCode` to provide the status code associated * Add `HttpDataSource.getResponseCode` to provide the status code associated
with the most recent HTTP response. with the most recent HTTP response.
* Improve text selection logic to always prefer the better language matches
over other selection parameters.
* OkHttp extension: Upgrade OkHttp to fix HTTP2 socket timeout issue * OkHttp extension: Upgrade OkHttp to fix HTTP2 socket timeout issue
([#4078](https://github.com/google/ExoPlayer/issues/4078)). ([#4078](https://github.com/google/ExoPlayer/issues/4078)).
* RTMP extension: Upgrade LibRtmp-Client-for-Android to fix RTMP playback issues * RTMP extension: Upgrade LibRtmp-Client-for-Android to fix RTMP playback issues
......
...@@ -2638,9 +2638,9 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -2638,9 +2638,9 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private final boolean isWithinRendererCapabilities; private final boolean isWithinRendererCapabilities;
private final boolean isDefault; private final boolean isDefault;
private final boolean isForced; private final boolean hasPreferredIsForcedFlag;
private final int preferredLanguageScore; private final int preferredLanguageScore;
private final boolean isForcedAndSelectedAudioLanguage; private final int selectedAudioLanguageScore;
public TextTrackScore( public TextTrackScore(
Format format, Format format,
...@@ -2652,17 +2652,21 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -2652,17 +2652,21 @@ public class DefaultTrackSelector extends MappingTrackSelector {
int maskedSelectionFlags = int maskedSelectionFlags =
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; boolean isForced = (maskedSelectionFlags & C.SELECTION_FLAG_FORCED) != 0;
preferredLanguageScore = preferredLanguageScore =
getFormatLanguageScore( getFormatLanguageScore(
format, parameters.preferredTextLanguage, parameters.selectUndeterminedTextLanguage); format, parameters.preferredTextLanguage, parameters.selectUndeterminedTextLanguage);
// 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);
boolean selectedAudioLanguageUndetermined = boolean selectedAudioLanguageUndetermined =
normalizeUndeterminedLanguageToNull(selectedAudioLanguage) == null; normalizeUndeterminedLanguageToNull(selectedAudioLanguage) == null;
int selectedAudioLanguageScore = selectedAudioLanguageScore =
getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined); getFormatLanguageScore(format, selectedAudioLanguage, selectedAudioLanguageUndetermined);
isForcedAndSelectedAudioLanguage = isForced && selectedAudioLanguageScore > 0;
isWithinConstraints = isWithinConstraints =
preferredLanguageScore > 0 || isDefault || isForcedAndSelectedAudioLanguage; preferredLanguageScore > 0 || isDefault || (isForced && selectedAudioLanguageScore > 0);
} }
/** /**
...@@ -2677,25 +2681,16 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -2677,25 +2681,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
if (this.isWithinRendererCapabilities != other.isWithinRendererCapabilities) { if (this.isWithinRendererCapabilities != other.isWithinRendererCapabilities) {
return this.isWithinRendererCapabilities ? 1 : -1; return this.isWithinRendererCapabilities ? 1 : -1;
} }
if ((this.preferredLanguageScore > 0) != (other.preferredLanguageScore > 0)) { if (this.preferredLanguageScore != other.preferredLanguageScore) {
return this.preferredLanguageScore > 0 ? 1 : -1; return compareInts(this.preferredLanguageScore, other.preferredLanguageScore);
} }
if (this.isDefault != other.isDefault) { if (this.isDefault != other.isDefault) {
return this.isDefault ? 1 : -1; return this.isDefault ? 1 : -1;
} }
if (this.preferredLanguageScore > 0) { if (this.hasPreferredIsForcedFlag != other.hasPreferredIsForcedFlag) {
if (this.isForced != other.isForced) { return this.hasPreferredIsForcedFlag ? 1 : -1;
// Prefer non-forced to forced if a preferred text language has been specified. Where
// both are provided the non-forced track will usually contain the forced subtitles as
// a subset.
return !this.isForced ? 1 : -1;
}
return compareInts(this.preferredLanguageScore, other.preferredLanguageScore);
}
if (this.isForcedAndSelectedAudioLanguage != other.isForcedAndSelectedAudioLanguage) {
return this.isForcedAndSelectedAudioLanguage ? 1 : -1;
} }
return 0; return compareInts(this.selectedAudioLanguageScore, other.selectedAudioLanguageScore);
} }
} }
} }
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