Remove DRM management from Renderers

PiperOrigin-RevId: 295569075
This commit is contained in:
aquilescanta 2020-02-17 13:37:17 +00:00 committed by Ian Baker
parent d3f806fdf4
commit 5c3c803460
29 changed files with 60 additions and 872 deletions

View File

@ -46,7 +46,11 @@
[background](https://www.w3.org/TR/webvtt1/#default-text-background) colors [background](https://www.w3.org/TR/webvtt1/#default-text-background) colors
([PR #4178](https://github.com/google/ExoPlayer/pull/4178), ([PR #4178](https://github.com/google/ExoPlayer/pull/4178),
[issue #6581](https://github.com/google/ExoPlayer/issues/6581)). [issue #6581](https://github.com/google/ExoPlayer/issues/6581)).
* DRM: Add support for attaching DRM sessions to clear content in the demo app. * DRM:
* Add support for attaching DRM sessions to clear content in the demo app.
* Remove `DrmSessionManager` references from all renderers.
`DrmSessionManager` must be injected into the MediaSources using the
MediaSources factories.
* Downloads: Merge downloads in `SegmentDownloader` to improve overall download * Downloads: Merge downloads in `SegmentDownloader` to improve overall download
speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)). speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)).
* MP3: Add `IndexSeeker` for accurate seeks in VBR streams * MP3: Add `IndexSeeker` for accurate seeks in VBR streams

View File

@ -27,7 +27,6 @@ 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.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.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.TraceUtil;
@ -121,13 +120,7 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
int threads, int threads,
int numInputBuffers, int numInputBuffers,
int numOutputBuffers) { int numOutputBuffers) {
super( super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
allowedJoiningTimeMs,
eventHandler,
eventListener,
maxDroppedFramesToNotify,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false);
this.threads = threads; this.threads = threads;
this.numInputBuffers = numInputBuffers; this.numInputBuffers = numInputBuffers;
this.numOutputBuffers = numOutputBuffers; this.numOutputBuffers = numOutputBuffers;
@ -135,13 +128,12 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
@Override @Override
@Capabilities @Capabilities
protected int supportsFormatInternal( public final int supportsFormat(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 RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) { if (format.drmInitData != null && format.exoMediaCryptoType == null) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM); return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }
return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED); return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED);

View File

@ -18,14 +18,12 @@ package com.google.android.exoplayer2.ext.ffmpeg;
import android.os.Handler; import android.os.Handler;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer; import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
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;
@ -85,22 +83,19 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
super( super(
eventHandler, eventHandler,
eventListener, eventListener,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
audioSink); audioSink);
this.enableFloatOutput = enableFloatOutput; this.enableFloatOutput = enableFloatOutput;
} }
@Override @Override
@FormatSupport @FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(Format format) {
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
Assertions.checkNotNull(format.sampleMimeType); Assertions.checkNotNull(format.sampleMimeType);
if (!FfmpegLibrary.isAvailable()) { if (!FfmpegLibrary.isAvailable()) {
return FORMAT_UNSUPPORTED_TYPE; return FORMAT_UNSUPPORTED_TYPE;
} else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType) || !isOutputSupported(format)) { } else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType) || !isOutputSupported(format)) {
return FORMAT_UNSUPPORTED_SUBTYPE; return FORMAT_UNSUPPORTED_SUBTYPE;
} else if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) { } else if (format.drmInitData != null && format.exoMediaCryptoType == null) {
return FORMAT_UNSUPPORTED_DRM; return FORMAT_UNSUPPORTED_DRM;
} else { } else {
return FORMAT_HANDLED; return FORMAT_HANDLED;
@ -109,7 +104,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
@Override @Override
@AdaptiveSupport @AdaptiveSupport
public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException { public final int supportsMixedMimeTypeAdaptation() {
return ADAPTIVE_NOT_SEAMLESS; return ADAPTIVE_NOT_SEAMLESS;
} }

View File

@ -23,7 +23,6 @@ import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.AudioSink; import com.google.android.exoplayer2.audio.AudioSink;
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer; import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.extractor.FlacStreamMetadata; import com.google.android.exoplayer2.extractor.FlacStreamMetadata;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
@ -69,15 +68,12 @@ public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
super( super(
eventHandler, eventHandler,
eventListener, eventListener,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
audioSink); audioSink);
} }
@Override @Override
@FormatSupport @FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(Format format) {
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
if (!FlacLibrary.isAvailable() if (!FlacLibrary.isAvailable()
|| !MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType)) { || !MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType)) {
return FORMAT_UNSUPPORTED_TYPE; return FORMAT_UNSUPPORTED_TYPE;
@ -99,7 +95,7 @@ public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
} }
if (!supportsOutput(format.channelCount, pcmEncoding)) { if (!supportsOutput(format.channelCount, pcmEncoding)) {
return FORMAT_UNSUPPORTED_SUBTYPE; return FORMAT_UNSUPPORTED_SUBTYPE;
} else if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) { } else if (format.drmInitData != null && format.exoMediaCryptoType == null) {
return FORMAT_UNSUPPORTED_DRM; return FORMAT_UNSUPPORTED_DRM;
} else { } else {
return FORMAT_HANDLED; return FORMAT_HANDLED;

View File

@ -22,9 +22,7 @@ import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer; import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
/** Decodes and renders audio using the native Opus decoder. */ /** Decodes and renders audio using the native Opus decoder. */
@ -55,42 +53,12 @@ public class LibopusAudioRenderer extends SimpleDecoderAudioRenderer {
super(eventHandler, eventListener, audioProcessors); super(eventHandler, eventListener, audioProcessors);
} }
/**
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
* @deprecated Use {@link #LibopusAudioRenderer(Handler, AudioRendererEventListener,
* AudioProcessor...)} instead, and pass DRM-related parameters to the {@link MediaSource}
* factories.
*/
@Deprecated
public LibopusAudioRenderer(
@Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener,
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
AudioProcessor... audioProcessors) {
super(eventHandler, eventListener, null, drmSessionManager, playClearSamplesWithoutKeys,
audioProcessors);
}
@Override @Override
@FormatSupport @FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(Format format) {
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
boolean drmIsSupported = boolean drmIsSupported =
format.drmInitData == null format.drmInitData == null
|| OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType) || OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType);
|| (format.exoMediaCryptoType == null
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
if (!OpusLibrary.isAvailable() if (!OpusLibrary.isAvailable()
|| !MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)) { || !MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)) {
return FORMAT_UNSUPPORTED_TYPE; return FORMAT_UNSUPPORTED_TYPE;

View File

@ -27,9 +27,7 @@ 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.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.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.util.TraceUtil;
import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer; import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer;
@ -101,45 +99,6 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
eventHandler, eventHandler,
eventListener, eventListener,
maxDroppedFramesToNotify, maxDroppedFramesToNotify,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false);
}
/**
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
* can attempt to seamlessly join an ongoing playback.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @deprecated Use {@link #LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int,
* int, int, int)}} instead, and pass DRM-related parameters to the {@link MediaSource}
* factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public LibvpxVideoRenderer(
long allowedJoiningTimeMs,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify,
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys) {
this(
allowedJoiningTimeMs,
eventHandler,
eventListener,
maxDroppedFramesToNotify,
drmSessionManager,
playClearSamplesWithoutKeys,
getRuntime().availableProcessors(), getRuntime().availableProcessors(),
/* numInputBuffers= */ 4, /* numInputBuffers= */ 4,
/* numOutputBuffers= */ 4); /* numOutputBuffers= */ 4);
@ -166,58 +125,7 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
int threads, int threads,
int numInputBuffers, int numInputBuffers,
int numOutputBuffers) { int numOutputBuffers) {
this( super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
allowedJoiningTimeMs,
eventHandler,
eventListener,
maxDroppedFramesToNotify,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
threads,
numInputBuffers,
numOutputBuffers);
}
/**
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
* can attempt to seamlessly join an ongoing playback.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param threads Number of threads libvpx will use to decode.
* @param numInputBuffers Number of input buffers.
* @param numOutputBuffers Number of output buffers.
* @deprecated Use {@link #LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int,
* int, int, int)}} instead, and pass DRM-related parameters to the {@link MediaSource}
* factories.
*/
@Deprecated
public LibvpxVideoRenderer(
long allowedJoiningTimeMs,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify,
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
int threads,
int numInputBuffers,
int numOutputBuffers) {
super(
allowedJoiningTimeMs,
eventHandler,
eventListener,
maxDroppedFramesToNotify,
drmSessionManager,
playClearSamplesWithoutKeys);
this.threads = threads; this.threads = threads;
this.numInputBuffers = numInputBuffers; this.numInputBuffers = numInputBuffers;
this.numOutputBuffers = numOutputBuffers; this.numOutputBuffers = numOutputBuffers;
@ -225,16 +133,13 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
@Override @Override
@Capabilities @Capabilities
protected int supportsFormatInternal( public final int supportsFormat(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 RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
boolean drmIsSupported = boolean drmIsSupported =
format.drmInitData == null format.drmInitData == null
|| VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType) || VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType);
|| (format.exoMediaCryptoType == null
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
if (!drmIsSupported) { if (!drmIsSupported) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM); return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }

View File

@ -18,7 +18,6 @@ package com.google.android.exoplayer2;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
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.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
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;
@ -411,26 +410,4 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
protected final boolean isSourceReady() { protected final boolean isSourceReady() {
return hasReadStreamToEnd() ? streamIsFinal : stream.isReady(); return hasReadStreamToEnd() ? streamIsFinal : stream.isReady();
} }
/**
* Returns whether {@code drmSessionManager} supports the specified {@code drmInitData}, or true
* if {@code drmInitData} is null.
*
* @param drmSessionManager The drm session manager.
* @param drmInitData {@link DrmInitData} of the format to check for support.
* @return Whether {@code drmSessionManager} supports the specified {@code drmInitData}, or
* true if {@code drmInitData} is null.
*/
protected static boolean supportsFormatDrm(@Nullable DrmSessionManager<?> drmSessionManager,
@Nullable DrmInitData drmInitData) {
if (drmInitData == null) {
// Content is unencrypted.
return true;
} else if (drmSessionManager == null) {
// Content is encrypted, but no drm session manager is available.
return false;
}
return drmSessionManager.canAcquireSession(drmInitData);
}
} }

View File

@ -20,14 +20,11 @@ import android.media.MediaCodec;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.IntDef; import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioCapabilities; import com.google.android.exoplayer2.audio.AudioCapabilities;
import com.google.android.exoplayer2.audio.AudioProcessor; import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.DefaultAudioSink; import com.google.android.exoplayer2.audio.DefaultAudioSink;
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataOutput;
@ -88,10 +85,8 @@ public class DefaultRenderersFactory implements RenderersFactory {
protected static final int MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY = 50; protected static final int MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY = 50;
private final Context context; private final Context context;
@Nullable private DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
@ExtensionRendererMode private int extensionRendererMode; @ExtensionRendererMode private int extensionRendererMode;
private long allowedVideoJoiningTimeMs; private long allowedVideoJoiningTimeMs;
private boolean playClearSamplesWithoutKeys;
private boolean enableDecoderFallback; private boolean enableDecoderFallback;
private MediaCodecSelector mediaCodecSelector; private MediaCodecSelector mediaCodecSelector;
@MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode; @MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode;
@ -105,17 +100,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
mediaCodecOperationMode = MediaCodecRenderer.OPERATION_MODE_SYNCHRONOUS; mediaCodecOperationMode = MediaCodecRenderer.OPERATION_MODE_SYNCHRONOUS;
} }
/**
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and pass {@link DrmSessionManager}
* directly to {@link SimpleExoPlayer.Builder}.
*/
@Deprecated
@SuppressWarnings("deprecation")
public DefaultRenderersFactory(
Context context, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
this(context, drmSessionManager, EXTENSION_RENDERER_MODE_OFF);
}
/** /**
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link * @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
* #setExtensionRendererMode(int)}. * #setExtensionRendererMode(int)}.
@ -127,48 +111,18 @@ public class DefaultRenderersFactory implements RenderersFactory {
this(context, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS); this(context, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS);
} }
/**
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
* #setExtensionRendererMode(int)}, and pass {@link DrmSessionManager} directly to {@link
* SimpleExoPlayer.Builder}.
*/
@Deprecated
@SuppressWarnings("deprecation")
public DefaultRenderersFactory(
Context context,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@ExtensionRendererMode int extensionRendererMode) {
this(context, drmSessionManager, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS);
}
/** /**
* @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link * @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
* #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}. * #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}.
*/ */
@Deprecated @Deprecated
@SuppressWarnings("deprecation")
public DefaultRenderersFactory( public DefaultRenderersFactory(
Context context, Context context,
@ExtensionRendererMode int extensionRendererMode, @ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) { long allowedVideoJoiningTimeMs) {
this(context, null, extensionRendererMode, allowedVideoJoiningTimeMs);
}
/**
* @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
* #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}, and pass
* {@link DrmSessionManager} directly to {@link SimpleExoPlayer.Builder}.
*/
@Deprecated
public DefaultRenderersFactory(
Context context,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) {
this.context = context; this.context = context;
this.extensionRendererMode = extensionRendererMode; this.extensionRendererMode = extensionRendererMode;
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs; this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
this.drmSessionManager = drmSessionManager;
mediaCodecSelector = MediaCodecSelector.DEFAULT; mediaCodecSelector = MediaCodecSelector.DEFAULT;
} }
@ -203,25 +157,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
return this; return this;
} }
/**
* Sets whether renderers are permitted to play clear regions of encrypted media prior to having
* obtained the keys necessary to decrypt encrypted regions of the media. For encrypted media that
* starts with a short clear region, this allows playback to begin in parallel with key
* acquisition, which can reduce startup latency.
*
* <p>The default value is {@code false}.
*
* @param playClearSamplesWithoutKeys Whether renderers are permitted to play clear regions of
* encrypted media prior to having obtained the keys necessary to decrypt encrypted regions of
* the media.
* @return This factory, for convenience.
*/
public DefaultRenderersFactory setPlayClearSamplesWithoutKeys(
boolean playClearSamplesWithoutKeys) {
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
return this;
}
/** /**
* Sets whether to enable fallback to lower-priority decoders if decoder initialization fails. * Sets whether to enable fallback to lower-priority decoders if decoder initialization fails.
* This may result in using a decoder that is less efficient or slower than the primary decoder. * This may result in using a decoder that is less efficient or slower than the primary decoder.
@ -269,18 +204,12 @@ public class DefaultRenderersFactory implements RenderersFactory {
VideoRendererEventListener videoRendererEventListener, VideoRendererEventListener videoRendererEventListener,
AudioRendererEventListener audioRendererEventListener, AudioRendererEventListener audioRendererEventListener,
TextOutput textRendererOutput, TextOutput textRendererOutput,
MetadataOutput metadataRendererOutput, MetadataOutput metadataRendererOutput) {
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
if (drmSessionManager == null) {
drmSessionManager = this.drmSessionManager;
}
ArrayList<Renderer> renderersList = new ArrayList<>(); ArrayList<Renderer> renderersList = new ArrayList<>();
buildVideoRenderers( buildVideoRenderers(
context, context,
extensionRendererMode, extensionRendererMode,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback, enableDecoderFallback,
eventHandler, eventHandler,
videoRendererEventListener, videoRendererEventListener,
@ -290,8 +219,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
context, context,
extensionRendererMode, extensionRendererMode,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback, enableDecoderFallback,
buildAudioProcessors(), buildAudioProcessors(),
eventHandler, eventHandler,
@ -312,11 +239,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
* @param context The {@link Context} associated with the player. * @param context The {@link Context} associated with the player.
* @param extensionRendererMode The extension renderer mode. * @param extensionRendererMode The extension renderer mode.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player will
* not be used for DRM protected playbacks.
* @param playClearSamplesWithoutKeys Whether renderers are permitted to play clear regions of
* encrypted media prior to having obtained the keys necessary to decrypt encrypted regions of
* the media.
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder * @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
* initialization fails. This may result in using a decoder that is slower/less efficient than * initialization fails. This may result in using a decoder that is slower/less efficient than
* the primary decoder. * the primary decoder.
@ -330,8 +252,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
Context context, Context context,
@ExtensionRendererMode int extensionRendererMode, @ExtensionRendererMode int extensionRendererMode,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
boolean enableDecoderFallback, boolean enableDecoderFallback,
Handler eventHandler, Handler eventHandler,
VideoRendererEventListener eventListener, VideoRendererEventListener eventListener,
@ -342,8 +262,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
context, context,
mediaCodecSelector, mediaCodecSelector,
allowedVideoJoiningTimeMs, allowedVideoJoiningTimeMs,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback, enableDecoderFallback,
eventHandler, eventHandler,
eventListener, eventListener,
@ -420,11 +338,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
* @param context The {@link Context} associated with the player. * @param context The {@link Context} associated with the player.
* @param extensionRendererMode The extension renderer mode. * @param extensionRendererMode The extension renderer mode.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player will
* not be used for DRM protected playbacks.
* @param playClearSamplesWithoutKeys Whether renderers are permitted to play clear regions of
* encrypted media prior to having obtained the keys necessary to decrypt encrypted regions of
* the media.
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder * @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
* initialization fails. This may result in using a decoder that is slower/less efficient than * initialization fails. This may result in using a decoder that is slower/less efficient than
* the primary decoder. * the primary decoder.
@ -438,8 +351,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
Context context, Context context,
@ExtensionRendererMode int extensionRendererMode, @ExtensionRendererMode int extensionRendererMode,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
boolean enableDecoderFallback, boolean enableDecoderFallback,
AudioProcessor[] audioProcessors, AudioProcessor[] audioProcessors,
Handler eventHandler, Handler eventHandler,
@ -449,8 +360,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
new MediaCodecAudioRenderer( new MediaCodecAudioRenderer(
context, context,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback, enableDecoderFallback,
eventHandler, eventHandler,
eventListener, eventListener,

View File

@ -17,11 +17,7 @@ package com.google.android.exoplayer2;
import android.content.Context; import android.content.Context;
import android.os.Looper; import android.os.Looper;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.analytics.AnalyticsCollector; import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
@ -35,45 +31,33 @@ public final class ExoPlayerFactory {
private ExoPlayerFactory() {} private ExoPlayerFactory() {}
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
Context context, Context context,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) { @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
new DefaultRenderersFactory(context).setExtensionRendererMode(extensionRendererMode); new DefaultRenderersFactory(context).setExtensionRendererMode(extensionRendererMode);
return newSimpleInstance( return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
Context context, Context context,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) { long allowedVideoJoiningTimeMs) {
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
new DefaultRenderersFactory(context) new DefaultRenderersFactory(context)
.setExtensionRendererMode(extensionRendererMode) .setExtensionRendererMode(extensionRendererMode)
.setAllowedVideoJoiningTimeMs(allowedVideoJoiningTimeMs); .setAllowedVideoJoiningTimeMs(allowedVideoJoiningTimeMs);
return newSimpleInstance( return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */ /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
@ -107,39 +91,6 @@ public final class ExoPlayerFactory {
return newSimpleInstance(context, renderersFactory, trackSelector, loadControl); return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
} }
/**
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance(
Context context,
TrackSelector trackSelector,
LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
RenderersFactory renderersFactory = new DefaultRenderersFactory(context);
return newSimpleInstance(
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
}
/**
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance(
Context context,
RenderersFactory renderersFactory,
TrackSelector trackSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
return newSimpleInstance(
context, renderersFactory, trackSelector, new DefaultLoadControl(), drmSessionManager);
}
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */ /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@ -153,15 +104,10 @@ public final class ExoPlayerFactory {
renderersFactory, renderersFactory,
trackSelector, trackSelector,
loadControl, loadControl,
/* drmSessionManager= */ null,
Util.getLooper()); Util.getLooper());
} }
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
@ -169,41 +115,18 @@ public final class ExoPlayerFactory {
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
return newSimpleInstance(
context, renderersFactory, trackSelector, loadControl, drmSessionManager, Util.getLooper());
}
/**
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance(
Context context,
RenderersFactory renderersFactory,
TrackSelector trackSelector,
LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
BandwidthMeter bandwidthMeter) { BandwidthMeter bandwidthMeter) {
return newSimpleInstance( return newSimpleInstance(
context, context,
renderersFactory, renderersFactory,
trackSelector, trackSelector,
loadControl, loadControl,
drmSessionManager,
bandwidthMeter, bandwidthMeter,
new AnalyticsCollector(Clock.DEFAULT), new AnalyticsCollector(Clock.DEFAULT),
Util.getLooper()); Util.getLooper());
} }
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
@ -211,23 +134,17 @@ public final class ExoPlayerFactory {
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
AnalyticsCollector analyticsCollector) { AnalyticsCollector analyticsCollector) {
return newSimpleInstance( return newSimpleInstance(
context, context,
renderersFactory, renderersFactory,
trackSelector, trackSelector,
loadControl, loadControl,
drmSessionManager,
analyticsCollector, analyticsCollector,
Util.getLooper()); Util.getLooper());
} }
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
@ -235,23 +152,17 @@ public final class ExoPlayerFactory {
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
Looper looper) { Looper looper) {
return newSimpleInstance( return newSimpleInstance(
context, context,
renderersFactory, renderersFactory,
trackSelector, trackSelector,
loadControl, loadControl,
drmSessionManager,
new AnalyticsCollector(Clock.DEFAULT), new AnalyticsCollector(Clock.DEFAULT),
looper); looper);
} }
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
@ -259,7 +170,6 @@ public final class ExoPlayerFactory {
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
AnalyticsCollector analyticsCollector, AnalyticsCollector analyticsCollector,
Looper looper) { Looper looper) {
return newSimpleInstance( return newSimpleInstance(
@ -267,17 +177,12 @@ public final class ExoPlayerFactory {
renderersFactory, renderersFactory,
trackSelector, trackSelector,
loadControl, loadControl,
drmSessionManager,
DefaultBandwidthMeter.getSingletonInstance(context), DefaultBandwidthMeter.getSingletonInstance(context),
analyticsCollector, analyticsCollector,
looper); looper);
} }
/** /** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
* MediaSource} factories.
*/
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@Deprecated @Deprecated
public static SimpleExoPlayer newSimpleInstance( public static SimpleExoPlayer newSimpleInstance(
@ -285,7 +190,6 @@ public final class ExoPlayerFactory {
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
TrackSelector trackSelector, TrackSelector trackSelector,
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
BandwidthMeter bandwidthMeter, BandwidthMeter bandwidthMeter,
AnalyticsCollector analyticsCollector, AnalyticsCollector analyticsCollector,
Looper looper) { Looper looper) {
@ -294,7 +198,6 @@ public final class ExoPlayerFactory {
renderersFactory, renderersFactory,
trackSelector, trackSelector,
loadControl, loadControl,
drmSessionManager,
bandwidthMeter, bandwidthMeter,
analyticsCollector, analyticsCollector,
/* useLazyPreparation= */ true, /* useLazyPreparation= */ true,

View File

@ -16,10 +16,7 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import android.os.Handler; import android.os.Handler;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataOutput;
import com.google.android.exoplayer2.text.TextOutput; import com.google.android.exoplayer2.text.TextOutput;
import com.google.android.exoplayer2.video.VideoRendererEventListener; import com.google.android.exoplayer2.video.VideoRendererEventListener;
@ -37,7 +34,6 @@ public interface RenderersFactory {
* @param audioRendererEventListener An event listener for audio renderers. * @param audioRendererEventListener An event listener for audio renderers.
* @param textRendererOutput An output for text renderers. * @param textRendererOutput An output for text renderers.
* @param metadataRendererOutput An output for metadata renderers. * @param metadataRendererOutput An output for metadata renderers.
* @param drmSessionManager A drm session manager used by renderers.
* @return The {@link Renderer instances}. * @return The {@link Renderer instances}.
*/ */
Renderer[] createRenderers( Renderer[] createRenderers(
@ -45,6 +41,5 @@ public interface RenderersFactory {
VideoRendererEventListener videoRendererEventListener, VideoRendererEventListener videoRendererEventListener,
AudioRendererEventListener audioRendererEventListener, AudioRendererEventListener audioRendererEventListener,
TextOutput textRendererOutput, TextOutput textRendererOutput,
MetadataOutput metadataRendererOutput, MetadataOutput metadataRendererOutput);
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager);
} }

View File

@ -36,9 +36,6 @@ import com.google.android.exoplayer2.audio.AudioListener;
import com.google.android.exoplayer2.audio.AudioRendererEventListener; import com.google.android.exoplayer2.audio.AudioRendererEventListener;
import com.google.android.exoplayer2.audio.AuxEffectInfo; import com.google.android.exoplayer2.audio.AuxEffectInfo;
import com.google.android.exoplayer2.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.metadata.Metadata; import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataOutput;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
@ -370,7 +367,6 @@ public class SimpleExoPlayer extends BasePlayer
* @param looper The {@link Looper} which must be used for all calls to the player and which is * @param looper The {@link Looper} which must be used for all calls to the player and which is
* used to call listeners on. * used to call listeners on.
*/ */
@SuppressWarnings("deprecation")
protected SimpleExoPlayer( protected SimpleExoPlayer(
Context context, Context context,
RenderersFactory renderersFactory, RenderersFactory renderersFactory,
@ -381,36 +377,6 @@ public class SimpleExoPlayer extends BasePlayer
boolean useLazyPreparation, boolean useLazyPreparation,
Clock clock, Clock clock,
Looper looper) { Looper looper) {
this(
context,
renderersFactory,
trackSelector,
loadControl,
DrmSessionManager.getDummyDrmSessionManager(),
bandwidthMeter,
analyticsCollector,
useLazyPreparation,
clock,
looper);
}
/**
* @deprecated Use {@link #SimpleExoPlayer(Context, RenderersFactory, TrackSelector, LoadControl,
* BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)} instead, and pass the {@link
* DrmSessionManager} to the {@link MediaSource} factories.
*/
@Deprecated
protected SimpleExoPlayer(
Context context,
RenderersFactory renderersFactory,
TrackSelector trackSelector,
LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
BandwidthMeter bandwidthMeter,
AnalyticsCollector analyticsCollector,
boolean useLazyPreparation,
Clock clock,
Looper looper) {
this.bandwidthMeter = bandwidthMeter; this.bandwidthMeter = bandwidthMeter;
this.analyticsCollector = analyticsCollector; this.analyticsCollector = analyticsCollector;
componentListener = new ComponentListener(); componentListener = new ComponentListener();
@ -427,8 +393,7 @@ public class SimpleExoPlayer extends BasePlayer
componentListener, componentListener,
componentListener, componentListener,
componentListener, componentListener,
componentListener, componentListener);
drmSessionManager);
// Set initial values. // Set initial values.
audioVolume = 1; audioVolume = 1;
@ -457,9 +422,6 @@ public class SimpleExoPlayer extends BasePlayer
audioListeners.add(analyticsCollector); audioListeners.add(analyticsCollector);
addMetadataOutput(analyticsCollector); addMetadataOutput(analyticsCollector);
bandwidthMeter.addEventListener(eventHandler, analyticsCollector); bandwidthMeter.addEventListener(eventHandler, analyticsCollector);
if (drmSessionManager instanceof DefaultDrmSessionManager) {
((DefaultDrmSessionManager) drmSessionManager).addListener(eventHandler, analyticsCollector);
}
audioBecomingNoisyManager = audioBecomingNoisyManager =
new AudioBecomingNoisyManager(context, eventHandler, componentListener); new AudioBecomingNoisyManager(context, eventHandler, componentListener);
audioFocusManager = new AudioFocusManager(context, eventHandler, componentListener); audioFocusManager = new AudioFocusManager(context, eventHandler, componentListener);

View File

@ -33,7 +33,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities; 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.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
@ -41,7 +40,6 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer2.mediacodec.MediaFormatUtil; import com.google.android.exoplayer2.mediacodec.MediaFormatUtil;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.MediaClock; import com.google.android.exoplayer2.util.MediaClock;
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;
@ -96,41 +94,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
* @param context A context. * @param context A context.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
*/ */
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector) { public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector) {
this( this(
context, context,
mediaCodecSelector, mediaCodecSelector,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false);
}
/**
* @param context A context.
* @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys) {
this(
context,
mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
/* eventHandler= */ null, /* eventHandler= */ null,
/* eventListener= */ null); /* eventListener= */ null);
} }
@ -142,7 +109,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
* null if delivery of events is not required. * null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
*/ */
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer( public MediaCodecAudioRenderer(
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@ -151,43 +117,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
this( this(
context, context,
mediaCodecSelector, mediaCodecSelector,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
eventHandler,
eventListener);
}
/**
* @param context A context.
* @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
@Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener) {
this(
context,
mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler, eventHandler,
eventListener, eventListener,
(AudioCapabilities) null); (AudioCapabilities) null);
@ -196,13 +125,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
/** /**
* @param context A context. * @param context A context.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be * @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required. * null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
@ -210,17 +132,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
* default capabilities (no encoded audio passthrough support) should be assumed. * default capabilities (no encoded audio passthrough support) should be assumed.
* @param audioProcessors Optional {@link AudioProcessor}s that will process PCM audio before * @param audioProcessors Optional {@link AudioProcessor}s that will process PCM audio before
* output. * output.
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/ */
@Deprecated
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer( public MediaCodecAudioRenderer(
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener, @Nullable AudioRendererEventListener eventListener,
@Nullable AudioCapabilities audioCapabilities, @Nullable AudioCapabilities audioCapabilities,
@ -228,8 +143,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
this( this(
context, context,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler, eventHandler,
eventListener, eventListener,
new DefaultAudioSink(audioCapabilities, audioProcessors)); new DefaultAudioSink(audioCapabilities, audioProcessors));
@ -238,36 +151,20 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
/** /**
* @param context A context. * @param context A context.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be * @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required. * null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioSink The sink to which audio will be output. * @param audioSink The sink to which audio will be output.
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/ */
@Deprecated
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer( public MediaCodecAudioRenderer(
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener, @Nullable AudioRendererEventListener eventListener,
AudioSink audioSink) { AudioSink audioSink) {
this( this(
context, context,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
/* enableDecoderFallback= */ false, /* enableDecoderFallback= */ false,
eventHandler, eventHandler,
eventListener, eventListener,
@ -285,7 +182,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioSink The sink to which audio will be output. * @param audioSink The sink to which audio will be output.
*/ */
@SuppressWarnings("deprecation")
public MediaCodecAudioRenderer( public MediaCodecAudioRenderer(
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@ -293,53 +189,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener, @Nullable AudioRendererEventListener eventListener,
AudioSink audioSink) { AudioSink audioSink) {
this(
context,
mediaCodecSelector,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
enableDecoderFallback,
eventHandler,
eventListener,
audioSink);
}
/**
* @param context A context.
* @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
* initialization fails. This may result in using a decoder that is slower/less efficient than
* the primary decoder.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioSink The sink to which audio will be output.
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/
@Deprecated
public MediaCodecAudioRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
boolean enableDecoderFallback,
@Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener,
AudioSink audioSink) {
super( super(
C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_AUDIO,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback, enableDecoderFallback,
/* assumedMinimumCodecOperatingRate= */ 44100); /* assumedMinimumCodecOperatingRate= */ 44100);
this.context = context.getApplicationContext(); this.context = context.getApplicationContext();
@ -352,7 +204,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
@Capabilities @Capabilities
protected int supportsFormat( protected int supportsFormat(
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
Format format) Format format)
throws DecoderQueryException { throws DecoderQueryException {
String mimeType = format.sampleMimeType; String mimeType = format.sampleMimeType;
@ -362,10 +213,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
@TunnelingSupport @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 || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType)
|| (format.exoMediaCryptoType == null
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
if (supportsFormatDrm if (supportsFormatDrm
&& allowPassthrough(format.channelCount, mimeType) && allowPassthrough(format.channelCount, mimeType)
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) { && mediaCodecSelector.getPassthroughDecoderInfo() != null) {

View File

@ -36,7 +36,6 @@ import com.google.android.exoplayer2.decoder.SimpleDecoder;
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.MediaClock; import com.google.android.exoplayer2.util.MediaClock;
@ -91,13 +90,10 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
*/ */
private static final int REINITIALIZATION_STATE_WAIT_END_OF_STREAM = 2; private static final int REINITIALIZATION_STATE_WAIT_END_OF_STREAM = 2;
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
private final boolean playClearSamplesWithoutKeys;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final AudioSink audioSink; private final AudioSink audioSink;
private final DecoderInputBuffer flagsOnlyBuffer; private final DecoderInputBuffer flagsOnlyBuffer;
private boolean drmResourcesAcquired;
private DecoderCounters decoderCounters; private DecoderCounters decoderCounters;
private Format inputFormat; private Format inputFormat;
private int encoderDelay; private int encoderDelay;
@ -142,8 +138,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
eventHandler, eventHandler,
eventListener, eventListener,
/* audioCapabilities= */ null, /* audioCapabilities= */ null,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
audioProcessors); audioProcessors);
} }
@ -153,67 +147,27 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioCapabilities The audio capabilities for playback on this device. May be null if the * @param audioCapabilities The audio capabilities for playback on this device. May be null if the
* default capabilities (no encoded audio passthrough support) should be assumed. * default capabilities (no encoded audio passthrough support) should be assumed.
*/
public SimpleDecoderAudioRenderer(
@Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener,
@Nullable AudioCapabilities audioCapabilities) {
this(
eventHandler,
eventListener,
audioCapabilities,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false);
}
/**
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param audioCapabilities The audio capabilities for playback on this device. May be null if the
* default capabilities (no encoded audio passthrough support) should be assumed.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output. * @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
*/ */
public SimpleDecoderAudioRenderer( public SimpleDecoderAudioRenderer(
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener, @Nullable AudioRendererEventListener eventListener,
@Nullable AudioCapabilities audioCapabilities, @Nullable AudioCapabilities audioCapabilities,
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
AudioProcessor... audioProcessors) { AudioProcessor... audioProcessors) {
this(eventHandler, eventListener, drmSessionManager, this(eventHandler, eventListener, new DefaultAudioSink(audioCapabilities, audioProcessors));
playClearSamplesWithoutKeys, new DefaultAudioSink(audioCapabilities, audioProcessors));
} }
/** /**
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be * @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required. * null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param audioSink The sink to which audio will be output. * @param audioSink The sink to which audio will be output.
*/ */
public SimpleDecoderAudioRenderer( public SimpleDecoderAudioRenderer(
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable AudioRendererEventListener eventListener, @Nullable AudioRendererEventListener eventListener,
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
AudioSink audioSink) { AudioSink audioSink) {
super(C.TRACK_TYPE_AUDIO); super(C.TRACK_TYPE_AUDIO);
this.drmSessionManager = drmSessionManager;
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
eventDispatcher = new EventDispatcher(eventHandler, eventListener); eventDispatcher = new EventDispatcher(eventHandler, eventListener);
this.audioSink = audioSink; this.audioSink = audioSink;
audioSink.setListener(new AudioSinkListener()); audioSink.setListener(new AudioSinkListener());
@ -234,7 +188,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
if (!MimeTypes.isAudio(format.sampleMimeType)) { if (!MimeTypes.isAudio(format.sampleMimeType)) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }
@FormatSupport int formatSupport = supportsFormatInternal(drmSessionManager, format); @FormatSupport int formatSupport = supportsFormatInternal(format);
if (formatSupport <= FORMAT_UNSUPPORTED_DRM) { if (formatSupport <= FORMAT_UNSUPPORTED_DRM) {
return RendererCapabilities.create(formatSupport); return RendererCapabilities.create(formatSupport);
} }
@ -246,13 +200,11 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
/** /**
* Returns the {@link FormatSupport} for the given {@link Format}. * Returns the {@link FormatSupport} for the given {@link Format}.
* *
* @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 {@link FormatSupport} for this {@link Format}. * @return The {@link FormatSupport} for this {@link Format}.
*/ */
@FormatSupport @FormatSupport
protected abstract int supportsFormatInternal( protected abstract int supportsFormatInternal(Format format);
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
/** /**
* Returns whether the sink supports the audio format. * Returns whether the sink supports the audio format.
@ -476,8 +428,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException { private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
if (decoderDrmSession == null if (decoderDrmSession == null
|| (!bufferEncrypted || (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
&& (playClearSamplesWithoutKeys || decoderDrmSession.playClearSamplesWithoutKeys()))) {
return false; return false;
} }
@DrmSession.State int drmSessionState = decoderDrmSession.getState(); @DrmSession.State int drmSessionState = decoderDrmSession.getState();
@ -544,10 +495,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
@Override @Override
protected void onEnabled(boolean joining) throws ExoPlaybackException { protected void onEnabled(boolean joining) throws ExoPlaybackException {
if (drmSessionManager != null && !drmResourcesAcquired) {
drmResourcesAcquired = true;
drmSessionManager.prepare();
}
decoderCounters = new DecoderCounters(); decoderCounters = new DecoderCounters();
eventDispatcher.enabled(decoderCounters); eventDispatcher.enabled(decoderCounters);
int tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId; int tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId;
@ -596,14 +543,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
} }
} }
@Override
protected void onReset() {
if (drmSessionManager != null && drmResourcesAcquired) {
drmResourcesAcquired = false;
drmSessionManager.release();
}
}
@Override @Override
public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException { public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException {
switch (messageType) { switch (messageType) {
@ -686,12 +625,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
Format newFormat = Assertions.checkNotNull(formatHolder.format); Format newFormat = Assertions.checkNotNull(formatHolder.format);
if (formatHolder.includesDrmSession) { setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
} else {
sourceDrmSession =
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
}
Format oldFormat = inputFormat; Format oldFormat = inputFormat;
inputFormat = newFormat; inputFormat = newFormat;

View File

@ -38,7 +38,6 @@ import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
@ -379,8 +378,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
private static final int ADAPTATION_WORKAROUND_SLICE_WIDTH_HEIGHT = 32; private static final int ADAPTATION_WORKAROUND_SLICE_WIDTH_HEIGHT = 32;
private final MediaCodecSelector mediaCodecSelector; private final MediaCodecSelector mediaCodecSelector;
@Nullable private final DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
private final boolean playClearSamplesWithoutKeys;
private final boolean enableDecoderFallback; private final boolean enableDecoderFallback;
private final float assumedMinimumCodecOperatingRate; private final float assumedMinimumCodecOperatingRate;
private final DecoderInputBuffer buffer; private final DecoderInputBuffer buffer;
@ -391,7 +388,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
private final long[] pendingOutputStreamOffsetsUs; private final long[] pendingOutputStreamOffsetsUs;
private final long[] pendingOutputStreamSwitchTimesUs; private final long[] pendingOutputStreamSwitchTimesUs;
private boolean drmResourcesAcquired;
@Nullable private Format inputFormat; @Nullable private Format inputFormat;
private Format outputFormat; private Format outputFormat;
@Nullable private DrmSession<FrameworkMediaCrypto> codecDrmSession; @Nullable private DrmSession<FrameworkMediaCrypto> codecDrmSession;
@ -448,13 +444,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
* @param trackType The track type that the renderer handles. One of the {@code C.TRACK_TYPE_*} * @param trackType The track type that the renderer handles. One of the {@code C.TRACK_TYPE_*}
* constants defined in {@link C}. * constants defined in {@link C}.
* @param mediaCodecSelector A decoder selector. * @param mediaCodecSelector A decoder selector.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder * @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
* initialization fails. This may result in using a decoder that is less efficient or slower * initialization fails. This may result in using a decoder that is less efficient or slower
* than the primary decoder. * than the primary decoder.
@ -465,14 +454,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
public MediaCodecRenderer( public MediaCodecRenderer(
int trackType, int trackType,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
boolean enableDecoderFallback, boolean enableDecoderFallback,
float assumedMinimumCodecOperatingRate) { float assumedMinimumCodecOperatingRate) {
super(trackType); super(trackType);
this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector); this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector);
this.drmSessionManager = drmSessionManager;
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
this.enableDecoderFallback = enableDecoderFallback; this.enableDecoderFallback = enableDecoderFallback;
this.assumedMinimumCodecOperatingRate = assumedMinimumCodecOperatingRate; this.assumedMinimumCodecOperatingRate = assumedMinimumCodecOperatingRate;
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED); buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED);
@ -550,7 +535,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Capabilities @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, format);
} catch (DecoderQueryException e) { } catch (DecoderQueryException e) {
throw createRendererException(e, format); throw createRendererException(e, format);
} }
@ -560,7 +545,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
* Returns the {@link Capabilities} for the 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 format The {@link Format}. * @param format The {@link Format}.
* @return The {@link Capabilities} for this {@link Format}. * @return The {@link Capabilities} for this {@link Format}.
* @throws DecoderQueryException If there was an error querying decoders. * @throws DecoderQueryException If there was an error querying decoders.
@ -568,7 +552,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Capabilities @Capabilities
protected abstract int supportsFormat( protected abstract int supportsFormat(
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
Format format) Format format)
throws DecoderQueryException; throws DecoderQueryException;
@ -696,10 +679,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
@Override @Override
protected void onEnabled(boolean joining) throws ExoPlaybackException { protected void onEnabled(boolean joining) throws ExoPlaybackException {
if (drmSessionManager != null && !drmResourcesAcquired) {
drmResourcesAcquired = true;
drmSessionManager.prepare();
}
decoderCounters = new DecoderCounters(); decoderCounters = new DecoderCounters();
} }
@ -771,10 +750,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
} finally { } finally {
setSourceDrmSession(null); setSourceDrmSession(null);
} }
if (drmSessionManager != null && drmResourcesAcquired) {
drmResourcesAcquired = false;
drmSessionManager.release();
}
} }
protected void releaseCodec() { protected void releaseCodec() {
@ -1366,8 +1341,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException { private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
if (codecDrmSession == null if (codecDrmSession == null
|| (!bufferEncrypted || (!bufferEncrypted && codecDrmSession.playClearSamplesWithoutKeys())) {
&& (playClearSamplesWithoutKeys || codecDrmSession.playClearSamplesWithoutKeys()))) {
return false; return false;
} }
@DrmSession.State int drmSessionState = codecDrmSession.getState(); @DrmSession.State int drmSessionState = codecDrmSession.getState();
@ -1402,12 +1376,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
waitingForFirstSampleInFormat = true; waitingForFirstSampleInFormat = true;
Format newFormat = Assertions.checkNotNull(formatHolder.format); Format newFormat = Assertions.checkNotNull(formatHolder.format);
if (formatHolder.includesDrmSession) { setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
} else {
sourceDrmSession =
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
}
inputFormat = newFormat; inputFormat = newFormat;
if (codec == null) { if (codec == null) {

View File

@ -96,7 +96,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
if (decoderFactory.supportsFormat(format)) { if (decoderFactory.supportsFormat(format)) {
return RendererCapabilities.create( return RendererCapabilities.create(
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM); format.drmInitData == null ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
} else { } else {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
} }

View File

@ -171,8 +171,7 @@ public final class DownloadHelper {
new VideoRendererEventListener() {}, new VideoRendererEventListener() {},
new AudioRendererEventListener() {}, new AudioRendererEventListener() {},
(cues) -> {}, (cues) -> {},
(metadata) -> {}, (metadata) -> {});
/* drmSessionManager= */ null);
RendererCapabilities[] capabilities = new RendererCapabilities[renderers.length]; RendererCapabilities[] capabilities = new RendererCapabilities[renderers.length];
for (int i = 0; i < renderers.length; i++) { for (int i = 0; i < renderers.length; i++) {
capabilities[i] = renderers[i].getCapabilities(); capabilities[i] = renderers[i].getCapabilities();

View File

@ -123,7 +123,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
public int supportsFormat(Format format) { public int supportsFormat(Format format) {
if (decoderFactory.supportsFormat(format)) { if (decoderFactory.supportsFormat(format)) {
return RendererCapabilities.create( return RendererCapabilities.create(
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM); format.drmInitData == null ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
} else if (MimeTypes.isText(format.sampleMimeType)) { } else if (MimeTypes.isText(format.sampleMimeType)) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} else { } else {

View File

@ -41,7 +41,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.RendererCapabilities; 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.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
@ -49,7 +48,6 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
import com.google.android.exoplayer2.mediacodec.MediaFormatUtil; import com.google.android.exoplayer2.mediacodec.MediaFormatUtil;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
@ -194,7 +192,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between * @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
*/ */
@SuppressWarnings("deprecation")
public MediaCodecVideoRenderer( public MediaCodecVideoRenderer(
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@ -206,51 +203,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
context, context,
mediaCodecSelector, mediaCodecSelector,
allowedJoiningTimeMs, allowedJoiningTimeMs,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
eventHandler,
eventListener,
maxDroppedFramesToNotify);
}
/**
* @param context A context.
* @param mediaCodecSelector A decoder selector.
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
* can attempt to seamlessly join an ongoing playback.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
* @deprecated Use {@link #MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean,
* Handler, VideoRendererEventListener, int)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/
@Deprecated
@SuppressWarnings("deprecation")
public MediaCodecVideoRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify) {
this(
context,
mediaCodecSelector,
allowedJoiningTimeMs,
drmSessionManager,
playClearSamplesWithoutKeys,
/* enableDecoderFallback= */ false, /* enableDecoderFallback= */ false,
eventHandler, eventHandler,
eventListener, eventListener,
@ -271,7 +223,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between * @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
*/ */
@SuppressWarnings("deprecation")
public MediaCodecVideoRenderer( public MediaCodecVideoRenderer(
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@ -280,58 +231,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener, @Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify) { int maxDroppedFramesToNotify) {
this(
context,
mediaCodecSelector,
allowedJoiningTimeMs,
/* drmSessionManager= */ null,
/* playClearSamplesWithoutKeys= */ false,
enableDecoderFallback,
eventHandler,
eventListener,
maxDroppedFramesToNotify);
}
/**
* @param context A context.
* @param mediaCodecSelector A decoder selector.
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
* can attempt to seamlessly join an ongoing playback.
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
* content is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
* initialization fails. This may result in using a decoder that is slower/less efficient than
* the primary decoder.
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
* null if delivery of events is not required.
* @param eventListener A listener of events. May be null if delivery of events is not required.
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
* @deprecated Use {@link #MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean,
* Handler, VideoRendererEventListener, int)} instead, and pass DRM-related parameters to the
* {@link MediaSource} factories.
*/
@Deprecated
public MediaCodecVideoRenderer(
Context context,
MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
boolean enableDecoderFallback,
@Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify) {
super( super(
C.TRACK_TYPE_VIDEO, C.TRACK_TYPE_VIDEO,
mediaCodecSelector, mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
enableDecoderFallback, enableDecoderFallback,
/* assumedMinimumCodecOperatingRate= */ 30); /* assumedMinimumCodecOperatingRate= */ 30);
this.allowedJoiningTimeMs = allowedJoiningTimeMs; this.allowedJoiningTimeMs = allowedJoiningTimeMs;
@ -353,7 +255,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
@Capabilities @Capabilities
protected int supportsFormat( protected int supportsFormat(
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
Format format) Format format)
throws DecoderQueryException { throws DecoderQueryException {
String mimeType = format.sampleMimeType; String mimeType = format.sampleMimeType;
@ -382,10 +283,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE); return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
} }
boolean supportsFormatDrm = boolean supportsFormatDrm =
drmInitData == null drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType)
|| (format.exoMediaCryptoType == null
&& supportsFormatDrm(drmSessionManager, drmInitData));
if (!supportsFormatDrm) { if (!supportsFormatDrm) {
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM); return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
} }

View File

@ -26,13 +26,11 @@ 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.decoder.DecoderCounters; import com.google.android.exoplayer2.decoder.DecoderCounters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleDecoder;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.TimedValueQueue; import com.google.android.exoplayer2.util.TimedValueQueue;
@ -71,13 +69,10 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
private final long allowedJoiningTimeMs; private final long allowedJoiningTimeMs;
private final int maxDroppedFramesToNotify; private final int maxDroppedFramesToNotify;
private final boolean playClearSamplesWithoutKeys;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final TimedValueQueue<Format> formatQueue; private final TimedValueQueue<Format> formatQueue;
private final DecoderInputBuffer flagsOnlyBuffer; private final DecoderInputBuffer flagsOnlyBuffer;
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
private boolean drmResourcesAcquired;
private Format inputFormat; private Format inputFormat;
private Format outputFormat; private Format outputFormat;
private SimpleDecoder< private SimpleDecoder<
@ -126,26 +121,15 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
* @param eventListener A listener of events. May be null if delivery of events is not required. * @param eventListener A listener of events. May be null if delivery of events is not required.
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between * @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}. * invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
* media is not required.
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
* For example a media file may start with a short clear region so as to allow playback to
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
* has obtained the keys necessary to decrypt encrypted regions of the media.
*/ */
protected SimpleDecoderVideoRenderer( protected SimpleDecoderVideoRenderer(
long allowedJoiningTimeMs, long allowedJoiningTimeMs,
@Nullable Handler eventHandler, @Nullable Handler eventHandler,
@Nullable VideoRendererEventListener eventListener, @Nullable VideoRendererEventListener eventListener,
int maxDroppedFramesToNotify, int maxDroppedFramesToNotify) {
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys) {
super(C.TRACK_TYPE_VIDEO); super(C.TRACK_TYPE_VIDEO);
this.allowedJoiningTimeMs = allowedJoiningTimeMs; this.allowedJoiningTimeMs = allowedJoiningTimeMs;
this.maxDroppedFramesToNotify = maxDroppedFramesToNotify; this.maxDroppedFramesToNotify = maxDroppedFramesToNotify;
this.drmSessionManager = drmSessionManager;
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
joiningDeadlineMs = C.TIME_UNSET; joiningDeadlineMs = C.TIME_UNSET;
clearReportedVideoSize(); clearReportedVideoSize();
formatQueue = new TimedValueQueue<>(); formatQueue = new TimedValueQueue<>();
@ -157,12 +141,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
// BaseRenderer implementation. // BaseRenderer implementation.
@Override
@Capabilities
public final int supportsFormat(Format format) {
return supportsFormatInternal(drmSessionManager, format);
}
@Override @Override
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
if (outputStreamEnded) { if (outputStreamEnded) {
@ -238,10 +216,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
@Override @Override
protected void onEnabled(boolean joining) throws ExoPlaybackException { protected void onEnabled(boolean joining) throws ExoPlaybackException {
if (drmSessionManager != null && !drmResourcesAcquired) {
drmResourcesAcquired = true;
drmSessionManager.prepare();
}
decoderCounters = new DecoderCounters(); decoderCounters = new DecoderCounters();
eventDispatcher.enabled(decoderCounters); eventDispatcher.enabled(decoderCounters);
} }
@ -291,14 +265,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
} }
} }
@Override
protected void onReset() {
if (drmSessionManager != null && drmResourcesAcquired) {
drmResourcesAcquired = false;
drmSessionManager.release();
}
}
@Override @Override
protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlaybackException { protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlaybackException {
outputStreamOffsetUs = offsetUs; outputStreamOffsetUs = offsetUs;
@ -371,12 +337,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
waitingForFirstSampleInFormat = true; waitingForFirstSampleInFormat = true;
Format newFormat = Assertions.checkNotNull(formatHolder.format); Format newFormat = Assertions.checkNotNull(formatHolder.format);
if (formatHolder.includesDrmSession) { setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
} else {
sourceDrmSession =
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
}
inputFormat = newFormat; inputFormat = newFormat;
if (sourceDrmSession != decoderDrmSession) { if (sourceDrmSession != decoderDrmSession) {
@ -511,18 +472,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
} }
} }
/**
* Returns the {@link Capabilities} for the given {@link Format}.
*
* @param drmSessionManager The renderer's {@link DrmSessionManager}.
* @param format The format, which has a video {@link Format#sampleMimeType}.
* @return The {@link Capabilities} for this {@link Format}.
* @see RendererCapabilities#supportsFormat(Format)
*/
@Capabilities
protected abstract int supportsFormatInternal(
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
/** /**
* Creates a decoder for the given format. * Creates a decoder for the given format.
* *
@ -893,9 +842,9 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
} }
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException { private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
DrmSession<ExoMediaCrypto> decoderDrmSession = this.decoderDrmSession;
if (decoderDrmSession == null if (decoderDrmSession == null
|| (!bufferEncrypted || (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
&& (playClearSamplesWithoutKeys || decoderDrmSession.playClearSamplesWithoutKeys()))) {
return false; return false;
} }
@DrmSession.State int drmSessionState = decoderDrmSession.getState(); @DrmSession.State int drmSessionState = decoderDrmSession.getState();

View File

@ -1167,8 +1167,7 @@ public final class AnalyticsCollectorTest {
videoRendererEventListener, videoRendererEventListener,
audioRendererEventListener, audioRendererEventListener,
textRendererOutput, textRendererOutput,
metadataRendererOutput, metadataRendererOutput) ->
drmSessionManager) ->
new Renderer[] { new Renderer[] {
new FakeVideoRenderer(eventHandler, videoRendererEventListener), new FakeVideoRenderer(eventHandler, videoRendererEventListener),
new FakeAudioRenderer(eventHandler, audioRendererEventListener) new FakeAudioRenderer(eventHandler, audioRendererEventListener)

View File

@ -32,7 +32,6 @@ import com.google.android.exoplayer2.RendererConfiguration;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.decoder.SimpleDecoder; import com.google.android.exoplayer2.decoder.SimpleDecoder;
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer; import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.drm.ExoMediaCrypto;
import com.google.android.exoplayer2.testutil.FakeSampleStream; import com.google.android.exoplayer2.testutil.FakeSampleStream;
import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.MimeTypes;
@ -56,11 +55,10 @@ public class SimpleDecoderAudioRendererTest {
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
audioRenderer = audioRenderer =
new SimpleDecoderAudioRenderer(null, null, null, false, mockAudioSink) { new SimpleDecoderAudioRenderer(null, null, mockAudioSink) {
@Override @Override
@FormatSupport @FormatSupport
protected int supportsFormatInternal( protected int supportsFormatInternal(Format format) {
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
return FORMAT_HANDLED; return FORMAT_HANDLED;
} }

View File

@ -123,7 +123,7 @@ public class DownloadHelperTest {
FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh); FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh);
FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh); FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh);
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
(handler, videoListener, audioListener, metadata, text, drm) -> (handler, videoListener, audioListener, metadata, text) ->
new Renderer[] {textRenderer, audioRenderer, videoRenderer}; new Renderer[] {textRenderer, audioRenderer, videoRenderer};
downloadHelper = downloadHelper =

View File

@ -35,11 +35,11 @@ public final class DownloadHelperTest {
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]); (handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
DownloadHelper.forDash( DownloadHelper.forDash(
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0], (handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
/* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(), /* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(),
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT); DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
} }

View File

@ -34,11 +34,11 @@ public final class DownloadHelperTest {
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]); (handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
DownloadHelper.forHls( DownloadHelper.forHls(
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0], (handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT); DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
} }

View File

@ -34,11 +34,11 @@ public final class DownloadHelperTest {
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]); (handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
DownloadHelper.forSmoothStreaming( DownloadHelper.forSmoothStreaming(
Uri.parse("http://uri"), Uri.parse("http://uri"),
new FakeDataSource.Factory(), new FakeDataSource.Factory(),
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0], (handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
/* drmSessionManager= */ null, /* drmSessionManager= */ null,
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT); DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
} }

View File

@ -270,7 +270,7 @@ import java.util.List;
C.WIDEVINE_UUID, C.WIDEVINE_UUID,
frameworkMediaDrm, frameworkMediaDrm,
drmCallback, drmCallback,
/* optionalKeyRequestParameters= */ null, /* keyRequestParameters= */ null,
/* multiSession= */ false, /* multiSession= */ false,
DefaultDrmSessionManager.INITIAL_DRM_REQUEST_RETRY_COUNT); DefaultDrmSessionManager.INITIAL_DRM_REQUEST_RETRY_COUNT);
if (!useL1Widevine) { if (!useL1Widevine) {

View File

@ -27,8 +27,6 @@ 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.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo; import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer; import com.google.android.exoplayer2.video.MediaCodecVideoRenderer;
@ -53,8 +51,6 @@ import java.util.ArrayList;
Context context, Context context,
@ExtensionRendererMode int extensionRendererMode, @ExtensionRendererMode int extensionRendererMode,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
boolean enableDecoderFallback, boolean enableDecoderFallback,
Handler eventHandler, Handler eventHandler,
VideoRendererEventListener eventListener, VideoRendererEventListener eventListener,
@ -65,8 +61,6 @@ import java.util.ArrayList;
context, context,
mediaCodecSelector, mediaCodecSelector,
allowedVideoJoiningTimeMs, allowedVideoJoiningTimeMs,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler, eventHandler,
eventListener, eventListener,
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
@ -92,8 +86,6 @@ import java.util.ArrayList;
Context context, Context context,
MediaCodecSelector mediaCodecSelector, MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs, long allowedJoiningTimeMs,
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
Handler eventHandler, Handler eventHandler,
VideoRendererEventListener eventListener, VideoRendererEventListener eventListener,
int maxDroppedFrameCountToNotify) { int maxDroppedFrameCountToNotify) {
@ -101,8 +93,6 @@ import java.util.ArrayList;
context, context,
mediaCodecSelector, mediaCodecSelector,
allowedJoiningTimeMs, allowedJoiningTimeMs,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler, eventHandler,
eventListener, eventListener,
maxDroppedFrameCountToNotify); maxDroppedFrameCountToNotify);

View File

@ -93,7 +93,6 @@ public final class DefaultRenderersFactoryAsserts {
new VideoRendererEventListener() {}, new VideoRendererEventListener() {},
new AudioRendererEventListener() {}, new AudioRendererEventListener() {},
(List<Cue> cues) -> {}, (List<Cue> cues) -> {},
(Metadata metadata) -> {}, (Metadata metadata) -> {});
/* drmSessionManager= */ null);
} }
} }

View File

@ -371,8 +371,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
videoRendererEventListener, videoRendererEventListener,
audioRendererEventListener, audioRendererEventListener,
textRendererOutput, textRendererOutput,
metadataRendererOutput, metadataRendererOutput) -> renderers;
drmSessionManager) -> renderers;
} }
if (loadControl == null) { if (loadControl == null) {
loadControl = new DefaultLoadControl(); loadControl = new DefaultLoadControl();