decrypting_audio_decoder.h revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1// Copyright (c) 2012 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_DECRYPTING_AUDIO_DECODER_H_
6#define MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
7
8#include "base/callback.h"
9#include "base/memory/ref_counted.h"
10#include "base/memory/scoped_ptr.h"
11#include "base/memory/weak_ptr.h"
12#include "base/time/time.h"
13#include "media/base/audio_decoder.h"
14#include "media/base/decryptor.h"
15#include "media/base/demuxer_stream.h"
16
17namespace base {
18class SingleThreadTaskRunner;
19}
20
21namespace media {
22
23class AudioTimestampHelper;
24class DecoderBuffer;
25class Decryptor;
26
27// Decryptor-based AudioDecoder implementation that can decrypt and decode
28// encrypted audio buffers and return decrypted and decompressed audio frames.
29// All public APIs and callbacks are trampolined to the |task_runner_| so
30// that no locks are required for thread safety.
31class MEDIA_EXPORT DecryptingAudioDecoder : public AudioDecoder {
32 public:
33  // We do not currently have a way to let the Decryptor choose the output
34  // audio sample format and notify us of its choice. Therefore, we require all
35  // Decryptor implementations to decode audio into a fixed integer sample
36  // format designated by kSupportedBitsPerChannel.
37  // TODO(xhwang): Remove this restriction after http://crbug.com/169105 fixed.
38  static const int kSupportedBitsPerChannel;
39
40  DecryptingAudioDecoder(
41      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
42      const SetDecryptorReadyCB& set_decryptor_ready_cb);
43  virtual ~DecryptingAudioDecoder();
44
45  // AudioDecoder implementation.
46  virtual void Initialize(const AudioDecoderConfig& config,
47                          const PipelineStatusCB& status_cb,
48                          const OutputCB& output_cb) OVERRIDE;
49  virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
50                      const DecodeCB& decode_cb) OVERRIDE;
51  virtual void Reset(const base::Closure& closure) OVERRIDE;
52
53 private:
54  // For a detailed state diagram please see this link: http://goo.gl/8jAok
55  // TODO(xhwang): Add a ASCII state diagram in this file after this class
56  // stabilizes.
57  // TODO(xhwang): Update this diagram for DecryptingAudioDecoder.
58  enum State {
59    kUninitialized = 0,
60    kDecryptorRequested,
61    kPendingDecoderInit,
62    kIdle,
63    kPendingDecode,
64    kWaitingForKey,
65    kDecodeFinished,
66    kError
67  };
68
69  // Callback for DecryptorHost::RequestDecryptor(). |decryptor_attached_cb| is
70  // called when the decryptor has been completely attached to the pipeline.
71  void SetDecryptor(Decryptor* decryptor,
72                    const DecryptorAttachedCB& decryptor_attached_cb);
73
74  // Initializes the audio decoder on the |decryptor_| with |config_|.
75  void InitializeDecoder();
76
77  // Callback for Decryptor::InitializeAudioDecoder() during initialization.
78  void FinishInitialization(bool success);
79
80  void DecodePendingBuffer();
81
82  // Callback for Decryptor::DecryptAndDecodeAudio().
83  void DeliverFrame(int buffer_size,
84                    Decryptor::Status status,
85                    const Decryptor::AudioBuffers& frames);
86
87  // Callback for the |decryptor_| to notify this object that a new key has been
88  // added.
89  void OnKeyAdded();
90
91  // Resets decoder and calls |reset_cb_|.
92  void DoReset();
93
94  // Sets timestamps for |frames| and then passes them to |output_cb_|.
95  void ProcessDecodedFrames(const Decryptor::AudioBuffers& frames);
96
97  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
98
99  State state_;
100
101  PipelineStatusCB init_cb_;
102  OutputCB output_cb_;
103  DecodeCB decode_cb_;
104  base::Closure reset_cb_;
105
106  // The current decoder configuration.
107  AudioDecoderConfig config_;
108
109  // Callback to request/cancel decryptor creation notification.
110  SetDecryptorReadyCB set_decryptor_ready_cb_;
111
112  Decryptor* decryptor_;
113
114  // The buffer that needs decrypting/decoding.
115  scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_;
116
117  // Indicates the situation where new key is added during pending decode
118  // (in other words, this variable can only be set in state kPendingDecode).
119  // If this variable is true and kNoKey is returned then we need to try
120  // decrypting/decoding again in case the newly added key is the correct
121  // decryption key.
122  bool key_added_while_decode_pending_;
123
124  scoped_ptr<AudioTimestampHelper> timestamp_helper_;
125
126  // NOTE: Weak pointers must be invalidated before all other member variables.
127  base::WeakPtrFactory<DecryptingAudioDecoder> weak_factory_;
128  base::WeakPtr<DecryptingAudioDecoder> weak_this_;
129
130  DISALLOW_COPY_AND_ASSIGN(DecryptingAudioDecoder);
131};
132
133}  // namespace media
134
135#endif  // MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
136