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 a4ae908519..42eaeb956a 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 @@ -2195,9 +2195,11 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { bufferPresentationTimeUs, isStarted); + boolean isLastFrame = processedLastFrame && processedFramesTimestampsUs.size() == 1; boolean shouldReleaseFrameImmediately = renderer.shouldForceRender(positionUs, earlyUs); if (shouldReleaseFrameImmediately) { - releaseProcessedFrameInternal(FrameProcessor.RELEASE_OUTPUT_FRAME_IMMEDIATELY); + releaseProcessedFrameInternal( + FrameProcessor.RELEASE_OUTPUT_FRAME_IMMEDIATELY, isLastFrame); break; } else if (!isStarted || positionUs == renderer.initialPositionUs) { return; @@ -2217,9 +2219,8 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { // TODO(b/238302341) Handle very late buffers and drop to key frame. Need to flush // FrameProcessor input frames in this case. - boolean isLastFrame = processedLastFrame && processedFramesTimestampsUs.size() == 1; if (renderer.shouldDropOutputBuffer(earlyUs, elapsedRealtimeUs, isLastFrame)) { - releaseProcessedFrameInternal(FrameProcessor.DROP_OUTPUT_FRAME); + releaseProcessedFrameInternal(FrameProcessor.DROP_OUTPUT_FRAME, isLastFrame); continue; } @@ -2235,10 +2236,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { pendingOutputSizeChangeNotificationTimeUs = C.TIME_UNSET; renderer.maybeNotifyVideoSizeChanged(processedFrameSize); } - releaseProcessedFrameInternal(adjustedFrameReleaseTimeNs); - if (isLastFrame) { - releasedLastFrame = true; - } + releaseProcessedFrameInternal(adjustedFrameReleaseTimeNs, isLastFrame); } } @@ -2261,7 +2259,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { canEnableFrameProcessing = true; } - private void releaseProcessedFrameInternal(long releaseTimeNs) { + private void releaseProcessedFrameInternal(long releaseTimeNs, boolean isLastFrame) { checkStateNotNull(frameProcessor); frameProcessor.releaseOutputFrame(releaseTimeNs); processedFramesTimestampsUs.remove(); @@ -2269,6 +2267,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { if (releaseTimeNs != FrameProcessor.DROP_OUTPUT_FRAME) { renderer.maybeNotifyRenderedFirstFrame(); } + if (isLastFrame) { + releasedLastFrame = true; + } } private static final class FrameProcessorAccessor {