DefaultRenderersFactory can set MediaCodecOperation

Add experimental method on DefaultRenderersFactory to set the
MediaCodecOperationMode on MediaCodecRenderer instances.

PiperOrigin-RevId: 286004667
This commit is contained in:
christosts 2019-12-17 18:12:00 +00:00 committed by Oliver Woodman
parent 863bf45341
commit 43bbc172a4

View file

@ -28,6 +28,7 @@ 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.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataOutput;
import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.metadata.MetadataRenderer;
@ -93,6 +94,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
private boolean playClearSamplesWithoutKeys; private boolean playClearSamplesWithoutKeys;
private boolean enableDecoderFallback; private boolean enableDecoderFallback;
private MediaCodecSelector mediaCodecSelector; private MediaCodecSelector mediaCodecSelector;
@MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode;
/** @param context A {@link Context}. */ /** @param context A {@link Context}. */
public DefaultRenderersFactory(Context context) { public DefaultRenderersFactory(Context context) {
@ -100,6 +102,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
extensionRendererMode = EXTENSION_RENDERER_MODE_OFF; extensionRendererMode = EXTENSION_RENDERER_MODE_OFF;
allowedVideoJoiningTimeMs = DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS; allowedVideoJoiningTimeMs = DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS;
mediaCodecSelector = MediaCodecSelector.DEFAULT; mediaCodecSelector = MediaCodecSelector.DEFAULT;
mediaCodecOperationMode = MediaCodecRenderer.MediaCodecOperationMode.SYNCHRONOUS;
} }
/** /**
@ -185,6 +188,21 @@ public class DefaultRenderersFactory implements RenderersFactory {
return this; return this;
} }
/**
* Set the {@link MediaCodecRenderer.MediaCodecOperationMode} of {@link MediaCodecRenderer}
* instances.
*
* <p>This method is experimental, and will be renamed or removed in a future release.
*
* @param mode The {@link MediaCodecRenderer.MediaCodecOperationMode} to set.
* @return This factory, for convenience.
*/
public DefaultRenderersFactory experimental_setMediaCodecOperationMode(
@MediaCodecRenderer.MediaCodecOperationMode int mode) {
mediaCodecOperationMode = mode;
return this;
}
/** /**
* Sets whether renderers are permitted to play clear regions of encrypted media prior to having * 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 * obtained the keys necessary to decrypt encrypted regions of the media. For encrypted media that
@ -319,7 +337,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
VideoRendererEventListener eventListener, VideoRendererEventListener eventListener,
long allowedVideoJoiningTimeMs, long allowedVideoJoiningTimeMs,
ArrayList<Renderer> out) { ArrayList<Renderer> out) {
out.add( MediaCodecVideoRenderer videoRenderer =
new MediaCodecVideoRenderer( new MediaCodecVideoRenderer(
context, context,
mediaCodecSelector, mediaCodecSelector,
@ -329,7 +347,9 @@ public class DefaultRenderersFactory implements RenderersFactory {
enableDecoderFallback, enableDecoderFallback,
eventHandler, eventHandler,
eventListener, eventListener,
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY)); MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY);
videoRenderer.experimental_setMediaCodecOperationMode(mediaCodecOperationMode);
out.add(videoRenderer);
if (extensionRendererMode == EXTENSION_RENDERER_MODE_OFF) { if (extensionRendererMode == EXTENSION_RENDERER_MODE_OFF) {
return; return;
@ -425,7 +445,7 @@ public class DefaultRenderersFactory implements RenderersFactory {
Handler eventHandler, Handler eventHandler,
AudioRendererEventListener eventListener, AudioRendererEventListener eventListener,
ArrayList<Renderer> out) { ArrayList<Renderer> out) {
out.add( MediaCodecAudioRenderer audioRenderer =
new MediaCodecAudioRenderer( new MediaCodecAudioRenderer(
context, context,
mediaCodecSelector, mediaCodecSelector,
@ -434,7 +454,9 @@ public class DefaultRenderersFactory implements RenderersFactory {
enableDecoderFallback, enableDecoderFallback,
eventHandler, eventHandler,
eventListener, eventListener,
new DefaultAudioSink(AudioCapabilities.getCapabilities(context), audioProcessors))); new DefaultAudioSink(AudioCapabilities.getCapabilities(context), audioProcessors));
audioRenderer.experimental_setMediaCodecOperationMode(mediaCodecOperationMode);
out.add(audioRenderer);
if (extensionRendererMode == EXTENSION_RENDERER_MODE_OFF) { if (extensionRendererMode == EXTENSION_RENDERER_MODE_OFF) {
return; return;