Commit 976e3c72 by claincly Committed by christosts

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
parent 77cc2524
......@@ -2191,9 +2191,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;
......@@ -2213,9 +2215,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;
}
......@@ -2231,10 +2232,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
pendingOutputSizeChangeNotificationTimeUs = C.TIME_UNSET;
renderer.maybeNotifyVideoSizeChanged(processedFrameSize);
}
releaseProcessedFrameInternal(adjustedFrameReleaseTimeNs);
if (isLastFrame) {
releasedLastFrame = true;
}
releaseProcessedFrameInternal(adjustedFrameReleaseTimeNs, isLastFrame);
}
}
......@@ -2257,7 +2255,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();
......@@ -2265,6 +2263,9 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
if (releaseTimeNs != FrameProcessor.DROP_OUTPUT_FRAME) {
renderer.maybeNotifyRenderedFirstFrame();
}
if (isLastFrame) {
releasedLastFrame = true;
}
}
private static final class FrameProcessorAccessor {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment