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