| Index: media/filters/decoder_selector.h
|
| diff --git a/media/filters/decoder_selector.h b/media/filters/decoder_selector.h
|
| index 3ce4df6b201333d54617973dc02c8f7043a53598..0a30989b137db40c773f5c9a9bedce9b56ee4fd5 100644
|
| --- a/media/filters/decoder_selector.h
|
| +++ b/media/filters/decoder_selector.h
|
| @@ -39,6 +39,11 @@ class MEDIA_EXPORT DecoderSelector {
|
| typedef typename StreamTraits::DecoderType Decoder;
|
| typedef typename StreamTraits::DecoderConfigType DecoderConfig;
|
|
|
| + // Callback to create a list of decoders to select from.
|
| + // TODO(xhwang): Use a DecoderFactory to create decoders one by one as needed,
|
| + // instead of creating a list of decoders all at once.
|
| + using CreateDecodersCB = base::RepeatingCallback<ScopedVector<Decoder>()>;
|
| +
|
| // Indicates completion of Decoder selection.
|
| // - First parameter: The initialized Decoder. If it's set to NULL, then
|
| // Decoder initialization failed.
|
| @@ -48,18 +53,17 @@ class MEDIA_EXPORT DecoderSelector {
|
| // Note: The caller owns selected Decoder and DecryptingDemuxerStream.
|
| // The caller should call DecryptingDemuxerStream::Reset() before
|
| // calling Decoder::Reset() to release any pending decryption or read.
|
| - typedef base::Callback<void(std::unique_ptr<Decoder>,
|
| - std::unique_ptr<DecryptingDemuxerStream>)>
|
| - SelectDecoderCB;
|
| + using SelectDecoderCB =
|
| + base::Callback<void(std::unique_ptr<Decoder>,
|
| + std::unique_ptr<DecryptingDemuxerStream>)>;
|
|
|
| - // |decoders| contains the Decoders to use when initializing.
|
| DecoderSelector(
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
|
| - ScopedVector<Decoder> decoders,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + CreateDecodersCB create_decoders_cb,
|
| MediaLog* media_log);
|
|
|
| // Aborts pending Decoder selection and fires |select_decoder_cb| with
|
| - // NULL and NULL immediately if it's pending.
|
| + // null and null immediately if it's pending.
|
| ~DecoderSelector();
|
|
|
| // Initializes and selects the first Decoder that can decode the |stream|.
|
| @@ -67,13 +71,20 @@ class MEDIA_EXPORT DecoderSelector {
|
| // the |select_decoder_cb|.
|
| // Notes:
|
| // 1. This must not be called again before |select_decoder_cb| is run.
|
| - // 2. Decoders that fail to initialize will be deleted. Future calls will
|
| - // select from the decoders following the decoder that was last returned.
|
| - // 3. |cdm_context| is optional. If |cdm_context| is
|
| - // null, no CDM will be available to perform decryption.
|
| + // 2. |create_decoders_cb| will be called to create a list of candidate
|
| + // decoders to select from.
|
| + // 3. The |blacklisted_decoder| will be skipped in the decoder selection
|
| + // process, unless DecryptingDemuxerStream is chosen. This is because
|
| + // DecryptingDemuxerStream updates the |config_|, and the blacklist should
|
| + // only be applied to the original |stream| config.
|
| + // 4. All decoders that are not selected will be deleted upon returning
|
| + // |select_decoder_cb|.
|
| + // 5. |cdm_context| is optional. If |cdm_context| is null, no CDM will be
|
| + // available to perform decryption.
|
| void SelectDecoder(StreamTraits* traits,
|
| DemuxerStream* stream,
|
| CdmContext* cdm_context,
|
| + const std::string& blacklisted_decoder,
|
| const SelectDecoderCB& select_decoder_cb,
|
| const typename Decoder::OutputCB& output_cb,
|
| const base::Closure& waiting_for_decryption_key_cb);
|
| @@ -90,7 +101,7 @@ class MEDIA_EXPORT DecoderSelector {
|
| void ReturnNullDecoder();
|
|
|
| scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
|
| - ScopedVector<Decoder> decoders_;
|
| + CreateDecodersCB create_decoders_cb_;
|
| MediaLog* media_log_;
|
|
|
| StreamTraits* traits_;
|
| @@ -100,10 +111,13 @@ class MEDIA_EXPORT DecoderSelector {
|
| DemuxerStream* input_stream_;
|
|
|
| CdmContext* cdm_context_;
|
| + std::string blacklisted_decoder_;
|
| SelectDecoderCB select_decoder_cb_;
|
| typename Decoder::OutputCB output_cb_;
|
| base::Closure waiting_for_decryption_key_cb_;
|
|
|
| + ScopedVector<Decoder> decoders_;
|
| +
|
| std::unique_ptr<Decoder> decoder_;
|
| std::unique_ptr<DecryptingDemuxerStream> decrypted_stream_;
|
|
|
|
|