Index: media/renderers/video_renderer_impl.cc |
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc |
index c338072e70bcd6c0d7e0b903ccc2c357fdeb3f30..2c13377bd0519218571104f9a3559dbc8932ca14 100644 |
--- a/media/renderers/video_renderer_impl.cc |
+++ b/media/renderers/video_renderer_impl.cc |
@@ -59,6 +59,7 @@ VideoRendererImpl::VideoRendererImpl( |
last_video_memory_usage_(0), |
have_renderered_frames_(false), |
last_frame_opaque_(false), |
+ painted_first_frame_(false), |
weak_factory_(this), |
frame_callback_weak_factory_(this) { |
if (gpu_factories && |
@@ -114,6 +115,7 @@ void VideoRendererImpl::Flush(const base::Closure& callback) { |
// will get a bunch of ReusePictureBuffer() calls before the Reset(), which |
// they may use to output more frames that won't be used. |
algorithm_->Reset(); |
+ painted_first_frame_ = false; |
} |
void VideoRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { |
@@ -126,6 +128,7 @@ void VideoRendererImpl::StartPlayingFrom(base::TimeDelta timestamp) { |
state_ = kPlaying; |
start_timestamp_ = timestamp; |
+ painted_first_frame_ = false; |
AttemptRead_Locked(); |
} |
@@ -400,10 +403,9 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
if (!sink_started_) |
UpdateStats_Locked(); |
- // 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()) { |
+ // Paint the first frame if possible and necessary. Paint ahead of |
+ // HAVE_ENOUGH_DATA to ensure the user sees the frame as early as possible. |
+ if (!sink_started_ && algorithm_->frames_queued() && !painted_first_frame_) { |
// 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). |
@@ -412,11 +414,14 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
// must have a timestamp >= |start_timestamp_|, since otherwise we may be |
// prerolling frames before the actual start time that will be dropped. |
if (algorithm_->frames_queued() > 1 || received_end_of_stream_ || |
- algorithm_->first_frame()->timestamp() >= start_timestamp_ || |
- low_delay_ || !video_frame_stream_->CanReadWithoutStalling()) { |
- scoped_refptr<VideoFrame> frame = algorithm_->first_frame(); |
- CheckForMetadataChanges(frame->format(), frame->natural_size()); |
- sink_->PaintSingleFrame(frame); |
+ frame->timestamp() >= start_timestamp_ || low_delay_ || |
+ !video_frame_stream_->CanReadWithoutStalling()) { |
+ scoped_refptr<VideoFrame> first_frame = |
+ algorithm_->Render(base::TimeTicks(), base::TimeTicks(), nullptr); |
+ CheckForMetadataChanges(first_frame->format(), |
+ first_frame->natural_size()); |
+ sink_->PaintSingleFrame(first_frame); |
+ painted_first_frame_ = true; |
} |
} |
@@ -673,6 +678,7 @@ void VideoRendererImpl::RemoveFramesForUnderflowOrBackgroundRendering() { |
frames_dropped_ += algorithm_->frames_queued(); |
algorithm_->Reset( |
VideoRendererAlgorithm::ResetFlag::kPreserveNextFrameEstimates); |
+ painted_first_frame_ = false; |
// It's possible in the background rendering case for us to expire enough |
// frames that we need to transition from HAVE_ENOUGH => HAVE_NOTHING. Just |