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 ffc34e710b..c6bd17561f 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 @@ -575,6 +575,7 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi default: throw new UnsupportedOperationException("Unsupported input type " + inputType); } + videoFrameReleaseControl.setFrameRate(format.frameRate); // MediaCodec applies rotation after API 21. if (inputType == INPUT_TYPE_SURFACE && Util.SDK_INT < 21 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 3af1cd7126..2dfc9fe7ed 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 @@ -825,7 +825,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer // We only need to update the codec if the display surface has changed. if (this.displaySurface != displaySurface) { this.displaySurface = displaySurface; - videoFrameReleaseControl.setOutputSurface(displaySurface); + if (!shouldUseVideoSink) { + videoFrameReleaseControl.setOutputSurface(displaySurface); + } haveReportedFirstFrameRenderedForCurrentSurface = false; @State int state = getState(); @@ -1230,7 +1232,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer } decodedVideoSize = new VideoSize(width, height, unappliedRotationDegrees, pixelWidthHeightRatio); - videoFrameReleaseControl.setFrameRate(format.frameRate); if (shouldUseVideoSink) { onReadyToRegisterVideoSinkInputStream(); @@ -1243,6 +1244,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer .setRotationDegrees(unappliedRotationDegrees) .setPixelWidthHeightRatio(pixelWidthHeightRatio) .build()); + } else { + videoFrameReleaseControl.setFrameRate(format.frameRate); } } @@ -1454,9 +1457,12 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer @Override protected void onProcessedStreamChange() { super.onProcessedStreamChange(); - videoFrameReleaseControl.onProcessedStreamChange(); + if (shouldUseVideoSink) { + videoSink.setStreamOffsetUs(getOutputStreamOffsetUs()); + } else { + videoFrameReleaseControl.onProcessedStreamChange(); + } maybeSetupTunnelingForFirstFrame(); - videoSink.setStreamOffsetUs(getOutputStreamOffsetUs()); } /** diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java index ed875fea83..1737304cf0 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java @@ -432,8 +432,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; .setWidth(outputImage.getWidth()) .setHeight(outputImage.getHeight()) .setColorInfo(ColorInfo.SRGB_BT709_FULL) + .setFrameRate(/* frameRate= */ DEFAULT_FRAME_RATE) .build()); - videoFrameReleaseControl.setFrameRate(/* frameRate= */ DEFAULT_FRAME_RATE); inputStreamPendingRegistration = false; } return videoSink.queueBitmap(outputImage, checkStateNotNull(timestampIterator));