From a817bd42e299fe8fc165c9bda70969f55658d895 Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 1 Feb 2023 18:37:44 +0000 Subject: [PATCH] Fix end of stream handling for previewing. Before this CL, the `renderedLastFrame` flag is not set if the last frame is released immediately (force render), or when it's dropped. PiperOrigin-RevId: 506358626 --- .../video/MediaCodecVideoRenderer.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) 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 {