diff --git a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java index f53d72f598e..97ad6613e38 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/DefaultRenderersFactory.java @@ -28,6 +28,7 @@ import com.google.android.exoplayer2.audio.MediaCodecAudioRenderer; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; +import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.metadata.MetadataRenderer; @@ -93,6 +94,7 @@ public class DefaultRenderersFactory implements RenderersFactory { private boolean playClearSamplesWithoutKeys; private boolean enableDecoderFallback; private MediaCodecSelector mediaCodecSelector; + @MediaCodecRenderer.MediaCodecOperationMode private int mediaCodecOperationMode; /** @param context A {@link Context}. */ public DefaultRenderersFactory(Context context) { @@ -100,6 +102,7 @@ public DefaultRenderersFactory(Context context) { extensionRendererMode = EXTENSION_RENDERER_MODE_OFF; allowedVideoJoiningTimeMs = DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS; mediaCodecSelector = MediaCodecSelector.DEFAULT; + mediaCodecOperationMode = MediaCodecRenderer.MediaCodecOperationMode.SYNCHRONOUS; } /** @@ -185,6 +188,21 @@ public DefaultRenderersFactory setExtensionRendererMode( return this; } + /** + * Set the {@link MediaCodecRenderer.MediaCodecOperationMode} of {@link MediaCodecRenderer} + * instances. + * + *

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 * obtained the keys necessary to decrypt encrypted regions of the media. For encrypted media that @@ -319,7 +337,7 @@ protected void buildVideoRenderers( VideoRendererEventListener eventListener, long allowedVideoJoiningTimeMs, ArrayList out) { - out.add( + MediaCodecVideoRenderer videoRenderer = new MediaCodecVideoRenderer( context, mediaCodecSelector, @@ -329,7 +347,9 @@ protected void buildVideoRenderers( enableDecoderFallback, eventHandler, 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) { return; @@ -425,7 +445,7 @@ protected void buildAudioRenderers( Handler eventHandler, AudioRendererEventListener eventListener, ArrayList out) { - out.add( + MediaCodecAudioRenderer audioRenderer = new MediaCodecAudioRenderer( context, mediaCodecSelector, @@ -434,7 +454,9 @@ protected void buildAudioRenderers( enableDecoderFallback, eventHandler, 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) { return;