From 2c71150f2be47540a1112a8e9e046de84db9e74b Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 10 Jun 2024 01:58:09 -0700 Subject: [PATCH] Set VideoSink listener when enabling MCVR Before, the listener was set in onReadyToInitializeCodec, which means that it was reset every time a new codec was used. We need to set the listener every time MCVR is enabled (not only the first time), because it might have been set by another renderer. PiperOrigin-RevId: 641825717 --- .../video/MediaCodecVideoRenderer.java | 82 +++++++++---------- 1 file changed, 40 insertions(+), 42 deletions(-) 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()); } }