| Index: media/filters/decoder_selector.cc
|
| diff --git a/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc
|
| index 4ab98e20535228a630c7843ea5c7f34468a68e14..8e5abf05c25156f93a741206563f6b6c1ff5e3f4 100644
|
| --- a/media/filters/decoder_selector.cc
|
| +++ b/media/filters/decoder_selector.cc
|
| @@ -40,19 +40,6 @@ static bool HasValidStreamConfig(DemuxerStream* stream) {
|
| return false;
|
| }
|
|
|
| -static bool IsStreamEncrypted(DemuxerStream* stream) {
|
| - switch (stream->type()) {
|
| - case DemuxerStream::AUDIO:
|
| - return stream->audio_decoder_config().is_encrypted();
|
| - case DemuxerStream::VIDEO:
|
| - return stream->video_decoder_config().is_encrypted();
|
| - case DemuxerStream::TEXT:
|
| - case DemuxerStream::UNKNOWN:
|
| - NOTREACHED();
|
| - }
|
| - return false;
|
| -}
|
| -
|
| template <DemuxerStream::Type StreamType>
|
| DecoderSelector<StreamType>::DecoderSelector(
|
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| @@ -106,23 +93,23 @@ void DecoderSelector<StreamType>::SelectDecoder(
|
| input_stream_ = stream;
|
| output_cb_ = output_cb;
|
|
|
| - if (!IsStreamEncrypted(input_stream_)) {
|
| - InitializeDecoder();
|
| + // When there is a CDM attached, always try the decrypting decoder or
|
| + // demuxer-stream first.
|
| + if (cdm_context_) {
|
| +#if !defined(OS_ANDROID)
|
| + InitializeDecryptingDecoder();
|
| +#else
|
| + InitializeDecryptingDemuxerStream();
|
| +#endif
|
| return;
|
| }
|
|
|
| - // This could be null during fallback after decoder reinitialization failure.
|
| - // See DecoderStream<StreamType>::OnDecoderReinitialized().
|
| - if (!cdm_context_) {
|
| - ReturnNullDecoder();
|
| - return;
|
| - }
|
| + config_ = StreamTraits::GetDecoderConfig(input_stream_);
|
|
|
| -#if !defined(OS_ANDROID)
|
| - InitializeDecryptingDecoder();
|
| -#else
|
| - InitializeDecryptingDemuxerStream();
|
| -#endif
|
| + // If the input stream is encrypted, CdmContext must be non-null.
|
| + DCHECK(!config_.is_encrypted());
|
| +
|
| + InitializeDecoder();
|
| }
|
|
|
| #if !defined(OS_ANDROID)
|
| @@ -177,6 +164,7 @@ void DecoderSelector<StreamType>::DecryptingDemuxerStreamInitDone(
|
| DVLOG(2) << __func__
|
| << ": status=" << MediaLog::PipelineStatusToString(status);
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| + DCHECK(cdm_context_);
|
|
|
| // If DecryptingDemuxerStream initialization succeeded, we'll use it to do
|
| // decryption and use a decoder to decode the clear stream. Otherwise, we'll
|
| @@ -185,10 +173,15 @@ void DecoderSelector<StreamType>::DecryptingDemuxerStreamInitDone(
|
|
|
| if (status == PIPELINE_OK) {
|
| input_stream_ = decrypted_stream_.get();
|
| - DCHECK(!IsStreamEncrypted(input_stream_));
|
| + config_ = StreamTraits::GetDecoderConfig(input_stream_);
|
| + DCHECK(!config_.is_encrypted());
|
| } else {
|
| decrypted_stream_.reset();
|
| - DCHECK(IsStreamEncrypted(input_stream_));
|
| + config_ = StreamTraits::GetDecoderConfig(input_stream_);
|
| +
|
| + // Prefer decrypting decoder by using an encrypted config.
|
| + if (!config_.is_encrypted())
|
| + config_.set_is_encrypted(true);
|
| }
|
|
|
| InitializeDecoder();
|
| @@ -209,7 +202,7 @@ void DecoderSelector<StreamType>::InitializeDecoder() {
|
| decoders_.weak_erase(decoders_.begin());
|
|
|
| traits_->InitializeDecoder(
|
| - decoder_.get(), StreamTraits::GetDecoderConfig(input_stream_),
|
| + decoder_.get(), config_,
|
| input_stream_->liveness() == DemuxerStream::LIVENESS_LIVE, cdm_context_,
|
| base::Bind(&DecoderSelector<StreamType>::DecoderInitDone,
|
| weak_ptr_factory_.GetWeakPtr()),
|
|
|