Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(991)

Unified Diff: media/filters/decoder_selector.cc

Issue 2701203003: media: Prefer decrypting pipeline when CDM is attached (Closed)
Patch Set: comments addressed Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/decoder_selector.h ('k') | media/filters/decoder_stream.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()),
« no previous file with comments | « media/filters/decoder_selector.h ('k') | media/filters/decoder_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698