Add maxVideoBitrate to DefaultTrackSelector.Parameters

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=149097876
This commit is contained in:
aquilescanta 2017-03-03 03:24:42 -08:00 committed by Oliver Woodman
parent 8e9711e8aa
commit e7462f05f5

View File

@ -54,6 +54,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
public final boolean allowNonSeamlessAdaptiveness; public final boolean allowNonSeamlessAdaptiveness;
public final int maxVideoWidth; public final int maxVideoWidth;
public final int maxVideoHeight; public final int maxVideoHeight;
public final int maxVideoBitrate;
public final boolean exceedVideoConstraintsIfNecessary; public final boolean exceedVideoConstraintsIfNecessary;
public final boolean exceedRendererCapabilitiesIfNecessary; public final boolean exceedRendererCapabilitiesIfNecessary;
public final int viewportWidth; public final int viewportWidth;
@ -68,14 +69,15 @@ public class DefaultTrackSelector extends MappingTrackSelector {
* <li>Adaptation between different mime types is not allowed.</li> * <li>Adaptation between different mime types is not allowed.</li>
* <li>Non seamless adaptation is allowed.</li> * <li>Non seamless adaptation is allowed.</li>
* <li>No max limit for video width/height.</li> * <li>No max limit for video width/height.</li>
* <li>No max video bitrate.</li>
* <li>Video constraints are exceeded if no supported selection can be made otherwise.</li> * <li>Video constraints are exceeded if no supported selection can be made otherwise.</li>
* <li>Renderer capabilities are exceeded if no supported selection can be made.</li> * <li>Renderer capabilities are exceeded if no supported selection can be made.</li>
* <li>No viewport width/height constraints are set.</li> * <li>No viewport width/height constraints are set.</li>
* </ul> * </ul>
*/ */
public Parameters() { public Parameters() {
this(null, null, false, true, Integer.MAX_VALUE, Integer.MAX_VALUE, true, true, this(null, null, false, true, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, true,
Integer.MAX_VALUE, Integer.MAX_VALUE, true); true, Integer.MAX_VALUE, Integer.MAX_VALUE, true);
} }
/** /**
@ -88,6 +90,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
* @param allowNonSeamlessAdaptiveness Whether non-seamless adaptation is allowed. * @param allowNonSeamlessAdaptiveness Whether non-seamless adaptation is allowed.
* @param maxVideoWidth Maximum allowed video width. * @param maxVideoWidth Maximum allowed video width.
* @param maxVideoHeight Maximum allowed video height. * @param maxVideoHeight Maximum allowed video height.
* @param maxVideoBitrate Maximum allowed video bitrate.
* @param exceedVideoConstraintsIfNecessary Whether to exceed video constraints when no * @param exceedVideoConstraintsIfNecessary Whether to exceed video constraints when no
* selection can be made otherwise. * selection can be made otherwise.
* @param exceedRendererCapabilitiesIfNecessary Whether to exceed renderer capabilities when no * @param exceedRendererCapabilitiesIfNecessary Whether to exceed renderer capabilities when no
@ -98,15 +101,16 @@ public class DefaultTrackSelector extends MappingTrackSelector {
*/ */
public Parameters(String preferredAudioLanguage, String preferredTextLanguage, public Parameters(String preferredAudioLanguage, String preferredTextLanguage,
boolean allowMixedMimeAdaptiveness, boolean allowNonSeamlessAdaptiveness, boolean allowMixedMimeAdaptiveness, boolean allowNonSeamlessAdaptiveness,
int maxVideoWidth, int maxVideoHeight, boolean exceedVideoConstraintsIfNecessary, int maxVideoWidth, int maxVideoHeight, int maxVideoBitrate,
boolean exceedRendererCapabilitiesIfNecessary, int viewportWidth, int viewportHeight, boolean exceedVideoConstraintsIfNecessary, boolean exceedRendererCapabilitiesIfNecessary,
boolean orientationMayChange) { int viewportWidth, int viewportHeight, boolean orientationMayChange) {
this.preferredAudioLanguage = preferredAudioLanguage; this.preferredAudioLanguage = preferredAudioLanguage;
this.preferredTextLanguage = preferredTextLanguage; this.preferredTextLanguage = preferredTextLanguage;
this.allowMixedMimeAdaptiveness = allowMixedMimeAdaptiveness; this.allowMixedMimeAdaptiveness = allowMixedMimeAdaptiveness;
this.allowNonSeamlessAdaptiveness = allowNonSeamlessAdaptiveness; this.allowNonSeamlessAdaptiveness = allowNonSeamlessAdaptiveness;
this.maxVideoWidth = maxVideoWidth; this.maxVideoWidth = maxVideoWidth;
this.maxVideoHeight = maxVideoHeight; this.maxVideoHeight = maxVideoHeight;
this.maxVideoBitrate = maxVideoBitrate;
this.exceedVideoConstraintsIfNecessary = exceedVideoConstraintsIfNecessary; this.exceedVideoConstraintsIfNecessary = exceedVideoConstraintsIfNecessary;
this.exceedRendererCapabilitiesIfNecessary = exceedRendererCapabilitiesIfNecessary; this.exceedRendererCapabilitiesIfNecessary = exceedRendererCapabilitiesIfNecessary;
this.viewportWidth = viewportWidth; this.viewportWidth = viewportWidth;
@ -130,8 +134,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -148,8 +152,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -164,8 +168,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -180,8 +184,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -197,8 +201,24 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
}
/**
* Returns a {@link Parameters} instance with the provided max video bitrate.
*
* @param maxVideoBitrate The max video bitrate.
* @return A {@link Parameters} instance with the provided max video bitrate.
*/
public Parameters withMaxVideoBitrate(int maxVideoBitrate) {
if (maxVideoBitrate == this.maxVideoBitrate) {
return this;
}
return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -235,8 +255,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -255,8 +275,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -275,8 +295,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
} }
return new Parameters(preferredAudioLanguage, preferredTextLanguage, return new Parameters(preferredAudioLanguage, preferredTextLanguage,
allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, allowMixedMimeAdaptiveness, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight,
exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary, viewportWidth, maxVideoBitrate, exceedVideoConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary,
viewportHeight, orientationMayChange); viewportWidth, viewportHeight, orientationMayChange);
} }
/** /**
@ -319,6 +339,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
&& exceedRendererCapabilitiesIfNecessary == other.exceedRendererCapabilitiesIfNecessary && exceedRendererCapabilitiesIfNecessary == other.exceedRendererCapabilitiesIfNecessary
&& orientationMayChange == other.orientationMayChange && orientationMayChange == other.orientationMayChange
&& viewportWidth == other.viewportWidth && viewportHeight == other.viewportHeight && viewportWidth == other.viewportWidth && viewportHeight == other.viewportHeight
&& maxVideoBitrate == other.maxVideoBitrate
&& TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage) && TextUtils.equals(preferredAudioLanguage, other.preferredAudioLanguage)
&& TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage); && TextUtils.equals(preferredTextLanguage, other.preferredTextLanguage);
} }
@ -331,6 +352,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
result = 31 * result + (allowNonSeamlessAdaptiveness ? 1 : 0); result = 31 * result + (allowNonSeamlessAdaptiveness ? 1 : 0);
result = 31 * result + maxVideoWidth; result = 31 * result + maxVideoWidth;
result = 31 * result + maxVideoHeight; result = 31 * result + maxVideoHeight;
result = 31 * result + maxVideoBitrate;
result = 31 * result + (exceedVideoConstraintsIfNecessary ? 1 : 0); result = 31 * result + (exceedVideoConstraintsIfNecessary ? 1 : 0);
result = 31 * result + (exceedRendererCapabilitiesIfNecessary ? 1 : 0); result = 31 * result + (exceedRendererCapabilitiesIfNecessary ? 1 : 0);
result = 31 * result + (orientationMayChange ? 1 : 0); result = 31 * result + (orientationMayChange ? 1 : 0);
@ -406,7 +428,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
case C.TRACK_TYPE_VIDEO: case C.TRACK_TYPE_VIDEO:
rendererTrackSelections[i] = selectVideoTrack(rendererCapabilities[i], rendererTrackSelections[i] = selectVideoTrack(rendererCapabilities[i],
rendererTrackGroupArrays[i], rendererFormatSupports[i], params.maxVideoWidth, rendererTrackGroupArrays[i], rendererFormatSupports[i], params.maxVideoWidth,
params.maxVideoHeight, params.allowNonSeamlessAdaptiveness, params.maxVideoHeight, params.maxVideoBitrate, params.allowNonSeamlessAdaptiveness,
params.allowMixedMimeAdaptiveness, params.viewportWidth, params.viewportHeight, params.allowMixedMimeAdaptiveness, params.viewportWidth, params.viewportHeight,
params.orientationMayChange, adaptiveVideoTrackSelectionFactory, params.orientationMayChange, adaptiveVideoTrackSelectionFactory,
params.exceedVideoConstraintsIfNecessary, params.exceedVideoConstraintsIfNecessary,
@ -436,30 +458,30 @@ public class DefaultTrackSelector extends MappingTrackSelector {
protected TrackSelection selectVideoTrack(RendererCapabilities rendererCapabilities, protected TrackSelection selectVideoTrack(RendererCapabilities rendererCapabilities,
TrackGroupArray groups, int[][] formatSupport, int maxVideoWidth, int maxVideoHeight, TrackGroupArray groups, int[][] formatSupport, int maxVideoWidth, int maxVideoHeight,
boolean allowNonSeamlessAdaptiveness, boolean allowMixedMimeAdaptiveness, int viewportWidth, int maxVideoBitrate, boolean allowNonSeamlessAdaptiveness, boolean allowMixedMimeAdaptiveness,
int viewportHeight, boolean orientationMayChange, int viewportWidth, int viewportHeight, boolean orientationMayChange,
TrackSelection.Factory adaptiveVideoTrackSelectionFactory, TrackSelection.Factory adaptiveVideoTrackSelectionFactory,
boolean exceedConstraintsIfNecessary, boolean exceedRendererCapabilitiesIfNecessary) boolean exceedConstraintsIfNecessary, boolean exceedRendererCapabilitiesIfNecessary)
throws ExoPlaybackException { throws ExoPlaybackException {
TrackSelection selection = null; TrackSelection selection = null;
if (adaptiveVideoTrackSelectionFactory != null) { if (adaptiveVideoTrackSelectionFactory != null) {
selection = selectAdaptiveVideoTrack(rendererCapabilities, groups, formatSupport, selection = selectAdaptiveVideoTrack(rendererCapabilities, groups, formatSupport,
maxVideoWidth, maxVideoHeight, allowNonSeamlessAdaptiveness, maxVideoWidth, maxVideoHeight, maxVideoBitrate, allowNonSeamlessAdaptiveness,
allowMixedMimeAdaptiveness, viewportWidth, viewportHeight, allowMixedMimeAdaptiveness, viewportWidth, viewportHeight,
orientationMayChange, adaptiveVideoTrackSelectionFactory); orientationMayChange, adaptiveVideoTrackSelectionFactory);
} }
if (selection == null) { if (selection == null) {
selection = selectFixedVideoTrack(groups, formatSupport, maxVideoWidth, maxVideoHeight, selection = selectFixedVideoTrack(groups, formatSupport, maxVideoWidth, maxVideoHeight,
viewportWidth, viewportHeight, orientationMayChange, exceedConstraintsIfNecessary, maxVideoBitrate, viewportWidth, viewportHeight, orientationMayChange,
exceedRendererCapabilitiesIfNecessary); exceedConstraintsIfNecessary, exceedRendererCapabilitiesIfNecessary);
} }
return selection; return selection;
} }
private static TrackSelection selectAdaptiveVideoTrack(RendererCapabilities rendererCapabilities, private static TrackSelection selectAdaptiveVideoTrack(RendererCapabilities rendererCapabilities,
TrackGroupArray groups, int[][] formatSupport, int maxVideoWidth, int maxVideoHeight, TrackGroupArray groups, int[][] formatSupport, int maxVideoWidth, int maxVideoHeight,
boolean allowNonSeamlessAdaptiveness, boolean allowMixedMimeAdaptiveness, int viewportWidth, int maxVideoBitrate, boolean allowNonSeamlessAdaptiveness, boolean allowMixedMimeAdaptiveness,
int viewportHeight, boolean orientationMayChange, int viewportWidth, int viewportHeight, boolean orientationMayChange,
TrackSelection.Factory adaptiveVideoTrackSelectionFactory) throws ExoPlaybackException { TrackSelection.Factory adaptiveVideoTrackSelectionFactory) throws ExoPlaybackException {
int requiredAdaptiveSupport = allowNonSeamlessAdaptiveness int requiredAdaptiveSupport = allowNonSeamlessAdaptiveness
? (RendererCapabilities.ADAPTIVE_NOT_SEAMLESS | RendererCapabilities.ADAPTIVE_SEAMLESS) ? (RendererCapabilities.ADAPTIVE_NOT_SEAMLESS | RendererCapabilities.ADAPTIVE_SEAMLESS)
@ -470,7 +492,7 @@ public class DefaultTrackSelector extends MappingTrackSelector {
TrackGroup group = groups.get(i); TrackGroup group = groups.get(i);
int[] adaptiveTracks = getAdaptiveTracksForGroup(group, formatSupport[i], int[] adaptiveTracks = getAdaptiveTracksForGroup(group, formatSupport[i],
allowMixedMimeTypes, requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight, allowMixedMimeTypes, requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight,
viewportWidth, viewportHeight, orientationMayChange); maxVideoBitrate, viewportWidth, viewportHeight, orientationMayChange);
if (adaptiveTracks.length > 0) { if (adaptiveTracks.length > 0) {
return adaptiveVideoTrackSelectionFactory.createTrackSelection(group, adaptiveTracks); return adaptiveVideoTrackSelectionFactory.createTrackSelection(group, adaptiveTracks);
} }
@ -480,7 +502,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private static int[] getAdaptiveTracksForGroup(TrackGroup group, int[] formatSupport, private static int[] getAdaptiveTracksForGroup(TrackGroup group, int[] formatSupport,
boolean allowMixedMimeTypes, int requiredAdaptiveSupport, int maxVideoWidth, boolean allowMixedMimeTypes, int requiredAdaptiveSupport, int maxVideoWidth,
int maxVideoHeight, int viewportWidth, int viewportHeight, boolean orientationMayChange) { int maxVideoHeight, int maxVideoBitrate, int viewportWidth, int viewportHeight,
boolean orientationMayChange) {
if (group.length < 2) { if (group.length < 2) {
return NO_TRACKS; return NO_TRACKS;
} }
@ -499,11 +522,10 @@ public class DefaultTrackSelector extends MappingTrackSelector {
for (int i = 0; i < selectedTrackIndices.size(); i++) { for (int i = 0; i < selectedTrackIndices.size(); i++) {
int trackIndex = selectedTrackIndices.get(i); int trackIndex = selectedTrackIndices.get(i);
String sampleMimeType = group.getFormat(trackIndex).sampleMimeType; String sampleMimeType = group.getFormat(trackIndex).sampleMimeType;
if (!seenMimeTypes.contains(sampleMimeType)) { if (seenMimeTypes.add(sampleMimeType)) {
seenMimeTypes.add(sampleMimeType);
int countForMimeType = getAdaptiveTrackCountForMimeType(group, formatSupport, int countForMimeType = getAdaptiveTrackCountForMimeType(group, formatSupport,
requiredAdaptiveSupport, sampleMimeType, maxVideoWidth, maxVideoHeight, requiredAdaptiveSupport, sampleMimeType, maxVideoWidth, maxVideoHeight,
selectedTrackIndices); maxVideoBitrate, selectedTrackIndices);
if (countForMimeType > selectedMimeTypeTrackCount) { if (countForMimeType > selectedMimeTypeTrackCount) {
selectedMimeType = sampleMimeType; selectedMimeType = sampleMimeType;
selectedMimeTypeTrackCount = countForMimeType; selectedMimeTypeTrackCount = countForMimeType;
@ -514,19 +536,20 @@ public class DefaultTrackSelector extends MappingTrackSelector {
// Filter by the selected mime type. // Filter by the selected mime type.
filterAdaptiveTrackCountForMimeType(group, formatSupport, requiredAdaptiveSupport, filterAdaptiveTrackCountForMimeType(group, formatSupport, requiredAdaptiveSupport,
selectedMimeType, maxVideoWidth, maxVideoHeight, selectedTrackIndices); selectedMimeType, maxVideoWidth, maxVideoHeight, maxVideoBitrate, selectedTrackIndices);
return selectedTrackIndices.size() < 2 ? NO_TRACKS : Util.toArray(selectedTrackIndices); return selectedTrackIndices.size() < 2 ? NO_TRACKS : Util.toArray(selectedTrackIndices);
} }
private static int getAdaptiveTrackCountForMimeType(TrackGroup group, int[] formatSupport, private static int getAdaptiveTrackCountForMimeType(TrackGroup group, int[] formatSupport,
int requiredAdaptiveSupport, String mimeType, int maxVideoWidth, int maxVideoHeight, int requiredAdaptiveSupport, String mimeType, int maxVideoWidth, int maxVideoHeight,
List<Integer> selectedTrackIndices) { int maxVideoBitrate, List<Integer> selectedTrackIndices) {
int adaptiveTrackCount = 0; int adaptiveTrackCount = 0;
for (int i = 0; i < selectedTrackIndices.size(); i++) { for (int i = 0; i < selectedTrackIndices.size(); i++) {
int trackIndex = selectedTrackIndices.get(i); int trackIndex = selectedTrackIndices.get(i);
if (isSupportedAdaptiveVideoTrack(group.getFormat(trackIndex), mimeType, if (isSupportedAdaptiveVideoTrack(group.getFormat(trackIndex), mimeType,
formatSupport[trackIndex], requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight)) { formatSupport[trackIndex], requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight,
maxVideoBitrate)) {
adaptiveTrackCount++; adaptiveTrackCount++;
} }
} }
@ -535,28 +558,31 @@ public class DefaultTrackSelector extends MappingTrackSelector {
private static void filterAdaptiveTrackCountForMimeType(TrackGroup group, int[] formatSupport, private static void filterAdaptiveTrackCountForMimeType(TrackGroup group, int[] formatSupport,
int requiredAdaptiveSupport, String mimeType, int maxVideoWidth, int maxVideoHeight, int requiredAdaptiveSupport, String mimeType, int maxVideoWidth, int maxVideoHeight,
List<Integer> selectedTrackIndices) { int maxVideoBitrate, List<Integer> selectedTrackIndices) {
for (int i = selectedTrackIndices.size() - 1; i >= 0; i--) { for (int i = selectedTrackIndices.size() - 1; i >= 0; i--) {
int trackIndex = selectedTrackIndices.get(i); int trackIndex = selectedTrackIndices.get(i);
if (!isSupportedAdaptiveVideoTrack(group.getFormat(trackIndex), mimeType, if (!isSupportedAdaptiveVideoTrack(group.getFormat(trackIndex), mimeType,
formatSupport[trackIndex], requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight)) { formatSupport[trackIndex], requiredAdaptiveSupport, maxVideoWidth, maxVideoHeight,
maxVideoBitrate)) {
selectedTrackIndices.remove(i); selectedTrackIndices.remove(i);
} }
} }
} }
private static boolean isSupportedAdaptiveVideoTrack(Format format, String mimeType, private static boolean isSupportedAdaptiveVideoTrack(Format format, String mimeType,
int formatSupport, int requiredAdaptiveSupport, int maxVideoWidth, int maxVideoHeight) { int formatSupport, int requiredAdaptiveSupport, int maxVideoWidth, int maxVideoHeight,
int maxVideoBitrate) {
return isSupported(formatSupport, false) && ((formatSupport & requiredAdaptiveSupport) != 0) return isSupported(formatSupport, false) && ((formatSupport & requiredAdaptiveSupport) != 0)
&& (mimeType == null || Util.areEqual(format.sampleMimeType, mimeType)) && (mimeType == null || Util.areEqual(format.sampleMimeType, mimeType))
&& (format.width == Format.NO_VALUE || format.width <= maxVideoWidth) && (format.width == Format.NO_VALUE || format.width <= maxVideoWidth)
&& (format.height == Format.NO_VALUE || format.height <= maxVideoHeight); && (format.height == Format.NO_VALUE || format.height <= maxVideoHeight)
&& (format.bitrate == Format.NO_VALUE || format.bitrate <= maxVideoBitrate);
} }
private static TrackSelection selectFixedVideoTrack(TrackGroupArray groups, private static TrackSelection selectFixedVideoTrack(TrackGroupArray groups,
int[][] formatSupport, int maxVideoWidth, int maxVideoHeight, int viewportWidth, int[][] formatSupport, int maxVideoWidth, int maxVideoHeight, int maxVideoBitrate,
int viewportHeight, boolean orientationMayChange, boolean exceedConstraintsIfNecessary, int viewportWidth, int viewportHeight, boolean orientationMayChange,
boolean exceedRendererCapabilitiesIfNecessary) { boolean exceedConstraintsIfNecessary, boolean exceedRendererCapabilitiesIfNecessary) {
TrackGroup selectedGroup = null; TrackGroup selectedGroup = null;
int selectedTrackIndex = 0; int selectedTrackIndex = 0;
int selectedTrackScore = 0; int selectedTrackScore = 0;
@ -572,7 +598,8 @@ public class DefaultTrackSelector extends MappingTrackSelector {
Format format = trackGroup.getFormat(trackIndex); Format format = trackGroup.getFormat(trackIndex);
boolean isWithinConstraints = selectedTrackIndices.contains(trackIndex) boolean isWithinConstraints = selectedTrackIndices.contains(trackIndex)
&& (format.width == Format.NO_VALUE || format.width <= maxVideoWidth) && (format.width == Format.NO_VALUE || format.width <= maxVideoWidth)
&& (format.height == Format.NO_VALUE || format.height <= maxVideoHeight); && (format.height == Format.NO_VALUE || format.height <= maxVideoHeight)
&& (format.bitrate == Format.NO_VALUE || format.bitrate <= maxVideoBitrate);
if (!isWithinConstraints && !exceedConstraintsIfNecessary) { if (!isWithinConstraints && !exceedConstraintsIfNecessary) {
// Track should not be selected. // Track should not be selected.
continue; continue;