Chromium Code Reviews| Index: media/filters/audio_renderer_impl.cc |
| diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
| index c07048161d9967fde1beb70e79059d208d7e2719..efc530f34ca5eedead5dd2f15e3cc7a061f3551a 100644 |
| --- a/media/filters/audio_renderer_impl.cc |
| +++ b/media/filters/audio_renderer_impl.cc |
| @@ -19,6 +19,8 @@ |
| #include "media/base/bind_to_loop.h" |
| #include "media/base/demuxer_stream.h" |
| #include "media/base/media_switches.h" |
| +#include "media/filters/audio_decoder_selector.h" |
| +#include "media/filters/decrypting_demuxer_stream.h" |
| namespace media { |
| @@ -92,6 +94,19 @@ void AudioRendererImpl::DoPause() { |
| void AudioRendererImpl::Flush(const base::Closure& callback) { |
| DCHECK(pipeline_thread_checker_.CalledOnValidThread()); |
| + |
| + if (decrypting_demuxer_stream_) { |
| + decrypting_demuxer_stream_->Reset(base::Bind( |
| + &AudioRendererImpl::OnDecryptingDemuxerStreamReset, this, callback)); |
| + return; |
| + } |
| + |
| + decoder_->Reset(callback); |
| +} |
| + |
| +void AudioRendererImpl::OnDecryptingDemuxerStreamReset( |
|
ddorwin
2012/12/13 05:08:25
How about calling this DoReset() and just calling
xhwang
2012/12/13 11:24:36
Done.
|
| + const base::Closure& callback) { |
| + DCHECK(pipeline_thread_checker_.CalledOnValidThread()); |
| decoder_->Reset(callback); |
| } |
| @@ -149,15 +164,17 @@ void AudioRendererImpl::Preroll(base::TimeDelta time, |
| sink_->Pause(true); |
| } |
| -void AudioRendererImpl::Initialize(const scoped_refptr<DemuxerStream>& stream, |
| - const AudioDecoderList& decoders, |
| - const PipelineStatusCB& init_cb, |
| - const StatisticsCB& statistics_cb, |
| - const base::Closure& underflow_cb, |
| - const TimeCB& time_cb, |
| - const base::Closure& ended_cb, |
| - const base::Closure& disabled_cb, |
| - const PipelineStatusCB& error_cb) { |
| +void AudioRendererImpl::Initialize( |
| + const scoped_refptr<DemuxerStream>& stream, |
| + const AudioDecoderList& decoders, |
| + const SetDecryptorReadyCB& set_decryptor_ready_cb, |
| + const PipelineStatusCB& init_cb, |
| + const StatisticsCB& statistics_cb, |
| + const base::Closure& underflow_cb, |
| + const TimeCB& time_cb, |
| + const base::Closure& ended_cb, |
| + const base::Closure& disabled_cb, |
| + const PipelineStatusCB& error_cb) { |
| DCHECK(pipeline_thread_checker_.CalledOnValidThread()); |
| DCHECK(stream); |
| DCHECK(!decoders.empty()); |
| @@ -180,32 +197,26 @@ void AudioRendererImpl::Initialize(const scoped_refptr<DemuxerStream>& stream, |
| disabled_cb_ = disabled_cb; |
| error_cb_ = error_cb; |
| - scoped_ptr<AudioDecoderList> decoder_list(new AudioDecoderList(decoders)); |
| - InitializeNextDecoder(stream, decoder_list.Pass()); |
| -} |
| + scoped_ptr<AudioDecoderSelector> decoder_selector( |
| + new AudioDecoderSelector(base::MessageLoopProxy::current(), |
| + decoders, |
| + set_decryptor_ready_cb)); |
| -void AudioRendererImpl::InitializeNextDecoder( |
| - const scoped_refptr<DemuxerStream>& demuxer_stream, |
| - scoped_ptr<AudioDecoderList> decoders) { |
| - DCHECK(pipeline_thread_checker_.CalledOnValidThread()); |
| - DCHECK(!decoders->empty()); |
| - |
| - scoped_refptr<AudioDecoder> decoder = decoders->front(); |
| - decoders->pop_front(); |
| - |
| - DCHECK(decoder); |
| - decoder_ = decoder; |
| - decoder->Initialize( |
| - demuxer_stream, BindToLoop(base::MessageLoopProxy::current(), base::Bind( |
| - &AudioRendererImpl::OnDecoderInitDone, this, demuxer_stream, |
| - base::Passed(&decoders))), |
| - statistics_cb_); |
| + // To avoid calling |decoder_selector| methods and passing ownership of |
| + // |decoder_selector| in the same line. |
|
ddorwin
2012/12/13 05:08:25
I'm not sure what the issue you're trying to avoid
xhwang
2012/12/13 11:24:36
The problem is that the evaluation order is undefi
|
| + AudioDecoderSelector* decoder_selector_ptr = decoder_selector.get(); |
| + |
| + decoder_selector_ptr->SelectAudioDecoder( |
| + stream, |
| + statistics_cb, |
| + base::Bind(&AudioRendererImpl::OnDecoderSelected, this, |
| + base::Passed(&decoder_selector))); |
| } |
| -void AudioRendererImpl::OnDecoderInitDone( |
| - const scoped_refptr<DemuxerStream>& demuxer_stream, |
| - scoped_ptr<AudioDecoderList> decoders, |
| - PipelineStatus status) { |
| +void AudioRendererImpl::OnDecoderSelected( |
| + scoped_ptr<AudioDecoderSelector> decoder_selector, |
| + const scoped_refptr<AudioDecoder>& selected_decoder, |
| + const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) { |
| DCHECK(pipeline_thread_checker_.CalledOnValidThread()); |
| if (state_ == kStopped) { |
| @@ -213,15 +224,13 @@ void AudioRendererImpl::OnDecoderInitDone( |
| return; |
| } |
| - if (!decoders->empty() && status == DECODER_ERROR_NOT_SUPPORTED) { |
| - InitializeNextDecoder(demuxer_stream, decoders.Pass()); |
| + if (!selected_decoder) { |
| + base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED); |
| return; |
| } |
| - if (status != PIPELINE_OK) { |
| - base::ResetAndReturn(&init_cb_).Run(status); |
| - return; |
| - } |
| + decoder_ = selected_decoder; |
| + decrypting_demuxer_stream_ = decrypting_demuxer_stream; |
| int sample_rate = decoder_->samples_per_second(); |
| int buffer_size = GetHighLatencyOutputBufferSize(sample_rate); |