Call VideoFrameReleaseControl.join from VideoSink when enabled

PiperOrigin-RevId: 644738200
This commit is contained in:
kimvde 2024-06-19 07:06:55 -07:00 committed by Copybara-Service
parent ff4feed0eb
commit 4751b80703
4 changed files with 27 additions and 3 deletions

View File

@ -788,6 +788,11 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi
} }
} }
@Override
public void join(boolean renderNextFrameImmediately) {
videoFrameReleaseControl.join(renderNextFrameImmediately);
}
@Override @Override
public void release() { public void release() {
CompositingVideoSinkProvider.this.release(); CompositingVideoSinkProvider.this.release();

View File

@ -731,7 +731,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
// Don't render next frame immediately to let the codec catch up with the playback position // Don't render next frame immediately to let the codec catch up with the playback position
// first. This prevents a stuttering effect caused by showing the first frame and then // first. This prevents a stuttering effect caused by showing the first frame and then
// dropping many of the subsequent frames during the catch up phase. // dropping many of the subsequent frames during the catch up phase.
videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ false); if (videoSink != null) {
videoSink.join(/* renderNextFrameImmediately= */ false);
} else {
videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ false);
}
} }
maybeSetupTunnelingForFirstFrame(); maybeSetupTunnelingForFirstFrame();
consecutiveDroppedFrameCount = 0; consecutiveDroppedFrameCount = 0;
@ -924,7 +928,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
// before we rendered the new first frame. Since there is no reason to believe the next // before we rendered the new first frame. Since there is no reason to believe the next
// frame is delayed and the renderer needs to catch up, we still request to render the // frame is delayed and the renderer needs to catch up, we still request to render the
// next frame as soon as possible. // next frame as soon as possible.
videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ true); if (videoSink != null) {
videoSink.join(/* renderNextFrameImmediately= */ true);
} else {
videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ true);
}
} }
} else { } else {
// The display surface has been removed. // The display surface has been removed.

View File

@ -302,7 +302,7 @@ public final class VideoFrameReleaseControl {
/** /**
* Joins the release control to a new stream. * Joins the release control to a new stream.
* *
* <p>The release control will pretend to be {@linkplain #isReady ready} for short time even if * <p>The release control will pretend to be {@linkplain #isReady ready} for a short time even if
* the first frame hasn't been rendered yet to avoid interrupting an ongoing playback. * the first frame hasn't been rendered yet to avoid interrupting an ongoing playback.
* *
* @param renderNextFrameImmediately Whether the next frame should be released as soon as possible * @param renderNextFrameImmediately Whether the next frame should be released as soon as possible

View File

@ -265,6 +265,17 @@ public interface VideoSink {
*/ */
void render(long positionUs, long elapsedRealtimeUs) throws VideoSinkException; void render(long positionUs, long elapsedRealtimeUs) throws VideoSinkException;
/**
* Joins the video sink to a new stream.
*
* <p>The sink will pretend to be {@linkplain #isReady ready} for a short time even if the first
* frame hasn't been rendered yet to avoid interrupting an ongoing playback.
*
* @param renderNextFrameImmediately Whether the next frame should be rendered as soon as possible
* or only at its preferred scheduled release time.
*/
void join(boolean renderNextFrameImmediately);
/** Releases the sink. */ /** Releases the sink. */
void release(); void release();
} }