| Index: media/renderers/renderer_impl.cc
|
| diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
|
| index f03b2da865c7f2b02b748b4f9f7f26f2627ebd50..cc1504529eee3f0dbef0eef70fb56a63306f9e05 100644
|
| --- a/media/renderers/renderer_impl.cc
|
| +++ b/media/renderers/renderer_impl.cc
|
| @@ -184,6 +184,11 @@ void RendererImpl::Flush(const base::Closure& flush_cb) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(flush_cb_.is_null());
|
|
|
| + if (state_ == STATE_FLUSHED) {
|
| + task_runner_->PostTask(FROM_HERE, flush_cb);
|
| + return;
|
| + }
|
| +
|
| if (state_ != STATE_PLAYING) {
|
| DCHECK_EQ(state_, STATE_ERROR);
|
| return;
|
| @@ -202,13 +207,14 @@ void RendererImpl::StartPlayingFrom(base::TimeDelta time) {
|
| DVLOG(1) << __func__;
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| - if (state_ != STATE_PLAYING) {
|
| + if (state_ != STATE_FLUSHED) {
|
| DCHECK_EQ(state_, STATE_ERROR);
|
| return;
|
| }
|
|
|
| time_source_->SetMediaTime(time);
|
|
|
| + state_ = STATE_PLAYING;
|
| if (audio_renderer_)
|
| audio_renderer_->StartPlaying();
|
| if (video_renderer_)
|
| @@ -278,7 +284,7 @@ void RendererImpl::SetPlaybackRate(double playback_rate) {
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
|
|
| // Playback rate changes are only carried out while playing.
|
| - if (state_ != STATE_PLAYING)
|
| + if (state_ != STATE_PLAYING && state_ != STATE_FLUSHED)
|
| return;
|
|
|
| time_source_->SetPlaybackRate(playback_rate);
|
| @@ -480,7 +486,7 @@ void RendererImpl::OnVideoRendererInitializeDone(PipelineStatus status) {
|
| time_source_ = wall_clock_time_source_.get();
|
| }
|
|
|
| - state_ = STATE_PLAYING;
|
| + state_ = STATE_FLUSHED;
|
| DCHECK(time_source_);
|
| DCHECK(audio_renderer_ || video_renderer_);
|
|
|
| @@ -552,7 +558,7 @@ void RendererImpl::OnVideoRendererFlushDone() {
|
|
|
| DCHECK_EQ(video_buffering_state_, BUFFERING_HAVE_NOTHING);
|
| video_ended_ = false;
|
| - state_ = STATE_PLAYING;
|
| + state_ = STATE_FLUSHED;
|
| base::ResetAndReturn(&flush_cb_).Run();
|
| }
|
|
|
| @@ -733,6 +739,7 @@ void RendererImpl::PausePlayback() {
|
| break;
|
|
|
| case STATE_FLUSHING:
|
| + case STATE_FLUSHED:
|
| // It's OK to pause playback when flushing.
|
| break;
|
|
|
|
|