Add a method to change the frame rate strategy from the VideoSink

PiperOrigin-RevId: 644373231
This commit is contained in:
kimvde 2024-06-18 07:09:07 -07:00 committed by Copybara-Service
parent 1d8b2e3f43
commit ada7271974
5 changed files with 29 additions and 3 deletions

View File

@ -697,6 +697,12 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi
CompositingVideoSinkProvider.this.clearOutputSurfaceInfo(); CompositingVideoSinkProvider.this.clearOutputSurfaceInfo();
} }
@Override
public void setChangeFrameRateStrategy(
@C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) {
videoFrameReleaseControl.setChangeFrameRateStrategy(changeFrameRateStrategy);
}
@Override @Override
public void enableMayRenderStartOfStream() { public void enableMayRenderStartOfStream() {
videoFrameReleaseControl.allowReleaseFirstFrameBeforeStarted(); videoFrameReleaseControl.allowReleaseFirstFrameBeforeStarted();

View File

@ -161,6 +161,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
private Size outputResolution; private Size outputResolution;
private boolean haveReportedFirstFrameRenderedForCurrentSurface; private boolean haveReportedFirstFrameRenderedForCurrentSurface;
private @C.VideoScalingMode int scalingMode; private @C.VideoScalingMode int scalingMode;
private @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy;
private long droppedFrameAccumulationStartTimeMs; private long droppedFrameAccumulationStartTimeMs;
private int droppedFrames; private int droppedFrames;
private int consecutiveDroppedFrameCount; private int consecutiveDroppedFrameCount;
@ -408,6 +409,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
deviceNeedsNoPostProcessWorkaround = deviceNeedsNoPostProcessWorkaround(); deviceNeedsNoPostProcessWorkaround = deviceNeedsNoPostProcessWorkaround();
outputResolution = Size.UNKNOWN; outputResolution = Size.UNKNOWN;
scalingMode = C.VIDEO_SCALING_MODE_DEFAULT; scalingMode = C.VIDEO_SCALING_MODE_DEFAULT;
changeFrameRateStrategy = C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS;
decodedVideoSize = VideoSize.UNKNOWN; decodedVideoSize = VideoSize.UNKNOWN;
tunnelingAudioSessionId = C.AUDIO_SESSION_ID_UNSET; tunnelingAudioSessionId = C.AUDIO_SESSION_ID_UNSET;
reportedVideoSize = null; reportedVideoSize = null;
@ -691,6 +693,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
if (displaySurface != null && !outputResolution.equals(Size.UNKNOWN)) { if (displaySurface != null && !outputResolution.equals(Size.UNKNOWN)) {
videoSink.setOutputSurfaceInfo(displaySurface, outputResolution); videoSink.setOutputSurfaceInfo(displaySurface, outputResolution);
} }
videoSink.setChangeFrameRateStrategy(changeFrameRateStrategy);
videoSink.setPlaybackSpeed(getPlaybackSpeed()); videoSink.setPlaybackSpeed(getPlaybackSpeed());
if (videoEffects != null) { if (videoEffects != null) {
videoSink.setVideoEffects(videoEffects); videoSink.setVideoEffects(videoEffects);
@ -833,7 +836,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
} }
break; break;
case MSG_SET_CHANGE_FRAME_RATE_STRATEGY: case MSG_SET_CHANGE_FRAME_RATE_STRATEGY:
videoFrameReleaseControl.setChangeFrameRateStrategy((int) checkNotNull(message)); changeFrameRateStrategy = (int) checkNotNull(message);
if (videoSink != null) {
videoSink.setChangeFrameRateStrategy(changeFrameRateStrategy);
} else {
videoFrameReleaseControl.setChangeFrameRateStrategy(changeFrameRateStrategy);
}
break; break;
case MSG_SET_VIDEO_FRAME_METADATA_LISTENER: case MSG_SET_VIDEO_FRAME_METADATA_LISTENER:
frameMetadataListener = (VideoFrameMetadataListener) checkNotNull(message); frameMetadataListener = (VideoFrameMetadataListener) checkNotNull(message);

View File

@ -389,8 +389,10 @@ public final class VideoFrameReleaseControl {
} }
/** /**
* Change the {@link C.VideoChangeFrameRateStrategy}, used when calling {@link * Changes the {@link C.VideoChangeFrameRateStrategy} used when calling {@link
* Surface#setFrameRate}. * Surface#setFrameRate}.
*
* <p>The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}.
*/ */
public void setChangeFrameRateStrategy( public void setChangeFrameRateStrategy(
@C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) { @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) {

View File

@ -142,8 +142,10 @@ public final class VideoFrameReleaseHelper {
} }
/** /**
* Change the {@link C.VideoChangeFrameRateStrategy} used when calling {@link * Changes the {@link C.VideoChangeFrameRateStrategy} used when calling {@link
* Surface#setFrameRate}. * Surface#setFrameRate}.
*
* <p>The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}.
*/ */
public void setChangeFrameRateStrategy( public void setChangeFrameRateStrategy(
@C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) { @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) {

View File

@ -201,6 +201,14 @@ public interface VideoSink {
/** Clears the set output surface info. */ /** Clears the set output surface info. */
void clearOutputSurfaceInfo(); void clearOutputSurfaceInfo();
/**
* Changes the {@link C.VideoChangeFrameRateStrategy} used when calling {@link
* Surface#setFrameRate}.
*
* <p>The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}.
*/
void setChangeFrameRateStrategy(@C.VideoChangeFrameRateStrategy int changeFrameRateStrategy);
/** /**
* Enables this video sink to render the start of the stream even if the renderer is not * Enables this video sink to render the start of the stream even if the renderer is not
* {@linkplain #onRendererStarted() started} yet. * {@linkplain #onRendererStarted() started} yet.