diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index e27f04df6d..aabaf43da6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -640,6 +640,40 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer hasSetShouldUseVideoSink = true; } if (shouldUseVideoSink) { + videoSink.setListener( + new VideoSink.Listener() { + @Override + public void onFirstFrameRendered(VideoSink videoSink) { + checkStateNotNull(displaySurface); + notifyRenderedFirstFrame(); + } + + @Override + public void onFrameDropped(VideoSink videoSink) { + updateDroppedBufferCounters( + /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); + } + + @Override + public void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize) { + // TODO: b/292111083 - Report video size change to app. Video size reporting is + // removed at the moment to ensure the first frame is rendered, and the video is + // rendered after switching on/off the screen. + } + + @Override + public void onError( + VideoSink videoSink, VideoSink.VideoSinkException videoSinkException) { + setPendingPlaybackException( + createRendererException( + videoSinkException, + videoSinkException.format, + PlaybackException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED)); + } + }, + // Pass a direct executor since the callback handling involves posting on the app looper + // again, so there's no need to do two hops. + directExecutor()); videoSink.onRendererEnabled(mayRenderStartOfStream); } else { videoFrameReleaseControl.onEnabled(mayRenderStartOfStream); @@ -1065,49 +1099,13 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer @CallSuper @Override protected void onReadyToInitializeCodec(Format format) throws ExoPlaybackException { - if (shouldUseVideoSink) { - if (!videoSink.isInitialized()) { - try { - videoSink.initialize(format, getClock()); - } catch (VideoSink.VideoSinkException e) { - throw createRendererException( - e, format, PlaybackException.ERROR_CODE_VIDEO_FRAME_PROCESSOR_INIT_FAILED); - } + if (shouldUseVideoSink && !videoSink.isInitialized()) { + try { + videoSink.initialize(format, getClock()); + } catch (VideoSink.VideoSinkException e) { + throw createRendererException( + e, format, PlaybackException.ERROR_CODE_VIDEO_FRAME_PROCESSOR_INIT_FAILED); } - videoSink.setListener( - new VideoSink.Listener() { - @Override - public void onFirstFrameRendered(VideoSink videoSink) { - checkStateNotNull(displaySurface); - notifyRenderedFirstFrame(); - } - - @Override - public void onFrameDropped(VideoSink videoSink) { - updateDroppedBufferCounters( - /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); - } - - @Override - public void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize) { - // TODO: b/292111083 - Report video size change to app. Video size reporting is - // removed at the moment to ensure the first frame is rendered, and the video is - // rendered after switching on/off the screen. - } - - @Override - public void onError( - VideoSink videoSink, VideoSink.VideoSinkException videoSinkException) { - setPendingPlaybackException( - createRendererException( - videoSinkException, - videoSinkException.format, - PlaybackException.ERROR_CODE_VIDEO_FRAME_PROCESSING_FAILED)); - } - }, - // Pass a direct executor since the callback handling involves posting on the app looper - // again, so there's no need to do two hops. - directExecutor()); } }