mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Move renderer state methods from release control to sink
PiperOrigin-RevId: 640515298
This commit is contained in:
parent
f3a9c74de2
commit
9716985272
4 changed files with 66 additions and 15 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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}.
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue