Index: media/renderers/video_renderer_impl.cc |
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc |
index a43ddab64283cbb22c8e5fa36a0fb34574861967..704c5ed3befc8475b4eb478e3376c4aac7a8dd45 100644 |
--- a/media/renderers/video_renderer_impl.cc |
+++ b/media/renderers/video_renderer_impl.cc |
@@ -190,11 +190,6 @@ void VideoRendererImpl::ThreadMain() { |
const base::TimeDelta kIdleTimeDelta = |
base::TimeDelta::FromMilliseconds(10); |
- // If we have no frames and haven't painted any frame for certain amount of |
- // time, declare BUFFERING_HAVE_NOTHING. |
- const base::TimeDelta kTimeToDeclareHaveNothing = |
- base::TimeDelta::FromSeconds(3); |
- |
for (;;) { |
base::AutoLock auto_lock(lock_); |
@@ -212,19 +207,23 @@ void VideoRendererImpl::ThreadMain() { |
// Remain idle until we have the next frame ready for rendering. |
if (ready_frames_.empty()) { |
+ base::TimeDelta wait_time = kIdleTimeDelta; |
if (received_end_of_stream_) { |
if (!rendered_end_of_stream_) { |
rendered_end_of_stream_ = true; |
task_runner_->PostTask(FROM_HERE, ended_cb_); |
} |
- } else if (!last_painted_time_.is_null() && |
- now - last_painted_time_ >= kTimeToDeclareHaveNothing) { |
+ } else if (now >= latest_possible_paint_time_) { |
+ // Declare HAVE_NOTHING if we don't have another frame by the time we |
+ // are ready to paint the next one. |
buffering_state_ = BUFFERING_HAVE_NOTHING; |
task_runner_->PostTask( |
FROM_HERE, base::Bind(buffering_state_cb_, BUFFERING_HAVE_NOTHING)); |
+ } else { |
+ wait_time = std::min(kIdleTimeDelta, latest_possible_paint_time_ - now); |
} |
- UpdateStatsAndWait_Locked(kIdleTimeDelta); |
+ UpdateStatsAndWait_Locked(wait_time); |
continue; |
} |
@@ -237,8 +236,6 @@ void VideoRendererImpl::ThreadMain() { |
continue; |
} |
- base::TimeTicks latest_possible_paint_time; |
- |
// Deadline is defined as the duration between this frame and the next |
// frame, using the delta between this frame and the previous frame as the |
// assumption for frame duration. |
@@ -246,10 +243,10 @@ void VideoRendererImpl::ThreadMain() { |
// TODO(scherkus): This can be vastly improved. Use a histogram to measure |
// the accuracy of our frame timing code. http://crbug.com/149829 |
if (last_media_time_.is_null()) { |
- latest_possible_paint_time = now; |
+ latest_possible_paint_time_ = now; |
} else { |
base::TimeDelta duration = target_paint_time - last_media_time_; |
- latest_possible_paint_time = target_paint_time + duration; |
+ latest_possible_paint_time_ = target_paint_time + duration; |
} |
// Remain idle until we've reached our target paint window. |
@@ -259,7 +256,7 @@ void VideoRendererImpl::ThreadMain() { |
continue; |
} |
- if (ready_frames_.size() > 1 && now > latest_possible_paint_time && |
+ if (ready_frames_.size() > 1 && now > latest_possible_paint_time_ && |
drop_frames_) { |
DropNextReadyFrame_Locked(); |
continue; |
@@ -285,8 +282,7 @@ void VideoRendererImpl::PaintNextReadyFrame_Locked() { |
ready_frames_.pop_front(); |
frames_decoded_++; |
- last_media_time_ = last_painted_time_ = |
- wall_clock_time_cb_.Run(next_frame->timestamp()); |
+ last_media_time_ = wall_clock_time_cb_.Run(next_frame->timestamp()); |
paint_cb_.Run(next_frame); |
@@ -443,7 +439,7 @@ void VideoRendererImpl::OnVideoFrameStreamResetDone() { |
DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); |
state_ = kFlushed; |
- last_media_time_ = last_painted_time_ = base::TimeTicks(); |
+ latest_possible_paint_time_ = last_media_time_ = base::TimeTicks(); |
base::ResetAndReturn(&flush_cb_).Run(); |
} |