Cast: Skip receiver log messages with time delta that can't be encoded.
[chromium-blink-merge.git] / media / filters / decrypting_audio_decoder.h
blob5d9c4da243580620650c3a5083a8d6dcc64b1eef
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.
5 #ifndef MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
6 #define MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_
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"
17 namespace base {
18 class SingleThreadTaskRunner;
21 namespace media {
23 class AudioTimestampHelper;
24 class DecoderBuffer;
25 class Decryptor;
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.
31 class 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;
40 DecryptingAudioDecoder(
41 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
42 const SetDecryptorReadyCB& set_decryptor_ready_cb);
43 virtual ~DecryptingAudioDecoder();
45 // AudioDecoder implementation.
46 virtual void Initialize(DemuxerStream* stream,
47 const PipelineStatusCB& status_cb,
48 const StatisticsCB& statistics_cb) OVERRIDE;
49 virtual void Read(const ReadCB& read_cb) OVERRIDE;
50 virtual void Reset(const base::Closure& closure) OVERRIDE;
51 virtual void Stop(const base::Closure& closure) OVERRIDE;
52 virtual int bits_per_channel() OVERRIDE;
53 virtual ChannelLayout channel_layout() OVERRIDE;
54 virtual int samples_per_second() OVERRIDE;
56 private:
57 // For a detailed state diagram please see this link: http://goo.gl/8jAok
58 // TODO(xhwang): Add a ASCII state diagram in this file after this class
59 // stabilizes.
60 // TODO(xhwang): Update this diagram for DecryptingAudioDecoder.
61 enum State {
62 kUninitialized = 0,
63 kDecryptorRequested,
64 kPendingDecoderInit,
65 kIdle,
66 kPendingConfigChange,
67 kPendingDemuxerRead,
68 kPendingDecode,
69 kWaitingForKey,
70 kDecodeFinished,
71 kStopped,
74 // Callback for DecryptorHost::RequestDecryptor().
75 void SetDecryptor(Decryptor* decryptor);
77 // Callback for Decryptor::InitializeAudioDecoder() during initialization.
78 void FinishInitialization(bool success);
80 // Callback for Decryptor::InitializeAudioDecoder() during config change.
81 void FinishConfigChange(bool success);
83 // Reads from the demuxer stream with corresponding callback method.
84 void ReadFromDemuxerStream();
85 void DecryptAndDecodeBuffer(DemuxerStream::Status status,
86 const scoped_refptr<DecoderBuffer>& buffer);
88 void DecodePendingBuffer();
90 // Callback for Decryptor::DecryptAndDecodeAudio().
91 void DeliverFrame(int buffer_size,
92 Decryptor::Status status,
93 const Decryptor::AudioBuffers& frames);
95 // Callback for the |decryptor_| to notify this object that a new key has been
96 // added.
97 void OnKeyAdded();
99 // Resets decoder and calls |reset_cb_|.
100 void DoReset();
102 // Updates audio configs from |demuxer_stream_| and resets
103 // |output_timestamp_base_| and |total_samples_decoded_|.
104 void UpdateDecoderConfig();
106 // Sets timestamp and duration for |queued_audio_frames_| to make sure the
107 // renderer always receives continuous frames without gaps and overlaps.
108 void EnqueueFrames(const Decryptor::AudioBuffers& frames);
110 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
111 base::WeakPtrFactory<DecryptingAudioDecoder> weak_factory_;
112 base::WeakPtr<DecryptingAudioDecoder> weak_this_;
114 State state_;
116 PipelineStatusCB init_cb_;
117 StatisticsCB statistics_cb_;
118 ReadCB read_cb_;
119 base::Closure reset_cb_;
120 base::Closure stop_cb_;
122 // Pointer to the demuxer stream that will feed us compressed buffers.
123 DemuxerStream* demuxer_stream_;
125 // Callback to request/cancel decryptor creation notification.
126 SetDecryptorReadyCB set_decryptor_ready_cb_;
128 Decryptor* decryptor_;
130 // The buffer returned by the demuxer that needs decrypting/decoding.
131 scoped_refptr<media::DecoderBuffer> pending_buffer_to_decode_;
133 // Indicates the situation where new key is added during pending decode
134 // (in other words, this variable can only be set in state kPendingDecode).
135 // If this variable is true and kNoKey is returned then we need to try
136 // decrypting/decoding again in case the newly added key is the correct
137 // decryption key.
138 bool key_added_while_decode_pending_;
140 Decryptor::AudioBuffers queued_audio_frames_;
142 // Decoded audio format.
143 int bits_per_channel_;
144 ChannelLayout channel_layout_;
145 int samples_per_second_;
147 scoped_ptr<AudioTimestampHelper> timestamp_helper_;
149 DISALLOW_COPY_AND_ASSIGN(DecryptingAudioDecoder);
152 } // namespace media
154 #endif // MEDIA_FILTERS_DECRYPTING_AUDIO_DECODER_H_