From 9716985272654241115dd719f48f36cdceca7709 Mon Sep 17 00:00:00 2001 From: kimvde Date: Wed, 5 Jun 2024 07:13:48 -0700 Subject: [PATCH] Move renderer state methods from release control to sink PiperOrigin-RevId: 640515298 --- .../video/CompositingVideoSinkProvider.java | 32 +++++++++++++++---- .../video/MediaCodecVideoRenderer.java | 24 +++++++++++--- .../media3/exoplayer/video/VideoSink.java | 17 +++++++++- .../SequencePlayerRenderersWrapper.java | 8 ++--- 4 files changed, 66 insertions(+), 15 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java index 431f564e3d..ffc34e710b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java @@ -500,6 +500,32 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi // VideoSink impl + @Override + public void onRendererEnabled(boolean releaseFirstFrameBeforeStarted) { + videoFrameReleaseControl.onEnabled(releaseFirstFrameBeforeStarted); + } + + @Override + public void onRendererDisabled() { + videoFrameReleaseControl.onDisabled(); + } + + @Override + public void onRendererStarted() { + videoFrameReleaseControl.onStarted(); + } + + @Override + public void onRendererStopped() { + videoFrameReleaseControl.onStopped(); + } + + @Override + public void setListener(Listener listener, Executor executor) { + this.listener = listener; + listenerExecutor = executor; + } + @Override public void initialize(Format sourceFormat, Clock clock) throws VideoSinkException { checkState(!isInitialized()); @@ -581,12 +607,6 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi } } - @Override - public void setListener(Listener listener, Executor executor) { - this.listener = listener; - listenerExecutor = executor; - } - @Override public boolean isFrameDropAllowedOnInput() { return Util.isFrameDropAllowedOnSurfaceInput(context); 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 2cbcb562dd..3af1cd7126 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 @@ -639,7 +639,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer shouldUseVideoSink = hasEffects || !ownsVideoSink; hasSetShouldUseVideoSink = true; } - videoFrameReleaseControl.onEnabled(mayRenderStartOfStream); + if (shouldUseVideoSink) { + videoSink.onRendererEnabled(mayRenderStartOfStream); + } else { + videoFrameReleaseControl.onEnabled(mayRenderStartOfStream); + } } @Override @@ -693,21 +697,33 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer droppedFrameAccumulationStartTimeMs = elapsedRealtimeMs; totalVideoFrameProcessingOffsetUs = 0; videoFrameProcessingOffsetCount = 0; - videoFrameReleaseControl.onStarted(); + if (shouldUseVideoSink) { + videoSink.onRendererStarted(); + } else { + videoFrameReleaseControl.onStarted(); + } } @Override protected void onStopped() { maybeNotifyDroppedFrames(); maybeNotifyVideoFrameProcessingOffset(); - videoFrameReleaseControl.onStopped(); + if (shouldUseVideoSink) { + videoSink.onRendererStopped(); + } else { + videoFrameReleaseControl.onStopped(); + } super.onStopped(); } @Override protected void onDisabled() { reportedVideoSize = null; - videoFrameReleaseControl.onDisabled(); + if (shouldUseVideoSink) { + videoSink.onRendererDisabled(); + } else { + videoFrameReleaseControl.onDisabled(); + } maybeSetupTunnelingForFirstFrame(); haveReportedFirstFrameRenderedForCurrentSurface = false; tunnelingOnFrameRenderedListener = null; 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 66bcda4b03..3ff8ce081d 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 @@ -36,7 +36,10 @@ import java.lang.annotation.Target; import java.util.List; import java.util.concurrent.Executor; -/** A sink that consumes decoded video frames. */ +/** + * A sink that consumes decoded video frames from a video {@link + * androidx.media3.exoplayer.Renderer}. + */ @UnstableApi public interface VideoSink { @@ -104,6 +107,18 @@ public interface VideoSink { /** Input frames come from a {@link Bitmap}. */ int INPUT_TYPE_BITMAP = 2; + /** Called when the renderer is enabled. */ + void onRendererEnabled(boolean releaseFirstFrameBeforeStarted); + + /** Called when the renderer is disabled. */ + void onRendererDisabled(); + + /** Called when the renderer is started. */ + void onRendererStarted(); + + /** Called when the renderer is stopped. */ + void onRendererStopped(); + /** * Sets a {@link Listener} on this sink. Callbacks are triggered on the supplied {@link Executor}. * diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java index f59f9592d1..ed875fea83 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java @@ -319,7 +319,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; throws ExoPlaybackException { super.onEnabled(joining, mayRenderStartOfStream); this.mayRenderStartOfStream = mayRenderStartOfStream; - videoFrameReleaseControl.onEnabled(mayRenderStartOfStream); + videoSink.onRendererEnabled(mayRenderStartOfStream); if (joining) { videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ false); } @@ -340,7 +340,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override protected void onDisabled() { super.onDisabled(); - videoFrameReleaseControl.onDisabled(); + videoSink.onRendererDisabled(); } @Override @@ -376,13 +376,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override protected void onStarted() throws ExoPlaybackException { super.onStarted(); - videoFrameReleaseControl.onStarted(); + videoSink.onRendererStarted(); } @Override protected void onStopped() { super.onStopped(); - videoFrameReleaseControl.onStopped(); + videoSink.onRendererStopped(); } @Override