From ad8f6c183d7ceafedd80c88fa11a339bb4e40d14 Mon Sep 17 00:00:00 2001 From: Pierre-Hugues Husson Date: Wed, 20 Nov 2019 16:12:15 +0100 Subject: [PATCH] Allow multiple metadata tracks, assuming multiple metadata renderers --- .../trackselection/DefaultTrackSelector.java | 16 +++++-- .../trackselection/MappingTrackSelector.java | 44 +++++++++++++++---- 2 files changed, 48 insertions(+), 12 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java index 0d74652408..59d249328c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/DefaultTrackSelector.java @@ -1732,6 +1732,7 @@ public class DefaultTrackSelector extends MappingTrackSelector { TextTrackScore selectedTextTrackScore = null; int selectedTextRendererIndex = C.INDEX_UNSET; + int nIgnore = 0; for (int i = 0; i < rendererCount; i++) { int trackType = mappedTrackInfo.getRendererType(i); switch (trackType) { @@ -1762,7 +1763,8 @@ public class DefaultTrackSelector extends MappingTrackSelector { default: definitions[i] = selectOtherTrack( - trackType, mappedTrackInfo.getTrackGroups(i), rendererFormatSupports[i], params); + trackType, mappedTrackInfo.getTrackGroups(i), rendererFormatSupports[i], params, nIgnore); + nIgnore++; break; } } @@ -2297,11 +2299,12 @@ public class DefaultTrackSelector extends MappingTrackSelector { */ @Nullable protected TrackSelection.Definition selectOtherTrack( - int trackType, TrackGroupArray groups, int[][] formatSupport, Parameters params) + int trackType, TrackGroupArray groups, int[][] formatSupport, Parameters params, int nIgnore) throws ExoPlaybackException { TrackGroup selectedGroup = null; int selectedTrackIndex = 0; int selectedTrackScore = 0; + int nAlreadyIgnored = 0; for (int groupIndex = 0; groupIndex < groups.length; groupIndex++) { TrackGroup trackGroup = groups.get(groupIndex); int[] trackFormatSupport = formatSupport[groupIndex]; @@ -2315,9 +2318,16 @@ public class DefaultTrackSelector extends MappingTrackSelector { trackScore += WITHIN_RENDERER_CAPABILITIES_BONUS; } if (trackScore > selectedTrackScore) { - selectedGroup = trackGroup; selectedTrackIndex = trackIndex; selectedTrackScore = trackScore; + nAlreadyIgnored = 0; + } + if(trackScore == selectedTrackScore) { + if(nAlreadyIgnored == nIgnore) { + selectedGroup = trackGroup; + selectedTrackIndex = trackIndex; + } + nAlreadyIgnored++; } } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java index 425da6c1c4..b29f6de886 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/trackselection/MappingTrackSelector.java @@ -31,7 +31,10 @@ import com.google.android.exoplayer2.util.Util; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; + import org.checkerframework.checker.nullness.compatqual.NullableType; /** @@ -356,15 +359,17 @@ public abstract class MappingTrackSelector extends TrackSelector { for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) { TrackGroup group = trackGroups.get(groupIndex); // Associate the group to a preferred renderer. - int rendererIndex = findRenderer(rendererCapabilities, group); - // Evaluate the support that the renderer provides for each track in the group. - int[] rendererFormatSupport = rendererIndex == rendererCapabilities.length - ? new int[group.length] : getFormatSupport(rendererCapabilities[rendererIndex], group); - // Stash the results. - int rendererTrackGroupCount = rendererTrackGroupCounts[rendererIndex]; - rendererTrackGroups[rendererIndex][rendererTrackGroupCount] = group; - rendererFormatSupports[rendererIndex][rendererTrackGroupCount] = rendererFormatSupport; - rendererTrackGroupCounts[rendererIndex]++; + List rendererIndexes = findAllRenderers(rendererCapabilities, group); + for(int rendererIndex: rendererIndexes) { + // Evaluate the support that the renderer provides for each track in the group. + int[] rendererFormatSupport = rendererIndex == rendererCapabilities.length + ? new int[group.length] : getFormatSupport(rendererCapabilities[rendererIndex], group); + // Stash the results. + int rendererTrackGroupCount = rendererTrackGroupCounts[rendererIndex]; + rendererTrackGroups[rendererIndex][rendererTrackGroupCount] = group; + rendererFormatSupports[rendererIndex][rendererTrackGroupCount] = rendererFormatSupport; + rendererTrackGroupCounts[rendererIndex]++; + } } // Create a track group array for each renderer, and trim each rendererFormatSupports entry. @@ -465,6 +470,27 @@ public abstract class MappingTrackSelector extends TrackSelector { return bestRendererIndex; } + private static List findAllRenderers(RendererCapabilities[] rendererCapabilities, TrackGroup group) + throws ExoPlaybackException { + ArrayList result = new ArrayList<>(); + int bestFormatSupportLevel = RendererCapabilities.FORMAT_UNSUPPORTED_TYPE; + for (int rendererIndex = 0; rendererIndex < rendererCapabilities.length; rendererIndex++) { + RendererCapabilities rendererCapability = rendererCapabilities[rendererIndex]; + for (int trackIndex = 0; trackIndex < group.length; trackIndex++) { + int formatSupportLevel = rendererCapability.supportsFormat(group.getFormat(trackIndex)) + & RendererCapabilities.FORMAT_SUPPORT_MASK; + if (formatSupportLevel > bestFormatSupportLevel) { + bestFormatSupportLevel = formatSupportLevel; + result.clear(); + } + if (formatSupportLevel == bestFormatSupportLevel) { + result.add(rendererIndex); + } + } + } + return result; + } + /** * Calls {@link RendererCapabilities#supportsFormat} for each track in the specified * {@link TrackGroup}, returning the results in an array.