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

Unified Diff: media/filters/decoder_stream.cc

Issue 2837613004: media: Support better decoder switching (Closed)
Patch Set: Created 3 years, 8 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
Index: media/filters/decoder_stream.cc
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc
index 5247734d29fb5b12083edd4d867799e1fece4cd0..48903a83cdf9970375b048dbdc6d402a7f537e72 100644
--- a/media/filters/decoder_stream.cc
+++ b/media/filters/decoder_stream.cc
@@ -45,7 +45,7 @@ const char* GetTraceString<DemuxerStream::AUDIO>() {
template <DemuxerStream::Type StreamType>
DecoderStream<StreamType>::DecoderStream(
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
- ScopedVector<Decoder> decoders,
+ const CreateDecodersCB& create_decoders_cb,
const scoped_refptr<MediaLog>& media_log)
: traits_(media_log),
task_runner_(task_runner),
@@ -54,7 +54,7 @@ DecoderStream<StreamType>::DecoderStream(
stream_(NULL),
cdm_context_(nullptr),
decoder_selector_(new DecoderSelector<StreamType>(task_runner,
- std::move(decoders),
+ create_decoders_cb,
media_log)),
decoded_frames_since_fallback_(0),
decoding_eos_(false),
@@ -256,9 +256,10 @@ void DecoderStream<StreamType>::SelectDecoder() {
// the |cdm_context_|. This will also help prevent creating a new DDS on top
// of the current DDS.
CdmContext* cdm_context = decrypting_demuxer_stream_ ? nullptr : cdm_context_;
+ std::string blacklisted_decoder = decoder_ ? decoder_->GetDisplayName() : "";
decoder_selector_->SelectDecoder(
- &traits_, stream_, cdm_context,
+ &traits_, stream_, cdm_context, blacklisted_decoder,
base::Bind(&DecoderStream<StreamType>::OnDecoderSelected,
weak_factory_.GetWeakPtr()),
base::Bind(&DecoderStream<StreamType>::OnDecodeOutputReady,
@@ -431,7 +432,9 @@ void DecoderStream<StreamType>::OnDecodeDone(int buffer_size,
switch (status) {
case DecodeStatus::DECODE_ERROR:
- if (!decoded_frames_since_fallback_) {
+ // Only fall back to a new decoder after failing to decode the first
+ // buffer, and we have not falled back before.
+ if (!decoded_frames_since_fallback_ && !previous_decoder_) {
pending_decode_requests_ = 0;
// Prevent all pending decode requests and outputs form those requests

Powered by Google App Engine
This is Rietveld 408576698