| 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..6a8ee3bfa355763361ee210f2962e2f55f1fb4ff 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_factory.h"
|
| +#include "media/filters/decrypting_demuxer_stream.h"
|
|
|
| namespace media {
|
|
|
| @@ -92,6 +94,10 @@ void AudioRendererImpl::DoPause() {
|
|
|
| void AudioRendererImpl::Flush(const base::Closure& callback) {
|
| DCHECK(pipeline_thread_checker_.CalledOnValidThread());
|
| +
|
| + if (decrypting_demuxer_stream_)
|
| + decrypting_demuxer_stream_->Reset(base::Closure());
|
| +
|
| decoder_->Reset(callback);
|
| }
|
|
|
| @@ -149,15 +155,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 RequestDecryptorNotificationCB& request_decryptor_notification_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,46 +188,31 @@ 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());
|
| -}
|
| -
|
| -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_);
|
| + factory_.reset(new AudioDecoderFactory(base::MessageLoopProxy::current(),
|
| + decoders,
|
| + request_decryptor_notification_cb));
|
| + factory_->InitAudioDecoder(
|
| + stream,
|
| + statistics_cb,
|
| + base::Bind(&AudioRendererImpl::OnDecoderInitDone, this));
|
| }
|
|
|
| void AudioRendererImpl::OnDecoderInitDone(
|
| - const scoped_refptr<DemuxerStream>& demuxer_stream,
|
| - scoped_ptr<AudioDecoderList> decoders,
|
| - PipelineStatus status) {
|
| + const scoped_refptr<AudioDecoder>& audio_decoder,
|
| + const scoped_refptr<DecryptingDemuxerStream>& decrypting_demuxer_stream) {
|
| DCHECK(pipeline_thread_checker_.CalledOnValidThread());
|
|
|
| + decoder_ = audio_decoder;
|
| + decrypting_demuxer_stream_ = decrypting_demuxer_stream;
|
| + factory_.reset();
|
| +
|
| if (state_ == kStopped) {
|
| DCHECK(!sink_);
|
| return;
|
| }
|
|
|
| - if (!decoders->empty() && status == DECODER_ERROR_NOT_SUPPORTED) {
|
| - InitializeNextDecoder(demuxer_stream, decoders.Pass());
|
| - return;
|
| - }
|
| -
|
| - if (status != PIPELINE_OK) {
|
| - base::ResetAndReturn(&init_cb_).Run(status);
|
| + if (!decoder_) {
|
| + base::ResetAndReturn(&init_cb_).Run(DECODER_ERROR_NOT_SUPPORTED);
|
| return;
|
| }
|
|
|
|
|