Commit fb81d629 by olly Committed by Oliver Woodman

Merge #5462: Making easier to set the playClearSampleWithoutKeys to renderers

Imported from GitHub PR https://github.com/google/ExoPlayer/pull/5462

Pull request for the following issue: #5421
Merge d9d88b079c4ca0533a836b2715a65b924babbb89 into a7381916

PiperOrigin-RevId: 232335113
parent 1f476ece
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
package com.google.android.exoplayer2; package com.google.android.exoplayer2;
import android.content.Context; import android.content.Context;
import android.media.MediaCodec;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.support.annotation.IntDef; import android.support.annotation.IntDef;
...@@ -85,15 +86,18 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -85,15 +86,18 @@ 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;
private final @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager; @Nullable private DrmSessionManager<FrameworkMediaCrypto> drmSessionManager;
private final @ExtensionRendererMode int extensionRendererMode; @ExtensionRendererMode private int extensionRendererMode;
private final long allowedVideoJoiningTimeMs; private long allowedVideoJoiningTimeMs;
private boolean playClearSamplesWithoutKeys;
private MediaCodecSelector mediaCodecSelector;
/** /** @param context A {@link Context}. */
* @param context A {@link Context}.
*/
public DefaultRenderersFactory(Context context) { public DefaultRenderersFactory(Context context) {
this(context, EXTENSION_RENDERER_MODE_OFF); this.context = context;
extensionRendererMode = EXTENSION_RENDERER_MODE_OFF;
allowedVideoJoiningTimeMs = DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS;
mediaCodecSelector = MediaCodecSelector.DEFAULT;
} }
/** /**
...@@ -108,19 +112,20 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -108,19 +112,20 @@ public class DefaultRenderersFactory implements RenderersFactory {
} }
/** /**
* @param context A {@link Context}. * @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
* @param extensionRendererMode The extension renderer mode, which determines if and how available * #setExtensionRendererMode(int)}.
* extension renderers are used. Note that extensions must be included in the application
* build for them to be considered available.
*/ */
@Deprecated
@SuppressWarnings("deprecation")
public DefaultRenderersFactory( public DefaultRenderersFactory(
Context context, @ExtensionRendererMode int extensionRendererMode) { Context context, @ExtensionRendererMode int extensionRendererMode) {
this(context, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS); this(context, extensionRendererMode, DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS);
} }
/** /**
* @deprecated Use {@link #DefaultRenderersFactory(Context, int)} and pass {@link * @deprecated Use {@link #DefaultRenderersFactory(Context)} and {@link
* DrmSessionManager} directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}. * #setExtensionRendererMode(int)}, and pass {@link DrmSessionManager} directly to {@link
* SimpleExoPlayer} or {@link ExoPlayerFactory}.
*/ */
@Deprecated @Deprecated
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
...@@ -132,26 +137,22 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -132,26 +137,22 @@ public class DefaultRenderersFactory implements RenderersFactory {
} }
/** /**
* @param context A {@link Context}. * @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
* @param extensionRendererMode The extension renderer mode, which determines if and how available * #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}.
* extension renderers are used. Note that extensions must be included in the application
* build for them to be considered available.
* @param allowedVideoJoiningTimeMs The maximum duration for which video renderers can attempt to
* seamlessly join an ongoing playback.
*/ */
@Deprecated
@SuppressWarnings("deprecation")
public DefaultRenderersFactory( public DefaultRenderersFactory(
Context context, Context context,
@ExtensionRendererMode int extensionRendererMode, @ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) { long allowedVideoJoiningTimeMs) {
this.context = context; this(context, null, extensionRendererMode, allowedVideoJoiningTimeMs);
this.extensionRendererMode = extensionRendererMode;
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
this.drmSessionManager = null;
} }
/** /**
* @deprecated Use {@link #DefaultRenderersFactory(Context, int, long)} and pass {@link * @deprecated Use {@link #DefaultRenderersFactory(Context)}, {@link
* DrmSessionManager} directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}. * #setExtensionRendererMode(int)} and {@link #setAllowedVideoJoiningTimeMs(long)}, and pass
* {@link DrmSessionManager} directly to {@link SimpleExoPlayer} or {@link ExoPlayerFactory}.
*/ */
@Deprecated @Deprecated
public DefaultRenderersFactory( public DefaultRenderersFactory(
...@@ -163,6 +164,70 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -163,6 +164,70 @@ public class DefaultRenderersFactory implements RenderersFactory {
this.extensionRendererMode = extensionRendererMode; this.extensionRendererMode = extensionRendererMode;
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs; this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
this.drmSessionManager = drmSessionManager; this.drmSessionManager = drmSessionManager;
mediaCodecSelector = MediaCodecSelector.DEFAULT;
}
/**
* Sets the extension renderer mode, which determines if and how available extension renderers are
* used. Note that extensions must be included in the application build for them to be considered
* available.
*
* <p>The default value is {@link #EXTENSION_RENDERER_MODE_OFF}.
*
* @param extensionRendererMode The extension renderer mode.
* @return This factory, for convenience.
*/
public DefaultRenderersFactory setExtensionRendererMode(
@ExtensionRendererMode int extensionRendererMode) {
this.extensionRendererMode = extensionRendererMode;
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 a {@link MediaCodecSelector} for use by {@link MediaCodec} based renderers.
*
* <p>The default value is {@link MediaCodecSelector#DEFAULT}.
*
* @param mediaCodecSelector The {@link MediaCodecSelector}.
* @return This factory, for convenience.
*/
public DefaultRenderersFactory setMediaCodecSelector(MediaCodecSelector mediaCodecSelector) {
this.mediaCodecSelector = mediaCodecSelector;
return this;
}
/**
* Sets the maximum duration for which video renderers can attempt to seamlessly join an ongoing
* playback.
*
* <p>The default value is {@link #DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS}.
*
* @param allowedVideoJoiningTimeMs The maximum duration for which video renderers can attempt to
* seamlessly join an ongoing playback, in milliseconds.
* @return This factory, for convenience.
*/
public DefaultRenderersFactory setAllowedVideoJoiningTimeMs(long allowedVideoJoiningTimeMs) {
this.allowedVideoJoiningTimeMs = allowedVideoJoiningTimeMs;
return this;
} }
@Override @Override
...@@ -177,10 +242,26 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -177,10 +242,26 @@ public class DefaultRenderersFactory implements RenderersFactory {
drmSessionManager = this.drmSessionManager; drmSessionManager = this.drmSessionManager;
} }
ArrayList<Renderer> renderersList = new ArrayList<>(); ArrayList<Renderer> renderersList = new ArrayList<>();
buildVideoRenderers(context, drmSessionManager, allowedVideoJoiningTimeMs, buildVideoRenderers(
eventHandler, videoRendererEventListener, extensionRendererMode, renderersList); context,
buildAudioRenderers(context, drmSessionManager, buildAudioProcessors(), extensionRendererMode,
eventHandler, audioRendererEventListener, extensionRendererMode, renderersList); mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler,
videoRendererEventListener,
allowedVideoJoiningTimeMs,
renderersList);
buildAudioRenderers(
context,
extensionRendererMode,
mediaCodecSelector,
drmSessionManager,
playClearSamplesWithoutKeys,
buildAudioProcessors(),
eventHandler,
audioRendererEventListener,
renderersList);
buildTextRenderers(context, textRendererOutput, eventHandler.getLooper(), buildTextRenderers(context, textRendererOutput, eventHandler.getLooper(),
extensionRendererMode, renderersList); extensionRendererMode, renderersList);
buildMetadataRenderers(context, metadataRendererOutput, eventHandler.getLooper(), buildMetadataRenderers(context, metadataRendererOutput, eventHandler.getLooper(),
...@@ -194,27 +275,36 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -194,27 +275,36 @@ public class DefaultRenderersFactory implements RenderersFactory {
* Builds video renderers for use by the player. * Builds video renderers for use by the player.
* *
* @param context The {@link Context} associated with the player. * @param context The {@link Context} associated with the player.
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player * @param extensionRendererMode The extension renderer mode.
* will not be used for DRM protected playbacks. * @param mediaCodecSelector A decoder selector.
* @param allowedVideoJoiningTimeMs The maximum duration in milliseconds for which video * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player will
* renderers can attempt to seamlessly join an ongoing playback. * 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 eventHandler A handler associated with the main thread's looper. * @param eventHandler A handler associated with the main thread's looper.
* @param eventListener An event listener. * @param eventListener An event listener.
* @param extensionRendererMode The extension renderer mode. * @param allowedVideoJoiningTimeMs The maximum duration for which video renderers can attempt to
* seamlessly join an ongoing playback, in milliseconds.
* @param out An array to which the built renderers should be appended. * @param out An array to which the built renderers should be appended.
*/ */
protected void buildVideoRenderers(Context context, protected void buildVideoRenderers(
Context context,
@ExtensionRendererMode int extensionRendererMode,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
long allowedVideoJoiningTimeMs, Handler eventHandler, boolean playClearSamplesWithoutKeys,
VideoRendererEventListener eventListener, @ExtensionRendererMode int extensionRendererMode, Handler eventHandler,
VideoRendererEventListener eventListener,
long allowedVideoJoiningTimeMs,
ArrayList<Renderer> out) { ArrayList<Renderer> out) {
out.add( out.add(
new MediaCodecVideoRenderer( new MediaCodecVideoRenderer(
context, context,
MediaCodecSelector.DEFAULT, mediaCodecSelector,
allowedVideoJoiningTimeMs, allowedVideoJoiningTimeMs,
drmSessionManager, drmSessionManager,
/* playClearSamplesWithoutKeys= */ false, playClearSamplesWithoutKeys,
eventHandler, eventHandler,
eventListener, eventListener,
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
...@@ -261,26 +351,35 @@ public class DefaultRenderersFactory implements RenderersFactory { ...@@ -261,26 +351,35 @@ public class DefaultRenderersFactory implements RenderersFactory {
* Builds audio renderers for use by the player. * Builds audio renderers for use by the player.
* *
* @param context The {@link Context} associated with the player. * @param context The {@link Context} associated with the player.
* @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player * @param extensionRendererMode The extension renderer mode.
* will not be used for DRM protected playbacks. * @param mediaCodecSelector A decoder selector.
* @param audioProcessors An array of {@link AudioProcessor}s that will process PCM audio * @param drmSessionManager An optional {@link DrmSessionManager}. May be null if the player will
* buffers before output. May be empty. * 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 audioProcessors An array of {@link AudioProcessor}s that will process PCM audio buffers
* before output. May be empty.
* @param eventHandler A handler to use when invoking event listeners and outputs. * @param eventHandler A handler to use when invoking event listeners and outputs.
* @param eventListener An event listener. * @param eventListener An event listener.
* @param extensionRendererMode The extension renderer mode.
* @param out An array to which the built renderers should be appended. * @param out An array to which the built renderers should be appended.
*/ */
protected void buildAudioRenderers(Context context, protected void buildAudioRenderers(
Context context,
@ExtensionRendererMode int extensionRendererMode,
MediaCodecSelector mediaCodecSelector,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
AudioProcessor[] audioProcessors, Handler eventHandler, boolean playClearSamplesWithoutKeys,
AudioRendererEventListener eventListener, @ExtensionRendererMode int extensionRendererMode, AudioProcessor[] audioProcessors,
Handler eventHandler,
AudioRendererEventListener eventListener,
ArrayList<Renderer> out) { ArrayList<Renderer> out) {
out.add( out.add(
new MediaCodecAudioRenderer( new MediaCodecAudioRenderer(
context, context,
MediaCodecSelector.DEFAULT, mediaCodecSelector,
drmSessionManager, drmSessionManager,
/* playClearSamplesWithoutKeys= */ false, playClearSamplesWithoutKeys,
eventHandler, eventHandler,
eventListener, eventListener,
AudioCapabilities.getCapabilities(context), AudioCapabilities.getCapabilities(context),
......
...@@ -97,7 +97,8 @@ public final class ExoPlayerFactory { ...@@ -97,7 +97,8 @@ public final class ExoPlayerFactory {
LoadControl loadControl, LoadControl loadControl,
@Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) { @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode) {
RenderersFactory renderersFactory = new DefaultRenderersFactory(context, extensionRendererMode); RenderersFactory renderersFactory =
new DefaultRenderersFactory(context).setExtensionRendererMode(extensionRendererMode);
return newSimpleInstance( return newSimpleInstance(
context, renderersFactory, trackSelector, loadControl, drmSessionManager); context, renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
...@@ -127,7 +128,9 @@ public final class ExoPlayerFactory { ...@@ -127,7 +128,9 @@ public final class ExoPlayerFactory {
@DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode, @DefaultRenderersFactory.ExtensionRendererMode int extensionRendererMode,
long allowedVideoJoiningTimeMs) { long allowedVideoJoiningTimeMs) {
RenderersFactory renderersFactory = RenderersFactory renderersFactory =
new DefaultRenderersFactory(context, extensionRendererMode, allowedVideoJoiningTimeMs); new DefaultRenderersFactory(context)
.setExtensionRendererMode(extensionRendererMode)
.setAllowedVideoJoiningTimeMs(allowedVideoJoiningTimeMs);
return newSimpleInstance( return newSimpleInstance(
context, renderersFactory, trackSelector, loadControl, drmSessionManager); context, renderersFactory, trackSelector, loadControl, drmSessionManager);
} }
......
...@@ -20,6 +20,7 @@ import android.content.Context; ...@@ -20,6 +20,7 @@ import android.content.Context;
import android.media.MediaCodec; import android.media.MediaCodec;
import android.media.MediaCrypto; import android.media.MediaCrypto;
import android.os.Handler; import android.os.Handler;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
...@@ -37,22 +38,37 @@ import java.util.ArrayList; ...@@ -37,22 +38,37 @@ import java.util.ArrayList;
/** /**
* A debug extension of {@link DefaultRenderersFactory}. Provides a video renderer that performs * A debug extension of {@link DefaultRenderersFactory}. Provides a video renderer that performs
* video buffer timestamp assertions. * video buffer timestamp assertions, and modifies the default value for {@link
* #setAllowedVideoJoiningTimeMs(long)} to be {@code 0}.
*/ */
@TargetApi(16) @TargetApi(16)
public class DebugRenderersFactory extends DefaultRenderersFactory { public class DebugRenderersFactory extends DefaultRenderersFactory {
public DebugRenderersFactory(Context context) { public DebugRenderersFactory(Context context) {
super(context, DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF, 0); super(context);
setAllowedVideoJoiningTimeMs(0);
} }
@Override @Override
protected void buildVideoRenderers(Context context, protected void buildVideoRenderers(
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, long allowedVideoJoiningTimeMs, Context context,
Handler eventHandler, VideoRendererEventListener eventListener, @ExtensionRendererMode int extensionRendererMode,
@ExtensionRendererMode int extensionRendererMode, ArrayList<Renderer> out) { MediaCodecSelector mediaCodecSelector,
out.add(new DebugMediaCodecVideoRenderer(context, MediaCodecSelector.DEFAULT, @Nullable DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
allowedVideoJoiningTimeMs, drmSessionManager, eventHandler, eventListener, boolean playClearSamplesWithoutKeys,
Handler eventHandler,
VideoRendererEventListener eventListener,
long allowedVideoJoiningTimeMs,
ArrayList<Renderer> out) {
out.add(
new DebugMediaCodecVideoRenderer(
context,
mediaCodecSelector,
allowedVideoJoiningTimeMs,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler,
eventListener,
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY));
} }
...@@ -72,12 +88,24 @@ public class DebugRenderersFactory extends DefaultRenderersFactory { ...@@ -72,12 +88,24 @@ public class DebugRenderersFactory extends DefaultRenderersFactory {
private int minimumInsertIndex; private int minimumInsertIndex;
private boolean skipToPositionBeforeRenderingFirstFrame; private boolean skipToPositionBeforeRenderingFirstFrame;
public DebugMediaCodecVideoRenderer(Context context, MediaCodecSelector mediaCodecSelector, public DebugMediaCodecVideoRenderer(
long allowedJoiningTimeMs, DrmSessionManager<FrameworkMediaCrypto> drmSessionManager, Context context,
Handler eventHandler, VideoRendererEventListener eventListener, MediaCodecSelector mediaCodecSelector,
long allowedJoiningTimeMs,
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager,
boolean playClearSamplesWithoutKeys,
Handler eventHandler,
VideoRendererEventListener eventListener,
int maxDroppedFrameCountToNotify) { int maxDroppedFrameCountToNotify) {
super(context, mediaCodecSelector, allowedJoiningTimeMs, drmSessionManager, false, super(
eventHandler, eventListener, maxDroppedFrameCountToNotify); context,
mediaCodecSelector,
allowedJoiningTimeMs,
drmSessionManager,
playClearSamplesWithoutKeys,
eventHandler,
eventListener,
maxDroppedFrameCountToNotify);
} }
@Override @Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment