Don't release a frame when not force rendering when paused.

And rename method `releaseOutputFrame` to `releaseProcessedFrameInternal` for consistency.

Removed misplaced comment.

PiperOrigin-RevId: 506005744
This commit is contained in:
claincly 2023-01-31 16:08:39 +00:00 committed by christosts
parent c67cfbf8ce
commit f0b7dfc71d

View File

@ -2158,8 +2158,6 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
*/ */
public void releaseProcessedFrames(long positionUs, long elapsedRealtimeUs) { public void releaseProcessedFrames(long positionUs, long elapsedRealtimeUs) {
checkStateNotNull(frameProcessor); checkStateNotNull(frameProcessor);
// Locking the entire releasing flow may block the FrameProcessor thread running
// onOutputFrameAvailable().
while (!processedFramesTimestampsUs.isEmpty()) { while (!processedFramesTimestampsUs.isEmpty()) {
boolean isStarted = renderer.getState() == STATE_STARTED; boolean isStarted = renderer.getState() == STATE_STARTED;
long bufferPresentationTimeUs = checkNotNull(processedFramesTimestampsUs.peek()); long bufferPresentationTimeUs = checkNotNull(processedFramesTimestampsUs.peek());
@ -2173,8 +2171,10 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
boolean shouldReleaseFrameImmediately = renderer.shouldForceRender(positionUs, earlyUs); boolean shouldReleaseFrameImmediately = renderer.shouldForceRender(positionUs, earlyUs);
if (shouldReleaseFrameImmediately) { if (shouldReleaseFrameImmediately) {
releaseOutputFrame(FrameProcessor.RELEASE_OUTPUT_FRAME_IMMEDIATELY); releaseProcessedFrameInternal(FrameProcessor.RELEASE_OUTPUT_FRAME_IMMEDIATELY);
break; break;
} else if (!isStarted || positionUs == renderer.initialPositionUs) {
return;
} }
// Only release frames that are reasonably close to presentation. // Only release frames that are reasonably close to presentation.
@ -2193,7 +2193,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
// FrameProcessor input frames in this case. // FrameProcessor input frames in this case.
boolean isLastFrame = processedLastFrame && processedFramesTimestampsUs.size() == 1; boolean isLastFrame = processedLastFrame && processedFramesTimestampsUs.size() == 1;
if (renderer.shouldDropOutputBuffer(earlyUs, elapsedRealtimeUs, isLastFrame)) { if (renderer.shouldDropOutputBuffer(earlyUs, elapsedRealtimeUs, isLastFrame)) {
releaseOutputFrame(FrameProcessor.DROP_OUTPUT_FRAME); releaseProcessedFrameInternal(FrameProcessor.DROP_OUTPUT_FRAME);
continue; continue;
} }
@ -2209,7 +2209,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
pendingOutputSizeChangeNotificationTimeUs = C.TIME_UNSET; pendingOutputSizeChangeNotificationTimeUs = C.TIME_UNSET;
renderer.maybeNotifyVideoSizeChanged(processedFrameSize); renderer.maybeNotifyVideoSizeChanged(processedFrameSize);
} }
releaseOutputFrame(adjustedFrameReleaseTimeNs); releaseProcessedFrameInternal(adjustedFrameReleaseTimeNs);
if (isLastFrame) { if (isLastFrame) {
releasedLastFrame = true; releasedLastFrame = true;
} }
@ -2235,7 +2235,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
canEnableFrameProcessing = true; canEnableFrameProcessing = true;
} }
private void releaseOutputFrame(long releaseTimeNs) { private void releaseProcessedFrameInternal(long releaseTimeNs) {
checkStateNotNull(frameProcessor); checkStateNotNull(frameProcessor);
frameProcessor.releaseOutputFrame(releaseTimeNs); frameProcessor.releaseOutputFrame(releaseTimeNs);
processedFramesTimestampsUs.remove(); processedFramesTimestampsUs.remove();