Index: media/filters/audio_renderer_impl.cc |
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
index 9ade30dc0dc6fdbba1dae9d7e8cbd041aee6638e..76d9e76b6885a1ac97c66e4307ca48931211aad2 100644 |
--- a/media/filters/audio_renderer_impl.cc |
+++ b/media/filters/audio_renderer_impl.cc |
@@ -147,8 +147,8 @@ void AudioRendererImpl::DoFlush_Locked() { |
DCHECK_EQ(state_, kPaused); |
if (decrypting_demuxer_stream_) { |
- decrypting_demuxer_stream_->Reset(BindToCurrentLoop( |
- base::Bind(&AudioRendererImpl::ResetDecoder, weak_this_))); |
+ decrypting_demuxer_stream_->Reset( |
+ base::Bind(&AudioRendererImpl::ResetDecoder, weak_this_)); |
return; |
} |
@@ -157,28 +157,29 @@ void AudioRendererImpl::DoFlush_Locked() { |
void AudioRendererImpl::ResetDecoder() { |
DCHECK(task_runner_->BelongsToCurrentThread()); |
- decoder_->Reset(BindToCurrentLoop( |
- base::Bind(&AudioRendererImpl::ResetDecoderDone, weak_this_))); |
+ decoder_->Reset(base::Bind(&AudioRendererImpl::ResetDecoderDone, weak_this_)); |
} |
void AudioRendererImpl::ResetDecoderDone() { |
- base::AutoLock auto_lock(lock_); |
- if (state_ == kStopped) |
- return; |
- |
- DCHECK_EQ(state_, kPaused); |
- DCHECK(!flush_cb_.is_null()); |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ { |
+ base::AutoLock auto_lock(lock_); |
+ if (state_ == kStopped) |
+ return; |
- audio_time_buffered_ = kNoTimestamp(); |
- current_time_ = kNoTimestamp(); |
- received_end_of_stream_ = false; |
- rendered_end_of_stream_ = false; |
- preroll_aborted_ = false; |
+ DCHECK_EQ(state_, kPaused); |
+ DCHECK(!flush_cb_.is_null()); |
- earliest_end_time_ = now_cb_.Run(); |
- splicer_->Reset(); |
- algorithm_->FlushBuffers(); |
+ audio_time_buffered_ = kNoTimestamp(); |
+ current_time_ = kNoTimestamp(); |
+ received_end_of_stream_ = false; |
+ rendered_end_of_stream_ = false; |
+ preroll_aborted_ = false; |
+ earliest_end_time_ = now_cb_.Run(); |
+ splicer_->Reset(); |
+ algorithm_->FlushBuffers(); |
+ } |
base::ResetAndReturn(&flush_cb_).Run(); |
} |
@@ -196,14 +197,32 @@ void AudioRendererImpl::Stop(const base::Closure& callback) { |
{ |
base::AutoLock auto_lock(lock_); |
+ if (state_ == kStopped) |
+ return; |
+ |
+ DCHECK(init_cb_.is_null()); |
+ |
ChangeState_Locked(kStopped); |
- algorithm_.reset(NULL); |
+ algorithm_.reset(); |
init_cb_.Reset(); |
underflow_cb_.Reset(); |
time_cb_.Reset(); |
flush_cb_.Reset(); |
} |
+ if (!init_cb_.is_null()) { |
rileya (GONE FROM CHROMIUM)
2014/01/21 19:08:50
This resolves the layout test failure (if we have
|
+ decoder_selector_->Abort(); |
+ base::ResetAndReturn(&init_cb_).Run(PIPELINE_ERROR_ABORT); |
rileya (GONE FROM CHROMIUM)
2014/01/21 19:08:50
Is there a better error for this?
DaleCurtis
2014/01/21 21:14:39
Hmm, I don't see VideoFrameStream / VideoRendererI
|
+ callback.Run(); |
+ return; |
+ } |
+ |
+ if (decoder_) { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ decoder_->Stop(callback); |
rileya (GONE FROM CHROMIUM)
2014/01/21 19:08:50
The canary crash was caused (so far as I can tell)
|
+ return; |
+ } |
+ |
callback.Run(); |
} |