From f8b1dcc33b9fb77bd45e7755ccac588a7e9027fe Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 31 Mar 2025 06:38:12 -0700 Subject: [PATCH] Move VideoSink config to dedicated method This is to improve readability of MediaCodecVideoRenderer.onEnabled PiperOrigin-RevId: 742246092 --- .../video/MediaCodecVideoRenderer.java | 117 +++++++++--------- 1 file changed, 61 insertions(+), 56 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 142d52a699..442c52eed6 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 @@ -881,62 +881,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer // Configure the VideoSink every time the renderer is enabled, in case the parameters have // been overridden by another renderer. Also configure the VideoSink with the parameters that // have been set on the renderer before creating the VideoSink. - videoSink.setListener( - new VideoSink.Listener() { - - @Override - public void onFrameAvailableForRendering() { - @Nullable WakeupListener wakeupListener = getWakeupListener(); - if (wakeupListener != null) { - wakeupListener.onWakeup(); - } - } - - @Override - public void onFirstFrameRendered() { - if (displaySurface != null) { - notifyRenderedFirstFrame(); - } - } - - @Override - public void onFrameDropped() { - if (displaySurface != null) { - updateDroppedBufferCounters( - /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); - } - } - - @Override - public void onVideoSizeChanged(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.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()); - if (frameMetadataListener != null) { - videoSink.setVideoFrameMetadataListener(frameMetadataListener); - } - if (displaySurface != null && !outputResolution.equals(Size.UNKNOWN)) { - videoSink.setOutputSurfaceInfo(displaySurface, outputResolution); - } - videoSink.setChangeFrameRateStrategy(changeFrameRateStrategy); - videoSink.setPlaybackSpeed(getPlaybackSpeed()); - if (videoEffects != null) { - videoSink.setVideoEffects(videoEffects); - } + configureVideoSink(); nextVideoSinkFirstFrameReleaseInstruction = mayRenderStartOfStream ? RELEASE_FIRST_FRAME_IMMEDIATELY @@ -952,6 +897,66 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer } } + @RequiresNonNull("videoSink") + private void configureVideoSink() { + videoSink.setListener( + new VideoSink.Listener() { + + @Override + public void onFrameAvailableForRendering() { + @Nullable WakeupListener wakeupListener = getWakeupListener(); + if (wakeupListener != null) { + wakeupListener.onWakeup(); + } + } + + @Override + public void onFirstFrameRendered() { + if (displaySurface != null) { + notifyRenderedFirstFrame(); + } + } + + @Override + public void onFrameDropped() { + if (displaySurface != null) { + updateDroppedBufferCounters( + /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); + } + } + + @Override + public void onVideoSizeChanged(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.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()); + if (frameMetadataListener != null) { + videoSink.setVideoFrameMetadataListener(frameMetadataListener); + } + if (displaySurface != null && !outputResolution.equals(Size.UNKNOWN)) { + videoSink.setOutputSurfaceInfo(displaySurface, outputResolution); + } + videoSink.setChangeFrameRateStrategy(changeFrameRateStrategy); + videoSink.setPlaybackSpeed(getPlaybackSpeed()); + if (videoEffects != null) { + videoSink.setVideoEffects(videoEffects); + } + } + /** Creates a {@link PlaybackVideoGraphWrapper} instance. */ protected PlaybackVideoGraphWrapper createPlaybackVideoGraphWrapper( Context context, VideoFrameReleaseControl videoFrameReleaseControl) {