|
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