| Index: media/renderers/renderer_impl.cc
|
| diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc
|
| index 264998cab8ec10a32221a64df28e96bdd6778e00..9c54bbb5bc5949425c589c5f51851e679d258679 100644
|
| --- a/media/renderers/renderer_impl.cc
|
| +++ b/media/renderers/renderer_impl.cc
|
| @@ -545,28 +545,46 @@ void RendererImpl::OnStreamStatusChanged(DemuxerStream* stream,
|
| bool video = (stream->type() == DemuxerStream::VIDEO);
|
| DVLOG(1) << __func__ << (video ? " video" : " audio") << " stream=" << stream
|
| << " enabled=" << enabled << " time=" << time.InSecondsF();
|
| - if ((state_ != STATE_PLAYING && state_ != STATE_FLUSHING) ||
|
| +
|
| + if ((state_ != STATE_PLAYING && state_ != STATE_FLUSHING &&
|
| + state_ != STATE_FLUSHED) ||
|
| (audio_ended_ && video_ended_))
|
| return;
|
| - if (restarting_audio_ || restarting_video_ || flush_cb_) {
|
| +
|
| + if (restarting_audio_ || restarting_video_ || state_ == STATE_FLUSHING) {
|
| DVLOG(3) << __func__ << ": postponed stream " << stream
|
| << " status change handling.";
|
| pending_actions_.push_back(base::Bind(&RendererImpl::OnStreamStatusChanged,
|
| weak_this_, stream, enabled, time));
|
| return;
|
| }
|
| +
|
| + DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED);
|
| if (stream->type() == DemuxerStream::VIDEO) {
|
| DCHECK(video_renderer_);
|
| restarting_video_ = true;
|
| - video_renderer_->Flush(
|
| + base::Closure handle_track_status_cb =
|
| base::Bind(stream == current_video_stream_
|
| ? &RendererImpl::RestartVideoRenderer
|
| : &RendererImpl::ReinitializeVideoRenderer,
|
| - weak_this_, stream, time));
|
| + weak_this_, stream, time);
|
| + if (state_ == STATE_FLUSHED)
|
| + handle_track_status_cb.Run();
|
| + else
|
| + video_renderer_->Flush(handle_track_status_cb);
|
| } else if (stream->type() == DemuxerStream::AUDIO) {
|
| DCHECK(audio_renderer_);
|
| DCHECK(time_source_);
|
| restarting_audio_ = true;
|
| + base::Closure handle_track_status_cb =
|
| + base::Bind(stream == current_audio_stream_
|
| + ? &RendererImpl::RestartAudioRenderer
|
| + : &RendererImpl::ReinitializeAudioRenderer,
|
| + weak_this_, stream, time);
|
| + if (state_ == STATE_FLUSHED) {
|
| + handle_track_status_cb.Run();
|
| + return;
|
| + }
|
| // Stop ticking (transition into paused state) in audio renderer before
|
| // calling Flush, since after Flush we are going to restart playback by
|
| // calling audio renderer StartPlaying which would fail in playing state.
|
| @@ -574,11 +592,7 @@ void RendererImpl::OnStreamStatusChanged(DemuxerStream* stream,
|
| time_ticking_ = false;
|
| time_source_->StopTicking();
|
| }
|
| - audio_renderer_->Flush(
|
| - base::Bind(stream == current_audio_stream_
|
| - ? &RendererImpl::RestartAudioRenderer
|
| - : &RendererImpl::ReinitializeAudioRenderer,
|
| - weak_this_, stream, time));
|
| + audio_renderer_->Flush(handle_track_status_cb);
|
| }
|
| }
|
|
|
| @@ -640,13 +654,16 @@ void RendererImpl::RestartAudioRenderer(DemuxerStream* stream,
|
| base::TimeDelta time) {
|
| DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| - DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHING);
|
| + DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED);
|
| DCHECK(time_source_);
|
| DCHECK(audio_renderer_);
|
| DCHECK_EQ(stream, current_audio_stream_);
|
|
|
| audio_ended_ = false;
|
| - audio_renderer_->StartPlaying();
|
| + if (state_ == STATE_PLAYING)
|
| + audio_renderer_->StartPlaying();
|
| + else
|
| + OnStreamRestartCompleted();
|
| }
|
|
|
| void RendererImpl::RestartVideoRenderer(DemuxerStream* stream,
|
| @@ -654,11 +671,14 @@ void RendererImpl::RestartVideoRenderer(DemuxerStream* stream,
|
| DVLOG(2) << __func__ << " stream=" << stream << " time=" << time.InSecondsF();
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(video_renderer_);
|
| - DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHING);
|
| + DCHECK(state_ == STATE_PLAYING || state_ == STATE_FLUSHED);
|
| DCHECK_EQ(stream, current_video_stream_);
|
|
|
| video_ended_ = false;
|
| - video_renderer_->StartPlayingFrom(time);
|
| + if (state_ == STATE_PLAYING)
|
| + video_renderer_->StartPlayingFrom(time);
|
| + else
|
| + OnStreamRestartCompleted();
|
| }
|
|
|
| void RendererImpl::OnStatisticsUpdate(const PipelineStatistics& stats) {
|
| @@ -735,6 +755,7 @@ bool RendererImpl::HandleRestartedStreamBufferingChanges(
|
| void RendererImpl::OnStreamRestartCompleted() {
|
| DVLOG(3) << __func__ << " restarting_audio_=" << restarting_audio_
|
| << " restarting_video_=" << restarting_video_;
|
| + DCHECK(task_runner_->BelongsToCurrentThread());
|
| DCHECK(restarting_audio_ || restarting_video_);
|
| restarting_audio_ = false;
|
| restarting_video_ = false;
|
|
|