1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_FILTERS_DECODER_SELECTOR_H_
6#define MEDIA_FILTERS_DECODER_SELECTOR_H_
7
8#include "base/callback.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_vector.h"
11#include "base/memory/weak_ptr.h"
12#include "media/base/decryptor.h"
13#include "media/base/demuxer_stream.h"
14#include "media/base/pipeline_status.h"
15#include "media/filters/decoder_stream_traits.h"
16
17namespace base {
18class SingleThreadTaskRunner;
19}
20
21namespace media {
22
23class DecoderBuffer;
24class DecryptingDemuxerStream;
25class Decryptor;
26
27// DecoderSelector (creates if necessary and) initializes the proper
28// Decoder for a given DemuxerStream. If the given DemuxerStream is
29// encrypted, a DecryptingDemuxerStream may also be created.
30// The template parameter |StreamType| is the type of stream we will be
31// selecting a decoder for.
32template<DemuxerStream::Type StreamType>
33class MEDIA_EXPORT DecoderSelector {
34 public:
35  typedef DecoderStreamTraits<StreamType> StreamTraits;
36  typedef typename StreamTraits::DecoderType Decoder;
37
38  // Indicates completion of Decoder selection.
39  // - First parameter: The initialized Decoder. If it's set to NULL, then
40  // Decoder initialization failed.
41  // - Second parameter: The initialized DecryptingDemuxerStream. If it's not
42  // NULL, then a DecryptingDemuxerStream is created and initialized to do
43  // decryption for the initialized Decoder.
44  // Note: The caller owns selected Decoder and DecryptingDemuxerStream.
45  // The caller should call DecryptingDemuxerStream::Reset() before
46  // calling Decoder::Reset() to release any pending decryption or read.
47  typedef base::Callback<
48      void(scoped_ptr<Decoder>,
49           scoped_ptr<DecryptingDemuxerStream>)>
50      SelectDecoderCB;
51
52  // |decoders| contains the Decoders to use when initializing.
53  //
54  // |set_decryptor_ready_cb| is optional. If |set_decryptor_ready_cb| is null,
55  // no decryptor will be available to perform decryption.
56  DecoderSelector(
57      const scoped_refptr<base::SingleThreadTaskRunner>& message_loop,
58      ScopedVector<Decoder> decoders,
59      const SetDecryptorReadyCB& set_decryptor_ready_cb);
60
61  // Aborts pending Decoder selection and fires |select_decoder_cb| with
62  // NULL and NULL immediately if it's pending.
63  ~DecoderSelector();
64
65  // Initializes and selects a Decoder that can decode the |stream|.
66  // Selected Decoder (and DecryptingDemuxerStream) is returned via
67  // the |select_decoder_cb|.
68  void SelectDecoder(DemuxerStream* stream,
69                     bool low_delay,
70                     const SelectDecoderCB& select_decoder_cb,
71                     const typename Decoder::OutputCB& output_cb);
72
73 private:
74  void DecryptingDecoderInitDone(PipelineStatus status);
75  void DecryptingDemuxerStreamInitDone(PipelineStatus status);
76  void InitializeDecoder();
77  void DecoderInitDone(PipelineStatus status);
78  void ReturnNullDecoder();
79
80  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
81  ScopedVector<Decoder> decoders_;
82  SetDecryptorReadyCB set_decryptor_ready_cb_;
83
84  DemuxerStream* input_stream_;
85  bool low_delay_;
86  SelectDecoderCB select_decoder_cb_;
87  typename Decoder::OutputCB output_cb_;
88
89  scoped_ptr<Decoder> decoder_;
90  scoped_ptr<DecryptingDemuxerStream> decrypted_stream_;
91
92  // NOTE: Weak pointers must be invalidated before all other member variables.
93  base::WeakPtrFactory<DecoderSelector> weak_ptr_factory_;
94
95  DISALLOW_IMPLICIT_CONSTRUCTORS(DecoderSelector);
96};
97
98typedef DecoderSelector<DemuxerStream::VIDEO> VideoDecoderSelector;
99typedef DecoderSelector<DemuxerStream::AUDIO> AudioDecoderSelector;
100
101}  // namespace media
102
103#endif  // MEDIA_FILTERS_DECODER_SELECTOR_H_
104