mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Reintroducing existing logic as requested here https://github.com/google/ExoPlayer/pull/6178#pullrequestreview-261298162
This commit is contained in:
parent
29a099cf03
commit
af98883a7b
1 changed files with 75 additions and 56 deletions
|
|
@ -1555,29 +1555,39 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
||||||
TextTrackScore selectedTextTrackScore = null;
|
TextTrackScore selectedTextTrackScore = null;
|
||||||
int selectedTextRendererIndex = C.INDEX_UNSET;
|
int selectedTextRendererIndex = C.INDEX_UNSET;
|
||||||
for (int i = 0; i < rendererCount; i++) {
|
for (int i = 0; i < rendererCount; i++) {
|
||||||
// The below behaviour is different from video and audio track selection
|
int trackType = mappedTrackInfo.getRendererType(i);
|
||||||
// i.e. do not perform a text track pre selection if there are no preferredTextLanguage requested.
|
switch (trackType) {
|
||||||
if (C.TRACK_TYPE_TEXT == mappedTrackInfo.getRendererType(i) && params.preferredTextLanguage != null) {
|
case C.TRACK_TYPE_VIDEO:
|
||||||
Pair<TrackSelection.Definition, TextTrackScore> textSelection =
|
case C.TRACK_TYPE_AUDIO:
|
||||||
selectTextTrack(
|
// Already done. Do nothing.
|
||||||
mappedTrackInfo.getTrackGroups(i),
|
break;
|
||||||
rendererFormatSupports[i],
|
case C.TRACK_TYPE_TEXT:
|
||||||
params);
|
Pair<TrackSelection.Definition, TextTrackScore> textSelection =
|
||||||
if (textSelection != null
|
selectTextTrack(
|
||||||
&& (selectedTextTrackScore == null
|
mappedTrackInfo.getTrackGroups(i),
|
||||||
|| textSelection.second.compareTo(selectedTextTrackScore) > 0)) {
|
rendererFormatSupports[i],
|
||||||
if (selectedTextRendererIndex != C.INDEX_UNSET) {
|
params,
|
||||||
// We've already made a selection for another text renderer, but it had a lower
|
selectedAudioLanguage);
|
||||||
// score. Clear the selection for that renderer.
|
if (textSelection != null
|
||||||
definitions[selectedTextRendererIndex] = null;
|
&& (selectedTextTrackScore == null
|
||||||
|
|| textSelection.second.compareTo(selectedTextTrackScore) > 0)) {
|
||||||
|
if (selectedTextRendererIndex != C.INDEX_UNSET) {
|
||||||
|
// We've already made a selection for another text renderer, but it had a lower
|
||||||
|
// score. Clear the selection for that renderer.
|
||||||
|
definitions[selectedTextRendererIndex] = null;
|
||||||
|
}
|
||||||
|
definitions[i] = textSelection.first;
|
||||||
|
selectedTextTrackScore = textSelection.second;
|
||||||
|
selectedTextRendererIndex = i;
|
||||||
}
|
}
|
||||||
TrackSelection.Definition definition = textSelection.first;
|
break;
|
||||||
definitions[i] = definition;
|
default:
|
||||||
selectedTextTrackScore = textSelection.second;
|
definitions[i] =
|
||||||
selectedTextRendererIndex = i;
|
selectOtherTrack(
|
||||||
|
trackType, mappedTrackInfo.getTrackGroups(i), rendererFormatSupports[i], params);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return definitions;
|
return definitions;
|
||||||
}
|
}
|
||||||
|
|
@ -2052,7 +2062,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
||||||
protected Pair<TrackSelection.Definition, TextTrackScore> selectTextTrack(
|
protected Pair<TrackSelection.Definition, TextTrackScore> selectTextTrack(
|
||||||
TrackGroupArray groups,
|
TrackGroupArray groups,
|
||||||
int[][] formatSupport,
|
int[][] formatSupport,
|
||||||
Parameters params)
|
Parameters params,
|
||||||
|
@Nullable String selectedAudioLanguage)
|
||||||
throws ExoPlaybackException {
|
throws ExoPlaybackException {
|
||||||
TrackGroup selectedGroup = null;
|
TrackGroup selectedGroup = null;
|
||||||
int selectedTrackIndex = C.INDEX_UNSET;
|
int selectedTrackIndex = C.INDEX_UNSET;
|
||||||
|
|
@ -2064,7 +2075,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
||||||
if (isSupported(trackFormatSupport[trackIndex],
|
if (isSupported(trackFormatSupport[trackIndex],
|
||||||
params.exceedRendererCapabilitiesIfNecessary)) {
|
params.exceedRendererCapabilitiesIfNecessary)) {
|
||||||
Format format = trackGroup.getFormat(trackIndex);
|
Format format = trackGroup.getFormat(trackIndex);
|
||||||
TextTrackScore trackScore = new TextTrackScore(format, params, trackFormatSupport[trackIndex]);
|
TextTrackScore trackScore = new TextTrackScore(format, params, trackFormatSupport[trackIndex], selectedAudioLanguage);
|
||||||
if ((selectedTrackScore == null) || trackScore.compareTo(selectedTrackScore) > 0) {
|
if ((selectedTrackScore == null) || trackScore.compareTo(selectedTrackScore) > 0) {
|
||||||
selectedGroup = trackGroup;
|
selectedGroup = trackGroup;
|
||||||
selectedTrackIndex = trackIndex;
|
selectedTrackIndex = trackIndex;
|
||||||
|
|
@ -2497,29 +2508,49 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
||||||
/** Represents how well an text track matches the selection {@link Parameters}. */
|
/** Represents how well an text track matches the selection {@link Parameters}. */
|
||||||
protected static final class TextTrackScore implements Comparable<TextTrackScore> {
|
protected static final class TextTrackScore implements Comparable<TextTrackScore> {
|
||||||
|
|
||||||
private final boolean isWithinRendererCapabilities;
|
private final boolean isDefault;
|
||||||
private final int preferredLanguageScore;
|
private final boolean isForced;
|
||||||
private final int localeLanguageMatchIndex;
|
private final int languageScore;
|
||||||
private final int localeLanguageScore;
|
private final boolean trackHasNoLanguage;
|
||||||
private final boolean isDefaultSelectionFlag;
|
private int bestMatchScore = 0;
|
||||||
|
|
||||||
public TextTrackScore(Format format, Parameters parameters, int formatSupport) {
|
public TextTrackScore(
|
||||||
isWithinRendererCapabilities = isSupported(formatSupport, false);
|
Format format,
|
||||||
preferredLanguageScore = getFormatLanguageScore(format, parameters.preferredTextLanguage);
|
Parameters parameters,
|
||||||
isDefaultSelectionFlag = (format.selectionFlags & C.SELECTION_FLAG_DEFAULT) != 0;
|
int trackFormatSupport,
|
||||||
String[] localeLanguages = Util.getSystemLanguageCodes();
|
@Nullable String selectedAudioLanguage) {
|
||||||
int bestMatchIndex = Integer.MAX_VALUE;
|
languageScore = getFormatLanguageScore(format, parameters.preferredTextLanguage);
|
||||||
int bestMatchScore = 0;
|
int maskedSelectionFlags =
|
||||||
for (int i = 0; i < localeLanguages.length; i++) {
|
format.selectionFlags & ~parameters.disabledTextTrackSelectionFlags;
|
||||||
int score = getFormatLanguageScore(format, localeLanguages[i]);
|
isDefault = (format.selectionFlags & C.SELECTION_FLAG_DEFAULT) != 0;
|
||||||
if (score > 0) {
|
isForced = (maskedSelectionFlags & C.SELECTION_FLAG_FORCED) != 0;
|
||||||
bestMatchIndex = i;
|
trackHasNoLanguage = formatHasNoLanguage(format);
|
||||||
bestMatchScore = score;
|
|
||||||
break;
|
if (languageScore > 0 || (parameters.selectUndeterminedTextLanguage && trackHasNoLanguage)) {
|
||||||
|
if (isDefault) {
|
||||||
|
bestMatchScore = 11;
|
||||||
|
} else if (!isForced) {
|
||||||
|
// 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.
|
||||||
|
bestMatchScore = 7;
|
||||||
|
} else {
|
||||||
|
bestMatchScore = 3;
|
||||||
}
|
}
|
||||||
|
bestMatchScore += languageScore;
|
||||||
|
} else if (isDefault) {
|
||||||
|
bestMatchScore = 2;
|
||||||
|
} else if (isForced
|
||||||
|
&& (languageScore > 0
|
||||||
|
|| (trackHasNoLanguage && stringDefinesNoLanguage(selectedAudioLanguage)))) {
|
||||||
|
bestMatchScore = 1;
|
||||||
|
} else {
|
||||||
|
// Track should not be selected.
|
||||||
|
bestMatchScore = -1;
|
||||||
|
}
|
||||||
|
if (isSupported(trackFormatSupport, false)) {
|
||||||
|
bestMatchScore += WITHIN_RENDERER_CAPABILITIES_BONUS;
|
||||||
}
|
}
|
||||||
localeLanguageMatchIndex = bestMatchIndex;
|
|
||||||
localeLanguageScore = bestMatchScore;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -2531,20 +2562,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(@NonNull TextTrackScore other) {
|
public int compareTo(@NonNull TextTrackScore other) {
|
||||||
if (this.isWithinRendererCapabilities != other.isWithinRendererCapabilities) {
|
if (this.bestMatchScore != other.bestMatchScore) {
|
||||||
return this.isWithinRendererCapabilities ? 1 : -1;
|
return compareInts(this.bestMatchScore, other.bestMatchScore);
|
||||||
}
|
|
||||||
if (this.preferredLanguageScore != other.preferredLanguageScore) {
|
|
||||||
return compareInts(this.preferredLanguageScore, other.preferredLanguageScore);
|
|
||||||
}
|
|
||||||
if (this.isDefaultSelectionFlag != other.isDefaultSelectionFlag) {
|
|
||||||
return this.isDefaultSelectionFlag ? 1 : -1;
|
|
||||||
}
|
|
||||||
if (this.localeLanguageMatchIndex != other.localeLanguageMatchIndex) {
|
|
||||||
return -compareInts(this.localeLanguageMatchIndex, other.localeLanguageMatchIndex);
|
|
||||||
}
|
|
||||||
if (this.localeLanguageScore != other.localeLanguageScore) {
|
|
||||||
return compareInts(this.localeLanguageScore, other.localeLanguageScore);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue