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 |