Commit af98883a by Yannick RUI

Reintroducing existing logic as requested here…

Reintroducing existing logic as requested here https://github.com/google/ExoPlayer/pull/6178#pullrequestreview-261298162
parent 29a099cf
...@@ -1555,14 +1555,19 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -1555,14 +1555,19 @@ 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:
case C.TRACK_TYPE_AUDIO:
// Already done. Do nothing.
break;
case C.TRACK_TYPE_TEXT:
Pair<TrackSelection.Definition, TextTrackScore> textSelection = Pair<TrackSelection.Definition, TextTrackScore> textSelection =
selectTextTrack( selectTextTrack(
mappedTrackInfo.getTrackGroups(i), mappedTrackInfo.getTrackGroups(i),
rendererFormatSupports[i], rendererFormatSupports[i],
params); params,
selectedAudioLanguage);
if (textSelection != null if (textSelection != null
&& (selectedTextTrackScore == null && (selectedTextTrackScore == null
|| textSelection.second.compareTo(selectedTextTrackScore) > 0)) { || textSelection.second.compareTo(selectedTextTrackScore) > 0)) {
...@@ -1571,11 +1576,16 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -1571,11 +1576,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
// score. Clear the selection for that renderer. // score. Clear the selection for that renderer.
definitions[selectedTextRendererIndex] = null; definitions[selectedTextRendererIndex] = null;
} }
TrackSelection.Definition definition = textSelection.first; definitions[i] = textSelection.first;
definitions[i] = definition;
selectedTextTrackScore = textSelection.second; selectedTextTrackScore = textSelection.second;
selectedTextRendererIndex = i; selectedTextRendererIndex = i;
} }
break;
default:
definitions[i] =
selectOtherTrack(
trackType, mappedTrackInfo.getTrackGroups(i), rendererFormatSupports[i], params);
break;
} }
} }
...@@ -2052,7 +2062,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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;
} }
......
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