| Index: media/renderers/video_renderer_impl.cc
|
| diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
|
| index b858a6904030b11cfba3eacf45f1ddf7f284ca08..efad57f9a33a14d970c178dbf1299d6cf396f794 100644
|
| --- a/media/renderers/video_renderer_impl.cc
|
| +++ b/media/renderers/video_renderer_impl.cc
|
| @@ -318,8 +318,10 @@ void VideoRendererImpl::OnTimeStateChanged(bool time_progressing) {
|
| // otherwise playback may hang indefinitely. Note: There are no effective
|
| // frames queued at this point, otherwise FrameReady() would have canceled
|
| // the underflow state before reaching this point.
|
| - if (buffering_state_ == BUFFERING_HAVE_NOTHING)
|
| + if (buffering_state_ == BUFFERING_HAVE_NOTHING) {
|
| + base::AutoLock al(lock_);
|
| RemoveFramesForUnderflowOrBackgroundRendering();
|
| + }
|
| }
|
| }
|
|
|
| @@ -458,6 +460,14 @@ void VideoRendererImpl::TransitionToHaveNothing() {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| base::AutoLock auto_lock(lock_);
|
| + TransitionToHaveNothing_Locked();
|
| +}
|
| +
|
| +void VideoRendererImpl::TransitionToHaveNothing_Locked() {
|
| + DVLOG(3) << __func__;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| + lock_.AssertAcquired();
|
| +
|
| if (buffering_state_ != BUFFERING_HAVE_ENOUGH || HaveEnoughData_Locked())
|
| return;
|
|
|
| @@ -659,6 +669,12 @@ void VideoRendererImpl::RemoveFramesForUnderflowOrBackgroundRendering() {
|
| frames_dropped_ += algorithm_->frames_queued();
|
| algorithm_->Reset(
|
| VideoRendererAlgorithm::ResetFlag::kPreserveNextFrameEstimates);
|
| +
|
| + // 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
|
| + // calling this function will check if we need to transition or not.
|
| + if (buffering_state_ == BUFFERING_HAVE_ENOUGH)
|
| + TransitionToHaveNothing_Locked();
|
| }
|
| }
|
|
|
|
|