| Index: media/filters/decoder_selector.cc
|
| diff --git a/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc
|
| index 87e58a695f14598c79d8d61a8495471eb62a3b35..6df22dc218f6d764a0513e26d45c2e9714dc2229 100644
|
| --- a/media/filters/decoder_selector.cc
|
| +++ b/media/filters/decoder_selector.cc
|
| @@ -13,6 +13,7 @@
|
| #include "build/build_config.h"
|
| #include "media/base/audio_decoder.h"
|
| #include "media/base/bind_to_current_loop.h"
|
| +#include "media/base/cdm_context.h"
|
| #include "media/base/demuxer_stream.h"
|
| #include "media/base/media_log.h"
|
| #include "media/base/pipeline.h"
|
| @@ -81,7 +82,7 @@ DecoderSelector<StreamType>::~DecoderSelector() {
|
| template <DemuxerStream::Type StreamType>
|
| void DecoderSelector<StreamType>::SelectDecoder(
|
| DemuxerStream* stream,
|
| - const SetCdmReadyCB& set_cdm_ready_cb,
|
| + CdmContext* cdm_context,
|
| const SelectDecoderCB& select_decoder_cb,
|
| const typename Decoder::OutputCB& output_cb,
|
| const base::Closure& waiting_for_decryption_key_cb) {
|
| @@ -90,7 +91,7 @@ void DecoderSelector<StreamType>::SelectDecoder(
|
| DCHECK(stream);
|
| DCHECK(select_decoder_cb_.is_null());
|
|
|
| - set_cdm_ready_cb_ = set_cdm_ready_cb;
|
| + cdm_context_ = cdm_context;
|
| waiting_for_decryption_key_cb_ = waiting_for_decryption_key_cb;
|
|
|
| // Make sure |select_decoder_cb| runs on a different execution stack.
|
| @@ -112,7 +113,7 @@ void DecoderSelector<StreamType>::SelectDecoder(
|
|
|
| // This could be null during fallback after decoder reinitialization failure.
|
| // See DecoderStream<StreamType>::OnDecoderReinitialized().
|
| - if (set_cdm_ready_cb_.is_null()) {
|
| + if (!cdm_context_) {
|
| ReturnNullDecoder();
|
| return;
|
| }
|
| @@ -127,11 +128,12 @@ void DecoderSelector<StreamType>::SelectDecoder(
|
| #if !defined(OS_ANDROID)
|
| template <DemuxerStream::Type StreamType>
|
| void DecoderSelector<StreamType>::InitializeDecryptingDecoder() {
|
| + DVLOG(2) << __FUNCTION__;
|
| decoder_.reset(new typename StreamTraits::DecryptingDecoderType(
|
| task_runner_, media_log_, waiting_for_decryption_key_cb_));
|
|
|
| DecoderStreamTraits<StreamType>::InitializeDecoder(
|
| - decoder_.get(), input_stream_, set_cdm_ready_cb_,
|
| + decoder_.get(), input_stream_, cdm_context_,
|
| base::Bind(&DecoderSelector<StreamType>::DecryptingDecoderInitDone,
|
| weak_ptr_factory_.GetWeakPtr()),
|
| output_cb_);
|
| @@ -157,12 +159,23 @@ void DecoderSelector<StreamType>::DecryptingDecoderInitDone(bool success) {
|
| #endif // !defined(OS_ANDROID)
|
|
|
| template <DemuxerStream::Type StreamType>
|
| +void DecoderSelector<StreamType>::SetCdmReadyCallback(
|
| + const CdmReadyCB& cdm_ready_cb) {
|
| + DCHECK(cdm_context_);
|
| + cdm_ready_cb.Run(cdm_context_, base::Bind(IgnoreCdmAttached));
|
| +}
|
| +
|
| +template <DemuxerStream::Type StreamType>
|
| void DecoderSelector<StreamType>::InitializeDecryptingDemuxerStream() {
|
| decrypted_stream_.reset(new DecryptingDemuxerStream(
|
| task_runner_, media_log_, waiting_for_decryption_key_cb_));
|
|
|
| + // TODO(xhwang): Fix DecryptingDemuxerStream::Initialize() to take
|
| + // |cdm_context_| directly.
|
| decrypted_stream_->Initialize(
|
| - input_stream_, set_cdm_ready_cb_,
|
| + input_stream_,
|
| + base::Bind(&DecoderSelector<StreamType>::SetCdmReadyCallback,
|
| + weak_ptr_factory_.GetWeakPtr()),
|
| base::Bind(&DecoderSelector<StreamType>::DecryptingDemuxerStreamInitDone,
|
| weak_ptr_factory_.GetWeakPtr()));
|
| }
|
| @@ -204,7 +217,7 @@ void DecoderSelector<StreamType>::InitializeDecoder() {
|
| decoders_.weak_erase(decoders_.begin());
|
|
|
| DecoderStreamTraits<StreamType>::InitializeDecoder(
|
| - decoder_.get(), input_stream_, set_cdm_ready_cb_,
|
| + decoder_.get(), input_stream_, cdm_context_,
|
| base::Bind(&DecoderSelector<StreamType>::DecoderInitDone,
|
| weak_ptr_factory_.GetWeakPtr()),
|
| output_cb_);
|
|
|