Chromium Code Reviews| Index: media/filters/decoder_stream.cc |
| diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc |
| index 53cf47c18a725f3eb11ef310c195cf50dbc016aa..6722a2326dba469ae0fe9694d6b3a55b44f5a0a4 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, |
| + CreateDecodersCB create_decoders_cb, |
| MediaLog* media_log) |
| : traits_(media_log), |
| task_runner_(task_runner), |
| @@ -53,10 +53,12 @@ DecoderStream<StreamType>::DecoderStream( |
| state_(STATE_UNINITIALIZED), |
| stream_(NULL), |
| cdm_context_(nullptr), |
| - decoder_selector_(new DecoderSelector<StreamType>(task_runner, |
| - std::move(decoders), |
| - media_log)), |
| + decoder_selector_( |
| + new DecoderSelector<StreamType>(task_runner, |
| + std::move(create_decoders_cb), |
| + media_log)), |
| decoder_produced_a_frame_(false), |
| + is_on_fallback_decoder_(false), |
| decoding_eos_(false), |
| pending_decode_requests_(0), |
| duration_tracker_(8), |
| @@ -256,9 +258,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 +434,10 @@ void DecoderStream<StreamType>::OnDecodeDone(int buffer_size, |
| switch (status) { |
| case DecodeStatus::DECODE_ERROR: |
| - if (!decoder_produced_a_frame_) { |
| + // Only fall back to a new decoder after failing to decode the first |
| + // buffer, and we have not falled back before. |
|
watk
2017/05/04 21:35:33
s/and we have not falled/and if we have not fallen
xhwang
2017/05/04 23:53:14
Done.
|
| + if (!decoder_produced_a_frame_ && !is_on_fallback_decoder_) { |
|
watk
2017/05/04 21:35:33
I'm not sure why we can't fall back again? Maybe a
xhwang
2017/05/04 23:53:13
Added comment in the .h file.
|
| + is_on_fallback_decoder_ = true; |
| pending_decode_requests_ = 0; |
| // Prevent all pending decode requests and outputs from those requests |
| @@ -501,6 +507,7 @@ void DecoderStream<StreamType>::OnDecodeOutputReady( |
| return; |
| decoder_produced_a_frame_ = true; |
| + is_on_fallback_decoder_ = false; |
| traits_.OnDecodeDone(output); |
| // |decoder_| sucessfully decoded a frame. No need to keep buffers for a |