mirror of
https://github.com/samsonjs/media.git
synced 2026-03-26 09:35:47 +00:00
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
This commit is contained in:
parent
0f4fcc1110
commit
a817bd42e2
1 changed files with 9 additions and 8 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue