From dc12982bd103f0d23c4e838a61ccc72083d6958f Mon Sep 17 00:00:00 2001 From: tonihei Date: Thu, 12 Sep 2019 17:10:14 +0100 Subject: [PATCH] Don't force render first frame when joining. We currently force render the first frame in all cases. However, when joining video to an ongoing playback, there is no defined first frame and we should rather drop frames if we are late until we caught up with the audio playback. PiperOrigin-RevId: 268698093 --- .../exoplayer2/video/MediaCodecVideoRenderer.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index a9f571c085..3b8c88e3e3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -800,10 +800,14 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } long elapsedRealtimeNowUs = SystemClock.elapsedRealtime() * 1000; + long elapsedSinceLastRenderUs = elapsedRealtimeNowUs - lastRenderTimeUs; boolean isStarted = getState() == STATE_STARTED; - if (!renderedFirstFrame - || (isStarted - && shouldForceRenderOutputBuffer(earlyUs, elapsedRealtimeNowUs - lastRenderTimeUs))) { + // Don't force output until we joined and always render first frame if not joining. + boolean forceRenderOutputBuffer = + joiningDeadlineMs == C.TIME_UNSET + && (!renderedFirstFrame + || (isStarted && shouldForceRenderOutputBuffer(earlyUs, elapsedSinceLastRenderUs))); + if (forceRenderOutputBuffer) { long releaseTimeNs = System.nanoTime(); notifyFrameMetadataListener(presentationTimeUs, releaseTimeNs, format); if (Util.SDK_INT >= 21) { @@ -988,6 +992,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { * @return Returns whether to force rendering an output buffer. */ protected boolean shouldForceRenderOutputBuffer(long earlyUs, long elapsedSinceLastRenderUs) { + // Force render late buffers every 100ms to avoid frozen video effect. return isBufferLate(earlyUs) && elapsedSinceLastRenderUs > 100000; }