Move renderer state methods from release control to sink

PiperOrigin-RevId: 640515298
This commit is contained in:
kimvde 2024-06-05 07:13:48 -07:00 committed by Copybara-Service
parent f3a9c74de2
commit 9716985272
4 changed files with 66 additions and 15 deletions

View file

@ -500,6 +500,32 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi
// VideoSink impl // 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 @Override
public void initialize(Format sourceFormat, Clock clock) throws VideoSinkException { public void initialize(Format sourceFormat, Clock clock) throws VideoSinkException {
checkState(!isInitialized()); 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 @Override
public boolean isFrameDropAllowedOnInput() { public boolean isFrameDropAllowedOnInput() {
return Util.isFrameDropAllowedOnSurfaceInput(context); return Util.isFrameDropAllowedOnSurfaceInput(context);

View file

@ -639,8 +639,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
shouldUseVideoSink = hasEffects || !ownsVideoSink; shouldUseVideoSink = hasEffects || !ownsVideoSink;
hasSetShouldUseVideoSink = true; hasSetShouldUseVideoSink = true;
} }
if (shouldUseVideoSink) {
videoSink.onRendererEnabled(mayRenderStartOfStream);
} else {
videoFrameReleaseControl.onEnabled(mayRenderStartOfStream); videoFrameReleaseControl.onEnabled(mayRenderStartOfStream);
} }
}
@Override @Override
public void enableMayRenderStartOfStream() { public void enableMayRenderStartOfStream() {
@ -693,21 +697,33 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
droppedFrameAccumulationStartTimeMs = elapsedRealtimeMs; droppedFrameAccumulationStartTimeMs = elapsedRealtimeMs;
totalVideoFrameProcessingOffsetUs = 0; totalVideoFrameProcessingOffsetUs = 0;
videoFrameProcessingOffsetCount = 0; videoFrameProcessingOffsetCount = 0;
if (shouldUseVideoSink) {
videoSink.onRendererStarted();
} else {
videoFrameReleaseControl.onStarted(); videoFrameReleaseControl.onStarted();
} }
}
@Override @Override
protected void onStopped() { protected void onStopped() {
maybeNotifyDroppedFrames(); maybeNotifyDroppedFrames();
maybeNotifyVideoFrameProcessingOffset(); maybeNotifyVideoFrameProcessingOffset();
if (shouldUseVideoSink) {
videoSink.onRendererStopped();
} else {
videoFrameReleaseControl.onStopped(); videoFrameReleaseControl.onStopped();
}
super.onStopped(); super.onStopped();
} }
@Override @Override
protected void onDisabled() { protected void onDisabled() {
reportedVideoSize = null; reportedVideoSize = null;
if (shouldUseVideoSink) {
videoSink.onRendererDisabled();
} else {
videoFrameReleaseControl.onDisabled(); videoFrameReleaseControl.onDisabled();
}
maybeSetupTunnelingForFirstFrame(); maybeSetupTunnelingForFirstFrame();
haveReportedFirstFrameRenderedForCurrentSurface = false; haveReportedFirstFrameRenderedForCurrentSurface = false;
tunnelingOnFrameRenderedListener = null; tunnelingOnFrameRenderedListener = null;

View file

@ -36,7 +36,10 @@ import java.lang.annotation.Target;
import java.util.List; import java.util.List;
import java.util.concurrent.Executor; 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 @UnstableApi
public interface VideoSink { public interface VideoSink {
@ -104,6 +107,18 @@ public interface VideoSink {
/** Input frames come from a {@link Bitmap}. */ /** Input frames come from a {@link Bitmap}. */
int INPUT_TYPE_BITMAP = 2; 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}. * Sets a {@link Listener} on this sink. Callbacks are triggered on the supplied {@link Executor}.
* *

View file

@ -319,7 +319,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
throws ExoPlaybackException { throws ExoPlaybackException {
super.onEnabled(joining, mayRenderStartOfStream); super.onEnabled(joining, mayRenderStartOfStream);
this.mayRenderStartOfStream = mayRenderStartOfStream; this.mayRenderStartOfStream = mayRenderStartOfStream;
videoFrameReleaseControl.onEnabled(mayRenderStartOfStream); videoSink.onRendererEnabled(mayRenderStartOfStream);
if (joining) { if (joining) {
videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ false); videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ false);
} }
@ -340,7 +340,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Override @Override
protected void onDisabled() { protected void onDisabled() {
super.onDisabled(); super.onDisabled();
videoFrameReleaseControl.onDisabled(); videoSink.onRendererDisabled();
} }
@Override @Override
@ -376,13 +376,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Override @Override
protected void onStarted() throws ExoPlaybackException { protected void onStarted() throws ExoPlaybackException {
super.onStarted(); super.onStarted();
videoFrameReleaseControl.onStarted(); videoSink.onRendererStarted();
} }
@Override @Override
protected void onStopped() { protected void onStopped() {
super.onStopped(); super.onStopped();
videoFrameReleaseControl.onStopped(); videoSink.onRendererStopped();
} }
@Override @Override