Commit 6fd610fc by aquilescanta Committed by Oliver Woodman

Added max video size selection to DefaultTrackSelectionPolicy.

It is possible to add use of this feature in the demo app, restricting the selected
tracks to the viewport size. But it should be added in a future CL.
-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=123965232
parent ebd37cfb
...@@ -27,9 +27,13 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -27,9 +27,13 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
private String preferredLanguage; private String preferredLanguage;
private boolean allowMixedMimeAdaptiveness; private boolean allowMixedMimeAdaptiveness;
private boolean allowNonSeamlessAdaptiveness; private boolean allowNonSeamlessAdaptiveness;
private int maxVideoWidth;
private int maxVideoHeight;
public DefaultTrackSelectionPolicy() { public DefaultTrackSelectionPolicy() {
allowNonSeamlessAdaptiveness = true; allowNonSeamlessAdaptiveness = true;
maxVideoWidth = Integer.MAX_VALUE;
maxVideoHeight = Integer.MAX_VALUE;
} }
public void setPreferredLanguage(String preferredLanguage) { public void setPreferredLanguage(String preferredLanguage) {
...@@ -53,6 +57,14 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -53,6 +57,14 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
} }
} }
public void setMaxVideoSize(int maxVideoWidth, int maxVideoHeight) {
if (this.maxVideoWidth != maxVideoWidth || this.maxVideoHeight != maxVideoHeight) {
this.maxVideoWidth = maxVideoWidth;
this.maxVideoHeight = maxVideoHeight;
invalidate();
}
}
@Override @Override
public TrackSelection[] selectTracks(TrackRenderer[] renderers, public TrackSelection[] selectTracks(TrackRenderer[] renderers,
TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports) TrackGroupArray[] rendererTrackGroupArrays, int[][][] rendererFormatSupports)
...@@ -63,8 +75,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -63,8 +75,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
switch (renderers[i].getTrackType()) { switch (renderers[i].getTrackType()) {
case C.TRACK_TYPE_VIDEO: case C.TRACK_TYPE_VIDEO:
rendererTrackSelections[i] = selectTrackForVideoRenderer(renderers[i], rendererTrackSelections[i] = selectTrackForVideoRenderer(renderers[i],
rendererTrackGroupArrays[i], rendererFormatSupports[i], allowMixedMimeAdaptiveness, rendererTrackGroupArrays[i], rendererFormatSupports[i]);
allowNonSeamlessAdaptiveness);
break; break;
case C.TRACK_TYPE_AUDIO: case C.TRACK_TYPE_AUDIO:
rendererTrackSelections[i] = selectTrackForAudioRenderer(rendererTrackGroupArrays[i], rendererTrackSelections[i] = selectTrackForAudioRenderer(rendererTrackGroupArrays[i],
...@@ -83,9 +94,8 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -83,9 +94,8 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
return rendererTrackSelections; return rendererTrackSelections;
} }
private static TrackSelection selectTrackForVideoRenderer(TrackRenderer renderer, private TrackSelection selectTrackForVideoRenderer(TrackRenderer renderer,
TrackGroupArray trackGroups, int[][] formatSupport, boolean allowMixedMimeAdaptiveness, TrackGroupArray trackGroups, int[][] formatSupport) throws ExoPlaybackException {
boolean allowNonSeamlessAdaptiveness) throws ExoPlaybackException {
int requiredAdaptiveSupport = allowNonSeamlessAdaptiveness int requiredAdaptiveSupport = allowNonSeamlessAdaptiveness
? TrackRenderer.ADAPTIVE_NOT_SEAMLESS | TrackRenderer.ADAPTIVE_SEAMLESS ? TrackRenderer.ADAPTIVE_NOT_SEAMLESS | TrackRenderer.ADAPTIVE_SEAMLESS
: TrackRenderer.ADAPTIVE_SEAMLESS; : TrackRenderer.ADAPTIVE_SEAMLESS;
...@@ -95,7 +105,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -95,7 +105,7 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
int[] largestAdaptiveGroupTracks = NO_TRACKS; int[] largestAdaptiveGroupTracks = NO_TRACKS;
for (int i = 0; i < trackGroups.length; i++) { for (int i = 0; i < trackGroups.length; i++) {
int[] adaptiveTracks = getAdaptiveTracksOfGroup(trackGroups.get(i), formatSupport[i], int[] adaptiveTracks = getAdaptiveTracksOfGroup(trackGroups.get(i), formatSupport[i],
allowMixedMimeTypes, requiredAdaptiveSupport); allowMixedMimeTypes, requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight);
if (adaptiveTracks.length > largestAdaptiveGroupTracks.length) { if (adaptiveTracks.length > largestAdaptiveGroupTracks.length) {
largestAdaptiveGroup = i; largestAdaptiveGroup = i;
largestAdaptiveGroupTracks = adaptiveTracks; largestAdaptiveGroupTracks = adaptiveTracks;
...@@ -104,11 +114,24 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -104,11 +114,24 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
if (largestAdaptiveGroup != -1) { if (largestAdaptiveGroup != -1) {
return new TrackSelection(largestAdaptiveGroup, largestAdaptiveGroupTracks); return new TrackSelection(largestAdaptiveGroup, largestAdaptiveGroupTracks);
} }
return selectFirstSupportedTrack(trackGroups, formatSupport);
// No adaptive tracks selection could be made, so we select the first supported video track.
for (int groupIndex = 0; groupIndex < trackGroups.length; groupIndex++) {
TrackGroup trackGroup = trackGroups.get(groupIndex);
int[] trackFormatSupport = formatSupport[groupIndex];
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
if (isSupportedVideoTrack(trackFormatSupport[trackIndex], trackGroup.getFormat(trackIndex),
maxVideoWidth, maxVideoHeight)) {
return new TrackSelection(groupIndex, trackIndex);
}
}
}
return null;
} }
private static int[] getAdaptiveTracksOfGroup(TrackGroup trackGroup, int[] formatSupport, private static int[] getAdaptiveTracksOfGroup(TrackGroup trackGroup, int[] formatSupport,
boolean allowMixedMimeTypes, int requiredAdaptiveSupport) { boolean allowMixedMimeTypes, int requiredAdaptiveSupport, int maxVideoWidth,
int maxVideoHeight) {
if (!trackGroup.adaptive) { if (!trackGroup.adaptive) {
return NO_TRACKS; return NO_TRACKS;
} }
...@@ -116,13 +139,14 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -116,13 +139,14 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
String mimeType = null; String mimeType = null;
int adaptiveTracksCount = 0; int adaptiveTracksCount = 0;
if (allowMixedMimeTypes) { if (allowMixedMimeTypes) {
adaptiveTracksCount = getSupportedTrackCountForMimeType(trackGroup, formatSupport, adaptiveTracksCount = getAdaptiveTrackCountForMimeType(trackGroup, formatSupport,
requiredAdaptiveSupport, mimeType); requiredAdaptiveSupport, mimeType, maxVideoWidth, maxVideoHeight);
} else { } else {
for (int i = 0; i < trackGroup.length; i++) { for (int i = 0; i < trackGroup.length; i++) {
if (!Util.areEqual(mimeType, trackGroup.getFormat(i).sampleMimeType)) { if (!Util.areEqual(mimeType, trackGroup.getFormat(i).sampleMimeType)) {
int countForMimeType = getSupportedTrackCountForMimeType(trackGroup, formatSupport, int countForMimeType = getAdaptiveTrackCountForMimeType(trackGroup, formatSupport,
requiredAdaptiveSupport, trackGroup.getFormat(i).sampleMimeType); requiredAdaptiveSupport, trackGroup.getFormat(i).sampleMimeType, maxVideoWidth,
maxVideoHeight);
if (countForMimeType > adaptiveTracksCount) { if (countForMimeType > adaptiveTracksCount) {
adaptiveTracksCount = countForMimeType; adaptiveTracksCount = countForMimeType;
mimeType = trackGroup.getFormat(i).sampleMimeType; mimeType = trackGroup.getFormat(i).sampleMimeType;
...@@ -138,30 +162,31 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -138,30 +162,31 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
int[] adaptiveTracks = new int[adaptiveTracksCount]; int[] adaptiveTracks = new int[adaptiveTracksCount];
adaptiveTracksCount = 0; adaptiveTracksCount = 0;
for (int i = 0; i < trackGroup.length; i++) { for (int i = 0; i < trackGroup.length; i++) {
if (isAdaptiveTrack(trackGroup.getFormat(i).sampleMimeType, mimeType, formatSupport[i], if (isAdaptiveTrack(trackGroup.getFormat(i), mimeType, formatSupport[i],
requiredAdaptiveSupport)) { requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight)) {
adaptiveTracks[adaptiveTracksCount++] = i; adaptiveTracks[adaptiveTracksCount++] = i;
} }
} }
return adaptiveTracks; return adaptiveTracks;
} }
private static int getSupportedTrackCountForMimeType(TrackGroup trackGroup, int[] formatSupport, private static int getAdaptiveTrackCountForMimeType(TrackGroup trackGroup, int[] formatSupport,
int requiredAdaptiveSupport, String mimeType) { int requiredAdaptiveSupport, String mimeType, int maxVideoWidth, int maxVideoHeight) {
int adaptiveTracksCount = 0; int adaptiveTracksCount = 0;
for (int i = 0; i < trackGroup.length; i++) { for (int i = 0; i < trackGroup.length; i++) {
if (isAdaptiveTrack(trackGroup.getFormat(i).sampleMimeType, mimeType, formatSupport[i], if (isAdaptiveTrack(trackGroup.getFormat(i), mimeType, formatSupport[i],
requiredAdaptiveSupport)) { requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight)) {
adaptiveTracksCount++; adaptiveTracksCount++;
} }
} }
return adaptiveTracksCount; return adaptiveTracksCount;
} }
private static boolean isAdaptiveTrack(String trackMimeType, String mimeType, int formatSupport, private static boolean isAdaptiveTrack(Format format, String mimeType, int formatSupport,
int requiredAdaptiveSupport) { int requiredAdaptiveSupport, int maxVideoWidth, int maxVideoHeight) {
return isSupported(formatSupport) && (formatSupport & requiredAdaptiveSupport) != 0 return isSupportedVideoTrack(formatSupport, format, maxVideoWidth, maxVideoHeight)
&& (mimeType == null || Util.areEqual(trackMimeType, mimeType)); && (formatSupport & requiredAdaptiveSupport) != 0
&& (mimeType == null || Util.areEqual(format.sampleMimeType, mimeType));
} }
private static TrackSelection selectTrackForTextRenderer(TrackGroupArray trackGroups, private static TrackSelection selectTrackForTextRenderer(TrackGroupArray trackGroups,
...@@ -221,6 +246,12 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy { ...@@ -221,6 +246,12 @@ public class DefaultTrackSelectionPolicy extends TrackSelectionPolicy {
return selectFirstSupportedTrack(trackGroups, formatSupport); return selectFirstSupportedTrack(trackGroups, formatSupport);
} }
private static boolean isSupportedVideoTrack(int formatSupport, Format format, int maxVideoWidth,
int maxVideoHeight) {
return isSupported(formatSupport) && format.width <= maxVideoWidth
&& format.height <= maxVideoHeight;
}
private static boolean isSupported(int formatSupport) { private static boolean isSupported(int formatSupport) {
return (formatSupport & TrackRenderer.FORMAT_SUPPORT_MASK) == TrackRenderer.FORMAT_HANDLED; return (formatSupport & TrackRenderer.FORMAT_SUPPORT_MASK) == TrackRenderer.FORMAT_HANDLED;
} }
......
...@@ -39,7 +39,9 @@ public abstract class TrackSelectionPolicy { ...@@ -39,7 +39,9 @@ public abstract class TrackSelectionPolicy {
* selections. * selections.
*/ */
protected void invalidate() { protected void invalidate() {
listener.invalidatePolicySelections(); if (listener != null) {
listener.invalidatePolicySelections();
}
} }
/** /**
......
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