Index: media/filters/decoder_selector.cc |
diff --git a/media/filters/decoder_selector.cc b/media/filters/decoder_selector.cc |
index 4ab98e20535228a630c7843ea5c7f34468a68e14..3d6854f3c5149a08fd94319d31aa4c4be9f485ea 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_.SetIsEncrypted(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()), |