Index: media/renderers/video_renderer_impl.cc |
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc |
index 35747764cf8e6a803e3ff5a11ec1dce2c24a6b0f..9e4954e2783e1b282759171b9425fbbbfd32bf87 100644 |
--- a/media/renderers/video_renderer_impl.cc |
+++ b/media/renderers/video_renderer_impl.cc |
@@ -368,9 +368,6 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
if (frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM)) { |
DCHECK(!received_end_of_stream_); |
received_end_of_stream_ = true; |
- |
- // See if we can fire EOS immediately instead of waiting for Render(). |
- MaybeFireEndedCallback_Locked(time_progressing_); |
} else if ((low_delay_ || !video_frame_stream_->CanReadWithoutStalling()) && |
IsBeforeStartTime(frame->timestamp())) { |
// Don't accumulate frames that are earlier than the start time if we |
@@ -391,19 +388,28 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
// Attempt to purge bad frames in case of underflow or backgrounding. |
RemoveFramesForUnderflowOrBackgroundRendering(); |
- // Signal buffering state if we've met our conditions. |
- if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked()) { |
- TransitionToHaveEnough_Locked(); |
- |
- // Paint the first frame if necessary. |
- if (!rendered_end_of_stream_ && !sink_started_) { |
- DCHECK(algorithm_->frames_queued()); |
+ // We may have removed all frames above and have reached end of stream. |
+ MaybeFireEndedCallback_Locked(time_progressing_); |
+ |
+ // Paint the first frame if possible and necessary. PaintSingleFrame() will |
+ // ignore repeated calls for the same frame. Paint ahead of HAVE_ENOUGH_DATA |
+ // to ensure the user sees the frame as early as possible. |
+ if (!sink_started_ && algorithm_->frames_queued()) { |
+ // We want to paint the first frame under two conditions: Either (1) we have |
+ // enough frames to know it's definitely the first frame or (2) there may be |
+ // no more frames coming (sometimes unless we paint one of them). |
+ if (algorithm_->frames_queued() > 1 || received_end_of_stream_ || |
+ low_delay_ || !video_frame_stream_->CanReadWithoutStalling()) { |
scoped_refptr<VideoFrame> frame = algorithm_->first_frame(); |
CheckForMetadataChanges(frame->format(), frame->natural_size()); |
sink_->PaintSingleFrame(frame); |
} |
} |
+ // Signal buffering state if we've met our conditions. |
+ if (buffering_state_ == BUFFERING_HAVE_NOTHING && HaveEnoughData_Locked()) |
+ TransitionToHaveEnough_Locked(); |
+ |
// Always request more decoded video if we have capacity. This serves two |
// purposes: |
// 1) Prerolling while paused |