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();
}
@Override
public void setChangeFrameRateStrategy(
@C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) {
videoFrameReleaseControl.setChangeFrameRateStrategy(changeFrameRateStrategy);
}
@Override
public void enableMayRenderStartOfStream() {
videoFrameReleaseControl.allowReleaseFirstFrameBeforeStarted();

View File

@ -161,6 +161,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
private Size outputResolution;
private boolean haveReportedFirstFrameRenderedForCurrentSurface;
private @C.VideoScalingMode int scalingMode;
private @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy;
private long droppedFrameAccumulationStartTimeMs;
private int droppedFrames;
private int consecutiveDroppedFrameCount;
@ -408,6 +409,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
deviceNeedsNoPostProcessWorkaround = deviceNeedsNoPostProcessWorkaround();
outputResolution = Size.UNKNOWN;
scalingMode = C.VIDEO_SCALING_MODE_DEFAULT;
changeFrameRateStrategy = C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS;
decodedVideoSize = VideoSize.UNKNOWN;
tunnelingAudioSessionId = C.AUDIO_SESSION_ID_UNSET;
reportedVideoSize = null;
@ -691,6 +693,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
if (displaySurface != null && !outputResolution.equals(Size.UNKNOWN)) {
videoSink.setOutputSurfaceInfo(displaySurface, outputResolution);
}
videoSink.setChangeFrameRateStrategy(changeFrameRateStrategy);
videoSink.setPlaybackSpeed(getPlaybackSpeed());
if (videoEffects != null) {
videoSink.setVideoEffects(videoEffects);
@ -833,7 +836,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer
}
break;
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;
case MSG_SET_VIDEO_FRAME_METADATA_LISTENER:
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}.
*
* <p>The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}.
*/
public void setChangeFrameRateStrategy(
@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}.
*
* <p>The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}.
*/
public void setChangeFrameRateStrategy(
@C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) {

View File

@ -201,6 +201,14 @@ public interface VideoSink {
/** Clears the set output surface info. */
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
* {@linkplain #onRendererStarted() started} yet.