|
11 | 11 | import androidx.media3.common.endeavor.WebUtil;
|
12 | 12 | import androidx.media3.common.util.Log;
|
13 | 13 | import androidx.media3.exoplayer.source.TrackGroupArray;
|
| 14 | +import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; |
14 | 15 | import androidx.media3.exoplayer.trackselection.ExoTrackSelection;
|
15 | 16 | import androidx.media3.exoplayer.trackselection.MappingTrackSelector;
|
16 | 17 | import androidx.media3.exoplayer.trackselection.TrackSelector;
|
| 18 | +import com.google.common.collect.ImmutableList; |
17 | 19 | import java.util.HashMap;
|
18 | 20 | import java.util.Iterator;
|
19 | 21 | import java.util.Map;
|
@@ -43,6 +45,7 @@ public TrackCollector(TrackSelector callback) {
|
43 | 45 | // May update status for the blacklistUntilTimes, videoTrackSelection, preferredAudioName and so on.
|
44 | 46 | public void onMappedTrackInfoChanged(
|
45 | 47 | MappingTrackSelector.MappedTrackInfo mappedTrackInfo,
|
| 48 | + DefaultTrackSelector.Parameters parameters, |
46 | 49 | ExoTrackSelection.Definition[] overrideDefinitions) {
|
47 | 50 | this.noGroupConstraint = true;
|
48 | 51 | this.videoUseFixedSelection = false;
|
@@ -72,25 +75,22 @@ public void onMappedTrackInfoChanged(
|
72 | 75 | Format format = overrideDefinitions[i].group.getFormat(overrideDefinitions[i].tracks[0]);
|
73 | 76 | preferredAudioName = getFormatName(format);
|
74 | 77 | } else if (preferredAudioName == null) {
|
75 |
| - preferredAudioName = ""; |
76 |
| - for (int j = 0; j < trackGroups.length; j++) { |
77 |
| - TrackGroup track = trackGroups.get(j); |
78 |
| - for (int k = 0; k < track.length; k++) { |
79 |
| - Format format = track.getFormat(k); |
80 |
| - if ((format.selectionFlags & C.SELECTION_FLAG_DEFAULT) != 0) { |
81 |
| - preferredAudioName = getFormatName(format); |
82 |
| - break; |
83 |
| - } |
84 |
| - } |
| 78 | + preferredAudioName = getParametersPreferred(trackGroups, parameters.preferredAudioLanguages); |
| 79 | + if (preferredAudioName == null) { |
| 80 | + preferredAudioName = getDefaultPreferred(trackGroups); |
85 | 81 | }
|
86 | 82 | }
|
87 | 83 | } else if (C.TRACK_TYPE_TEXT == mappedTrackInfo.getRendererType(i)) {
|
88 | 84 | // Init the preferred text name.
|
89 | 85 | if (overrideDefinitions[i] != null) {
|
90 | 86 | Format format = overrideDefinitions[i].group.getFormat(overrideDefinitions[i].tracks[0]);
|
91 | 87 | preferredTextName = getFormatName(format);
|
92 |
| - } else { |
93 |
| - preferredTextName = ""; |
| 88 | + } else if (preferredTextName == null) { |
| 89 | + TrackGroupArray trackGroups = mappedTrackInfo.getTrackGroups(i); |
| 90 | + preferredTextName = getParametersPreferred(trackGroups, parameters.preferredTextLanguages); |
| 91 | + if (preferredTextName == null) { |
| 92 | + preferredTextName = ""; |
| 93 | + } |
94 | 94 | }
|
95 | 95 | }
|
96 | 96 | }
|
@@ -305,6 +305,55 @@ private TrackGroupArray getTrackGroups(int trackType) {
|
305 | 305 | return new TrackGroupArray();
|
306 | 306 | }
|
307 | 307 |
|
| 308 | + private String getParametersPreferred( |
| 309 | + TrackGroupArray trackGroups, |
| 310 | + ImmutableList<String> preferredLanguages) { |
| 311 | + if (preferredLanguages.size() == 0) { |
| 312 | + return null; |
| 313 | + } |
| 314 | + |
| 315 | + int bestLanguageScore = 0; |
| 316 | + int bestLanguageIndex = Integer.MAX_VALUE; |
| 317 | + String preferredName = null; |
| 318 | + for (int i = 0; i < trackGroups.length; i++) { |
| 319 | + TrackGroup trackGroup = trackGroups.get(i); |
| 320 | + if (trackGroup.length == 0) { |
| 321 | + continue; |
| 322 | + } |
| 323 | + Format format = trackGroup.getFormat(0); |
| 324 | + for (int j = 0; j < preferredLanguages.size(); j++) { |
| 325 | + int score = DefaultTrackSelector.getFormatLanguageScore( |
| 326 | + format, |
| 327 | + preferredLanguages.get(j), |
| 328 | + /* allowUndeterminedFormatLanguage= */ false); |
| 329 | + if (score > 0) { |
| 330 | + if (j < bestLanguageIndex || (j == bestLanguageIndex && score > bestLanguageScore)) { |
| 331 | + bestLanguageIndex = j; |
| 332 | + bestLanguageScore = score; |
| 333 | + preferredName = getFormatName(format); |
| 334 | + } |
| 335 | + break; |
| 336 | + } |
| 337 | + } |
| 338 | + } |
| 339 | + return preferredName; |
| 340 | + } |
| 341 | + |
| 342 | + private String getDefaultPreferred(TrackGroupArray trackGroups) { |
| 343 | + String preferredName = ""; |
| 344 | + for (int i = 0; i < trackGroups.length; i++) { |
| 345 | + TrackGroup trackGroup = trackGroups.get(i); |
| 346 | + for (int j = 0; j < trackGroup.length; j++) { |
| 347 | + Format format = trackGroup.getFormat(j); |
| 348 | + if ((format.selectionFlags & C.SELECTION_FLAG_DEFAULT) != 0) { |
| 349 | + preferredName = getFormatName(format); |
| 350 | + break; |
| 351 | + } |
| 352 | + } |
| 353 | + } |
| 354 | + return preferredName; |
| 355 | + } |
| 356 | + |
308 | 357 | private static int getMetadataEntrySize(Format format) {
|
309 | 358 | return (format == null || format.metadata == null ? 0 : format.metadata.length());
|
310 | 359 | }
|
|
0 commit comments