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
|
[background](https://www.w3.org/TR/webvtt1/#default-text-background) colors
|
||||||
([PR #4178](https://github.com/google/ExoPlayer/pull/4178),
|
([PR #4178](https://github.com/google/ExoPlayer/pull/4178),
|
||||||
[issue #6581](https://github.com/google/ExoPlayer/issues/6581)).
|
[issue #6581](https://github.com/google/ExoPlayer/issues/6581)).
|
||||||
* DRM: Add support for attaching DRM sessions to clear content in the demo app.
|
* DRM:
|
||||||
|
* Add support for attaching DRM sessions to clear content in the demo app.
|
||||||
|
* Remove `DrmSessionManager` references from all renderers.
|
||||||
|
`DrmSessionManager` must be injected into the MediaSources using the
|
||||||
|
MediaSources factories.
|
||||||
* Downloads: Merge downloads in `SegmentDownloader` to improve overall download
|
* Downloads: Merge downloads in `SegmentDownloader` to improve overall download
|
||||||
speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)).
|
speed ([#5978](https://github.com/google/ExoPlayer/issues/5978)).
|
||||||
* MP3: Add `IndexSeeker` for accurate seeks in VBR streams
|
* MP3: Add `IndexSeeker` for accurate seeks in VBR streams
|
||||||
|
@ -27,7 +27,6 @@ import com.google.android.exoplayer2.Format;
|
|||||||
import com.google.android.exoplayer2.PlayerMessage.Target;
|
import com.google.android.exoplayer2.PlayerMessage.Target;
|
||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
import com.google.android.exoplayer2.RendererCapabilities;
|
||||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.TraceUtil;
|
import com.google.android.exoplayer2.util.TraceUtil;
|
||||||
@ -121,13 +120,7 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
|
|||||||
int threads,
|
int threads,
|
||||||
int numInputBuffers,
|
int numInputBuffers,
|
||||||
int numOutputBuffers) {
|
int numOutputBuffers) {
|
||||||
super(
|
super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
|
||||||
allowedJoiningTimeMs,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
maxDroppedFramesToNotify,
|
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false);
|
|
||||||
this.threads = threads;
|
this.threads = threads;
|
||||||
this.numInputBuffers = numInputBuffers;
|
this.numInputBuffers = numInputBuffers;
|
||||||
this.numOutputBuffers = numOutputBuffers;
|
this.numOutputBuffers = numOutputBuffers;
|
||||||
@ -135,13 +128,12 @@ public class Libgav1VideoRenderer extends SimpleDecoderVideoRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Capabilities
|
@Capabilities
|
||||||
protected int supportsFormatInternal(
|
public final int supportsFormat(Format format) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
|
||||||
if (!MimeTypes.VIDEO_AV1.equalsIgnoreCase(format.sampleMimeType)
|
if (!MimeTypes.VIDEO_AV1.equalsIgnoreCase(format.sampleMimeType)
|
||||||
|| !Gav1Library.isAvailable()) {
|
|| !Gav1Library.isAvailable()) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||||
}
|
}
|
||||||
if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) {
|
if (format.drmInitData != null && format.exoMediaCryptoType == null) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
||||||
}
|
}
|
||||||
return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED);
|
return RendererCapabilities.create(FORMAT_HANDLED, ADAPTIVE_SEAMLESS, TUNNELING_NOT_SUPPORTED);
|
||||||
|
@ -18,14 +18,12 @@ package com.google.android.exoplayer2.ext.ffmpeg;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
import com.google.android.exoplayer2.audio.AudioProcessor;
|
import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||||
import com.google.android.exoplayer2.audio.AudioSink;
|
import com.google.android.exoplayer2.audio.AudioSink;
|
||||||
import com.google.android.exoplayer2.audio.DefaultAudioSink;
|
import com.google.android.exoplayer2.audio.DefaultAudioSink;
|
||||||
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
|
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
@ -85,22 +83,19 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
|
|||||||
super(
|
super(
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
audioSink);
|
audioSink);
|
||||||
this.enableFloatOutput = enableFloatOutput;
|
this.enableFloatOutput = enableFloatOutput;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@FormatSupport
|
@FormatSupport
|
||||||
protected int supportsFormatInternal(
|
protected int supportsFormatInternal(Format format) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
|
||||||
Assertions.checkNotNull(format.sampleMimeType);
|
Assertions.checkNotNull(format.sampleMimeType);
|
||||||
if (!FfmpegLibrary.isAvailable()) {
|
if (!FfmpegLibrary.isAvailable()) {
|
||||||
return FORMAT_UNSUPPORTED_TYPE;
|
return FORMAT_UNSUPPORTED_TYPE;
|
||||||
} else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType) || !isOutputSupported(format)) {
|
} else if (!FfmpegLibrary.supportsFormat(format.sampleMimeType) || !isOutputSupported(format)) {
|
||||||
return FORMAT_UNSUPPORTED_SUBTYPE;
|
return FORMAT_UNSUPPORTED_SUBTYPE;
|
||||||
} else if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) {
|
} else if (format.drmInitData != null && format.exoMediaCryptoType == null) {
|
||||||
return FORMAT_UNSUPPORTED_DRM;
|
return FORMAT_UNSUPPORTED_DRM;
|
||||||
} else {
|
} else {
|
||||||
return FORMAT_HANDLED;
|
return FORMAT_HANDLED;
|
||||||
@ -109,7 +104,7 @@ public final class FfmpegAudioRenderer extends SimpleDecoderAudioRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@AdaptiveSupport
|
@AdaptiveSupport
|
||||||
public final int supportsMixedMimeTypeAdaptation() throws ExoPlaybackException {
|
public final int supportsMixedMimeTypeAdaptation() {
|
||||||
return ADAPTIVE_NOT_SEAMLESS;
|
return ADAPTIVE_NOT_SEAMLESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,6 @@ import com.google.android.exoplayer2.audio.AudioProcessor;
|
|||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||||
import com.google.android.exoplayer2.audio.AudioSink;
|
import com.google.android.exoplayer2.audio.AudioSink;
|
||||||
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
|
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.extractor.FlacStreamMetadata;
|
import com.google.android.exoplayer2.extractor.FlacStreamMetadata;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
@ -69,15 +68,12 @@ public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
|
|||||||
super(
|
super(
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
audioSink);
|
audioSink);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@FormatSupport
|
@FormatSupport
|
||||||
protected int supportsFormatInternal(
|
protected int supportsFormatInternal(Format format) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
|
||||||
if (!FlacLibrary.isAvailable()
|
if (!FlacLibrary.isAvailable()
|
||||||
|| !MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType)) {
|
|| !MimeTypes.AUDIO_FLAC.equalsIgnoreCase(format.sampleMimeType)) {
|
||||||
return FORMAT_UNSUPPORTED_TYPE;
|
return FORMAT_UNSUPPORTED_TYPE;
|
||||||
@ -99,7 +95,7 @@ public final class LibflacAudioRenderer extends SimpleDecoderAudioRenderer {
|
|||||||
}
|
}
|
||||||
if (!supportsOutput(format.channelCount, pcmEncoding)) {
|
if (!supportsOutput(format.channelCount, pcmEncoding)) {
|
||||||
return FORMAT_UNSUPPORTED_SUBTYPE;
|
return FORMAT_UNSUPPORTED_SUBTYPE;
|
||||||
} else if (!supportsFormatDrm(drmSessionManager, format.drmInitData)) {
|
} else if (format.drmInitData != null && format.exoMediaCryptoType == null) {
|
||||||
return FORMAT_UNSUPPORTED_DRM;
|
return FORMAT_UNSUPPORTED_DRM;
|
||||||
} else {
|
} else {
|
||||||
return FORMAT_HANDLED;
|
return FORMAT_HANDLED;
|
||||||
|
@ -22,9 +22,7 @@ import com.google.android.exoplayer2.Format;
|
|||||||
import com.google.android.exoplayer2.audio.AudioProcessor;
|
import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||||
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
|
import com.google.android.exoplayer2.audio.SimpleDecoderAudioRenderer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
|
|
||||||
/** Decodes and renders audio using the native Opus decoder. */
|
/** Decodes and renders audio using the native Opus decoder. */
|
||||||
@ -55,42 +53,12 @@ public class LibopusAudioRenderer extends SimpleDecoderAudioRenderer {
|
|||||||
super(eventHandler, eventListener, audioProcessors);
|
super(eventHandler, eventListener, audioProcessors);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
|
|
||||||
* @deprecated Use {@link #LibopusAudioRenderer(Handler, AudioRendererEventListener,
|
|
||||||
* AudioProcessor...)} instead, and pass DRM-related parameters to the {@link MediaSource}
|
|
||||||
* factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public LibopusAudioRenderer(
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
AudioProcessor... audioProcessors) {
|
|
||||||
super(eventHandler, eventListener, null, drmSessionManager, playClearSamplesWithoutKeys,
|
|
||||||
audioProcessors);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@FormatSupport
|
@FormatSupport
|
||||||
protected int supportsFormatInternal(
|
protected int supportsFormatInternal(Format format) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
|
||||||
boolean drmIsSupported =
|
boolean drmIsSupported =
|
||||||
format.drmInitData == null
|
format.drmInitData == null
|
||||||
|| OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType)
|
|| OpusLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType);
|
||||||
|| (format.exoMediaCryptoType == null
|
|
||||||
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
|
|
||||||
if (!OpusLibrary.isAvailable()
|
if (!OpusLibrary.isAvailable()
|
||||||
|| !MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)) {
|
|| !MimeTypes.AUDIO_OPUS.equalsIgnoreCase(format.sampleMimeType)) {
|
||||||
return FORMAT_UNSUPPORTED_TYPE;
|
return FORMAT_UNSUPPORTED_TYPE;
|
||||||
|
@ -27,9 +27,7 @@ import com.google.android.exoplayer2.Format;
|
|||||||
import com.google.android.exoplayer2.PlayerMessage.Target;
|
import com.google.android.exoplayer2.PlayerMessage.Target;
|
||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
import com.google.android.exoplayer2.RendererCapabilities;
|
||||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.TraceUtil;
|
import com.google.android.exoplayer2.util.TraceUtil;
|
||||||
import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer;
|
import com.google.android.exoplayer2.video.SimpleDecoderVideoRenderer;
|
||||||
@ -101,45 +99,6 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|
|||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
maxDroppedFramesToNotify,
|
maxDroppedFramesToNotify,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
|
||||||
* can attempt to seamlessly join an ongoing playback.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @deprecated Use {@link #LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int,
|
|
||||||
* int, int, int)}} instead, and pass DRM-related parameters to the {@link MediaSource}
|
|
||||||
* factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public LibvpxVideoRenderer(
|
|
||||||
long allowedJoiningTimeMs,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
|
||||||
int maxDroppedFramesToNotify,
|
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys) {
|
|
||||||
this(
|
|
||||||
allowedJoiningTimeMs,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
maxDroppedFramesToNotify,
|
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
getRuntime().availableProcessors(),
|
getRuntime().availableProcessors(),
|
||||||
/* numInputBuffers= */ 4,
|
/* numInputBuffers= */ 4,
|
||||||
/* numOutputBuffers= */ 4);
|
/* numOutputBuffers= */ 4);
|
||||||
@ -166,58 +125,7 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|
|||||||
int threads,
|
int threads,
|
||||||
int numInputBuffers,
|
int numInputBuffers,
|
||||||
int numOutputBuffers) {
|
int numOutputBuffers) {
|
||||||
this(
|
super(allowedJoiningTimeMs, eventHandler, eventListener, maxDroppedFramesToNotify);
|
||||||
allowedJoiningTimeMs,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
maxDroppedFramesToNotify,
|
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
threads,
|
|
||||||
numInputBuffers,
|
|
||||||
numOutputBuffers);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
|
||||||
* can attempt to seamlessly join an ongoing playback.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param threads Number of threads libvpx will use to decode.
|
|
||||||
* @param numInputBuffers Number of input buffers.
|
|
||||||
* @param numOutputBuffers Number of output buffers.
|
|
||||||
* @deprecated Use {@link #LibvpxVideoRenderer(long, Handler, VideoRendererEventListener, int,
|
|
||||||
* int, int, int)}} instead, and pass DRM-related parameters to the {@link MediaSource}
|
|
||||||
* factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public LibvpxVideoRenderer(
|
|
||||||
long allowedJoiningTimeMs,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
|
||||||
int maxDroppedFramesToNotify,
|
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
int threads,
|
|
||||||
int numInputBuffers,
|
|
||||||
int numOutputBuffers) {
|
|
||||||
super(
|
|
||||||
allowedJoiningTimeMs,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
maxDroppedFramesToNotify,
|
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys);
|
|
||||||
this.threads = threads;
|
this.threads = threads;
|
||||||
this.numInputBuffers = numInputBuffers;
|
this.numInputBuffers = numInputBuffers;
|
||||||
this.numOutputBuffers = numOutputBuffers;
|
this.numOutputBuffers = numOutputBuffers;
|
||||||
@ -225,16 +133,13 @@ public class LibvpxVideoRenderer extends SimpleDecoderVideoRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Capabilities
|
@Capabilities
|
||||||
protected int supportsFormatInternal(
|
public final int supportsFormat(Format format) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
|
||||||
if (!VpxLibrary.isAvailable() || !MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)) {
|
if (!VpxLibrary.isAvailable() || !MimeTypes.VIDEO_VP9.equalsIgnoreCase(format.sampleMimeType)) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||||
}
|
}
|
||||||
boolean drmIsSupported =
|
boolean drmIsSupported =
|
||||||
format.drmInitData == null
|
format.drmInitData == null
|
||||||
|| VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType)
|
|| VpxLibrary.matchesExpectedExoMediaCryptoType(format.exoMediaCryptoType);
|
||||||
|| (format.exoMediaCryptoType == null
|
|
||||||
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
|
|
||||||
if (!drmIsSupported) {
|
if (!drmIsSupported) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,6 @@ package com.google.android.exoplayer2;
|
|||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmInitData;
|
|
||||||
import com.google.android.exoplayer2.drm.DrmSession;
|
import com.google.android.exoplayer2.drm.DrmSession;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
@ -411,26 +410,4 @@ public abstract class BaseRenderer implements Renderer, RendererCapabilities {
|
|||||||
protected final boolean isSourceReady() {
|
protected final boolean isSourceReady() {
|
||||||
return hasReadStreamToEnd() ? streamIsFinal : stream.isReady();
|
return hasReadStreamToEnd() ? streamIsFinal : stream.isReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether {@code drmSessionManager} supports the specified {@code drmInitData}, or true
|
|
||||||
* if {@code drmInitData} is null.
|
|
||||||
*
|
|
||||||
* @param drmSessionManager The drm session manager.
|
|
||||||
* @param drmInitData {@link DrmInitData} of the format to check for support.
|
|
||||||
* @return Whether {@code drmSessionManager} supports the specified {@code drmInitData}, or
|
|
||||||
* true if {@code drmInitData} is null.
|
|
||||||
*/
|
|
||||||
protected static boolean supportsFormatDrm(@Nullable DrmSessionManager<?> drmSessionManager,
|
|
||||||
@Nullable DrmInitData drmInitData) {
|
|
||||||
if (drmInitData == null) {
|
|
||||||
// Content is unencrypted.
|
|
||||||
return true;
|
|
||||||
} else if (drmSessionManager == null) {
|
|
||||||
// Content is encrypted, but no drm session manager is available.
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return drmSessionManager.canAcquireSession(drmInitData);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,11 @@ import android.media.MediaCodec;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import com.google.android.exoplayer2.audio.AudioCapabilities;
|
import com.google.android.exoplayer2.audio.AudioCapabilities;
|
||||||
import com.google.android.exoplayer2.audio.AudioProcessor;
|
import com.google.android.exoplayer2.audio.AudioProcessor;
|
||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||||
import com.google.android.exoplayer2.audio.DefaultAudioSink;
|
import com.google.android.exoplayer2.audio.DefaultAudioSink;
|
||||||
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer;
|
import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
||||||
import com.google.android.exoplayer2.metadata.MetadataOutput;
|
import com.google.android.exoplayer2.metadata.MetadataOutput;
|
||||||
@ -88,10 +85,8 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
protected static final int MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY = 50;
|
protected static final int MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY = 50;
|
||||||
|
|
||||||
private final Context context;
|
private final Context context;
|
||||||
@Nullable private DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
|
|
||||||
@ExtensionRendererMode private int extensionRendererMode;
|
@ExtensionRendererMode private int extensionRendererMode;
|
||||||
private long allowedVideoJoiningTimeMs;
|
private long allowedVideoJoiningTimeMs;
|
||||||
private boolean playClearSamplesWithoutKeys;
|
|
||||||
private boolean enableDecoderFallback;
|
private boolean enableDecoderFallback;
|
||||||
private MediaCodecSelector mediaCodecSelector;
|
private MediaCodecSelector mediaCodecSelector;
|
||||||
@MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode;
|
@MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode;
|
||||||
@ -105,17 +100,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
mediaCodecOperationMode = MediaCodecRenderer.OPERATION_MODE_SYNCHRONOUS;
|
mediaCodecOperationMode = MediaCodecRenderer.OPERATION_MODE_SYNCHRONOUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and pass {@link DrmSessionManager}
|
|
||||||
* directly to {@link SimpleExoPlayer.Builder}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public DefaultRenderersFactory(
|
|
||||||
Context context, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
this(context, drmSessionManager, EXTENSION_RENDERER_MODE_OFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
|
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
|
||||||
* #setExtensionRendererMode(int)}.
|
* #setExtensionRendererMode(int)}.
|
||||||
@ -127,48 +111,18 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
this(context, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS);
|
this(context, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
|
|
||||||
* #setExtensionRendererMode(int)}, and pass {@link DrmSessionManager} directly to {@link
|
|
||||||
* SimpleExoPlayer.Builder}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public DefaultRenderersFactory(
|
|
||||||
Context context,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
@ExtensionRendererMode int extensionRendererMode) {
|
|
||||||
this(context, drmSessionManager, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
|
* @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
|
||||||
* #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}.
|
* #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public DefaultRenderersFactory(
|
public DefaultRenderersFactory(
|
||||||
Context context,
|
Context context,
|
||||||
@ExtensionRendererMode int extensionRendererMode,
|
@ExtensionRendererMode int extensionRendererMode,
|
||||||
long allowedVideoJoiningTimeMs) {
|
long allowedVideoJoiningTimeMs) {
|
||||||
this(context, null, extensionRendererMode, allowedVideoJoiningTimeMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
|
|
||||||
* #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}, and pass
|
|
||||||
* {@link DrmSessionManager} directly to {@link SimpleExoPlayer.Builder}.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public DefaultRenderersFactory(
|
|
||||||
Context context,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
@ExtensionRendererMode int extensionRendererMode,
|
|
||||||
long allowedVideoJoiningTimeMs) {
|
|
||||||
this.context = context;
|
this.context = context;
|
||||||
this.extensionRendererMode = extensionRendererMode;
|
this.extensionRendererMode = extensionRendererMode;
|
||||||
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
|
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
|
||||||
this.drmSessionManager = drmSessionManager;
|
|
||||||
mediaCodecSelector = MediaCodecSelector.DEFAULT;
|
mediaCodecSelector = MediaCodecSelector.DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -203,25 +157,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets whether renderers are permitted to play clear regions of encrypted media prior to having
|
|
||||||
* obtained the keys necessary to decrypt encrypted regions of the media. For encrypted media that
|
|
||||||
* starts with a short clear region, this allows playback to begin in parallel with key
|
|
||||||
* acquisition, which can reduce startup latency.
|
|
||||||
*
|
|
||||||
* <p>The default value is {@code false}.
|
|
||||||
*
|
|
||||||
* @param playClearSamplesWithoutKeys Whether renderers are permitted to play clear regions of
|
|
||||||
* encrypted media prior to having obtained the keys necessary to decrypt encrypted regions of
|
|
||||||
* the media.
|
|
||||||
* @return This factory, for convenience.
|
|
||||||
*/
|
|
||||||
public DefaultRenderersFactory setPlayClearSamplesWithoutKeys(
|
|
||||||
boolean playClearSamplesWithoutKeys) {
|
|
||||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets whether to enable fallback to lower-priority decoders if decoder initialization fails.
|
* Sets whether to enable fallback to lower-priority decoders if decoder initialization fails.
|
||||||
* This may result in using a decoder that is less efficient or slower than the primary decoder.
|
* This may result in using a decoder that is less efficient or slower than the primary decoder.
|
||||||
@ -269,18 +204,12 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
VideoRendererEventListener videoRendererEventListener,
|
VideoRendererEventListener videoRendererEventListener,
|
||||||
AudioRendererEventListener audioRendererEventListener,
|
AudioRendererEventListener audioRendererEventListener,
|
||||||
TextOutput textRendererOutput,
|
TextOutput textRendererOutput,
|
||||||
MetadataOutput metadataRendererOutput,
|
MetadataOutput metadataRendererOutput) {
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
if (drmSessionManager == null) {
|
|
||||||
drmSessionManager = this.drmSessionManager;
|
|
||||||
}
|
|
||||||
ArrayList<Renderer> renderersList = new ArrayList<>();
|
ArrayList<Renderer> renderersList = new ArrayList<>();
|
||||||
buildVideoRenderers(
|
buildVideoRenderers(
|
||||||
context,
|
context,
|
||||||
extensionRendererMode,
|
extensionRendererMode,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
enableDecoderFallback,
|
enableDecoderFallback,
|
||||||
eventHandler,
|
eventHandler,
|
||||||
videoRendererEventListener,
|
videoRendererEventListener,
|
||||||
@ -290,8 +219,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
context,
|
context,
|
||||||
extensionRendererMode,
|
extensionRendererMode,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
enableDecoderFallback,
|
enableDecoderFallback,
|
||||||
buildAudioProcessors(),
|
buildAudioProcessors(),
|
||||||
eventHandler,
|
eventHandler,
|
||||||
@ -312,11 +239,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
* @param context The {@link Context} associated with the player.
|
* @param context The {@link Context} associated with the player.
|
||||||
* @param extensionRendererMode The extension renderer mode.
|
* @param extensionRendererMode The extension renderer mode.
|
||||||
* @param mediaCodecSelector A decoder selector.
|
* @param mediaCodecSelector A decoder selector.
|
||||||
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player will
|
|
||||||
* not be used for DRM protected playbacks.
|
|
||||||
* @param playClearSamplesWithoutKeys Whether renderers are permitted to play clear regions of
|
|
||||||
* encrypted media prior to having obtained the keys necessary to decrypt encrypted regions of
|
|
||||||
* the media.
|
|
||||||
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
||||||
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
||||||
* the primary decoder.
|
* the primary decoder.
|
||||||
@ -330,8 +252,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
Context context,
|
Context context,
|
||||||
@ExtensionRendererMode int extensionRendererMode,
|
@ExtensionRendererMode int extensionRendererMode,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
boolean enableDecoderFallback,
|
boolean enableDecoderFallback,
|
||||||
Handler eventHandler,
|
Handler eventHandler,
|
||||||
VideoRendererEventListener eventListener,
|
VideoRendererEventListener eventListener,
|
||||||
@ -342,8 +262,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
allowedVideoJoiningTimeMs,
|
allowedVideoJoiningTimeMs,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
enableDecoderFallback,
|
enableDecoderFallback,
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
@ -420,11 +338,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
* @param context The {@link Context} associated with the player.
|
* @param context The {@link Context} associated with the player.
|
||||||
* @param extensionRendererMode The extension renderer mode.
|
* @param extensionRendererMode The extension renderer mode.
|
||||||
* @param mediaCodecSelector A decoder selector.
|
* @param mediaCodecSelector A decoder selector.
|
||||||
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player will
|
|
||||||
* not be used for DRM protected playbacks.
|
|
||||||
* @param playClearSamplesWithoutKeys Whether renderers are permitted to play clear regions of
|
|
||||||
* encrypted media prior to having obtained the keys necessary to decrypt encrypted regions of
|
|
||||||
* the media.
|
|
||||||
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
||||||
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
||||||
* the primary decoder.
|
* the primary decoder.
|
||||||
@ -438,8 +351,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
Context context,
|
Context context,
|
||||||
@ExtensionRendererMode int extensionRendererMode,
|
@ExtensionRendererMode int extensionRendererMode,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
boolean enableDecoderFallback,
|
boolean enableDecoderFallback,
|
||||||
AudioProcessor[] audioProcessors,
|
AudioProcessor[] audioProcessors,
|
||||||
Handler eventHandler,
|
Handler eventHandler,
|
||||||
@ -449,8 +360,6 @@ public class DefaultRenderersFactory implements RenderersFactory {
|
|||||||
new MediaCodecAudioRenderer(
|
new MediaCodecAudioRenderer(
|
||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
enableDecoderFallback,
|
enableDecoderFallback,
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
|
@ -17,11 +17,7 @@ package com.google.android.exoplayer2;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
|
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
|
||||||
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
|
||||||
import com.google.android.exoplayer2.trackselection.TrackSelector;
|
import com.google.android.exoplayer2.trackselection.TrackSelector;
|
||||||
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
import com.google.android.exoplayer2.upstream.BandwidthMeter;
|
||||||
@ -35,45 +31,33 @@ public final class ExoPlayerFactory {
|
|||||||
|
|
||||||
private ExoPlayerFactory() {}
|
private ExoPlayerFactory() {}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
Context context,
|
Context context,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
|
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
|
||||||
RenderersFactory renderersFactory =
|
RenderersFactory renderersFactory =
|
||||||
new DefaultRenderersFactory(context).setExtensionRendererMode(extensionRendererMode);
|
new DefaultRenderersFactory(context).setExtensionRendererMode(extensionRendererMode);
|
||||||
return newSimpleInstance(
|
return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
|
||||||
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
Context context,
|
Context context,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode,
|
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode,
|
||||||
long allowedVideoJoiningTimeMs) {
|
long allowedVideoJoiningTimeMs) {
|
||||||
RenderersFactory renderersFactory =
|
RenderersFactory renderersFactory =
|
||||||
new DefaultRenderersFactory(context)
|
new DefaultRenderersFactory(context)
|
||||||
.setExtensionRendererMode(extensionRendererMode)
|
.setExtensionRendererMode(extensionRendererMode)
|
||||||
.setAllowedVideoJoiningTimeMs(allowedVideoJoiningTimeMs);
|
.setAllowedVideoJoiningTimeMs(allowedVideoJoiningTimeMs);
|
||||||
return newSimpleInstance(
|
return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
|
||||||
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
@ -107,39 +91,6 @@ public final class ExoPlayerFactory {
|
|||||||
return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
|
return newSimpleInstance(context, renderersFactory, trackSelector, loadControl);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
|
||||||
Context context,
|
|
||||||
TrackSelector trackSelector,
|
|
||||||
LoadControl loadControl,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
RenderersFactory renderersFactory = new DefaultRenderersFactory(context);
|
|
||||||
return newSimpleInstance(
|
|
||||||
context, renderersFactory, trackSelector, loadControl, drmSessionManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
|
||||||
Context context,
|
|
||||||
RenderersFactory renderersFactory,
|
|
||||||
TrackSelector trackSelector,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
return newSimpleInstance(
|
|
||||||
context, renderersFactory, trackSelector, new DefaultLoadControl(), drmSessionManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@ -153,15 +104,10 @@ public final class ExoPlayerFactory {
|
|||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
loadControl,
|
loadControl,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
Util.getLooper());
|
Util.getLooper());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
@ -169,41 +115,18 @@ public final class ExoPlayerFactory {
|
|||||||
RenderersFactory renderersFactory,
|
RenderersFactory renderersFactory,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager) {
|
|
||||||
return newSimpleInstance(
|
|
||||||
context, renderersFactory, trackSelector, loadControl, drmSessionManager, Util.getLooper());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
|
||||||
Context context,
|
|
||||||
RenderersFactory renderersFactory,
|
|
||||||
TrackSelector trackSelector,
|
|
||||||
LoadControl loadControl,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
BandwidthMeter bandwidthMeter) {
|
BandwidthMeter bandwidthMeter) {
|
||||||
return newSimpleInstance(
|
return newSimpleInstance(
|
||||||
context,
|
context,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
loadControl,
|
loadControl,
|
||||||
drmSessionManager,
|
|
||||||
bandwidthMeter,
|
bandwidthMeter,
|
||||||
new AnalyticsCollector(Clock.DEFAULT),
|
new AnalyticsCollector(Clock.DEFAULT),
|
||||||
Util.getLooper());
|
Util.getLooper());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
@ -211,23 +134,17 @@ public final class ExoPlayerFactory {
|
|||||||
RenderersFactory renderersFactory,
|
RenderersFactory renderersFactory,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
AnalyticsCollector analyticsCollector) {
|
AnalyticsCollector analyticsCollector) {
|
||||||
return newSimpleInstance(
|
return newSimpleInstance(
|
||||||
context,
|
context,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
loadControl,
|
loadControl,
|
||||||
drmSessionManager,
|
|
||||||
analyticsCollector,
|
analyticsCollector,
|
||||||
Util.getLooper());
|
Util.getLooper());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
@ -235,23 +152,17 @@ public final class ExoPlayerFactory {
|
|||||||
RenderersFactory renderersFactory,
|
RenderersFactory renderersFactory,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
Looper looper) {
|
Looper looper) {
|
||||||
return newSimpleInstance(
|
return newSimpleInstance(
|
||||||
context,
|
context,
|
||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
loadControl,
|
loadControl,
|
||||||
drmSessionManager,
|
|
||||||
new AnalyticsCollector(Clock.DEFAULT),
|
new AnalyticsCollector(Clock.DEFAULT),
|
||||||
looper);
|
looper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
@ -259,7 +170,6 @@ public final class ExoPlayerFactory {
|
|||||||
RenderersFactory renderersFactory,
|
RenderersFactory renderersFactory,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
AnalyticsCollector analyticsCollector,
|
AnalyticsCollector analyticsCollector,
|
||||||
Looper looper) {
|
Looper looper) {
|
||||||
return newSimpleInstance(
|
return newSimpleInstance(
|
||||||
@ -267,17 +177,12 @@ public final class ExoPlayerFactory {
|
|||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
loadControl,
|
loadControl,
|
||||||
drmSessionManager,
|
|
||||||
DefaultBandwidthMeter.getSingletonInstance(context),
|
DefaultBandwidthMeter.getSingletonInstance(context),
|
||||||
analyticsCollector,
|
analyticsCollector,
|
||||||
looper);
|
looper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/** @deprecated Use {@link SimpleExoPlayer.Builder} instead. */
|
||||||
* @deprecated Use {@link SimpleExoPlayer.Builder} instead. The {@link DrmSessionManager} cannot
|
|
||||||
* be passed to {@link SimpleExoPlayer.Builder} and should instead be injected into the {@link
|
|
||||||
* MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static SimpleExoPlayer newSimpleInstance(
|
public static SimpleExoPlayer newSimpleInstance(
|
||||||
@ -285,7 +190,6 @@ public final class ExoPlayerFactory {
|
|||||||
RenderersFactory renderersFactory,
|
RenderersFactory renderersFactory,
|
||||||
TrackSelector trackSelector,
|
TrackSelector trackSelector,
|
||||||
LoadControl loadControl,
|
LoadControl loadControl,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
BandwidthMeter bandwidthMeter,
|
BandwidthMeter bandwidthMeter,
|
||||||
AnalyticsCollector analyticsCollector,
|
AnalyticsCollector analyticsCollector,
|
||||||
Looper looper) {
|
Looper looper) {
|
||||||
@ -294,7 +198,6 @@ public final class ExoPlayerFactory {
|
|||||||
renderersFactory,
|
renderersFactory,
|
||||||
trackSelector,
|
trackSelector,
|
||||||
loadControl,
|
loadControl,
|
||||||
drmSessionManager,
|
|
||||||
bandwidthMeter,
|
bandwidthMeter,
|
||||||
analyticsCollector,
|
analyticsCollector,
|
||||||
/* useLazyPreparation= */ true,
|
/* useLazyPreparation= */ true,
|
||||||
|
@ -16,10 +16,7 @@
|
|||||||
package com.google.android.exoplayer2;
|
package com.google.android.exoplayer2;
|
||||||
|
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import androidx.annotation.Nullable;
|
|
||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.metadata.MetadataOutput;
|
import com.google.android.exoplayer2.metadata.MetadataOutput;
|
||||||
import com.google.android.exoplayer2.text.TextOutput;
|
import com.google.android.exoplayer2.text.TextOutput;
|
||||||
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
import com.google.android.exoplayer2.video.VideoRendererEventListener;
|
||||||
@ -37,7 +34,6 @@ public interface RenderersFactory {
|
|||||||
* @param audioRendererEventListener An event listener for audio renderers.
|
* @param audioRendererEventListener An event listener for audio renderers.
|
||||||
* @param textRendererOutput An output for text renderers.
|
* @param textRendererOutput An output for text renderers.
|
||||||
* @param metadataRendererOutput An output for metadata renderers.
|
* @param metadataRendererOutput An output for metadata renderers.
|
||||||
* @param drmSessionManager A drm session manager used by renderers.
|
|
||||||
* @return The {@link Renderer instances}.
|
* @return The {@link Renderer instances}.
|
||||||
*/
|
*/
|
||||||
Renderer[] createRenderers(
|
Renderer[] createRenderers(
|
||||||
@ -45,6 +41,5 @@ public interface RenderersFactory {
|
|||||||
VideoRendererEventListener videoRendererEventListener,
|
VideoRendererEventListener videoRendererEventListener,
|
||||||
AudioRendererEventListener audioRendererEventListener,
|
AudioRendererEventListener audioRendererEventListener,
|
||||||
TextOutput textRendererOutput,
|
TextOutput textRendererOutput,
|
||||||
MetadataOutput metadataRendererOutput,
|
MetadataOutput metadataRendererOutput);
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager);
|
|
||||||
}
|
}
|
||||||
|
@ -36,9 +36,6 @@ import com.google.android.exoplayer2.audio.AudioListener;
|
|||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener;
|
||||||
import com.google.android.exoplayer2.audio.AuxEffectInfo;
|
import com.google.android.exoplayer2.audio.AuxEffectInfo;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderCounters;
|
import com.google.android.exoplayer2.decoder.DecoderCounters;
|
||||||
import com.google.android.exoplayer2.drm.DefaultDrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.metadata.Metadata;
|
import com.google.android.exoplayer2.metadata.Metadata;
|
||||||
import com.google.android.exoplayer2.metadata.MetadataOutput;
|
import com.google.android.exoplayer2.metadata.MetadataOutput;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
import com.google.android.exoplayer2.source.MediaSource;
|
||||||
@ -370,7 +367,6 @@ public class SimpleExoPlayer extends BasePlayer
|
|||||||
* @param looper The {@link Looper} which must be used for all calls to the player and which is
|
* @param looper The {@link Looper} which must be used for all calls to the player and which is
|
||||||
* used to call listeners on.
|
* used to call listeners on.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
protected SimpleExoPlayer(
|
protected SimpleExoPlayer(
|
||||||
Context context,
|
Context context,
|
||||||
RenderersFactory renderersFactory,
|
RenderersFactory renderersFactory,
|
||||||
@ -381,36 +377,6 @@ public class SimpleExoPlayer extends BasePlayer
|
|||||||
boolean useLazyPreparation,
|
boolean useLazyPreparation,
|
||||||
Clock clock,
|
Clock clock,
|
||||||
Looper looper) {
|
Looper looper) {
|
||||||
this(
|
|
||||||
context,
|
|
||||||
renderersFactory,
|
|
||||||
trackSelector,
|
|
||||||
loadControl,
|
|
||||||
DrmSessionManager.getDummyDrmSessionManager(),
|
|
||||||
bandwidthMeter,
|
|
||||||
analyticsCollector,
|
|
||||||
useLazyPreparation,
|
|
||||||
clock,
|
|
||||||
looper);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated Use {@link #SimpleExoPlayer(Context, RenderersFactory, TrackSelector, LoadControl,
|
|
||||||
* BandwidthMeter, AnalyticsCollector, boolean, Clock, Looper)} instead, and pass the {@link
|
|
||||||
* DrmSessionManager} to the {@link MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
protected SimpleExoPlayer(
|
|
||||||
Context context,
|
|
||||||
RenderersFactory renderersFactory,
|
|
||||||
TrackSelector trackSelector,
|
|
||||||
LoadControl loadControl,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
BandwidthMeter bandwidthMeter,
|
|
||||||
AnalyticsCollector analyticsCollector,
|
|
||||||
boolean useLazyPreparation,
|
|
||||||
Clock clock,
|
|
||||||
Looper looper) {
|
|
||||||
this.bandwidthMeter = bandwidthMeter;
|
this.bandwidthMeter = bandwidthMeter;
|
||||||
this.analyticsCollector = analyticsCollector;
|
this.analyticsCollector = analyticsCollector;
|
||||||
componentListener = new ComponentListener();
|
componentListener = new ComponentListener();
|
||||||
@ -427,8 +393,7 @@ public class SimpleExoPlayer extends BasePlayer
|
|||||||
componentListener,
|
componentListener,
|
||||||
componentListener,
|
componentListener,
|
||||||
componentListener,
|
componentListener,
|
||||||
componentListener,
|
componentListener);
|
||||||
drmSessionManager);
|
|
||||||
|
|
||||||
// Set initial values.
|
// Set initial values.
|
||||||
audioVolume = 1;
|
audioVolume = 1;
|
||||||
@ -457,9 +422,6 @@ public class SimpleExoPlayer extends BasePlayer
|
|||||||
audioListeners.add(analyticsCollector);
|
audioListeners.add(analyticsCollector);
|
||||||
addMetadataOutput(analyticsCollector);
|
addMetadataOutput(analyticsCollector);
|
||||||
bandwidthMeter.addEventListener(eventHandler, analyticsCollector);
|
bandwidthMeter.addEventListener(eventHandler, analyticsCollector);
|
||||||
if (drmSessionManager instanceof DefaultDrmSessionManager) {
|
|
||||||
((DefaultDrmSessionManager) drmSessionManager).addListener(eventHandler, analyticsCollector);
|
|
||||||
}
|
|
||||||
audioBecomingNoisyManager =
|
audioBecomingNoisyManager =
|
||||||
new AudioBecomingNoisyManager(context, eventHandler, componentListener);
|
new AudioBecomingNoisyManager(context, eventHandler, componentListener);
|
||||||
audioFocusManager = new AudioFocusManager(context, eventHandler, componentListener);
|
audioFocusManager = new AudioFocusManager(context, eventHandler, componentListener);
|
||||||
|
@ -33,7 +33,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
|
|||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
import com.google.android.exoplayer2.RendererCapabilities;
|
||||||
import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher;
|
import com.google.android.exoplayer2.audio.AudioRendererEventListener.EventDispatcher;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
|
||||||
@ -41,7 +40,6 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
|||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaFormatUtil;
|
import com.google.android.exoplayer2.mediacodec.MediaFormatUtil;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
|
||||||
import com.google.android.exoplayer2.util.MediaClock;
|
import com.google.android.exoplayer2.util.MediaClock;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
@ -96,41 +94,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
* @param context A context.
|
* @param context A context.
|
||||||
* @param mediaCodecSelector A decoder selector.
|
* @param mediaCodecSelector A decoder selector.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector) {
|
public MediaCodecAudioRenderer(Context context, MediaCodecSelector mediaCodecSelector) {
|
||||||
this(
|
this(
|
||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param context A context.
|
|
||||||
* @param mediaCodecSelector A decoder selector.
|
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
|
|
||||||
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(
|
|
||||||
Context context,
|
|
||||||
MediaCodecSelector mediaCodecSelector,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys) {
|
|
||||||
this(
|
|
||||||
context,
|
|
||||||
mediaCodecSelector,
|
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
/* eventHandler= */ null,
|
/* eventHandler= */ null,
|
||||||
/* eventListener= */ null);
|
/* eventListener= */ null);
|
||||||
}
|
}
|
||||||
@ -142,7 +109,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
* null if delivery of events is not required.
|
* null if delivery of events is not required.
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(
|
public MediaCodecAudioRenderer(
|
||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@ -151,43 +117,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
this(
|
this(
|
||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
eventHandler,
|
|
||||||
eventListener);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param context A context.
|
|
||||||
* @param mediaCodecSelector A decoder selector.
|
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
|
|
||||||
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(
|
|
||||||
Context context,
|
|
||||||
MediaCodecSelector mediaCodecSelector,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable AudioRendererEventListener eventListener) {
|
|
||||||
this(
|
|
||||||
context,
|
|
||||||
mediaCodecSelector,
|
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
(AudioCapabilities) null);
|
(AudioCapabilities) null);
|
||||||
@ -196,13 +125,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
/**
|
/**
|
||||||
* @param context A context.
|
* @param context A context.
|
||||||
* @param mediaCodecSelector A decoder selector.
|
* @param mediaCodecSelector A decoder selector.
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
||||||
* null if delivery of events is not required.
|
* null if delivery of events is not required.
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
@ -210,17 +132,10 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
* default capabilities (no encoded audio passthrough support) should be assumed.
|
* default capabilities (no encoded audio passthrough support) should be assumed.
|
||||||
* @param audioProcessors Optional {@link AudioProcessor}s that will process PCM audio before
|
* @param audioProcessors Optional {@link AudioProcessor}s that will process PCM audio before
|
||||||
* output.
|
* output.
|
||||||
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
|
|
||||||
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(
|
public MediaCodecAudioRenderer(
|
||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
@Nullable AudioRendererEventListener eventListener,
|
||||||
@Nullable AudioCapabilities audioCapabilities,
|
@Nullable AudioCapabilities audioCapabilities,
|
||||||
@ -228,8 +143,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
this(
|
this(
|
||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
new DefaultAudioSink(audioCapabilities, audioProcessors));
|
new DefaultAudioSink(audioCapabilities, audioProcessors));
|
||||||
@ -238,36 +151,20 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
/**
|
/**
|
||||||
* @param context A context.
|
* @param context A context.
|
||||||
* @param mediaCodecSelector A decoder selector.
|
* @param mediaCodecSelector A decoder selector.
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
||||||
* null if delivery of events is not required.
|
* null if delivery of events is not required.
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
* @param audioSink The sink to which audio will be output.
|
* @param audioSink The sink to which audio will be output.
|
||||||
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
|
|
||||||
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(
|
public MediaCodecAudioRenderer(
|
||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
@Nullable AudioRendererEventListener eventListener,
|
||||||
AudioSink audioSink) {
|
AudioSink audioSink) {
|
||||||
this(
|
this(
|
||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
/* enableDecoderFallback= */ false,
|
/* enableDecoderFallback= */ false,
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
@ -285,7 +182,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
* @param audioSink The sink to which audio will be output.
|
* @param audioSink The sink to which audio will be output.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecAudioRenderer(
|
public MediaCodecAudioRenderer(
|
||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@ -293,53 +189,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
@Nullable AudioRendererEventListener eventListener,
|
||||||
AudioSink audioSink) {
|
AudioSink audioSink) {
|
||||||
this(
|
|
||||||
context,
|
|
||||||
mediaCodecSelector,
|
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
enableDecoderFallback,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
audioSink);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param context A context.
|
|
||||||
* @param mediaCodecSelector A decoder selector.
|
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
|
||||||
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
|
||||||
* the primary decoder.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param audioSink The sink to which audio will be output.
|
|
||||||
* @deprecated Use {@link #MediaCodecAudioRenderer(Context, MediaCodecSelector, boolean, Handler,
|
|
||||||
* AudioRendererEventListener, AudioSink)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public MediaCodecAudioRenderer(
|
|
||||||
Context context,
|
|
||||||
MediaCodecSelector mediaCodecSelector,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
boolean enableDecoderFallback,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
|
||||||
AudioSink audioSink) {
|
|
||||||
super(
|
super(
|
||||||
C.TRACK_TYPE_AUDIO,
|
C.TRACK_TYPE_AUDIO,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
enableDecoderFallback,
|
enableDecoderFallback,
|
||||||
/* assumedMinimumCodecOperatingRate= */ 44100);
|
/* assumedMinimumCodecOperatingRate= */ 44100);
|
||||||
this.context = context.getApplicationContext();
|
this.context = context.getApplicationContext();
|
||||||
@ -352,7 +204,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
@Capabilities
|
@Capabilities
|
||||||
protected int supportsFormat(
|
protected int supportsFormat(
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
Format format)
|
Format format)
|
||||||
throws DecoderQueryException {
|
throws DecoderQueryException {
|
||||||
String mimeType = format.sampleMimeType;
|
String mimeType = format.sampleMimeType;
|
||||||
@ -362,10 +213,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
|||||||
@TunnelingSupport
|
@TunnelingSupport
|
||||||
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
|
int tunnelingSupport = Util.SDK_INT >= 21 ? TUNNELING_SUPPORTED : TUNNELING_NOT_SUPPORTED;
|
||||||
boolean supportsFormatDrm =
|
boolean supportsFormatDrm =
|
||||||
format.drmInitData == null
|
format.drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
|
||||||
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType)
|
|
||||||
|| (format.exoMediaCryptoType == null
|
|
||||||
&& supportsFormatDrm(drmSessionManager, format.drmInitData));
|
|
||||||
if (supportsFormatDrm
|
if (supportsFormatDrm
|
||||||
&& allowPassthrough(format.channelCount, mimeType)
|
&& allowPassthrough(format.channelCount, mimeType)
|
||||||
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) {
|
&& mediaCodecSelector.getPassthroughDecoderInfo() != null) {
|
||||||
|
@ -36,7 +36,6 @@ import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
|||||||
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
|
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSession;
|
import com.google.android.exoplayer2.drm.DrmSession;
|
||||||
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.MediaClock;
|
import com.google.android.exoplayer2.util.MediaClock;
|
||||||
@ -91,13 +90,10 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
*/
|
*/
|
||||||
private static final int REINITIALIZATION_STATE_WAIT_END_OF_STREAM = 2;
|
private static final int REINITIALIZATION_STATE_WAIT_END_OF_STREAM = 2;
|
||||||
|
|
||||||
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
|
|
||||||
private final boolean playClearSamplesWithoutKeys;
|
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
private final AudioSink audioSink;
|
private final AudioSink audioSink;
|
||||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||||
|
|
||||||
private boolean drmResourcesAcquired;
|
|
||||||
private DecoderCounters decoderCounters;
|
private DecoderCounters decoderCounters;
|
||||||
private Format inputFormat;
|
private Format inputFormat;
|
||||||
private int encoderDelay;
|
private int encoderDelay;
|
||||||
@ -142,8 +138,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
/* audioCapabilities= */ null,
|
/* audioCapabilities= */ null,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
audioProcessors);
|
audioProcessors);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -153,67 +147,27 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
* @param audioCapabilities The audio capabilities for playback on this device. May be null if the
|
* @param audioCapabilities The audio capabilities for playback on this device. May be null if the
|
||||||
* default capabilities (no encoded audio passthrough support) should be assumed.
|
* default capabilities (no encoded audio passthrough support) should be assumed.
|
||||||
*/
|
|
||||||
public SimpleDecoderAudioRenderer(
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
|
||||||
@Nullable AudioCapabilities audioCapabilities) {
|
|
||||||
this(
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
audioCapabilities,
|
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param audioCapabilities The audio capabilities for playback on this device. May be null if the
|
|
||||||
* default capabilities (no encoded audio passthrough support) should be assumed.
|
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
|
* @param audioProcessors Optional {@link AudioProcessor}s that will process audio before output.
|
||||||
*/
|
*/
|
||||||
public SimpleDecoderAudioRenderer(
|
public SimpleDecoderAudioRenderer(
|
||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
@Nullable AudioRendererEventListener eventListener,
|
||||||
@Nullable AudioCapabilities audioCapabilities,
|
@Nullable AudioCapabilities audioCapabilities,
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
AudioProcessor... audioProcessors) {
|
AudioProcessor... audioProcessors) {
|
||||||
this(eventHandler, eventListener, drmSessionManager,
|
this(eventHandler, eventListener, new DefaultAudioSink(audioCapabilities, audioProcessors));
|
||||||
playClearSamplesWithoutKeys, new DefaultAudioSink(audioCapabilities, audioProcessors));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
||||||
* null if delivery of events is not required.
|
* null if delivery of events is not required.
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param audioSink The sink to which audio will be output.
|
* @param audioSink The sink to which audio will be output.
|
||||||
*/
|
*/
|
||||||
public SimpleDecoderAudioRenderer(
|
public SimpleDecoderAudioRenderer(
|
||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable AudioRendererEventListener eventListener,
|
@Nullable AudioRendererEventListener eventListener,
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
AudioSink audioSink) {
|
AudioSink audioSink) {
|
||||||
super(C.TRACK_TYPE_AUDIO);
|
super(C.TRACK_TYPE_AUDIO);
|
||||||
this.drmSessionManager = drmSessionManager;
|
|
||||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
|
||||||
eventDispatcher = new EventDispatcher(eventHandler, eventListener);
|
eventDispatcher = new EventDispatcher(eventHandler, eventListener);
|
||||||
this.audioSink = audioSink;
|
this.audioSink = audioSink;
|
||||||
audioSink.setListener(new AudioSinkListener());
|
audioSink.setListener(new AudioSinkListener());
|
||||||
@ -234,7 +188,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
if (!MimeTypes.isAudio(format.sampleMimeType)) {
|
if (!MimeTypes.isAudio(format.sampleMimeType)) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||||
}
|
}
|
||||||
@FormatSupport int formatSupport = supportsFormatInternal(drmSessionManager, format);
|
@FormatSupport int formatSupport = supportsFormatInternal(format);
|
||||||
if (formatSupport <= FORMAT_UNSUPPORTED_DRM) {
|
if (formatSupport <= FORMAT_UNSUPPORTED_DRM) {
|
||||||
return RendererCapabilities.create(formatSupport);
|
return RendererCapabilities.create(formatSupport);
|
||||||
}
|
}
|
||||||
@ -246,13 +200,11 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
/**
|
/**
|
||||||
* Returns the {@link FormatSupport} for the given {@link Format}.
|
* Returns the {@link FormatSupport} for the given {@link Format}.
|
||||||
*
|
*
|
||||||
* @param drmSessionManager The renderer's {@link DrmSessionManager}.
|
|
||||||
* @param format The format, which has an audio {@link Format#sampleMimeType}.
|
* @param format The format, which has an audio {@link Format#sampleMimeType}.
|
||||||
* @return The {@link FormatSupport} for this {@link Format}.
|
* @return The {@link FormatSupport} for this {@link Format}.
|
||||||
*/
|
*/
|
||||||
@FormatSupport
|
@FormatSupport
|
||||||
protected abstract int supportsFormatInternal(
|
protected abstract int supportsFormatInternal(Format format);
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether the sink supports the audio format.
|
* Returns whether the sink supports the audio format.
|
||||||
@ -476,8 +428,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
|
|
||||||
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
||||||
if (decoderDrmSession == null
|
if (decoderDrmSession == null
|
||||||
|| (!bufferEncrypted
|
|| (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
|
||||||
&& (playClearSamplesWithoutKeys || decoderDrmSession.playClearSamplesWithoutKeys()))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@DrmSession.State int drmSessionState = decoderDrmSession.getState();
|
@DrmSession.State int drmSessionState = decoderDrmSession.getState();
|
||||||
@ -544,10 +495,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
||||||
if (drmSessionManager != null && !drmResourcesAcquired) {
|
|
||||||
drmResourcesAcquired = true;
|
|
||||||
drmSessionManager.prepare();
|
|
||||||
}
|
|
||||||
decoderCounters = new DecoderCounters();
|
decoderCounters = new DecoderCounters();
|
||||||
eventDispatcher.enabled(decoderCounters);
|
eventDispatcher.enabled(decoderCounters);
|
||||||
int tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId;
|
int tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId;
|
||||||
@ -596,14 +543,6 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onReset() {
|
|
||||||
if (drmSessionManager != null && drmResourcesAcquired) {
|
|
||||||
drmResourcesAcquired = false;
|
|
||||||
drmSessionManager.release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException {
|
public void handleMessage(int messageType, @Nullable Object message) throws ExoPlaybackException {
|
||||||
switch (messageType) {
|
switch (messageType) {
|
||||||
@ -686,12 +625,7 @@ public abstract class SimpleDecoderAudioRenderer extends BaseRenderer implements
|
|||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
private void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
||||||
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
||||||
if (formatHolder.includesDrmSession) {
|
|
||||||
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
||||||
} else {
|
|
||||||
sourceDrmSession =
|
|
||||||
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
|
|
||||||
}
|
|
||||||
Format oldFormat = inputFormat;
|
Format oldFormat = inputFormat;
|
||||||
inputFormat = newFormat;
|
inputFormat = newFormat;
|
||||||
|
|
||||||
|
@ -38,7 +38,6 @@ import com.google.android.exoplayer2.decoder.DecoderCounters;
|
|||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSession;
|
import com.google.android.exoplayer2.drm.DrmSession;
|
||||||
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
|
||||||
import com.google.android.exoplayer2.source.MediaPeriod;
|
import com.google.android.exoplayer2.source.MediaPeriod;
|
||||||
@ -379,8 +378,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
private static final int ADAPTATION_WORKAROUND_SLICE_WIDTH_HEIGHT = 32;
|
private static final int ADAPTATION_WORKAROUND_SLICE_WIDTH_HEIGHT = 32;
|
||||||
|
|
||||||
private final MediaCodecSelector mediaCodecSelector;
|
private final MediaCodecSelector mediaCodecSelector;
|
||||||
@Nullable private final DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
|
|
||||||
private final boolean playClearSamplesWithoutKeys;
|
|
||||||
private final boolean enableDecoderFallback;
|
private final boolean enableDecoderFallback;
|
||||||
private final float assumedMinimumCodecOperatingRate;
|
private final float assumedMinimumCodecOperatingRate;
|
||||||
private final DecoderInputBuffer buffer;
|
private final DecoderInputBuffer buffer;
|
||||||
@ -391,7 +388,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
private final long[] pendingOutputStreamOffsetsUs;
|
private final long[] pendingOutputStreamOffsetsUs;
|
||||||
private final long[] pendingOutputStreamSwitchTimesUs;
|
private final long[] pendingOutputStreamSwitchTimesUs;
|
||||||
|
|
||||||
private boolean drmResourcesAcquired;
|
|
||||||
@Nullable private Format inputFormat;
|
@Nullable private Format inputFormat;
|
||||||
private Format outputFormat;
|
private Format outputFormat;
|
||||||
@Nullable private DrmSession<FrameworkMediaCrypto> codecDrmSession;
|
@Nullable private DrmSession<FrameworkMediaCrypto> codecDrmSession;
|
||||||
@ -448,13 +444,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
* @param trackType The track type that the renderer handles. One of the {@code C.TRACK_TYPE_*}
|
* @param trackType The track type that the renderer handles. One of the {@code C.TRACK_TYPE_*}
|
||||||
* constants defined in {@link C}.
|
* constants defined in {@link C}.
|
||||||
* @param mediaCodecSelector A decoder selector.
|
* @param mediaCodecSelector A decoder selector.
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
||||||
* initialization fails. This may result in using a decoder that is less efficient or slower
|
* initialization fails. This may result in using a decoder that is less efficient or slower
|
||||||
* than the primary decoder.
|
* than the primary decoder.
|
||||||
@ -465,14 +454,10 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
public MediaCodecRenderer(
|
public MediaCodecRenderer(
|
||||||
int trackType,
|
int trackType,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
boolean enableDecoderFallback,
|
boolean enableDecoderFallback,
|
||||||
float assumedMinimumCodecOperatingRate) {
|
float assumedMinimumCodecOperatingRate) {
|
||||||
super(trackType);
|
super(trackType);
|
||||||
this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector);
|
this.mediaCodecSelector = Assertions.checkNotNull(mediaCodecSelector);
|
||||||
this.drmSessionManager = drmSessionManager;
|
|
||||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
|
||||||
this.enableDecoderFallback = enableDecoderFallback;
|
this.enableDecoderFallback = enableDecoderFallback;
|
||||||
this.assumedMinimumCodecOperatingRate = assumedMinimumCodecOperatingRate;
|
this.assumedMinimumCodecOperatingRate = assumedMinimumCodecOperatingRate;
|
||||||
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED);
|
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DISABLED);
|
||||||
@ -550,7 +535,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
@Capabilities
|
@Capabilities
|
||||||
public final int supportsFormat(Format format) throws ExoPlaybackException {
|
public final int supportsFormat(Format format) throws ExoPlaybackException {
|
||||||
try {
|
try {
|
||||||
return supportsFormat(mediaCodecSelector, drmSessionManager, format);
|
return supportsFormat(mediaCodecSelector, format);
|
||||||
} catch (DecoderQueryException e) {
|
} catch (DecoderQueryException e) {
|
||||||
throw createRendererException(e, format);
|
throw createRendererException(e, format);
|
||||||
}
|
}
|
||||||
@ -560,7 +545,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
* Returns the {@link Capabilities} for the given {@link Format}.
|
* Returns the {@link Capabilities} for the given {@link Format}.
|
||||||
*
|
*
|
||||||
* @param mediaCodecSelector The decoder selector.
|
* @param mediaCodecSelector The decoder selector.
|
||||||
* @param drmSessionManager The renderer's {@link DrmSessionManager}.
|
|
||||||
* @param format The {@link Format}.
|
* @param format The {@link Format}.
|
||||||
* @return The {@link Capabilities} for this {@link Format}.
|
* @return The {@link Capabilities} for this {@link Format}.
|
||||||
* @throws DecoderQueryException If there was an error querying decoders.
|
* @throws DecoderQueryException If there was an error querying decoders.
|
||||||
@ -568,7 +552,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
@Capabilities
|
@Capabilities
|
||||||
protected abstract int supportsFormat(
|
protected abstract int supportsFormat(
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
Format format)
|
Format format)
|
||||||
throws DecoderQueryException;
|
throws DecoderQueryException;
|
||||||
|
|
||||||
@ -696,10 +679,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
||||||
if (drmSessionManager != null && !drmResourcesAcquired) {
|
|
||||||
drmResourcesAcquired = true;
|
|
||||||
drmSessionManager.prepare();
|
|
||||||
}
|
|
||||||
decoderCounters = new DecoderCounters();
|
decoderCounters = new DecoderCounters();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -771,10 +750,6 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
} finally {
|
} finally {
|
||||||
setSourceDrmSession(null);
|
setSourceDrmSession(null);
|
||||||
}
|
}
|
||||||
if (drmSessionManager != null && drmResourcesAcquired) {
|
|
||||||
drmResourcesAcquired = false;
|
|
||||||
drmSessionManager.release();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void releaseCodec() {
|
protected void releaseCodec() {
|
||||||
@ -1366,8 +1341,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
|
|
||||||
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
||||||
if (codecDrmSession == null
|
if (codecDrmSession == null
|
||||||
|| (!bufferEncrypted
|
|| (!bufferEncrypted && codecDrmSession.playClearSamplesWithoutKeys())) {
|
||||||
&& (playClearSamplesWithoutKeys || codecDrmSession.playClearSamplesWithoutKeys()))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@DrmSession.State int drmSessionState = codecDrmSession.getState();
|
@DrmSession.State int drmSessionState = codecDrmSession.getState();
|
||||||
@ -1402,12 +1376,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer {
|
|||||||
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
||||||
waitingForFirstSampleInFormat = true;
|
waitingForFirstSampleInFormat = true;
|
||||||
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
||||||
if (formatHolder.includesDrmSession) {
|
|
||||||
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
|
setSourceDrmSession((DrmSession<FrameworkMediaCrypto>) formatHolder.drmSession);
|
||||||
} else {
|
|
||||||
sourceDrmSession =
|
|
||||||
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
|
|
||||||
}
|
|
||||||
inputFormat = newFormat;
|
inputFormat = newFormat;
|
||||||
|
|
||||||
if (codec == null) {
|
if (codec == null) {
|
||||||
|
@ -96,7 +96,7 @@ public final class MetadataRenderer extends BaseRenderer implements Callback {
|
|||||||
public int supportsFormat(Format format) {
|
public int supportsFormat(Format format) {
|
||||||
if (decoderFactory.supportsFormat(format)) {
|
if (decoderFactory.supportsFormat(format)) {
|
||||||
return RendererCapabilities.create(
|
return RendererCapabilities.create(
|
||||||
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
|
format.drmInitData == null ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
|
||||||
} else {
|
} else {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_TYPE);
|
||||||
}
|
}
|
||||||
|
@ -171,8 +171,7 @@ public final class DownloadHelper {
|
|||||||
new VideoRendererEventListener() {},
|
new VideoRendererEventListener() {},
|
||||||
new AudioRendererEventListener() {},
|
new AudioRendererEventListener() {},
|
||||||
(cues) -> {},
|
(cues) -> {},
|
||||||
(metadata) -> {},
|
(metadata) -> {});
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
RendererCapabilities[] capabilities = new RendererCapabilities[renderers.length];
|
RendererCapabilities[] capabilities = new RendererCapabilities[renderers.length];
|
||||||
for (int i = 0; i < renderers.length; i++) {
|
for (int i = 0; i < renderers.length; i++) {
|
||||||
capabilities[i] = renderers[i].getCapabilities();
|
capabilities[i] = renderers[i].getCapabilities();
|
||||||
|
@ -123,7 +123,7 @@ public final class TextRenderer extends BaseRenderer implements Callback {
|
|||||||
public int supportsFormat(Format format) {
|
public int supportsFormat(Format format) {
|
||||||
if (decoderFactory.supportsFormat(format)) {
|
if (decoderFactory.supportsFormat(format)) {
|
||||||
return RendererCapabilities.create(
|
return RendererCapabilities.create(
|
||||||
supportsFormatDrm(null, format.drmInitData) ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
|
format.drmInitData == null ? FORMAT_HANDLED : FORMAT_UNSUPPORTED_DRM);
|
||||||
} else if (MimeTypes.isText(format.sampleMimeType)) {
|
} else if (MimeTypes.isText(format.sampleMimeType)) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
||||||
} else {
|
} else {
|
||||||
|
@ -41,7 +41,6 @@ import com.google.android.exoplayer2.PlayerMessage.Target;
|
|||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
import com.google.android.exoplayer2.RendererCapabilities;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmInitData;
|
import com.google.android.exoplayer2.drm.DrmInitData;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
|
||||||
@ -49,7 +48,6 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
|||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaFormatUtil;
|
import com.google.android.exoplayer2.mediacodec.MediaFormatUtil;
|
||||||
import com.google.android.exoplayer2.source.MediaSource;
|
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.Log;
|
import com.google.android.exoplayer2.util.Log;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
@ -194,7 +192,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecVideoRenderer(
|
public MediaCodecVideoRenderer(
|
||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@ -206,51 +203,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
allowedJoiningTimeMs,
|
allowedJoiningTimeMs,
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
maxDroppedFramesToNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param context A context.
|
|
||||||
* @param mediaCodecSelector A decoder selector.
|
|
||||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
|
||||||
* can attempt to seamlessly join an ongoing playback.
|
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
|
||||||
* @deprecated Use {@link #MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean,
|
|
||||||
* Handler, VideoRendererEventListener, int)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecVideoRenderer(
|
|
||||||
Context context,
|
|
||||||
MediaCodecSelector mediaCodecSelector,
|
|
||||||
long allowedJoiningTimeMs,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
|
||||||
int maxDroppedFramesToNotify) {
|
|
||||||
this(
|
|
||||||
context,
|
|
||||||
mediaCodecSelector,
|
|
||||||
allowedJoiningTimeMs,
|
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
/* enableDecoderFallback= */ false,
|
/* enableDecoderFallback= */ false,
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
@ -271,7 +223,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public MediaCodecVideoRenderer(
|
public MediaCodecVideoRenderer(
|
||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@ -280,58 +231,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
@Nullable VideoRendererEventListener eventListener,
|
||||||
int maxDroppedFramesToNotify) {
|
int maxDroppedFramesToNotify) {
|
||||||
this(
|
|
||||||
context,
|
|
||||||
mediaCodecSelector,
|
|
||||||
allowedJoiningTimeMs,
|
|
||||||
/* drmSessionManager= */ null,
|
|
||||||
/* playClearSamplesWithoutKeys= */ false,
|
|
||||||
enableDecoderFallback,
|
|
||||||
eventHandler,
|
|
||||||
eventListener,
|
|
||||||
maxDroppedFramesToNotify);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param context A context.
|
|
||||||
* @param mediaCodecSelector A decoder selector.
|
|
||||||
* @param allowedJoiningTimeMs The maximum duration in milliseconds for which this video renderer
|
|
||||||
* can attempt to seamlessly join an ongoing playback.
|
|
||||||
* @param drmSessionManager For use with encrypted content. May be null if support for encrypted
|
|
||||||
* content is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
* @param enableDecoderFallback Whether to enable fallback to lower-priority decoders if decoder
|
|
||||||
* initialization fails. This may result in using a decoder that is slower/less efficient than
|
|
||||||
* the primary decoder.
|
|
||||||
* @param eventHandler A handler to use when delivering events to {@code eventListener}. May be
|
|
||||||
* null if delivery of events is not required.
|
|
||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
|
||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
|
||||||
* @deprecated Use {@link #MediaCodecVideoRenderer(Context, MediaCodecSelector, long, boolean,
|
|
||||||
* Handler, VideoRendererEventListener, int)} instead, and pass DRM-related parameters to the
|
|
||||||
* {@link MediaSource} factories.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public MediaCodecVideoRenderer(
|
|
||||||
Context context,
|
|
||||||
MediaCodecSelector mediaCodecSelector,
|
|
||||||
long allowedJoiningTimeMs,
|
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
boolean enableDecoderFallback,
|
|
||||||
@Nullable Handler eventHandler,
|
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
|
||||||
int maxDroppedFramesToNotify) {
|
|
||||||
super(
|
super(
|
||||||
C.TRACK_TYPE_VIDEO,
|
C.TRACK_TYPE_VIDEO,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
enableDecoderFallback,
|
enableDecoderFallback,
|
||||||
/* assumedMinimumCodecOperatingRate= */ 30);
|
/* assumedMinimumCodecOperatingRate= */ 30);
|
||||||
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
||||||
@ -353,7 +255,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
@Capabilities
|
@Capabilities
|
||||||
protected int supportsFormat(
|
protected int supportsFormat(
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
Format format)
|
Format format)
|
||||||
throws DecoderQueryException {
|
throws DecoderQueryException {
|
||||||
String mimeType = format.sampleMimeType;
|
String mimeType = format.sampleMimeType;
|
||||||
@ -382,10 +283,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_SUBTYPE);
|
||||||
}
|
}
|
||||||
boolean supportsFormatDrm =
|
boolean supportsFormatDrm =
|
||||||
drmInitData == null
|
drmInitData == null || FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType);
|
||||||
|| FrameworkMediaCrypto.class.equals(format.exoMediaCryptoType)
|
|
||||||
|| (format.exoMediaCryptoType == null
|
|
||||||
&& supportsFormatDrm(drmSessionManager, drmInitData));
|
|
||||||
if (!supportsFormatDrm) {
|
if (!supportsFormatDrm) {
|
||||||
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
return RendererCapabilities.create(FORMAT_UNSUPPORTED_DRM);
|
||||||
}
|
}
|
||||||
|
@ -26,13 +26,11 @@ import com.google.android.exoplayer2.C;
|
|||||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||||
import com.google.android.exoplayer2.Format;
|
import com.google.android.exoplayer2.Format;
|
||||||
import com.google.android.exoplayer2.FormatHolder;
|
import com.google.android.exoplayer2.FormatHolder;
|
||||||
import com.google.android.exoplayer2.RendererCapabilities;
|
|
||||||
import com.google.android.exoplayer2.decoder.DecoderCounters;
|
import com.google.android.exoplayer2.decoder.DecoderCounters;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||||
import com.google.android.exoplayer2.drm.DrmSession;
|
import com.google.android.exoplayer2.drm.DrmSession;
|
||||||
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.util.Assertions;
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.TimedValueQueue;
|
import com.google.android.exoplayer2.util.TimedValueQueue;
|
||||||
@ -71,13 +69,10 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
|
|
||||||
private final long allowedJoiningTimeMs;
|
private final long allowedJoiningTimeMs;
|
||||||
private final int maxDroppedFramesToNotify;
|
private final int maxDroppedFramesToNotify;
|
||||||
private final boolean playClearSamplesWithoutKeys;
|
|
||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
private final TimedValueQueue<Format> formatQueue;
|
private final TimedValueQueue<Format> formatQueue;
|
||||||
private final DecoderInputBuffer flagsOnlyBuffer;
|
private final DecoderInputBuffer flagsOnlyBuffer;
|
||||||
private final DrmSessionManager<ExoMediaCrypto> drmSessionManager;
|
|
||||||
|
|
||||||
private boolean drmResourcesAcquired;
|
|
||||||
private Format inputFormat;
|
private Format inputFormat;
|
||||||
private Format outputFormat;
|
private Format outputFormat;
|
||||||
private SimpleDecoder<
|
private SimpleDecoder<
|
||||||
@ -126,26 +121,15 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
* @param eventListener A listener of events. May be null if delivery of events is not required.
|
||||||
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
* @param maxDroppedFramesToNotify The maximum number of frames that can be dropped between
|
||||||
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
* invocations of {@link VideoRendererEventListener#onDroppedFrames(int, long)}.
|
||||||
* @param drmSessionManager For use with encrypted media. May be null if support for encrypted
|
|
||||||
* media is not required.
|
|
||||||
* @param playClearSamplesWithoutKeys Encrypted media may contain clear (un-encrypted) regions.
|
|
||||||
* For example a media file may start with a short clear region so as to allow playback to
|
|
||||||
* begin in parallel with key acquisition. This parameter specifies whether the renderer is
|
|
||||||
* permitted to play clear regions of encrypted media files before {@code drmSessionManager}
|
|
||||||
* has obtained the keys necessary to decrypt encrypted regions of the media.
|
|
||||||
*/
|
*/
|
||||||
protected SimpleDecoderVideoRenderer(
|
protected SimpleDecoderVideoRenderer(
|
||||||
long allowedJoiningTimeMs,
|
long allowedJoiningTimeMs,
|
||||||
@Nullable Handler eventHandler,
|
@Nullable Handler eventHandler,
|
||||||
@Nullable VideoRendererEventListener eventListener,
|
@Nullable VideoRendererEventListener eventListener,
|
||||||
int maxDroppedFramesToNotify,
|
int maxDroppedFramesToNotify) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys) {
|
|
||||||
super(C.TRACK_TYPE_VIDEO);
|
super(C.TRACK_TYPE_VIDEO);
|
||||||
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
this.allowedJoiningTimeMs = allowedJoiningTimeMs;
|
||||||
this.maxDroppedFramesToNotify = maxDroppedFramesToNotify;
|
this.maxDroppedFramesToNotify = maxDroppedFramesToNotify;
|
||||||
this.drmSessionManager = drmSessionManager;
|
|
||||||
this.playClearSamplesWithoutKeys = playClearSamplesWithoutKeys;
|
|
||||||
joiningDeadlineMs = C.TIME_UNSET;
|
joiningDeadlineMs = C.TIME_UNSET;
|
||||||
clearReportedVideoSize();
|
clearReportedVideoSize();
|
||||||
formatQueue = new TimedValueQueue<>();
|
formatQueue = new TimedValueQueue<>();
|
||||||
@ -157,12 +141,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
|
|
||||||
// BaseRenderer implementation.
|
// BaseRenderer implementation.
|
||||||
|
|
||||||
@Override
|
|
||||||
@Capabilities
|
|
||||||
public final int supportsFormat(Format format) {
|
|
||||||
return supportsFormatInternal(drmSessionManager, format);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
|
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException {
|
||||||
if (outputStreamEnded) {
|
if (outputStreamEnded) {
|
||||||
@ -238,10 +216,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
protected void onEnabled(boolean joining) throws ExoPlaybackException {
|
||||||
if (drmSessionManager != null && !drmResourcesAcquired) {
|
|
||||||
drmResourcesAcquired = true;
|
|
||||||
drmSessionManager.prepare();
|
|
||||||
}
|
|
||||||
decoderCounters = new DecoderCounters();
|
decoderCounters = new DecoderCounters();
|
||||||
eventDispatcher.enabled(decoderCounters);
|
eventDispatcher.enabled(decoderCounters);
|
||||||
}
|
}
|
||||||
@ -291,14 +265,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onReset() {
|
|
||||||
if (drmSessionManager != null && drmResourcesAcquired) {
|
|
||||||
drmResourcesAcquired = false;
|
|
||||||
drmSessionManager.release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlaybackException {
|
protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlaybackException {
|
||||||
outputStreamOffsetUs = offsetUs;
|
outputStreamOffsetUs = offsetUs;
|
||||||
@ -371,12 +337,7 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException {
|
||||||
waitingForFirstSampleInFormat = true;
|
waitingForFirstSampleInFormat = true;
|
||||||
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
Format newFormat = Assertions.checkNotNull(formatHolder.format);
|
||||||
if (formatHolder.includesDrmSession) {
|
|
||||||
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
setSourceDrmSession((DrmSession<ExoMediaCrypto>) formatHolder.drmSession);
|
||||||
} else {
|
|
||||||
sourceDrmSession =
|
|
||||||
getUpdatedSourceDrmSession(inputFormat, newFormat, drmSessionManager, sourceDrmSession);
|
|
||||||
}
|
|
||||||
inputFormat = newFormat;
|
inputFormat = newFormat;
|
||||||
|
|
||||||
if (sourceDrmSession != decoderDrmSession) {
|
if (sourceDrmSession != decoderDrmSession) {
|
||||||
@ -511,18 +472,6 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@link Capabilities} for the given {@link Format}.
|
|
||||||
*
|
|
||||||
* @param drmSessionManager The renderer's {@link DrmSessionManager}.
|
|
||||||
* @param format The format, which has a video {@link Format#sampleMimeType}.
|
|
||||||
* @return The {@link Capabilities} for this {@link Format}.
|
|
||||||
* @see RendererCapabilities#supportsFormat(Format)
|
|
||||||
*/
|
|
||||||
@Capabilities
|
|
||||||
protected abstract int supportsFormatInternal(
|
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a decoder for the given format.
|
* Creates a decoder for the given format.
|
||||||
*
|
*
|
||||||
@ -893,9 +842,9 @@ public abstract class SimpleDecoderVideoRenderer extends BaseRenderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
private boolean shouldWaitForKeys(boolean bufferEncrypted) throws ExoPlaybackException {
|
||||||
|
DrmSession<ExoMediaCrypto> decoderDrmSession = this.decoderDrmSession;
|
||||||
if (decoderDrmSession == null
|
if (decoderDrmSession == null
|
||||||
|| (!bufferEncrypted
|
|| (!bufferEncrypted && decoderDrmSession.playClearSamplesWithoutKeys())) {
|
||||||
&& (playClearSamplesWithoutKeys || decoderDrmSession.playClearSamplesWithoutKeys()))) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@DrmSession.State int drmSessionState = decoderDrmSession.getState();
|
@DrmSession.State int drmSessionState = decoderDrmSession.getState();
|
||||||
|
@ -1167,8 +1167,7 @@ public final class AnalyticsCollectorTest {
|
|||||||
videoRendererEventListener,
|
videoRendererEventListener,
|
||||||
audioRendererEventListener,
|
audioRendererEventListener,
|
||||||
textRendererOutput,
|
textRendererOutput,
|
||||||
metadataRendererOutput,
|
metadataRendererOutput) ->
|
||||||
drmSessionManager) ->
|
|
||||||
new Renderer[] {
|
new Renderer[] {
|
||||||
new FakeVideoRenderer(eventHandler, videoRendererEventListener),
|
new FakeVideoRenderer(eventHandler, videoRendererEventListener),
|
||||||
new FakeAudioRenderer(eventHandler, audioRendererEventListener)
|
new FakeAudioRenderer(eventHandler, audioRendererEventListener)
|
||||||
|
@ -32,7 +32,6 @@ import com.google.android.exoplayer2.RendererConfiguration;
|
|||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
import com.google.android.exoplayer2.decoder.SimpleDecoder;
|
||||||
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
|
import com.google.android.exoplayer2.decoder.SimpleOutputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
import com.google.android.exoplayer2.drm.ExoMediaCrypto;
|
||||||
import com.google.android.exoplayer2.testutil.FakeSampleStream;
|
import com.google.android.exoplayer2.testutil.FakeSampleStream;
|
||||||
import com.google.android.exoplayer2.util.MimeTypes;
|
import com.google.android.exoplayer2.util.MimeTypes;
|
||||||
@ -56,11 +55,10 @@ public class SimpleDecoderAudioRendererTest {
|
|||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
audioRenderer =
|
audioRenderer =
|
||||||
new SimpleDecoderAudioRenderer(null, null, null, false, mockAudioSink) {
|
new SimpleDecoderAudioRenderer(null, null, mockAudioSink) {
|
||||||
@Override
|
@Override
|
||||||
@FormatSupport
|
@FormatSupport
|
||||||
protected int supportsFormatInternal(
|
protected int supportsFormatInternal(Format format) {
|
||||||
@Nullable DrmSessionManager<ExoMediaCrypto> drmSessionManager, Format format) {
|
|
||||||
return FORMAT_HANDLED;
|
return FORMAT_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ public class DownloadHelperTest {
|
|||||||
FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh);
|
FakeRenderer audioRenderer = new FakeRenderer(audioFormatUs, audioFormatZh);
|
||||||
FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh);
|
FakeRenderer textRenderer = new FakeRenderer(textFormatUs, textFormatZh);
|
||||||
RenderersFactory renderersFactory =
|
RenderersFactory renderersFactory =
|
||||||
(handler, videoListener, audioListener, metadata, text, drm) ->
|
(handler, videoListener, audioListener, metadata, text) ->
|
||||||
new Renderer[] {textRenderer, audioRenderer, videoRenderer};
|
new Renderer[] {textRenderer, audioRenderer, videoRenderer};
|
||||||
|
|
||||||
downloadHelper =
|
downloadHelper =
|
||||||
|
@ -35,11 +35,11 @@ public final class DownloadHelperTest {
|
|||||||
ApplicationProvider.getApplicationContext(),
|
ApplicationProvider.getApplicationContext(),
|
||||||
Uri.parse("http://uri"),
|
Uri.parse("http://uri"),
|
||||||
new FakeDataSource.Factory(),
|
new FakeDataSource.Factory(),
|
||||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
|
||||||
DownloadHelper.forDash(
|
DownloadHelper.forDash(
|
||||||
Uri.parse("http://uri"),
|
Uri.parse("http://uri"),
|
||||||
new FakeDataSource.Factory(),
|
new FakeDataSource.Factory(),
|
||||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
|
||||||
/* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(),
|
/* drmSessionManager= */ DrmSessionManager.getDummyDrmSessionManager(),
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
||||||
}
|
}
|
||||||
|
@ -34,11 +34,11 @@ public final class DownloadHelperTest {
|
|||||||
ApplicationProvider.getApplicationContext(),
|
ApplicationProvider.getApplicationContext(),
|
||||||
Uri.parse("http://uri"),
|
Uri.parse("http://uri"),
|
||||||
new FakeDataSource.Factory(),
|
new FakeDataSource.Factory(),
|
||||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
|
||||||
DownloadHelper.forHls(
|
DownloadHelper.forHls(
|
||||||
Uri.parse("http://uri"),
|
Uri.parse("http://uri"),
|
||||||
new FakeDataSource.Factory(),
|
new FakeDataSource.Factory(),
|
||||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
|
||||||
/* drmSessionManager= */ null,
|
/* drmSessionManager= */ null,
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
||||||
}
|
}
|
||||||
|
@ -34,11 +34,11 @@ public final class DownloadHelperTest {
|
|||||||
ApplicationProvider.getApplicationContext(),
|
ApplicationProvider.getApplicationContext(),
|
||||||
Uri.parse("http://uri"),
|
Uri.parse("http://uri"),
|
||||||
new FakeDataSource.Factory(),
|
new FakeDataSource.Factory(),
|
||||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0]);
|
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0]);
|
||||||
DownloadHelper.forSmoothStreaming(
|
DownloadHelper.forSmoothStreaming(
|
||||||
Uri.parse("http://uri"),
|
Uri.parse("http://uri"),
|
||||||
new FakeDataSource.Factory(),
|
new FakeDataSource.Factory(),
|
||||||
(handler, videoListener, audioListener, text, metadata, drm) -> new Renderer[0],
|
(handler, videoListener, audioListener, text, metadata) -> new Renderer[0],
|
||||||
/* drmSessionManager= */ null,
|
/* drmSessionManager= */ null,
|
||||||
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT);
|
||||||
}
|
}
|
||||||
|
@ -270,7 +270,7 @@ import java.util.List;
|
|||||||
C.WIDEVINE_UUID,
|
C.WIDEVINE_UUID,
|
||||||
frameworkMediaDrm,
|
frameworkMediaDrm,
|
||||||
drmCallback,
|
drmCallback,
|
||||||
/* optionalKeyRequestParameters= */ null,
|
/* keyRequestParameters= */ null,
|
||||||
/* multiSession= */ false,
|
/* multiSession= */ false,
|
||||||
DefaultDrmSessionManager.INITIAL_DRM_REQUEST_RETRY_COUNT);
|
DefaultDrmSessionManager.INITIAL_DRM_REQUEST_RETRY_COUNT);
|
||||||
if (!useL1Widevine) {
|
if (!useL1Widevine) {
|
||||||
|
@ -27,8 +27,6 @@ import com.google.android.exoplayer2.Format;
|
|||||||
import com.google.android.exoplayer2.FormatHolder;
|
import com.google.android.exoplayer2.FormatHolder;
|
||||||
import com.google.android.exoplayer2.Renderer;
|
import com.google.android.exoplayer2.Renderer;
|
||||||
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||||
import com.google.android.exoplayer2.drm.DrmSessionManager;
|
|
||||||
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
|
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
|
||||||
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
|
||||||
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer;
|
import com.google.android.exoplayer2.video.MediaCodecVideoRenderer;
|
||||||
@ -53,8 +51,6 @@ import java.util.ArrayList;
|
|||||||
Context context,
|
Context context,
|
||||||
@ExtensionRendererMode int extensionRendererMode,
|
@ExtensionRendererMode int extensionRendererMode,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
boolean enableDecoderFallback,
|
boolean enableDecoderFallback,
|
||||||
Handler eventHandler,
|
Handler eventHandler,
|
||||||
VideoRendererEventListener eventListener,
|
VideoRendererEventListener eventListener,
|
||||||
@ -65,8 +61,6 @@ import java.util.ArrayList;
|
|||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
allowedVideoJoiningTimeMs,
|
allowedVideoJoiningTimeMs,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
|
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
|
||||||
@ -92,8 +86,6 @@ import java.util.ArrayList;
|
|||||||
Context context,
|
Context context,
|
||||||
MediaCodecSelector mediaCodecSelector,
|
MediaCodecSelector mediaCodecSelector,
|
||||||
long allowedJoiningTimeMs,
|
long allowedJoiningTimeMs,
|
||||||
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
|
|
||||||
boolean playClearSamplesWithoutKeys,
|
|
||||||
Handler eventHandler,
|
Handler eventHandler,
|
||||||
VideoRendererEventListener eventListener,
|
VideoRendererEventListener eventListener,
|
||||||
int maxDroppedFrameCountToNotify) {
|
int maxDroppedFrameCountToNotify) {
|
||||||
@ -101,8 +93,6 @@ import java.util.ArrayList;
|
|||||||
context,
|
context,
|
||||||
mediaCodecSelector,
|
mediaCodecSelector,
|
||||||
allowedJoiningTimeMs,
|
allowedJoiningTimeMs,
|
||||||
drmSessionManager,
|
|
||||||
playClearSamplesWithoutKeys,
|
|
||||||
eventHandler,
|
eventHandler,
|
||||||
eventListener,
|
eventListener,
|
||||||
maxDroppedFrameCountToNotify);
|
maxDroppedFrameCountToNotify);
|
||||||
|
@ -93,7 +93,6 @@ public final class DefaultRenderersFactoryAsserts {
|
|||||||
new VideoRendererEventListener() {},
|
new VideoRendererEventListener() {},
|
||||||
new AudioRendererEventListener() {},
|
new AudioRendererEventListener() {},
|
||||||
(List<Cue> cues) -> {},
|
(List<Cue> cues) -> {},
|
||||||
(Metadata metadata) -> {},
|
(Metadata metadata) -> {});
|
||||||
/* drmSessionManager= */ null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,8 +371,7 @@ public final class ExoPlayerTestRunner implements Player.EventListener, ActionSc
|
|||||||
videoRendererEventListener,
|
videoRendererEventListener,
|
||||||
audioRendererEventListener,
|
audioRendererEventListener,
|
||||||
textRendererOutput,
|
textRendererOutput,
|
||||||
metadataRendererOutput,
|
metadataRendererOutput) -> renderers;
|
||||||
drmSessionManager) -> renderers;
|
|
||||||
}
|
}
|
||||||
if (loadControl == null) {
|
if (loadControl == null) {
|
||||||
loadControl = new DefaultLoadControl();
|
loadControl = new DefaultLoadControl();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user