From 3d5e650980dda0dd7cc630b0ae87f50b4808588f Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 26 Mar 2025 04:26:07 -0700 Subject: [PATCH] Improvements to VideoSink.Listener - Remove unused VideoSink parameter - Make methods default so that implementations don't have to override them all PiperOrigin-RevId: 740715000 --- .../exoplayer/video/DefaultVideoSink.java | 6 ++--- .../video/MediaCodecVideoRenderer.java | 9 ++++---- .../video/PlaybackVideoGraphWrapper.java | 17 ++++++-------- .../media3/exoplayer/video/VideoSink.java | 23 ++++--------------- 4 files changed, 19 insertions(+), 36 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java index de11ed55fe..9f64532c2e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/DefaultVideoSink.java @@ -276,14 +276,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; .setHeight(videoSize.height) .setSampleMimeType(MimeTypes.VIDEO_RAW) .build(); - listenerExecutor.execute(() -> listener.onVideoSizeChanged(DefaultVideoSink.this, videoSize)); + listenerExecutor.execute(() -> listener.onVideoSizeChanged(videoSize)); } @Override public void renderFrame( long renderTimeNs, long bufferPresentationTimeUs, boolean isFirstFrame) { if (isFirstFrame && outputSurface != null) { - listenerExecutor.execute(() -> listener.onFirstFrameRendered(DefaultVideoSink.this)); + listenerExecutor.execute(() -> listener.onFirstFrameRendered()); } // TODO - b/292111083: outputFormat is initialized after the first frame is rendered because // onVideoSizeChanged is announced after the first frame is available for rendering. @@ -298,7 +298,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override public void dropFrame() { - listenerExecutor.execute(() -> listener.onFrameDropped(DefaultVideoSink.this)); + listenerExecutor.execute(() -> listener.onFrameDropped()); videoFrameHandlers.remove().skip(); } } 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 33514b780f..d944958cea 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 @@ -884,14 +884,14 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer videoSink.setListener( new VideoSink.Listener() { @Override - public void onFirstFrameRendered(VideoSink videoSink) { + public void onFirstFrameRendered() { if (displaySurface != null) { notifyRenderedFirstFrame(); } } @Override - public void onFrameDropped(VideoSink videoSink) { + public void onFrameDropped() { if (displaySurface != null) { updateDroppedBufferCounters( /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); @@ -899,15 +899,14 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer } @Override - public void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize) { + 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 videoSink, VideoSink.VideoSinkException videoSinkException) { + public void onError(VideoSink.VideoSinkException videoSinkException) { setPendingPlaybackException( createRendererException( videoSinkException, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java index 9eb45a8d7a..fa35c0f0d9 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/PlaybackVideoGraphWrapper.java @@ -969,21 +969,19 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video @Override public void onFirstFrameRendered() { VideoSink.Listener currentListener = listener; - listenerExecutor.execute(() -> currentListener.onFirstFrameRendered(/* videoSink= */ this)); + listenerExecutor.execute(currentListener::onFirstFrameRendered); } @Override public void onFrameDropped() { VideoSink.Listener currentListener = listener; - listenerExecutor.execute( - () -> currentListener.onFrameDropped(checkStateNotNull(/* reference= */ this))); + listenerExecutor.execute(currentListener::onFrameDropped); } @Override public void onVideoSizeChanged(VideoSize videoSize) { VideoSink.Listener currentListener = listener; - listenerExecutor.execute( - () -> currentListener.onVideoSizeChanged(/* videoSink= */ this, videoSize)); + listenerExecutor.execute(() -> currentListener.onVideoSizeChanged(videoSize)); } @Override @@ -992,7 +990,6 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video listenerExecutor.execute( () -> currentListener.onError( - /* videoSink= */ this, new VideoSinkException( videoFrameProcessingException, checkStateNotNull(this.inputFormat)))); } @@ -1040,28 +1037,28 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video private final class DefaultVideoSinkListener implements VideoSink.Listener { @Override - public void onFirstFrameRendered(VideoSink videoSink) { + public void onFirstFrameRendered() { for (PlaybackVideoGraphWrapper.Listener listener : listeners) { listener.onFirstFrameRendered(); } } @Override - public void onFrameDropped(VideoSink videoSink) { + public void onFrameDropped() { for (PlaybackVideoGraphWrapper.Listener listener : listeners) { listener.onFrameDropped(); } } @Override - public void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize) { + public void onVideoSizeChanged(VideoSize videoSize) { for (PlaybackVideoGraphWrapper.Listener listener : listeners) { listener.onVideoSizeChanged(videoSize); } } @Override - public void onError(VideoSink videoSink, VideoSink.VideoSinkException videoSinkException) { + public void onError(VideoSink.VideoSinkException videoSinkException) { for (PlaybackVideoGraphWrapper.Listener listener : listeners) { listener.onError(VideoFrameProcessingException.from(videoSinkException)); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java index 6e9f51f39c..76ffc535cb 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java @@ -57,36 +57,23 @@ public interface VideoSink { /** Listener for {@link VideoSink} events. */ interface Listener { /** Called when the sink renders the first frame on the output surface. */ - void onFirstFrameRendered(VideoSink videoSink); + default void onFirstFrameRendered() {} /** Called when the sink dropped a frame. */ - void onFrameDropped(VideoSink videoSink); + default void onFrameDropped() {} /** * Called before a frame is rendered for the first time after setting the output surface, and * each time there's a change in the size, rotation or pixel aspect ratio of the video being * rendered. */ - void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize); + default void onVideoSizeChanged(VideoSize videoSize) {} /** Called when the {@link VideoSink} encountered an error. */ - void onError(VideoSink videoSink, VideoSinkException videoSinkException); + default void onError(VideoSinkException videoSinkException) {} /** A no-op listener implementation. */ - Listener NO_OP = - new Listener() { - @Override - public void onFirstFrameRendered(VideoSink videoSink) {} - - @Override - public void onFrameDropped(VideoSink videoSink) {} - - @Override - public void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize) {} - - @Override - public void onError(VideoSink videoSink, VideoSinkException videoSinkException) {} - }; + Listener NO_OP = new Listener() {}; } /** Handler for a video frame. */