Commit e97b8347 by tonihei Committed by Oliver Woodman

Add IntDefs for renderer capabilities.

This simplifies documentation and adds compiler checks that the correct values
are used.

PiperOrigin-RevId: 283754163
parent 7d7c37b3
Showing with 262 additions and 89 deletions
...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; ...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleDecoder;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
...@@ -133,16 +134,17 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer { ...@@ -133,16 +134,17 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
} }
@Override @Override
@Capabilities
protected int supportsFormatInternal( protected int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) { @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
if (!MimeTypes.VIDEO_AV1.equalsIgnoreCase(format.sampleMimeType) if (!MimeTypes.VIDEO_AV1.equalsIgnoreCase(format.sampleMimeType)
|| !Gav1Library.isAvailable()) { || !Gav1Library.isAvailable()) {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) { if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) {
return FORMAT_UNSUPPORTED_DRM; return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }
return FORMAT_HANDLED | ADAPTIVE_SEAMLESS; return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED);
} }
@Override @Override
......
...@@ -92,6 +92,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer { ...@@ -92,6 +92,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
} }
@Override @Override
@FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) { @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
Assertions.checkNotNull(format.sampleMimeType); Assertions.checkNotNull(format.sampleMimeType);
...@@ -108,6 +109,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer { ...@@ -108,6 +109,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
} }
@Override @Override
@AdaptiveSupport
public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
return ADAPTIVE_NOT_SEAMLESS; return ADAPTIVE_NOT_SEAMLESS;
} }
......
...@@ -51,6 +51,7 @@ public class LibflacAudioRenderer extends SimpleDecoderAudioRenderer { ...@@ -51,6 +51,7 @@ public class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
} }
@Override @Override
@FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) { @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
if (!FlacLibrary.isAvailable() if (!FlacLibrary.isAvailable()
......
...@@ -83,6 +83,7 @@ public class LibopusAudioRenderer extends SimpleDecoderAudioRenderer { ...@@ -83,6 +83,7 @@ public class LibopusAudioRenderer extends SimpleDecoderAudioRenderer {
} }
@Override @Override
@FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) { @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
boolean drmIsSupported = boolean drmIsSupported =
......
...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; ...@@ -25,6 +25,7 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleDecoder;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
...@@ -223,10 +224,11 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { ...@@ -223,10 +224,11 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
} }
@Override @Override
@Capabilities
protected int supportsFormatInternal( protected int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) { @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
if (!VpxLibrary.isAvailable() || !MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)) { if (!VpxLibrary.isAvailable() || !MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)) {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
boolean drmIsSupported = boolean drmIsSupported =
format.drmInitData == null format.drmInitData == null
...@@ -234,9 +236,9 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer { ...@@ -234,9 +236,9 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|| (format.exoMediaCryptoType == null || (format.exoMediaCryptoType == null
&& supportsFormatDrm(drmSessionManager, format.drmInitData)); && supportsFormatDrm(drmSessionManager, format.drmInitData));
if (!drmIsSupported) { if (!drmIsSupported) {
return FORMAT_UNSUPPORTED_DRM; return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }
return FORMAT_HANDLED | ADAPTIVE_SEAMLESS; return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED);
} }
@Override @Override
......
...@@ -16,7 +16,7 @@ apply from: '../../constants.gradle' ...@@ -16,7 +16,7 @@ apply from: '../../constants.gradle'
android { android {
compileSdkVersion project.ext.compileSdkVersion compileSdkVersion project.ext.compileSdkVersion
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8
......
...@@ -177,6 +177,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities { ...@@ -177,6 +177,7 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
// RendererCapabilities implementation. // RendererCapabilities implementation.
@Override @Override
@AdaptiveSupport
public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
return ADAPTIVE_NOT_SUPPORTED; return ADAPTIVE_NOT_SUPPORTED;
} }
......
...@@ -185,11 +185,13 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities ...@@ -185,11 +185,13 @@ public abstract class NoSampleRenderer implements Renderer, RendererCapabilities
// RendererCapabilities implementation. // RendererCapabilities implementation.
@Override @Override
@Capabilities
public int supportsFormat(Format format) throws ExoPlaybackException { public int supportsFormat(Format format) throws ExoPlaybackException {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@Override @Override
@AdaptiveSupport
public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
return ADAPTIVE_NOT_SUPPORTED; return ADAPTIVE_NOT_SUPPORTED;
} }
......
...@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.Format; ...@@ -31,6 +31,7 @@ import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
...@@ -358,6 +359,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -358,6 +359,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
} }
@Override @Override
@Capabilities
protected int supportsFormat( protected int supportsFormat(
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
...@@ -365,8 +367,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -365,8 +367,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
throws DecoderQueryException { throws DecoderQueryException {
String mimeType = format.sampleMimeType; String mimeType = format.sampleMimeType;
if (!MimeTypes.isAudio(mimeType)) { if (!MimeTypes.isAudio(mimeType)) {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@TunnelingSupport
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED; int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
boolean supportsFormatDrm = boolean supportsFormatDrm =
format.drmInitData == null format.drmInitData == null
...@@ -376,31 +379,33 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media ...@@ -376,31 +379,33 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
if (supportsFormatDrm if (supportsFormatDrm
&& allowPassthrough(format.channelCount, mimeType) && allowPassthrough(format.channelCount, mimeType)
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) { && mediaCodecSelector.getPassthroughDecoderInfo() != null) {
return ADAPTIVE_NOT_SEAMLESS | tunnelingSupport | FORMAT_HANDLED; return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_NOT_SEAMLESS, tunnelingSupport);
} }
if ((MimeTypes.AUDIO_RAW.equals(mimeType) if ((MimeTypes.AUDIO_RAW.equals(mimeType)
&& !audioSink.supportsOutput(format.channelCount, format.pcmEncoding)) && !audioSink.supportsOutput(format.channelCount, format.pcmEncoding))
|| !audioSink.supportsOutput(format.channelCount, C.ENCODING_PCM_16BIT)) { || !audioSink.supportsOutput(format.channelCount, C.ENCODING_PCM_16BIT)) {
// Assume the decoder outputs 16-bit PCM, unless the input is raw. // Assume the decoder outputs 16-bit PCM, unless the input is raw.
return FORMAT_UNSUPPORTED_SUBTYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} }
List<MediaCodecInfo> decoderInfos = List<MediaCodecInfo> decoderInfos =
getDecoderInfos(mediaCodecSelector, format, /* requiresSecureDecoder= */ false); getDecoderInfos(mediaCodecSelector, format, /* requiresSecureDecoder= */ false);
if (decoderInfos.isEmpty()) { if (decoderInfos.isEmpty()) {
return FORMAT_UNSUPPORTED_SUBTYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} }
if (!supportsFormatDrm) { if (!supportsFormatDrm) {
return FORMAT_UNSUPPORTED_DRM; return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }
// Check capabilities for the first decoder in the list, which takes priority. // Check capabilities for the first decoder in the list, which takes priority.
MediaCodecInfo decoderInfo = decoderInfos.get(0); MediaCodecInfo decoderInfo = decoderInfos.get(0);
boolean isFormatSupported = decoderInfo.isFormatSupported(format); boolean isFormatSupported = decoderInfo.isFormatSupported(format);
@AdaptiveSupport
int adaptiveSupport = int adaptiveSupport =
isFormatSupported && decoderInfo.isSeamlessAdaptationSupported(format) isFormatSupported && decoderInfo.isSeamlessAdaptationSupported(format)
? ADAPTIVE_SEAMLESS ? ADAPTIVE_SEAMLESS
: ADAPTIVE_NOT_SEAMLESS; : ADAPTIVE_NOT_SEAMLESS;
@FormatSupport
int formatSupport = isFormatSupported ? FORMAT_HANDLED : FORMAT_EXCEEDS_CAPABILITIES; int formatSupport = isFormatSupported ? FORMAT_HANDLED : FORMAT_EXCEEDS_CAPABILITIES;
return adaptiveSupport | tunnelingSupport | formatSupport; return RendererCapabilities.create(formatSupport, adaptiveSupport, tunnelingSupport);
} }
@Override @Override
......
...@@ -28,6 +28,7 @@ import com.google.android.exoplayer2.Format; ...@@ -28,6 +28,7 @@ import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher; import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher;
import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
...@@ -222,26 +223,28 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements ...@@ -222,26 +223,28 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
} }
@Override @Override
@Capabilities
public final int supportsFormat(Format format) { public final int supportsFormat(Format format) {
if (!MimeTypes.isAudio(format.sampleMimeType)) { if (!MimeTypes.isAudio(format.sampleMimeType)) {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
int formatSupport = supportsFormatInternal(drmSessionManager, format); @FormatSupport int formatSupport = supportsFormatInternal(drmSessionManager, format);
if (formatSupport <= FORMAT_UNSUPPORTED_DRM) { if (formatSupport <= FORMAT_UNSUPPORTED_DRM) {
return formatSupport; return RendererCapabilities.create(formatSupport);
} }
@TunnelingSupport
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED; int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
return ADAPTIVE_NOT_SEAMLESS | tunnelingSupport | formatSupport; return RendererCapabilities.create(formatSupport, ADAPTIVE_NOT_SEAMLESS, tunnelingSupport);
} }
/** /**
* Returns the {@link #FORMAT_SUPPORT_MASK} component of the return value for {@link * Returns the {@link FormatSupport} for the given {@link Format}.
* #supportsFormat(Format)}.
* *
* @param drmSessionManager The renderer's {@link DrmSessionManager}. * @param drmSessionManager The renderer's {@link DrmSessionManager}.
* @param format The format, which has an audio {@link Format#sampleMimeType}. * @param format The format, which has an audio {@link Format#sampleMimeType}.
* @return The extent to which the renderer supports the format itself. * @return The {@link FormatSupport} for this {@link Format}.
*/ */
@FormatSupport
protected abstract int supportsFormatInternal( protected abstract int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format); @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
......
...@@ -452,11 +452,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -452,11 +452,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} }
@Override @Override
@AdaptiveSupport
public final int supportsMixedMimeTypeAdaptation() { public final int supportsMixedMimeTypeAdaptation() {
return ADAPTIVE_NOT_SEAMLESS; return ADAPTIVE_NOT_SEAMLESS;
} }
@Override @Override
@Capabilities
public final int supportsFormat(Format format) throws ExoPlaybackException { public final int supportsFormat(Format format) throws ExoPlaybackException {
try { try {
return supportsFormat(mediaCodecSelector, drmSessionManager, format); return supportsFormat(mediaCodecSelector, drmSessionManager, format);
...@@ -466,15 +468,15 @@ public abstract class MediaCodecRenderer extends BaseRenderer { ...@@ -466,15 +468,15 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} }
/** /**
* Returns the extent to which the renderer is capable of supporting a given {@link Format}. * Returns the {@link Capabilities} for the given {@link Format}.
* *
* @param mediaCodecSelector The decoder selector. * @param mediaCodecSelector The decoder selector.
* @param drmSessionManager The renderer's {@link DrmSessionManager}. * @param drmSessionManager The renderer's {@link DrmSessionManager}.
* @param format The {@link Format}. * @param format The {@link Format}.
* @return The extent to which the renderer is capable of supporting the given format. See {@link * @return The {@link Capabilities} for this {@link Format}.
* #supportsFormat(Format)} for more detail.
* @throws DecoderQueryException If there was an error querying decoders. * @throws DecoderQueryException If there was an error querying decoders.
*/ */
@Capabilities
protected abstract int supportsFormat( protected abstract int supportsFormat(
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
......
...@@ -26,6 +26,7 @@ import com.google.android.exoplayer2.BaseRenderer; ...@@ -26,6 +26,7 @@ import com.google.android.exoplayer2.BaseRenderer;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -91,11 +92,13 @@ public final class MetadataRenderer extends BaseRenderer implements Callback { ...@@ -91,11 +92,13 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
if (decoderFactory.supportsFormat(format)) { if (decoderFactory.supportsFormat(format)) {
return supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM; return RendererCapabilities.create(
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
} else { } else {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
} }
......
...@@ -26,6 +26,7 @@ import com.google.android.exoplayer2.C; ...@@ -26,6 +26,7 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
...@@ -118,13 +119,15 @@ public final class TextRenderer extends BaseRenderer implements Callback { ...@@ -118,13 +119,15 @@ public final class TextRenderer extends BaseRenderer implements Callback {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
if (decoderFactory.supportsFormat(format)) { if (decoderFactory.supportsFormat(format)) {
return supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM; return RendererCapabilities.create(
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
} else if (MimeTypes.isText(format.sampleMimeType)) { } else if (MimeTypes.isText(format.sampleMimeType)) {
return FORMAT_UNSUPPORTED_SUBTYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} else { } else {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
} }
......
...@@ -25,6 +25,8 @@ import com.google.android.exoplayer2.PlaybackParameters; ...@@ -25,6 +25,8 @@ import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Player.PlaybackSuppressionReason; import com.google.android.exoplayer2.Player.PlaybackSuppressionReason;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport;
import com.google.android.exoplayer2.RendererCapabilities.FormatSupport;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.analytics.AnalyticsListener; import com.google.android.exoplayer2.analytics.AnalyticsListener;
import com.google.android.exoplayer2.audio.AudioAttributes; import com.google.android.exoplayer2.audio.AudioAttributes;
...@@ -210,7 +212,8 @@ public class EventLogger implements AnalyticsListener { ...@@ -210,7 +212,8 @@ public class EventLogger implements AnalyticsListener {
String adaptiveSupport = String adaptiveSupport =
getAdaptiveSupportString( getAdaptiveSupportString(
trackGroup.length, trackGroup.length,
mappedTrackInfo.getAdaptiveSupport(rendererIndex, groupIndex, false)); mappedTrackInfo.getAdaptiveSupport(
rendererIndex, groupIndex, /* includeCapabilitiesExceededTracks= */ false));
logd(" Group:" + groupIndex + ", adaptive_supported=" + adaptiveSupport + " ["); logd(" Group:" + groupIndex + ", adaptive_supported=" + adaptiveSupport + " [");
for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) {
String status = getTrackStatusString(trackSelection, trackGroup, trackIndex); String status = getTrackStatusString(trackSelection, trackGroup, trackIndex);
...@@ -552,7 +555,7 @@ public class EventLogger implements AnalyticsListener { ...@@ -552,7 +555,7 @@ public class EventLogger implements AnalyticsListener {
} }
} }
private static String getFormatSupportString(int formatSupport) { private static String getFormatSupportString(@FormatSupport int formatSupport) {
switch (formatSupport) { switch (formatSupport) {
case RendererCapabilities.FORMAT_HANDLED: case RendererCapabilities.FORMAT_HANDLED:
return "YES"; return "YES";
...@@ -565,11 +568,12 @@ public class EventLogger implements AnalyticsListener { ...@@ -565,11 +568,12 @@ public class EventLogger implements AnalyticsListener {
case RendererCapabilities.FORMAT_UNSUPPORTED_TYPE: case RendererCapabilities.FORMAT_UNSUPPORTED_TYPE:
return "NO"; return "NO";
default: default:
return "?"; throw new IllegalStateException();
} }
} }
private static String getAdaptiveSupportString(int trackCount, int adaptiveSupport) { private static String getAdaptiveSupportString(
int trackCount, @AdaptiveSupport int adaptiveSupport) {
if (trackCount < 2) { if (trackCount < 2) {
return "N/A"; return "N/A";
} }
...@@ -581,7 +585,7 @@ public class EventLogger implements AnalyticsListener { ...@@ -581,7 +585,7 @@ public class EventLogger implements AnalyticsListener {
case RendererCapabilities.ADAPTIVE_NOT_SUPPORTED: case RendererCapabilities.ADAPTIVE_NOT_SUPPORTED:
return "NO"; return "NO";
default: default:
return "?"; throw new IllegalStateException();
} }
} }
......
...@@ -37,6 +37,7 @@ import com.google.android.exoplayer2.ExoPlayer; ...@@ -37,6 +37,7 @@ import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.PlayerMessage.Target; import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmInitData; import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
...@@ -360,6 +361,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -360,6 +361,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
} }
@Override @Override
@Capabilities
protected int supportsFormat( protected int supportsFormat(
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
...@@ -367,7 +369,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -367,7 +369,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
throws DecoderQueryException { throws DecoderQueryException {
String mimeType = format.sampleMimeType; String mimeType = format.sampleMimeType;
if (!MimeTypes.isVideo(mimeType)) { if (!MimeTypes.isVideo(mimeType)) {
return FORMAT_UNSUPPORTED_TYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@Nullable DrmInitData drmInitData = format.drmInitData; @Nullable DrmInitData drmInitData = format.drmInitData;
// Assume encrypted content requires secure decoders. // Assume encrypted content requires secure decoders.
...@@ -388,7 +390,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -388,7 +390,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
/* requiresTunnelingDecoder= */ false); /* requiresTunnelingDecoder= */ false);
} }
if (decoderInfos.isEmpty()) { if (decoderInfos.isEmpty()) {
return FORMAT_UNSUPPORTED_SUBTYPE; return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} }
boolean supportsFormatDrm = boolean supportsFormatDrm =
drmInitData == null drmInitData == null
...@@ -396,16 +398,17 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -396,16 +398,17 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|| (format.exoMediaCryptoType == null || (format.exoMediaCryptoType == null
&& supportsFormatDrm(drmSessionManager, drmInitData)); && supportsFormatDrm(drmSessionManager, drmInitData));
if (!supportsFormatDrm) { if (!supportsFormatDrm) {
return FORMAT_UNSUPPORTED_DRM; return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }
// Check capabilities for the first decoder in the list, which takes priority. // Check capabilities for the first decoder in the list, which takes priority.
MediaCodecInfo decoderInfo = decoderInfos.get(0); MediaCodecInfo decoderInfo = decoderInfos.get(0);
boolean isFormatSupported = decoderInfo.isFormatSupported(format); boolean isFormatSupported = decoderInfo.isFormatSupported(format);
@AdaptiveSupport
int adaptiveSupport = int adaptiveSupport =
decoderInfo.isSeamlessAdaptationSupported(format) decoderInfo.isSeamlessAdaptationSupported(format)
? ADAPTIVE_SEAMLESS ? ADAPTIVE_SEAMLESS
: ADAPTIVE_NOT_SEAMLESS; : ADAPTIVE_NOT_SEAMLESS;
int tunnelingSupport = TUNNELING_NOT_SUPPORTED; @TunnelingSupport int tunnelingSupport = TUNNELING_NOT_SUPPORTED;
if (isFormatSupported) { if (isFormatSupported) {
List<MediaCodecInfo> tunnelingDecoderInfos = List<MediaCodecInfo> tunnelingDecoderInfos =
getDecoderInfos( getDecoderInfos(
...@@ -421,8 +424,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -421,8 +424,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
} }
} }
} }
@FormatSupport
int formatSupport = isFormatSupported ? FORMAT_HANDLED : FORMAT_EXCEEDS_CAPABILITIES; int formatSupport = isFormatSupported ? FORMAT_HANDLED : FORMAT_EXCEEDS_CAPABILITIES;
return adaptiveSupport | tunnelingSupport | formatSupport; return RendererCapabilities.create(formatSupport, adaptiveSupport, tunnelingSupport);
} }
@Override @Override
......
...@@ -157,6 +157,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { ...@@ -157,6 +157,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
// BaseRenderer implementation. // BaseRenderer implementation.
@Override @Override
@Capabilities
public final int supportsFormat(Format format) { public final int supportsFormat(Format format) {
return supportsFormatInternal(drmSessionManager, format); return supportsFormatInternal(drmSessionManager, format);
} }
...@@ -498,13 +499,14 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer { ...@@ -498,13 +499,14 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
} }
/** /**
* Returns the extent to which the subclass supports a given format. * Returns the {@link Capabilities} for the given {@link Format}.
* *
* @param drmSessionManager The renderer's {@link DrmSessionManager}. * @param drmSessionManager The renderer's {@link DrmSessionManager}.
* @param format The format, which has a video {@link Format#sampleMimeType}. * @param format The format, which has a video {@link Format#sampleMimeType}.
* @return The extent to which the subclass supports the format itself. * @return The {@link Capabilities} for this {@link Format}.
* @see RendererCapabilities#supportsFormat(Format) * @see RendererCapabilities#supportsFormat(Format)
*/ */
@Capabilities
protected abstract int supportsFormatInternal( protected abstract int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format); @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
......
...@@ -22,6 +22,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; ...@@ -22,6 +22,7 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.ParsableByteArray; import com.google.android.exoplayer2.util.ParsableByteArray;
...@@ -48,10 +49,11 @@ public class CameraMotionRenderer extends BaseRenderer { ...@@ -48,10 +49,11 @@ public class CameraMotionRenderer extends BaseRenderer {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
return MimeTypes.APPLICATION_CAMERA_MOTION.equals(format.sampleMimeType) return MimeTypes.APPLICATION_CAMERA_MOTION.equals(format.sampleMimeType)
? FORMAT_HANDLED ? RendererCapabilities.create(FORMAT_HANDLED)
: FORMAT_UNSUPPORTED_TYPE; : RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@Override @Override
......
...@@ -58,6 +58,7 @@ public class SimpleDecoderAudioRendererTest { ...@@ -58,6 +58,7 @@ public class SimpleDecoderAudioRendererTest {
audioRenderer = audioRenderer =
new SimpleDecoderAudioRenderer(null, null, null, false, mockAudioSink) { new SimpleDecoderAudioRenderer(null, null, null, false, mockAudioSink) {
@Override @Override
@FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) { @Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
return FORMAT_HANDLED; return FORMAT_HANDLED;
......
...@@ -1767,7 +1767,7 @@ public final class DefaultTrackSelectorTest { ...@@ -1767,7 +1767,7 @@ public final class DefaultTrackSelectorTest {
private static final class FakeRendererCapabilities implements RendererCapabilities { private static final class FakeRendererCapabilities implements RendererCapabilities {
private final int trackType; private final int trackType;
private final int supportValue; @Capabilities private final int supportValue;
/** /**
* Returns {@link FakeRendererCapabilities} that advertises adaptive support for all * Returns {@link FakeRendererCapabilities} that advertises adaptive support for all
...@@ -1777,19 +1777,21 @@ public final class DefaultTrackSelectorTest { ...@@ -1777,19 +1777,21 @@ public final class DefaultTrackSelectorTest {
* support for. * support for.
*/ */
FakeRendererCapabilities(int trackType) { FakeRendererCapabilities(int trackType) {
this(trackType, FORMAT_HANDLED | ADAPTIVE_SEAMLESS); this(
trackType,
RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED));
} }
/** /**
* Returns {@link FakeRendererCapabilities} that advertises support level using given value * Returns {@link FakeRendererCapabilities} that advertises support level using given value for
* for all tracks of the given type. * all tracks of the given type.
* *
* @param trackType the track type of all formats that this renderer capabilities advertises * @param trackType the track type of all formats that this renderer capabilities advertises
* support for. * support for.
* @param supportValue the support level value that will be returned for formats with * @param supportValue the {@link Capabilities} that will be returned for formats with the given
* the given type. * type.
*/ */
FakeRendererCapabilities(int trackType, int supportValue) { FakeRendererCapabilities(int trackType, @Capabilities int supportValue) {
this.trackType = trackType; this.trackType = trackType;
this.supportValue = supportValue; this.supportValue = supportValue;
} }
...@@ -1800,12 +1802,15 @@ public final class DefaultTrackSelectorTest { ...@@ -1800,12 +1802,15 @@ public final class DefaultTrackSelectorTest {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
return MimeTypes.getTrackType(format.sampleMimeType) == trackType return MimeTypes.getTrackType(format.sampleMimeType) == trackType
? (supportValue) : FORMAT_UNSUPPORTED_TYPE; ? supportValue
: RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@Override @Override
@AdaptiveSupport
public int supportsMixedMimeTypeAdaptation() { public int supportsMixedMimeTypeAdaptation() {
return ADAPTIVE_SEAMLESS; return ADAPTIVE_SEAMLESS;
} }
...@@ -1841,13 +1846,15 @@ public final class DefaultTrackSelectorTest { ...@@ -1841,13 +1846,15 @@ public final class DefaultTrackSelectorTest {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
return format.id != null && formatToCapability.containsKey(format.id) return format.id != null && formatToCapability.containsKey(format.id)
? formatToCapability.get(format.id) ? formatToCapability.get(format.id)
: FORMAT_UNSUPPORTED_TYPE; : RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@Override @Override
@AdaptiveSupport
public int supportsMixedMimeTypeAdaptation() { public int supportsMixedMimeTypeAdaptation() {
return ADAPTIVE_SEAMLESS; return ADAPTIVE_SEAMLESS;
} }
......
...@@ -23,6 +23,8 @@ import com.google.android.exoplayer2.C; ...@@ -23,6 +23,8 @@ import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.RendererCapabilities.AdaptiveSupport;
import com.google.android.exoplayer2.RendererCapabilities.Capabilities;
import com.google.android.exoplayer2.RendererConfiguration; import com.google.android.exoplayer2.RendererConfiguration;
import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
...@@ -112,8 +114,8 @@ public final class MappingTrackSelectorTest { ...@@ -112,8 +114,8 @@ public final class MappingTrackSelectorTest {
@Override @Override
protected Pair<RendererConfiguration[], TrackSelection[]> selectTracks( protected Pair<RendererConfiguration[], TrackSelection[]> selectTracks(
MappedTrackInfo mappedTrackInfo, MappedTrackInfo mappedTrackInfo,
int[][][] rendererFormatSupports, @Capabilities int[][][] rendererFormatSupports,
int[] rendererMixedMimeTypeAdaptationSupports) @AdaptiveSupport int[] rendererMixedMimeTypeAdaptationSupports)
throws ExoPlaybackException { throws ExoPlaybackException {
int rendererCount = mappedTrackInfo.getRendererCount(); int rendererCount = mappedTrackInfo.getRendererCount();
lastMappedTrackInfo = mappedTrackInfo; lastMappedTrackInfo = mappedTrackInfo;
...@@ -148,12 +150,15 @@ public final class MappingTrackSelectorTest { ...@@ -148,12 +150,15 @@ public final class MappingTrackSelectorTest {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) throws ExoPlaybackException { public int supportsFormat(Format format) throws ExoPlaybackException {
return MimeTypes.getTrackType(format.sampleMimeType) == trackType return MimeTypes.getTrackType(format.sampleMimeType) == trackType
? (FORMAT_HANDLED | ADAPTIVE_SEAMLESS) : FORMAT_UNSUPPORTED_TYPE; ? RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED)
: RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@Override @Override
@AdaptiveSupport
public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
return ADAPTIVE_SEAMLESS; return ADAPTIVE_SEAMLESS;
} }
......
...@@ -371,7 +371,8 @@ public class TrackSelectionView extends LinearLayout { ...@@ -371,7 +371,8 @@ public class TrackSelectionView extends LinearLayout {
private boolean shouldEnableAdaptiveSelection(int groupIndex) { private boolean shouldEnableAdaptiveSelection(int groupIndex) {
return allowAdaptiveSelections return allowAdaptiveSelections
&& trackGroups.get(groupIndex).length > 1 && trackGroups.get(groupIndex).length > 1
&& mappedTrackInfo.getAdaptiveSupport(rendererIndex, groupIndex, false) && mappedTrackInfo.getAdaptiveSupport(
rendererIndex, groupIndex, /* includeCapabilitiesExceededTracks= */ false)
!= RendererCapabilities.ADAPTIVE_NOT_SUPPORTED; != RendererCapabilities.ADAPTIVE_NOT_SUPPORTED;
} }
......
...@@ -451,7 +451,7 @@ import java.util.List; ...@@ -451,7 +451,7 @@ import java.util.List;
} }
private static boolean isFormatHandled(int formatSupport) { private static boolean isFormatHandled(int formatSupport) {
return (formatSupport & RendererCapabilities.FORMAT_SUPPORT_MASK) return RendererCapabilities.getFormatSupport(formatSupport)
== RendererCapabilities.FORMAT_HANDLED; == RendererCapabilities.FORMAT_HANDLED;
} }
......
...@@ -23,6 +23,7 @@ import com.google.android.exoplayer2.ExoPlaybackException; ...@@ -23,6 +23,7 @@ import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
...@@ -110,9 +111,11 @@ public class FakeRenderer extends BaseRenderer { ...@@ -110,9 +111,11 @@ public class FakeRenderer extends BaseRenderer {
} }
@Override @Override
@Capabilities
public int supportsFormat(Format format) throws ExoPlaybackException { public int supportsFormat(Format format) throws ExoPlaybackException {
return getTrackType() == MimeTypes.getTrackType(format.sampleMimeType) return getTrackType() == MimeTypes.getTrackType(format.sampleMimeType)
? (FORMAT_HANDLED | ADAPTIVE_SEAMLESS) : FORMAT_UNSUPPORTED_TYPE; ? RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED)
: RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
/** Called when the renderer reads a new format. */ /** Called when the renderer reads a new format. */
......
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