Index: media/renderers/renderer_impl.cc |
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc |
index 210e5cc574f2437b4368c498f56b02facf5c1e61..b8d9511140231b1e3c1570c879b9ce4af01153ec 100644 |
--- a/media/renderers/renderer_impl.cc |
+++ b/media/renderers/renderer_impl.cc |
@@ -111,6 +111,8 @@ RendererImpl::~RendererImpl() { |
DVLOG(1) << __func__; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ state_ = STATE_SHUTDOWN; |
xhwang
2017/01/04 18:29:09
Instead of adding a new state, does it make sense
servolk
2017/01/04 19:00:52
Yes, I guess we could try invalidating RendererImp
|
+ |
// Tear down in opposite order of construction as |video_renderer_| can still |
// need |time_source_| (which can be |audio_renderer_|) to be alive. |
video_renderer_.reset(); |
@@ -246,8 +248,13 @@ void RendererImpl::RestartStreamPlayback(DemuxerStream* stream, |
void RendererImpl::RestartVideoRenderer(base::TimeDelta time) { |
DVLOG(3) << __func__; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
+ // We only need to actually restart video renderer if we are in the PLAYING |
+ // state. In all other states we don't need to do anything, since either we |
+ // are already shutting down, or the VideoRenderer::StartPlayingFrom will be |
+ // called when RendererImpl transitions into PLAYING state. |
+ if (state_ != STATE_PLAYING) |
+ return; |
DCHECK(video_renderer_); |
- DCHECK_EQ(state_, STATE_PLAYING); |
video_ended_ = false; |
video_renderer_->StartPlayingFrom(time); |
} |
@@ -255,7 +262,12 @@ void RendererImpl::RestartVideoRenderer(base::TimeDelta time) { |
void RendererImpl::RestartAudioRenderer(base::TimeDelta time) { |
DVLOG(3) << __func__; |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- DCHECK_EQ(state_, STATE_PLAYING); |
+ // We only need to actually restart audio renderer if we are in the PLAYING |
+ // state. In all other states we don't need to do anything, since either we |
+ // are already shutting down, or the AudioRenderer::StartPlayingFrom will be |
+ // called when RendererImpl transitions into PLAYING state. |
+ if (state_ != STATE_PLAYING) |
+ return; |
DCHECK(time_source_); |
DCHECK(audio_renderer_); |
audio_ended_ = false; |
@@ -724,6 +736,7 @@ void RendererImpl::PausePlayback() { |
case STATE_UNINITIALIZED: |
case STATE_INIT_PENDING_CDM: |
case STATE_INITIALIZING: |
+ case STATE_SHUTDOWN: |
NOTREACHED() << "Invalid state: " << state_; |
break; |