diff --git a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java index 4d75f6076b9..f3720fee0ad 100644 --- a/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java +++ b/extensions/vp9/src/main/java/com/google/android/exoplayer2/ext/vp9/LibvpxVideoRenderer.java @@ -127,6 +127,7 @@ public class LibvpxVideoRenderer extends BaseRenderer { private Bitmap bitmap; private boolean renderedFirstFrame; + private long initialPositionUs; private long joiningDeadlineMs; private Surface surface; private VpxOutputBufferRenderer outputBufferRenderer; @@ -303,6 +304,7 @@ protected void onPositionReset(long positionUs, boolean joining) throws ExoPlayb inputStreamEnded = false; outputStreamEnded = false; clearRenderedFirstFrame(); + initialPositionUs = C.TIME_UNSET; consecutiveDroppedFrameCount = 0; if (decoder != null) { flushDecoder(); @@ -809,6 +811,10 @@ private boolean drainOutputBuffer(long positionUs, long elapsedRealtimeUs) */ private boolean processOutputBuffer(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { + if (initialPositionUs == C.TIME_UNSET) { + initialPositionUs = positionUs; + } + long earlyUs = outputBuffer.timeUs - positionUs; if (outputMode == VpxDecoder.OUTPUT_MODE_NONE) { // Skip frames in sync with playback, so we'll be at the right frame if the mode changes. @@ -828,7 +834,7 @@ && shouldForceRenderOutputBuffer(earlyUs, elapsedRealtimeNowUs - lastRenderTimeU return true; } - if (!isStarted) { + if (!isStarted || positionUs == initialPositionUs) { return false; } 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 7a75e5d352e..979088f4215 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 @@ -100,6 +100,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { @C.VideoScalingMode private int scalingMode; private boolean renderedFirstFrame; + private long initialPositionUs; private long joiningDeadlineMs; private long droppedFrameAccumulationStartTimeMs; private int droppedFrames; @@ -276,6 +277,7 @@ protected void onStreamChanged(Format[] formats, long offsetUs) throws ExoPlayba protected void onPositionReset(long positionUs, boolean joining) throws ExoPlaybackException { super.onPositionReset(positionUs, joining); clearRenderedFirstFrame(); + initialPositionUs = C.TIME_UNSET; consecutiveDroppedFrameCount = 0; if (pendingOutputStreamOffsetCount != 0) { outputStreamOffsetUs = pendingOutputStreamOffsetsUs[pendingOutputStreamOffsetCount - 1]; @@ -532,6 +534,10 @@ protected void onOutputFormatChanged(MediaCodec codec, MediaFormat outputFormat) protected boolean processOutputBuffer(long positionUs, long elapsedRealtimeUs, MediaCodec codec, ByteBuffer buffer, int bufferIndex, int bufferFlags, long bufferPresentationTimeUs, boolean shouldSkip) throws ExoPlaybackException { + if (initialPositionUs == C.TIME_UNSET) { + initialPositionUs = positionUs; + } + while (pendingOutputStreamOffsetCount != 0 && bufferPresentationTimeUs >= pendingOutputStreamOffsetsUs[0]) { outputStreamOffsetUs = pendingOutputStreamOffsetsUs[0]; @@ -569,7 +575,7 @@ && shouldForceRenderOutputBuffer(earlyUs, elapsedRealtimeNowUs - lastRenderTimeU return true; } - if (!isStarted) { + if (!isStarted || positionUs == initialPositionUs) { return false; }