Remove DRM management from Renderers
PiperOrigin-RevId: 295569075
This commit is contained in:
parent
d3f806fdf4
commit
5c3c803460
@ -46,7 +46,11 @@
|
||||
[background](https://www.w3.org/TR/webvtt1/#default-text-background) colors
|
||||
([PR #4178](https://github.com/google/ExoPlayer/pull/4178),
|
||||
[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
|
||||
speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)).
|
||||
* MP3: Add `IndexSeeker` for accurate seeks in VBR streams
|
||||
|
@ -27,7 +27,6 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.PlayerMessage.Target;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
import com.google.android.exoplayer2.util.TraceUtil;
|
||||
@ -121,13 +120,7 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
|
||||
int threads,
|
||||
int numInputBuffers,
|
||||
int numOutputBuffers) {
|
||||
super(
|
||||
allowedJoiningTimeMs,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
maxDroppedFramesToNotify,
|
||||
/* drmSessionManager= */ null,
|
||||
/* playClearSamplesWithoutKeys= */ false);
|
||||
super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
|
||||
this.threads = threads;
|
||||
this.numInputBuffers = numInputBuffers;
|
||||
this.numOutputBuffers = numOutputBuffers;
|
||||
@ -135,13 +128,12 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
|
||||
|
||||
@Override
|
||||
@Capabilities
|
||||
protected int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
||||
public final int supportsFormat(Format format) {
|
||||
if (!MimeTypes.VIDEO_AV1.equalsIgnoreCase(format.sampleMimeType)
|
||||
|| !Gav1Library.isAvailable()) {
|
||||
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_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED);
|
||||
|
@ -18,14 +18,12 @@ package com.google.android.exoplayer2.ext.ffmpeg;
|
||||
import android.os.Handler;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||
import com.google.android.exoplayer2.audio.AudioSink;
|
||||
import com.google.android.exoplayer2.audio.DefaultAudioSink;
|
||||
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.util.Assertions;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
@ -85,22 +83,19 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
|
||||
super(
|
||||
eventHandler,
|
||||
eventListener,
|
||||
/* drmSessionManager= */ null,
|
||||
/* playClearSamplesWithoutKeys= */ false,
|
||||
audioSink);
|
||||
this.enableFloatOutput = enableFloatOutput;
|
||||
}
|
||||
|
||||
@Override
|
||||
@FormatSupport
|
||||
protected int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
||||
protected int supportsFormatInternal(Format format) {
|
||||
Assertions.checkNotNull(format.sampleMimeType);
|
||||
if (!FfmpegLibrary.isAvailable()) {
|
||||
return FORMAT_UNSUPPORTED_TYPE;
|
||||
} else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType) || !isOutputSupported(format)) {
|
||||
return FORMAT_UNSUPPORTED_SUBTYPE;
|
||||
} else if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) {
|
||||
} else if (format.drmInitData != null && format.exoMediaCryptoType == null) {
|
||||
return FORMAT_UNSUPPORTED_DRM;
|
||||
} else {
|
||||
return FORMAT_HANDLED;
|
||||
@ -109,7 +104,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
|
||||
|
||||
@Override
|
||||
@AdaptiveSupport
|
||||
public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
|
||||
public final int supportsMixedMimeTypeAdaptation() {
|
||||
return ADAPTIVE_NOT_SEAMLESS;
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,6 @@ import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||
import com.google.android.exoplayer2.audio.AudioSink;
|
||||
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.extractor.FlacStreamMetadata;
|
||||
import com.google.android.exoplayer2.util.Assertions;
|
||||
@ -69,15 +68,12 @@ public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
|
||||
super(
|
||||
eventHandler,
|
||||
eventListener,
|
||||
/* drmSessionManager= */ null,
|
||||
/* playClearSamplesWithoutKeys= */ false,
|
||||
audioSink);
|
||||
}
|
||||
|
||||
@Override
|
||||
@FormatSupport
|
||||
protected int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
||||
protected int supportsFormatInternal(Format format) {
|
||||
if (!FlacLibrary.isAvailable()
|
||||
|| !MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType)) {
|
||||
return FORMAT_UNSUPPORTED_TYPE;
|
||||
@ -99,7 +95,7 @@ public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
|
||||
}
|
||||
if (!supportsOutput(format.channelCount, pcmEncoding)) {
|
||||
return FORMAT_UNSUPPORTED_SUBTYPE;
|
||||
} else if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) {
|
||||
} else if (format.drmInitData != null && format.exoMediaCryptoType == null) {
|
||||
return FORMAT_UNSUPPORTED_DRM;
|
||||
} else {
|
||||
return FORMAT_HANDLED;
|
||||
|
@ -22,9 +22,7 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||
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.source.MediaSource;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
|
||||
/** Decodes and renders audio using the native Opus decoder. */
|
||||
@ -55,42 +53,12 @@ public class LibopusAudioRenderer extends SimpleDecoderAudioRenderer {
|
||||
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
|
||||
@FormatSupport
|
||||
protected int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
||||
protected int supportsFormatInternal(Format format) {
|
||||
boolean drmIsSupported =
|
||||
format.drmInitData == null
|
||||
|| OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType)
|
||||
|| (format.exoMediaCryptoType == null
|
||||
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
|
||||
|| OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType);
|
||||
if (!OpusLibrary.isAvailable()
|
||||
|| !MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)) {
|
||||
return FORMAT_UNSUPPORTED_TYPE;
|
||||
|
@ -27,9 +27,7 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.PlayerMessage.Target;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||
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.TraceUtil;
|
||||
import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer;
|
||||
@ -101,45 +99,6 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|
||||
eventHandler,
|
||||
eventListener,
|
||||
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(),
|
||||
/* numInputBuffers= */ 4,
|
||||
/* numOutputBuffers= */ 4);
|
||||
@ -166,58 +125,7 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|
||||
int threads,
|
||||
int numInputBuffers,
|
||||
int numOutputBuffers) {
|
||||
this(
|
||||
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);
|
||||
super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
|
||||
this.threads = threads;
|
||||
this.numInputBuffers = numInputBuffers;
|
||||
this.numOutputBuffers = numOutputBuffers;
|
||||
@ -225,16 +133,13 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|
||||
|
||||
@Override
|
||||
@Capabilities
|
||||
protected int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
||||
public final int supportsFormat(Format format) {
|
||||
if (!VpxLibrary.isAvailable() || !MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)) {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||
}
|
||||
boolean drmIsSupported =
|
||||
format.drmInitData == null
|
||||
|| VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType)
|
||||
|| (format.exoMediaCryptoType == null
|
||||
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
|
||||
|| VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType);
|
||||
if (!drmIsSupported) {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
||||
}
|
||||
|
@ -18,7 +18,6 @@ package com.google.android.exoplayer2;
|
||||
import android.os.Looper;
|
||||
import androidx.annotation.Nullable;
|
||||
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.DrmSessionManager;
|
||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||
@ -411,26 +410,4 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
||||
protected final boolean isSourceReady() {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,14 +20,11 @@ import android.media.MediaCodec;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import androidx.annotation.IntDef;
|
||||
import androidx.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.audio.AudioCapabilities;
|
||||
import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||
import com.google.android.exoplayer2.audio.DefaultAudioSink;
|
||||
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.MediaCodecSelector;
|
||||
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;
|
||||
|
||||
private final Context context;
|
||||
@Nullable private DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
|
||||
@ExtensionRendererMode private int extensionRendererMode;
|
||||
private long allowedVideoJoiningTimeMs;
|
||||
private boolean playClearSamplesWithoutKeys;
|
||||
private boolean enableDecoderFallback;
|
||||
private MediaCodecSelector mediaCodecSelector;
|
||||
@MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode;
|
||||
@ -105,17 +100,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
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
|
||||
* #setExtensionRendererMode(int)}.
|
||||
@ -127,48 +111,18 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
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
|
||||
* #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}.
|
||||
*/
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public DefaultRenderersFactory(
|
||||
Context context,
|
||||
@ExtensionRendererMode int extensionRendererMode,
|
||||
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.extensionRendererMode = extensionRendererMode;
|
||||
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
|
||||
this.drmSessionManager = drmSessionManager;
|
||||
mediaCodecSelector = MediaCodecSelector.DEFAULT;
|
||||
}
|
||||
|
||||
@ -203,25 +157,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
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.
|
||||
* 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,
|
||||
AudioRendererEventListener audioRendererEventListener,
|
||||
TextOutput textRendererOutput,
|
||||
MetadataOutput metadataRendererOutput,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
||||
if (drmSessionManager == null) {
|
||||
drmSessionManager = this.drmSessionManager;
|
||||
}
|
||||
MetadataOutput metadataRendererOutput) {
|
||||
ArrayList<Renderer> renderersList = new ArrayList<>();
|
||||
buildVideoRenderers(
|
||||
context,
|
||||
extensionRendererMode,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
enableDecoderFallback,
|
||||
eventHandler,
|
||||
videoRendererEventListener,
|
||||
@ -290,8 +219,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
context,
|
||||
extensionRendererMode,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
enableDecoderFallback,
|
||||
buildAudioProcessors(),
|
||||
eventHandler,
|
||||
@ -312,11 +239,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
* @param context The {@link Context} associated with the player.
|
||||
* @param extensionRendererMode The extension renderer mode.
|
||||
* @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
|
||||
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
||||
* the primary decoder.
|
||||
@ -330,8 +252,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
Context context,
|
||||
@ExtensionRendererMode int extensionRendererMode,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
boolean enableDecoderFallback,
|
||||
Handler eventHandler,
|
||||
VideoRendererEventListener eventListener,
|
||||
@ -342,8 +262,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
allowedVideoJoiningTimeMs,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
enableDecoderFallback,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
@ -420,11 +338,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
* @param context The {@link Context} associated with the player.
|
||||
* @param extensionRendererMode The extension renderer mode.
|
||||
* @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
|
||||
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
||||
* the primary decoder.
|
||||
@ -438,8 +351,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
Context context,
|
||||
@ExtensionRendererMode int extensionRendererMode,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
boolean enableDecoderFallback,
|
||||
AudioProcessor[] audioProcessors,
|
||||
Handler eventHandler,
|
||||
@ -449,8 +360,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
||||
new MediaCodecAudioRenderer(
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
enableDecoderFallback,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
|
@ -17,11 +17,7 @@ package com.google.android.exoplayer2;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Looper;
|
||||
import androidx.annotation.Nullable;
|
||||
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.TrackSelector;
|
||||
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
||||
@ -35,45 +31,33 @@ public final class ExoPlayerFactory {
|
||||
|
||||
private ExoPlayerFactory() {}
|
||||
|
||||
/**
|
||||
* @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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
Context context,
|
||||
TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
|
||||
RenderersFactory renderersFactory =
|
||||
new DefaultRenderersFactory(context).setExtensionRendererMode(extensionRendererMode);
|
||||
return newSimpleInstance(
|
||||
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
|
||||
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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
Context context,
|
||||
TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode,
|
||||
long allowedVideoJoiningTimeMs) {
|
||||
RenderersFactory renderersFactory =
|
||||
new DefaultRenderersFactory(context)
|
||||
.setExtensionRendererMode(extensionRendererMode)
|
||||
.setAllowedVideoJoiningTimeMs(allowedVideoJoiningTimeMs);
|
||||
return newSimpleInstance(
|
||||
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
|
||||
return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
|
||||
}
|
||||
|
||||
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@ -107,39 +91,6 @@ public final class ExoPlayerFactory {
|
||||
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
|
||||
@SuppressWarnings("deprecation")
|
||||
@ -153,15 +104,10 @@ public final class ExoPlayerFactory {
|
||||
renderersFactory,
|
||||
trackSelector,
|
||||
loadControl,
|
||||
/* drmSessionManager= */ null,
|
||||
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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
@ -169,41 +115,18 @@ public final class ExoPlayerFactory {
|
||||
RenderersFactory renderersFactory,
|
||||
TrackSelector trackSelector,
|
||||
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) {
|
||||
return newSimpleInstance(
|
||||
context,
|
||||
renderersFactory,
|
||||
trackSelector,
|
||||
loadControl,
|
||||
drmSessionManager,
|
||||
bandwidthMeter,
|
||||
new AnalyticsCollector(Clock.DEFAULT),
|
||||
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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
@ -211,23 +134,17 @@ public final class ExoPlayerFactory {
|
||||
RenderersFactory renderersFactory,
|
||||
TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
AnalyticsCollector analyticsCollector) {
|
||||
return newSimpleInstance(
|
||||
context,
|
||||
renderersFactory,
|
||||
trackSelector,
|
||||
loadControl,
|
||||
drmSessionManager,
|
||||
analyticsCollector,
|
||||
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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
@ -235,23 +152,17 @@ public final class ExoPlayerFactory {
|
||||
RenderersFactory renderersFactory,
|
||||
TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
Looper looper) {
|
||||
return newSimpleInstance(
|
||||
context,
|
||||
renderersFactory,
|
||||
trackSelector,
|
||||
loadControl,
|
||||
drmSessionManager,
|
||||
new AnalyticsCollector(Clock.DEFAULT),
|
||||
looper);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@Deprecated
|
||||
@SuppressWarnings("deprecation")
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
@ -259,7 +170,6 @@ public final class ExoPlayerFactory {
|
||||
RenderersFactory renderersFactory,
|
||||
TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
AnalyticsCollector analyticsCollector,
|
||||
Looper looper) {
|
||||
return newSimpleInstance(
|
||||
@ -267,17 +177,12 @@ public final class ExoPlayerFactory {
|
||||
renderersFactory,
|
||||
trackSelector,
|
||||
loadControl,
|
||||
drmSessionManager,
|
||||
DefaultBandwidthMeter.getSingletonInstance(context),
|
||||
analyticsCollector,
|
||||
looper);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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 Use {@link SimpleExoPlayer.Builder} instead. */
|
||||
@SuppressWarnings("deprecation")
|
||||
@Deprecated
|
||||
public static SimpleExoPlayer newSimpleInstance(
|
||||
@ -285,7 +190,6 @@ public final class ExoPlayerFactory {
|
||||
RenderersFactory renderersFactory,
|
||||
TrackSelector trackSelector,
|
||||
LoadControl loadControl,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
BandwidthMeter bandwidthMeter,
|
||||
AnalyticsCollector analyticsCollector,
|
||||
Looper looper) {
|
||||
@ -294,7 +198,6 @@ public final class ExoPlayerFactory {
|
||||
renderersFactory,
|
||||
trackSelector,
|
||||
loadControl,
|
||||
drmSessionManager,
|
||||
bandwidthMeter,
|
||||
analyticsCollector,
|
||||
/* useLazyPreparation= */ true,
|
||||
|
@ -16,10 +16,7 @@
|
||||
package com.google.android.exoplayer2;
|
||||
|
||||
import android.os.Handler;
|
||||
import androidx.annotation.Nullable;
|
||||
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.text.TextOutput;
|
||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||
@ -37,7 +34,6 @@ public interface RenderersFactory {
|
||||
* @param audioRendererEventListener An event listener for audio renderers.
|
||||
* @param textRendererOutput An output for text renderers.
|
||||
* @param metadataRendererOutput An output for metadata renderers.
|
||||
* @param drmSessionManager A drm session manager used by renderers.
|
||||
* @return The {@link Renderer instances}.
|
||||
*/
|
||||
Renderer[] createRenderers(
|
||||
@ -45,6 +41,5 @@ public interface RenderersFactory {
|
||||
VideoRendererEventListener videoRendererEventListener,
|
||||
AudioRendererEventListener audioRendererEventListener,
|
||||
TextOutput textRendererOutput,
|
||||
MetadataOutput metadataRendererOutput,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager);
|
||||
MetadataOutput metadataRendererOutput);
|
||||
}
|
||||
|
@ -36,9 +36,6 @@ import com.google.android.exoplayer2.audio.AudioListener;
|
||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||
import com.google.android.exoplayer2.audio.AuxEffectInfo;
|
||||
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.MetadataOutput;
|
||||
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
|
||||
* used to call listeners on.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
protected SimpleExoPlayer(
|
||||
Context context,
|
||||
RenderersFactory renderersFactory,
|
||||
@ -381,36 +377,6 @@ public class SimpleExoPlayer extends BasePlayer
|
||||
boolean useLazyPreparation,
|
||||
Clock clock,
|
||||
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.analyticsCollector = analyticsCollector;
|
||||
componentListener = new ComponentListener();
|
||||
@ -427,8 +393,7 @@ public class SimpleExoPlayer extends BasePlayer
|
||||
componentListener,
|
||||
componentListener,
|
||||
componentListener,
|
||||
componentListener,
|
||||
drmSessionManager);
|
||||
componentListener);
|
||||
|
||||
// Set initial values.
|
||||
audioVolume = 1;
|
||||
@ -457,9 +422,6 @@ public class SimpleExoPlayer extends BasePlayer
|
||||
audioListeners.add(analyticsCollector);
|
||||
addMetadataOutput(analyticsCollector);
|
||||
bandwidthMeter.addEventListener(eventHandler, analyticsCollector);
|
||||
if (drmSessionManager instanceof DefaultDrmSessionManager) {
|
||||
((DefaultDrmSessionManager) drmSessionManager).addListener(eventHandler, analyticsCollector);
|
||||
}
|
||||
audioBecomingNoisyManager =
|
||||
new AudioBecomingNoisyManager(context, eventHandler, componentListener);
|
||||
audioFocusManager = new AudioFocusManager(context, eventHandler, componentListener);
|
||||
|
@ -33,7 +33,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher;
|
||||
import com.google.android.exoplayer2.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.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.DecoderQueryException;
|
||||
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.MimeTypes;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
@ -96,41 +94,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
* @param context A context.
|
||||
* @param mediaCodecSelector A decoder selector.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector) {
|
||||
this(
|
||||
context,
|
||||
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,
|
||||
/* eventListener= */ null);
|
||||
}
|
||||
@ -142,7 +109,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
* 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(
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@ -151,43 +117,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
this(
|
||||
context,
|
||||
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,
|
||||
eventListener,
|
||||
(AudioCapabilities) null);
|
||||
@ -196,13 +125,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
/**
|
||||
* @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.
|
||||
@ -210,17 +132,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
* default capabilities (no encoded audio passthrough support) should be assumed.
|
||||
* @param audioProcessors Optional {@link AudioProcessor}s that will process PCM audio before
|
||||
* 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(
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable AudioRendererEventListener eventListener,
|
||||
@Nullable AudioCapabilities audioCapabilities,
|
||||
@ -228,8 +143,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
this(
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
new DefaultAudioSink(audioCapabilities, audioProcessors));
|
||||
@ -238,36 +151,20 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
/**
|
||||
* @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.
|
||||
* @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(
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable AudioRendererEventListener eventListener,
|
||||
AudioSink audioSink) {
|
||||
this(
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
/* enableDecoderFallback= */ false,
|
||||
eventHandler,
|
||||
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 audioSink The sink to which audio will be output.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public MediaCodecAudioRenderer(
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@ -293,53 +189,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable AudioRendererEventListener eventListener,
|
||||
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(
|
||||
C.TRACK_TYPE_AUDIO,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
enableDecoderFallback,
|
||||
/* assumedMinimumCodecOperatingRate= */ 44100);
|
||||
this.context = context.getApplicationContext();
|
||||
@ -352,7 +204,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
@Capabilities
|
||||
protected int supportsFormat(
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
Format format)
|
||||
throws DecoderQueryException {
|
||||
String mimeType = format.sampleMimeType;
|
||||
@ -362,10 +213,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
@TunnelingSupport
|
||||
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
|
||||
boolean supportsFormatDrm =
|
||||
format.drmInitData == null
|
||||
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType)
|
||||
|| (format.exoMediaCryptoType == null
|
||||
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
|
||||
format.drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
|
||||
if (supportsFormatDrm
|
||||
&& allowPassthrough(format.channelCount, mimeType)
|
||||
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) {
|
||||
|
@ -36,7 +36,6 @@ import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmSession;
|
||||
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.util.Assertions;
|
||||
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 final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
|
||||
private final boolean playClearSamplesWithoutKeys;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
private final AudioSink audioSink;
|
||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||
|
||||
private boolean drmResourcesAcquired;
|
||||
private DecoderCounters decoderCounters;
|
||||
private Format inputFormat;
|
||||
private int encoderDelay;
|
||||
@ -142,8 +138,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
||||
eventHandler,
|
||||
eventListener,
|
||||
/* audioCapabilities= */ null,
|
||||
/* drmSessionManager= */ null,
|
||||
/* playClearSamplesWithoutKeys= */ false,
|
||||
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 audioCapabilities The audio capabilities for playback on this device. May be null if the
|
||||
* 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.
|
||||
*/
|
||||
public SimpleDecoderAudioRenderer(
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable AudioRendererEventListener eventListener,
|
||||
@Nullable AudioCapabilities audioCapabilities,
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
AudioProcessor... audioProcessors) {
|
||||
this(eventHandler, eventListener, drmSessionManager,
|
||||
playClearSamplesWithoutKeys, new DefaultAudioSink(audioCapabilities, audioProcessors));
|
||||
this(eventHandler, eventListener, new DefaultAudioSink(audioCapabilities, 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 audioSink The sink to which audio will be output.
|
||||
*/
|
||||
public SimpleDecoderAudioRenderer(
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable AudioRendererEventListener eventListener,
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
AudioSink audioSink) {
|
||||
super(C.TRACK_TYPE_AUDIO);
|
||||
this.drmSessionManager = drmSessionManager;
|
||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
||||
eventDispatcher = new EventDispatcher(eventHandler, eventListener);
|
||||
this.audioSink = audioSink;
|
||||
audioSink.setListener(new AudioSinkListener());
|
||||
@ -234,7 +188,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
||||
if (!MimeTypes.isAudio(format.sampleMimeType)) {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||
}
|
||||
@FormatSupport int formatSupport = supportsFormatInternal(drmSessionManager, format);
|
||||
@FormatSupport int formatSupport = supportsFormatInternal(format);
|
||||
if (formatSupport <= FORMAT_UNSUPPORTED_DRM) {
|
||||
return RendererCapabilities.create(formatSupport);
|
||||
}
|
||||
@ -246,13 +200,11 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
||||
/**
|
||||
* 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}.
|
||||
* @return The {@link FormatSupport} for this {@link Format}.
|
||||
*/
|
||||
@FormatSupport
|
||||
protected abstract int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
|
||||
protected abstract int supportsFormatInternal(Format 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 {
|
||||
if (decoderDrmSession == null
|
||||
|| (!bufferEncrypted
|
||||
&& (playClearSamplesWithoutKeys || decoderDrmSession.playClearSamplesWithoutKeys()))) {
|
||||
|| (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
|
||||
return false;
|
||||
}
|
||||
@DrmSession.State int drmSessionState = decoderDrmSession.getState();
|
||||
@ -544,10 +495,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
||||
|
||||
@Override
|
||||
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
||||
if (drmSessionManager != null && !drmResourcesAcquired) {
|
||||
drmResourcesAcquired = true;
|
||||
drmSessionManager.prepare();
|
||||
}
|
||||
decoderCounters = new DecoderCounters();
|
||||
eventDispatcher.enabled(decoderCounters);
|
||||
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
|
||||
public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException {
|
||||
switch (messageType) {
|
||||
@ -686,12 +625,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
||||
@SuppressWarnings("unchecked")
|
||||
private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
||||
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
||||
if (formatHolder.includesDrmSession) {
|
||||
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
||||
} else {
|
||||
sourceDrmSession =
|
||||
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
|
||||
}
|
||||
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
||||
Format oldFormat = inputFormat;
|
||||
inputFormat = newFormat;
|
||||
|
||||
|
@ -38,7 +38,6 @@ import com.google.android.exoplayer2.decoder.DecoderCounters;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmSession;
|
||||
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.mediacodec.MediaCodecUtil.DecoderQueryException;
|
||||
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 final MediaCodecSelector mediaCodecSelector;
|
||||
@Nullable private final DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
|
||||
private final boolean playClearSamplesWithoutKeys;
|
||||
private final boolean enableDecoderFallback;
|
||||
private final float assumedMinimumCodecOperatingRate;
|
||||
private final DecoderInputBuffer buffer;
|
||||
@ -391,7 +388,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
private final long[] pendingOutputStreamOffsetsUs;
|
||||
private final long[] pendingOutputStreamSwitchTimesUs;
|
||||
|
||||
private boolean drmResourcesAcquired;
|
||||
@Nullable private Format inputFormat;
|
||||
private Format outputFormat;
|
||||
@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_*}
|
||||
* constants defined in {@link C}.
|
||||
* @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
|
||||
* initialization fails. This may result in using a decoder that is less efficient or slower
|
||||
* than the primary decoder.
|
||||
@ -465,14 +454,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
public MediaCodecRenderer(
|
||||
int trackType,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
boolean enableDecoderFallback,
|
||||
float assumedMinimumCodecOperatingRate) {
|
||||
super(trackType);
|
||||
this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector);
|
||||
this.drmSessionManager = drmSessionManager;
|
||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
||||
this.enableDecoderFallback = enableDecoderFallback;
|
||||
this.assumedMinimumCodecOperatingRate = assumedMinimumCodecOperatingRate;
|
||||
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED);
|
||||
@ -550,7 +535,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
@Capabilities
|
||||
public final int supportsFormat(Format format) throws ExoPlaybackException {
|
||||
try {
|
||||
return supportsFormat(mediaCodecSelector, drmSessionManager, format);
|
||||
return supportsFormat(mediaCodecSelector, format);
|
||||
} catch (DecoderQueryException e) {
|
||||
throw createRendererException(e, format);
|
||||
}
|
||||
@ -560,7 +545,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
* Returns the {@link Capabilities} for the given {@link Format}.
|
||||
*
|
||||
* @param mediaCodecSelector The decoder selector.
|
||||
* @param drmSessionManager The renderer's {@link DrmSessionManager}.
|
||||
* @param format The {@link Format}.
|
||||
* @return The {@link Capabilities} for this {@link Format}.
|
||||
* @throws DecoderQueryException If there was an error querying decoders.
|
||||
@ -568,7 +552,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
@Capabilities
|
||||
protected abstract int supportsFormat(
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
Format format)
|
||||
throws DecoderQueryException;
|
||||
|
||||
@ -696,10 +679,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
|
||||
@Override
|
||||
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
||||
if (drmSessionManager != null && !drmResourcesAcquired) {
|
||||
drmResourcesAcquired = true;
|
||||
drmSessionManager.prepare();
|
||||
}
|
||||
decoderCounters = new DecoderCounters();
|
||||
}
|
||||
|
||||
@ -771,10 +750,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
} finally {
|
||||
setSourceDrmSession(null);
|
||||
}
|
||||
if (drmSessionManager != null && drmResourcesAcquired) {
|
||||
drmResourcesAcquired = false;
|
||||
drmSessionManager.release();
|
||||
}
|
||||
}
|
||||
|
||||
protected void releaseCodec() {
|
||||
@ -1366,8 +1341,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
|
||||
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
||||
if (codecDrmSession == null
|
||||
|| (!bufferEncrypted
|
||||
&& (playClearSamplesWithoutKeys || codecDrmSession.playClearSamplesWithoutKeys()))) {
|
||||
|| (!bufferEncrypted && codecDrmSession.playClearSamplesWithoutKeys())) {
|
||||
return false;
|
||||
}
|
||||
@DrmSession.State int drmSessionState = codecDrmSession.getState();
|
||||
@ -1402,12 +1376,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
||||
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
||||
waitingForFirstSampleInFormat = true;
|
||||
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
||||
if (formatHolder.includesDrmSession) {
|
||||
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
|
||||
} else {
|
||||
sourceDrmSession =
|
||||
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
|
||||
}
|
||||
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
|
||||
inputFormat = newFormat;
|
||||
|
||||
if (codec == null) {
|
||||
|
@ -96,7 +96,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
|
||||
public int supportsFormat(Format format) {
|
||||
if (decoderFactory.supportsFormat(format)) {
|
||||
return RendererCapabilities.create(
|
||||
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
|
||||
format.drmInitData == null ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
|
||||
} else {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||
}
|
||||
|
@ -171,8 +171,7 @@ public final class DownloadHelper {
|
||||
new VideoRendererEventListener() {},
|
||||
new AudioRendererEventListener() {},
|
||||
(cues) -> {},
|
||||
(metadata) -> {},
|
||||
/* drmSessionManager= */ null);
|
||||
(metadata) -> {});
|
||||
RendererCapabilities[] capabilities = new RendererCapabilities[renderers.length];
|
||||
for (int i = 0; i < renderers.length; i++) {
|
||||
capabilities[i] = renderers[i].getCapabilities();
|
||||
|
@ -123,7 +123,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
|
||||
public int supportsFormat(Format format) {
|
||||
if (decoderFactory.supportsFormat(format)) {
|
||||
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)) {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
||||
} else {
|
||||
|
@ -41,7 +41,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
|
||||
import com.google.android.exoplayer2.RendererCapabilities;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.drm.DrmInitData;
|
||||
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.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.DecoderQueryException;
|
||||
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.Log;
|
||||
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
|
||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public MediaCodecVideoRenderer(
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@ -206,51 +203,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
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,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
@ -271,7 +223,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public MediaCodecVideoRenderer(
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@ -280,58 +231,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable VideoRendererEventListener eventListener,
|
||||
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(
|
||||
C.TRACK_TYPE_VIDEO,
|
||||
mediaCodecSelector,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
enableDecoderFallback,
|
||||
/* assumedMinimumCodecOperatingRate= */ 30);
|
||||
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
||||
@ -353,7 +255,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||
@Capabilities
|
||||
protected int supportsFormat(
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
Format format)
|
||||
throws DecoderQueryException {
|
||||
String mimeType = format.sampleMimeType;
|
||||
@ -382,10 +283,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
||||
}
|
||||
boolean supportsFormatDrm =
|
||||
drmInitData == null
|
||||
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType)
|
||||
|| (format.exoMediaCryptoType == null
|
||||
&& supportsFormatDrm(drmSessionManager, drmInitData));
|
||||
drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
|
||||
if (!supportsFormatDrm) {
|
||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
||||
}
|
||||
|
@ -26,13 +26,11 @@ import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||
import com.google.android.exoplayer2.Format;
|
||||
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.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
import com.google.android.exoplayer2.drm.DrmSession;
|
||||
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.util.Assertions;
|
||||
import com.google.android.exoplayer2.util.TimedValueQueue;
|
||||
@ -71,13 +69,10 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
||||
|
||||
private final long allowedJoiningTimeMs;
|
||||
private final int maxDroppedFramesToNotify;
|
||||
private final boolean playClearSamplesWithoutKeys;
|
||||
private final EventDispatcher eventDispatcher;
|
||||
private final TimedValueQueue<Format> formatQueue;
|
||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
|
||||
|
||||
private boolean drmResourcesAcquired;
|
||||
private Format inputFormat;
|
||||
private Format outputFormat;
|
||||
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 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.
|
||||
*/
|
||||
protected SimpleDecoderVideoRenderer(
|
||||
long allowedJoiningTimeMs,
|
||||
@Nullable Handler eventHandler,
|
||||
@Nullable VideoRendererEventListener eventListener,
|
||||
int maxDroppedFramesToNotify,
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys) {
|
||||
int maxDroppedFramesToNotify) {
|
||||
super(C.TRACK_TYPE_VIDEO);
|
||||
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
||||
this.maxDroppedFramesToNotify = maxDroppedFramesToNotify;
|
||||
this.drmSessionManager = drmSessionManager;
|
||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
||||
joiningDeadlineMs = C.TIME_UNSET;
|
||||
clearReportedVideoSize();
|
||||
formatQueue = new TimedValueQueue<>();
|
||||
@ -157,12 +141,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
||||
|
||||
// BaseRenderer implementation.
|
||||
|
||||
@Override
|
||||
@Capabilities
|
||||
public final int supportsFormat(Format format) {
|
||||
return supportsFormatInternal(drmSessionManager, format);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
|
||||
if (outputStreamEnded) {
|
||||
@ -238,10 +216,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
||||
|
||||
@Override
|
||||
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
||||
if (drmSessionManager != null && !drmResourcesAcquired) {
|
||||
drmResourcesAcquired = true;
|
||||
drmSessionManager.prepare();
|
||||
}
|
||||
decoderCounters = new 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
|
||||
protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlaybackException {
|
||||
outputStreamOffsetUs = offsetUs;
|
||||
@ -371,12 +337,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
||||
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
||||
waitingForFirstSampleInFormat = true;
|
||||
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
||||
if (formatHolder.includesDrmSession) {
|
||||
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
||||
} else {
|
||||
sourceDrmSession =
|
||||
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
|
||||
}
|
||||
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
||||
inputFormat = newFormat;
|
||||
|
||||
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.
|
||||
*
|
||||
@ -893,9 +842,9 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
||||
}
|
||||
|
||||
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
||||
DrmSession<ExoMediaCrypto> decoderDrmSession = this.decoderDrmSession;
|
||||
if (decoderDrmSession == null
|
||||
|| (!bufferEncrypted
|
||||
&& (playClearSamplesWithoutKeys || decoderDrmSession.playClearSamplesWithoutKeys()))) {
|
||||
|| (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
|
||||
return false;
|
||||
}
|
||||
@DrmSession.State int drmSessionState = decoderDrmSession.getState();
|
||||
|
@ -1167,8 +1167,7 @@ public final class AnalyticsCollectorTest {
|
||||
videoRendererEventListener,
|
||||
audioRendererEventListener,
|
||||
textRendererOutput,
|
||||
metadataRendererOutput,
|
||||
drmSessionManager) ->
|
||||
metadataRendererOutput) ->
|
||||
new Renderer[] {
|
||||
new FakeVideoRenderer(eventHandler, videoRendererEventListener),
|
||||
new FakeAudioRenderer(eventHandler, audioRendererEventListener)
|
||||
|
@ -32,7 +32,6 @@ import com.google.android.exoplayer2.RendererConfiguration;
|
||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||
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.testutil.FakeSampleStream;
|
||||
import com.google.android.exoplayer2.util.MimeTypes;
|
||||
@ -56,11 +55,10 @@ public class SimpleDecoderAudioRendererTest {
|
||||
public void setUp() throws Exception {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
audioRenderer =
|
||||
new SimpleDecoderAudioRenderer(null, null, null, false, mockAudioSink) {
|
||||
new SimpleDecoderAudioRenderer(null, null, mockAudioSink) {
|
||||
@Override
|
||||
@FormatSupport
|
||||
protected int supportsFormatInternal(
|
||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
||||
protected int supportsFormatInternal(Format format) {
|
||||
return FORMAT_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -123,7 +123,7 @@ public class DownloadHelperTest {
|
||||
FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh);
|
||||
FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh);
|
||||
RenderersFactory renderersFactory =
|
||||
(handler, videoListener, audioListener, metadata, text, drm) ->
|
||||
(handler, videoListener, audioListener, metadata, text) ->
|
||||
new Renderer[] {textRenderer, audioRenderer, videoRenderer};
|
||||
|
||||
downloadHelper =
|
||||
|
@ -35,11 +35,11 @@ public final class DownloadHelperTest {
|
||||
ApplicationProvider.getApplicationContext(),
|
||||
Uri.parse("http://uri"),
|
||||
new FakeDataSource.Factory(),
|
||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
||||
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
|
||||
DownloadHelper.forDash(
|
||||
Uri.parse("http://uri"),
|
||||
new FakeDataSource.Factory(),
|
||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
||||
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
|
||||
/* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(),
|
||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
||||
}
|
||||
|
@ -34,11 +34,11 @@ public final class DownloadHelperTest {
|
||||
ApplicationProvider.getApplicationContext(),
|
||||
Uri.parse("http://uri"),
|
||||
new FakeDataSource.Factory(),
|
||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
||||
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
|
||||
DownloadHelper.forHls(
|
||||
Uri.parse("http://uri"),
|
||||
new FakeDataSource.Factory(),
|
||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
||||
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
|
||||
/* drmSessionManager= */ null,
|
||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
||||
}
|
||||
|
@ -34,11 +34,11 @@ public final class DownloadHelperTest {
|
||||
ApplicationProvider.getApplicationContext(),
|
||||
Uri.parse("http://uri"),
|
||||
new FakeDataSource.Factory(),
|
||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
||||
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
|
||||
DownloadHelper.forSmoothStreaming(
|
||||
Uri.parse("http://uri"),
|
||||
new FakeDataSource.Factory(),
|
||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
||||
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
|
||||
/* drmSessionManager= */ null,
|
||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ import java.util.List;
|
||||
C.WIDEVINE_UUID,
|
||||
frameworkMediaDrm,
|
||||
drmCallback,
|
||||
/* optionalKeyRequestParameters= */ null,
|
||||
/* keyRequestParameters= */ null,
|
||||
/* multiSession= */ false,
|
||||
DefaultDrmSessionManager.INITIAL_DRM_REQUEST_RETRY_COUNT);
|
||||
if (!useL1Widevine) {
|
||||
|
@ -27,8 +27,6 @@ import com.google.android.exoplayer2.Format;
|
||||
import com.google.android.exoplayer2.FormatHolder;
|
||||
import com.google.android.exoplayer2.Renderer;
|
||||
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.MediaCodecSelector;
|
||||
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer;
|
||||
@ -53,8 +51,6 @@ import java.util.ArrayList;
|
||||
Context context,
|
||||
@ExtensionRendererMode int extensionRendererMode,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
boolean enableDecoderFallback,
|
||||
Handler eventHandler,
|
||||
VideoRendererEventListener eventListener,
|
||||
@ -65,8 +61,6 @@ import java.util.ArrayList;
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
allowedVideoJoiningTimeMs,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
|
||||
@ -92,8 +86,6 @@ import java.util.ArrayList;
|
||||
Context context,
|
||||
MediaCodecSelector mediaCodecSelector,
|
||||
long allowedJoiningTimeMs,
|
||||
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
||||
boolean playClearSamplesWithoutKeys,
|
||||
Handler eventHandler,
|
||||
VideoRendererEventListener eventListener,
|
||||
int maxDroppedFrameCountToNotify) {
|
||||
@ -101,8 +93,6 @@ import java.util.ArrayList;
|
||||
context,
|
||||
mediaCodecSelector,
|
||||
allowedJoiningTimeMs,
|
||||
drmSessionManager,
|
||||
playClearSamplesWithoutKeys,
|
||||
eventHandler,
|
||||
eventListener,
|
||||
maxDroppedFrameCountToNotify);
|
||||
|
@ -93,7 +93,6 @@ public final class DefaultRenderersFactoryAsserts {
|
||||
new VideoRendererEventListener() {},
|
||||
new AudioRendererEventListener() {},
|
||||
(List<Cue> cues) -> {},
|
||||
(Metadata metadata) -> {},
|
||||
/* drmSessionManager= */ null);
|
||||
(Metadata metadata) -> {});
|
||||
}
|
||||
}
|
||||
|
@ -371,8 +371,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
|
||||
videoRendererEventListener,
|
||||
audioRendererEventListener,
|
||||
textRendererOutput,
|
||||
metadataRendererOutput,
|
||||
drmSessionManager) -> renderers;
|
||||
metadataRendererOutput) -> renderers;
|
||||
}
|
||||
if (loadControl == null) {
|
||||
loadControl = new DefaultLoadControl();
|
||||
|
Loading…
x
Reference in New Issue
Block a user