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)
.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();
}
}

View File

@ -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,

View File

@ -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));
}

View File

@ -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. */