mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
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
This commit is contained in:
parent
9bc4497749
commit
560c8c8760
2 changed files with 17 additions and 20 deletions
|
|
@ -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 {
|
||||||
|
|
||||||
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 {
|
||||||
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 {
|
||||||
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);
|
return compareInts(this.selectedAudioLanguageScore, other.selectedAudioLanguageScore);
|
||||||
}
|
|
||||||
if (this.isForcedAndSelectedAudioLanguage != other.isForcedAndSelectedAudioLanguage) {
|
|
||||||
return this.isForcedAndSelectedAudioLanguage ? 1 : -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue