15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_FILTERS_DECODER_SELECTOR_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_FILTERS_DECODER_SELECTOR_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/callback.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_vector.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/decryptor.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/demuxer_stream.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/pipeline_status.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/filters/decoder_stream_traits.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class SingleThreadTaskRunner;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DecoderBuffer;
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DecryptingDemuxerStream;
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class Decryptor;
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// DecoderSelector (creates if necessary and) initializes the proper
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Decoder for a given DemuxerStream. If the given DemuxerStream is
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// encrypted, a DecryptingDemuxerStream may also be created.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The template parameter |StreamType| is the type of stream we will be
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// selecting a decoder for.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template<DemuxerStream::Type StreamType>
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MEDIA_EXPORT DecoderSelector {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef DecoderStreamTraits<StreamType> StreamTraits;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef typename StreamTraits::DecoderType Decoder;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Indicates completion of Decoder selection.
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // - First parameter: The initialized Decoder. If it's set to NULL, then
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Decoder initialization failed.
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // - Second parameter: The initialized DecryptingDemuxerStream. If it's not
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // NULL, then a DecryptingDemuxerStream is created and initialized to do
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // decryption for the initialized Decoder.
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Note: The caller owns selected Decoder and DecryptingDemuxerStream.
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The caller should call DecryptingDemuxerStream::Reset() before
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // calling Decoder::Reset() to release any pending decryption or read.
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  typedef base::Callback<
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      void(scoped_ptr<Decoder>,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           scoped_ptr<DecryptingDemuxerStream>)>
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      SelectDecoderCB;
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |decoders| contains the Decoders to use when initializing.
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  //
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // |set_decryptor_ready_cb| is optional. If |set_decryptor_ready_cb| is null,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // no decryptor will be available to perform decryption.
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DecoderSelector(
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ScopedVector<Decoder> decoders,
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const SetDecryptorReadyCB& set_decryptor_ready_cb);
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Aborts pending Decoder selection and fires |select_decoder_cb| with
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // NULL and NULL immediately if it's pending.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~DecoderSelector();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initializes and selects a Decoder that can decode the |stream|.
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Selected Decoder (and DecryptingDemuxerStream) is returned via
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // the |select_decoder_cb|.
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SelectDecoder(DemuxerStream* stream,
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                     bool low_delay,
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     const SelectDecoderCB& select_decoder_cb,
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     const typename Decoder::OutputCB& output_cb);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DecryptingDecoderInitDone(PipelineStatus status);
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DecryptingDemuxerStreamInitDone(PipelineStatus status);
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void InitializeDecoder();
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void DecoderInitDone(PipelineStatus status);
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ReturnNullDecoder();
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ScopedVector<Decoder> decoders_;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetDecryptorReadyCB set_decryptor_ready_cb_;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DemuxerStream* input_stream_;
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  bool low_delay_;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SelectDecoderCB select_decoder_cb_;
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  typename Decoder::OutputCB output_cb_;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<Decoder> decoder_;
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<DecryptingDemuxerStream> decrypted_stream_;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::WeakPtrFactory<DecoderSelector> weak_ptr_factory_;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(DecoderSelector);
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef DecoderSelector<DemuxerStream::VIDEO> VideoDecoderSelector;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef DecoderSelector<DemuxerStream::AUDIO> AudioDecoderSelector;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace media
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // MEDIA_FILTERS_DECODER_SELECTOR_H_
104