From 6c4795b49631ba33d76b39f28c89deba150b9222 Mon Sep 17 00:00:00 2001 From: anjalibh Date: Thu, 15 Dec 2016 14:42:37 -0800 Subject: [PATCH] Prevent frozen frames when the decoder is always late. Create a MediaCodecVideoTrackRenderer.shouldDropFrame function that can be overriden by a child class. The YouTube override prevents a frame drop if we haven't rendered anything in the last 35 ms. The YouTube override is off at the moment, I plan to use a server side flag to do a slow and controlled experiment. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=142190774 --- .../exoplayer2/video/MediaCodecVideoRenderer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 2a13953106..f68b72fb65 100644 --- a/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -403,7 +403,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { bufferPresentationTimeUs, unadjustedFrameReleaseTimeNs); earlyUs = (adjustedReleaseTimeNs - systemTimeNs) / 1000; - if (earlyUs < -30000) { + if (shouldDropOutputBuffer(earlyUs, elapsedRealtimeUs)) { // We're more than 30ms late rendering the frame. dropOutputBuffer(codec, bufferIndex); return true; @@ -437,6 +437,17 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { return false; } + /** + * Returns true if the current frame should be dropped. + * + * @param earlyUs Time indicating how early the frame is. Negative values indicate late frame. + * @param elapsedRealtimeUs Wall clock time. + */ + protected boolean shouldDropOutputBuffer(long earlyUs, long elapsedRealtimeUs) { + // Drop the frame if we're more than 30ms late rendering the frame. + return earlyUs < -30000; + } + private void skipOutputBuffer(MediaCodec codec, int bufferIndex) { TraceUtil.beginSection("skipVideoBuffer"); codec.releaseOutputBuffer(bufferIndex, false);