Improvements to VideoSink.Listener

- Remove unused VideoSink parameter
- Make methods default so that implementations don't have to override
them all

PiperOrigin-RevId: 740715000
This commit is contained in:
kimvde 2025-03-26 04:26:07 -07:00 committed by Copybara-Service
parent d4ea3ad932
commit 3d5e650980
4 changed files with 19 additions and 36 deletions

View File

@ -276,14 +276,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
.setHeight(videoSize.height) .setHeight(videoSize.height)
.setSampleMimeType(MimeTypes.VIDEO_RAW) .setSampleMimeType(MimeTypes.VIDEO_RAW)
.build(); .build();
listenerExecutor.execute(() -> listener.onVideoSizeChanged(DefaultVideoSink.this, videoSize)); listenerExecutor.execute(() -> listener.onVideoSizeChanged(videoSize));
} }
@Override @Override
public void renderFrame( public void renderFrame(
long renderTimeNs, long bufferPresentationTimeUs, boolean isFirstFrame) { long renderTimeNs, long bufferPresentationTimeUs, boolean isFirstFrame) {
if (isFirstFrame && outputSurface != null) { 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 // TODO - b/292111083: outputFormat is initialized after the first frame is rendered because
// onVideoSizeChanged is announced after the first frame is available for rendering. // onVideoSizeChanged is announced after the first frame is available for rendering.
@ -298,7 +298,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Override @Override
public void dropFrame() { public void dropFrame() {
listenerExecutor.execute(() -> listener.onFrameDropped(DefaultVideoSink.this)); listenerExecutor.execute(() -> listener.onFrameDropped());
videoFrameHandlers.remove().skip(); videoFrameHandlers.remove().skip();
} }
} }

View File

@ -884,14 +884,14 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
videoSink.setListener( videoSink.setListener(
new VideoSink.Listener() { new VideoSink.Listener() {
@Override @Override
public void onFirstFrameRendered(VideoSink videoSink) { public void onFirstFrameRendered() {
if (displaySurface != null) { if (displaySurface != null) {
notifyRenderedFirstFrame(); notifyRenderedFirstFrame();
} }
} }
@Override @Override
public void onFrameDropped(VideoSink videoSink) { public void onFrameDropped() {
if (displaySurface != null) { if (displaySurface != null) {
updateDroppedBufferCounters( updateDroppedBufferCounters(
/* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1); /* droppedInputBufferCount= */ 0, /* droppedDecoderBufferCount= */ 1);
@ -899,15 +899,14 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
} }
@Override @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 // 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 // removed at the moment to ensure the first frame is rendered, and the video is
// rendered after switching on/off the screen. // rendered after switching on/off the screen.
} }
@Override @Override
public void onError( public void onError(VideoSink.VideoSinkException videoSinkException) {
VideoSink videoSink, VideoSink.VideoSinkException videoSinkException) {
setPendingPlaybackException( setPendingPlaybackException(
createRendererException( createRendererException(
videoSinkException, videoSinkException,

View File

@ -969,21 +969,19 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video
@Override @Override
public void onFirstFrameRendered() { public void onFirstFrameRendered() {
VideoSink.Listener currentListener = listener; VideoSink.Listener currentListener = listener;
listenerExecutor.execute(() -> currentListener.onFirstFrameRendered(/* videoSink= */ this)); listenerExecutor.execute(currentListener::onFirstFrameRendered);
} }
@Override @Override
public void onFrameDropped() { public void onFrameDropped() {
VideoSink.Listener currentListener = listener; VideoSink.Listener currentListener = listener;
listenerExecutor.execute( listenerExecutor.execute(currentListener::onFrameDropped);
() -> currentListener.onFrameDropped(checkStateNotNull(/* reference= */ this)));
} }
@Override @Override
public void onVideoSizeChanged(VideoSize videoSize) { public void onVideoSizeChanged(VideoSize videoSize) {
VideoSink.Listener currentListener = listener; VideoSink.Listener currentListener = listener;
listenerExecutor.execute( listenerExecutor.execute(() -> currentListener.onVideoSizeChanged(videoSize));
() -> currentListener.onVideoSizeChanged(/* videoSink= */ this, videoSize));
} }
@Override @Override
@ -992,7 +990,6 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video
listenerExecutor.execute( listenerExecutor.execute(
() -> () ->
currentListener.onError( currentListener.onError(
/* videoSink= */ this,
new VideoSinkException( new VideoSinkException(
videoFrameProcessingException, checkStateNotNull(this.inputFormat)))); videoFrameProcessingException, checkStateNotNull(this.inputFormat))));
} }
@ -1040,28 +1037,28 @@ public final class PlaybackVideoGraphWrapper implements VideoSinkProvider, Video
private final class DefaultVideoSinkListener implements VideoSink.Listener { private final class DefaultVideoSinkListener implements VideoSink.Listener {
@Override @Override
public void onFirstFrameRendered(VideoSink videoSink) { public void onFirstFrameRendered() {
for (PlaybackVideoGraphWrapper.Listener listener : listeners) { for (PlaybackVideoGraphWrapper.Listener listener : listeners) {
listener.onFirstFrameRendered(); listener.onFirstFrameRendered();
} }
} }
@Override @Override
public void onFrameDropped(VideoSink videoSink) { public void onFrameDropped() {
for (PlaybackVideoGraphWrapper.Listener listener : listeners) { for (PlaybackVideoGraphWrapper.Listener listener : listeners) {
listener.onFrameDropped(); listener.onFrameDropped();
} }
} }
@Override @Override
public void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize) { public void onVideoSizeChanged(VideoSize videoSize) {
for (PlaybackVideoGraphWrapper.Listener listener : listeners) { for (PlaybackVideoGraphWrapper.Listener listener : listeners) {
listener.onVideoSizeChanged(videoSize); listener.onVideoSizeChanged(videoSize);
} }
} }
@Override @Override
public void onError(VideoSink videoSink, VideoSink.VideoSinkException videoSinkException) { public void onError(VideoSink.VideoSinkException videoSinkException) {
for (PlaybackVideoGraphWrapper.Listener listener : listeners) { for (PlaybackVideoGraphWrapper.Listener listener : listeners) {
listener.onError(VideoFrameProcessingException.from(videoSinkException)); listener.onError(VideoFrameProcessingException.from(videoSinkException));
} }

View File

@ -57,36 +57,23 @@ public interface VideoSink {
/** Listener for {@link VideoSink} events. */ /** Listener for {@link VideoSink} events. */
interface Listener { interface Listener {
/** Called when the sink renders the first frame on the output surface. */ /** 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. */ /** 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 * 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 * each time there's a change in the size, rotation or pixel aspect ratio of the video being
* rendered. * rendered.
*/ */
void onVideoSizeChanged(VideoSink videoSink, VideoSize videoSize); default void onVideoSizeChanged(VideoSize videoSize) {}
/** Called when the {@link VideoSink} encountered an error. */ /** Called when the {@link VideoSink} encountered an error. */
void onError(VideoSink videoSink, VideoSinkException videoSinkException); default void onError(VideoSinkException videoSinkException) {}
/** A no-op listener implementation. */ /** A no-op listener implementation. */
Listener NO_OP = Listener NO_OP = new Listener() {};
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) {}
};
} }
/** Handler for a video frame. */ /** Handler for a video frame. */