Index: media/filters/decoder_stream.h |
diff --git a/media/filters/decoder_stream.h b/media/filters/decoder_stream.h |
index 97ab9705e342091e3e8cf6aa01b890da05e8a062..380eb114036e554a2e399dcb04cca85ba611b197 100644 |
--- a/media/filters/decoder_stream.h |
+++ b/media/filters/decoder_stream.h |
@@ -50,14 +50,17 @@ class MEDIA_EXPORT DecoderStream { |
DECODE_ERROR, // Decoder returned decode error. |
}; |
+ // Callback to create a list of decoders. |
+ using CreateDecodersCB = base::RepeatingCallback<ScopedVector<Decoder>()>; |
+ |
// Indicates completion of a DecoderStream initialization. |
- typedef base::Callback<void(bool success)> InitCB; |
+ using InitCB = base::Callback<void(bool success)>; |
// Indicates completion of a DecoderStream read. |
- typedef base::Callback<void(Status, const scoped_refptr<Output>&)> ReadCB; |
+ using ReadCB = base::Callback<void(Status, const scoped_refptr<Output>&)>; |
DecoderStream(const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
- ScopedVector<Decoder> decoders, |
+ CreateDecodersCB create_decoders_cb, |
MediaLog* media_log); |
virtual ~DecoderStream(); |
@@ -188,7 +191,7 @@ class MEDIA_EXPORT DecoderStream { |
DecoderStreamTraits<StreamType> traits_; |
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
- |
+ CreateDecodersCB create_decoders_cb_; |
MediaLog* media_log_; |
State state_; |
@@ -211,6 +214,16 @@ class MEDIA_EXPORT DecoderStream { |
// Whether |decoder_| has produced a frame yet. Reset on fallback. |
bool decoder_produced_a_frame_; |
+ // Whether we have already fallen back once on decode error, used to prevent |
+ // issues like infinite fallback like: |
+ // 1. select decoder 1 |
+ // 2. decode error on decoder 1 |
+ // 3. black list decoder 1 and select decoder 2 |
+ // 4. decode error again on decoder 2 |
+ // 5. black list decoder 2 and select decoder 1 |
+ // 6. go to (2) |
+ bool has_fallen_back_once_on_decode_error_; |
+ |
std::unique_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream_; |
ConfigChangeObserverCB config_change_observer_cb_; |