Index: media/renderers/video_renderer_impl.cc |
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc |
index c6902976272cad8a0a1d0c3e88d49c994559e292..b8eedb6d682cedc369281fc291cec04a072da7e4 100644 |
--- a/media/renderers/video_renderer_impl.cc |
+++ b/media/renderers/video_renderer_impl.cc |
@@ -237,10 +237,8 @@ void VideoRendererImpl::OnVideoFrameStreamInitialized(bool success) { |
return; |
} |
- // We're all good! Consider ourselves flushed. (ThreadMain() should never |
- // see us in the kUninitialized state). |
- // Since we had an initial Preroll(), we consider ourself flushed, because we |
- // have not populated any buffers yet. |
+ // We're all good! Consider ourselves flushed because we have not read any |
+ // frames yet. |
state_ = kFlushed; |
algorithm_.reset(new VideoRendererAlgorithm(wall_clock_time_cb_)); |
@@ -285,41 +283,44 @@ void VideoRendererImpl::SetGpuMemoryBufferVideoForTesting( |
gpu_memory_buffer_pool_.swap(gpu_memory_buffer_pool); |
} |
-void VideoRendererImpl::OnTimeStateChanged(bool time_progressing) { |
+void VideoRendererImpl::TimeStartedProgressing() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- time_progressing_ = time_progressing; |
+ time_progressing_ = true; |
- // WARNING: Do not attempt to use |lock_| here as this may be a reentrant call |
- // in response to callbacks firing above. |
+ if (sink_started_) |
+ return; |
+ |
+ // If only an EOS frame came in after a seek, the renderer may not have |
+ // received the ended event yet though we've posted it. |
+ if (rendered_end_of_stream_) |
+ return; |
- if (sink_started_ == time_progressing_) |
+ // If we have no frames queued, there is a pending buffering state change in |
+ // flight and we should ignore the start attempt. |
+ if (!algorithm_->frames_queued()) { |
+ DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); |
return; |
+ } |
+ |
+ StartSink(); |
+} |
+ |
+void VideoRendererImpl::TimeStoppedProgressing() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ time_progressing_ = false; |
+ |
+ if (!sink_started_) |
+ return; |
+ |
+ StopSink(); |
- if (time_progressing_) { |
- // If only an EOS frame came in after a seek, the renderer may not have |
- // received the ended event yet though we've posted it. |
- if (rendered_end_of_stream_) |
- return; |
- |
- // If we have no frames queued, there is a pending buffering state change in |
- // flight and we should ignore the start attempt. |
- if (!algorithm_->frames_queued()) { |
- DCHECK_EQ(buffering_state_, BUFFERING_HAVE_NOTHING); |
- return; |
- } |
- |
- StartSink(); |
- } else { |
- StopSink(); |
- |
- // Make sure we expire everything we can if we can't read anymore currently, |
- // 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) { |
- base::AutoLock al(lock_); |
- RemoveFramesForUnderflowOrBackgroundRendering(); |
- } |
+ // Make sure we expire everything we can if we can't read any more currently, |
+ // 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) { |
+ base::AutoLock al(lock_); |
+ RemoveFramesForUnderflowOrBackgroundRendering(); |
} |
} |
@@ -415,10 +416,7 @@ void VideoRendererImpl::FrameReady(VideoFrameStream::Status status, |
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 |
- // 2) Keeps decoding going if video rendering thread starts falling behind |
+ // Always request more decoded video if we have capacity. |
AttemptRead_Locked(); |
} |