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 27fc7e6a0d..aaf443b454 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 @@ -567,7 +567,7 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi } @Override - public void flush() { + public void flush(boolean resetPosition) { if (isInitialized()) { videoFrameProcessor.flush(); } @@ -575,6 +575,9 @@ public final class CompositingVideoSinkProvider implements VideoSinkProvider, Vi finalBufferPresentationTimeUs = C.TIME_UNSET; lastBufferPresentationTimeUs = C.TIME_UNSET; CompositingVideoSinkProvider.this.flush(); + if (resetPosition) { + videoFrameReleaseControl.reset(); + } // Don't change input stream offset or reset the pending input stream offset change so that // it's announced with the next input frame. // Don't reset pendingInputStreamBufferPresentationTimeUs because it's not guaranteed to 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 1bd55d3b00..d019636edd 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 @@ -714,16 +714,16 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer @Override protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException { if (videoSink != null) { - // When this renderer doesn't own the VideoSink, it's possible that the VideoSink is already - // initialized by another renderer, before this renderer is enabled. // Flush the video sink first to ensure it stops reading textures that will be owned by // MediaCodec once the codec is flushed. - videoSink.flush(); + videoSink.flush(/* resetPosition= */ true); videoSink.setStreamOffsetAndAdjustmentUs( getOutputStreamOffsetUs(), getBufferTimestampAdjustmentUs()); } super.onPositionReset(positionUs, joining); - videoFrameReleaseControl.reset(); + if (videoSink == null) { + videoFrameReleaseControl.reset(); + } if (joining) { // 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 @@ -1624,7 +1624,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer } flushOrReinitializeCodec(); if (videoSink != null) { - videoSink.flush(); + videoSink.flush(/* resetPosition= */ false); } return true; } 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 58dc285848..330a665ade 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 @@ -141,8 +141,10 @@ public interface VideoSink { * Flushes the video sink. * *

After calling this method, any frames stored inside the video sink are discarded. + * + * @param resetPosition Whether to reset the current position. */ - void flush(); + void flush(boolean resetPosition); /** * Returns whether the video sink is able to immediately render media from the current position. 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 f611b5e195..fc05c319bf 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SequencePlayerRenderersWrapper.java @@ -375,10 +375,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException { - videoSink.flush(); + videoSink.flush(/* resetPosition= */ true); super.onPositionReset(positionUs, joining); timestampIterator = createTimestampIterator(positionUs); - videoFrameReleaseControl.reset(); if (joining) { videoFrameReleaseControl.join(/* renderNextFrameImmediately= */ false); }