Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(839)

Unified Diff: media/renderers/renderer_impl.cc

Issue 2800523003: Properly handle track status changes in FLUSHED state (Closed)
Patch Set: rebase Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
« no previous file with comments | « no previous file | media/renderers/renderer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698