diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java index aaf443b454..7c9ce3273d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/CompositingVideoSinkProvider.java @@ -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(); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index d019636edd..2a61baebcd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -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); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseControl.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseControl.java index a4572ce774..380d63a968 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseControl.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseControl.java @@ -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}. + * + *
The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}. */ public void setChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java index 10dc0bdca2..35ff8ab83c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoFrameReleaseHelper.java @@ -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}. + * + *
The default value is {@link C#VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS}. */ public void setChangeFrameRateStrategy( @C.VideoChangeFrameRateStrategy int changeFrameRateStrategy) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java index 330a665ade..c2eab5cc56 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/VideoSink.java @@ -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}. + * + *
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.