1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_CLEAR_KEY_CDM_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_CLEAR_KEY_CDM_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "media/cdm/aes_decryptor.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cdm/ppapi/external_clear_key/clear_key_cdm_common.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enable this to use the fake decoder for testing.
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(tomfinegan): Move fake audio decoder into a separate class.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FileIOTestRunner;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class CdmVideoDecoder;
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass DecoderBuffer;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FFmpegCdmAudioDecoder;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Clear key implementation of the cdm::ContentDecryptionModule interface.
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ClearKeyCdm : public ClearKeyCdmInterface {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ClearKeyCdm(Host* host, const std::string& key_system);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ClearKeyCdm();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ContentDecryptionModule implementation.
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void CreateSession(uint32 promise_id,
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             const char* init_data_type,
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             uint32 init_data_type_size,
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             const uint8* init_data,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             uint32 init_data_size,
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             cdm::SessionType session_type) OVERRIDE;
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void LoadSession(uint32 promise_id,
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           const char* web_session_id,
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           uint32_t web_session_id_length) OVERRIDE;
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void UpdateSession(uint32 promise_id,
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             const char* web_session_id,
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             uint32_t web_session_id_length,
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             const uint8* response,
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             uint32 response_size) OVERRIDE;
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void CloseSession(uint32 promise_id,
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            const char* web_session_id,
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                            uint32_t web_session_id_length) OVERRIDE;
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void RemoveSession(uint32 promise_id,
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                             const char* web_session_id,
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                             uint32_t web_session_id_length) OVERRIDE;
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual void GetUsableKeyIds(uint32_t promise_id,
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               const char* web_session_id,
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               uint32_t web_session_id_length) OVERRIDE;
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void SetServerCertificate(
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      uint32 promise_id,
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const uint8_t* server_certificate_data,
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      uint32_t server_certificate_data_size) OVERRIDE;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TimerExpired(void* context) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cdm::Status Decrypt(const cdm::InputBuffer& encrypted_buffer,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              cdm::DecryptedBlock* decrypted_block) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cdm::Status InitializeAudioDecoder(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const cdm::AudioDecoderConfig& audio_decoder_config) OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cdm::Status InitializeVideoDecoder(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const cdm::VideoDecoderConfig& video_decoder_config) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeinitializeDecoder(cdm::StreamType decoder_type) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResetDecoder(cdm::StreamType decoder_type) OVERRIDE;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cdm::Status DecryptAndDecodeFrame(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const cdm::InputBuffer& encrypted_buffer,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cdm::VideoFrame* video_frame) OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual cdm::Status DecryptAndDecodeSamples(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const cdm::InputBuffer& encrypted_buffer,
791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      cdm::AudioFrames* audio_frames) OVERRIDE;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Destroy() OVERRIDE;
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnPlatformChallengeResponse(
821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const cdm::PlatformChallengeResponse& response) OVERRIDE;
831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnQueryOutputProtectionStatus(
841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      uint32_t link_mask, uint32_t output_protection_mask) OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Emulates a session stored for |session_id_for_emulated_loadsession_|. This
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // is necessary since aes_decryptor.cc does not support storing sessions.
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void LoadLoadableSession();
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ContentDecryptionModule callbacks.
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionMessage(const std::string& web_session_id,
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        const std::vector<uint8>& message,
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        const GURL& destination_url);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnSessionKeysChange(const std::string& web_session_id,
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           bool has_additional_usable_key);
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionClosed(const std::string& web_session_id);
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Handle the success/failure of a promise. These methods are responsible for
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // calling |host_| to resolve or reject the promise.
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionCreated(uint32 promise_id, const std::string& web_session_id);
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionLoaded(uint32 promise_id, const std::string& web_session_id);
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionUpdated(uint32 promise_id, const std::string& web_session_id);
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  void OnUsableKeyIdsObtained(uint32 promise_id, const KeyIdsVector& key_ids);
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnPromiseResolved(uint32 promise_id);
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnPromiseFailed(uint32 promise_id,
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       MediaKeys::Exception exception_code,
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       uint32 system_code,
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                       const std::string& error_message);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prepares next heartbeat message and sets a timer for it.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ScheduleNextHeartBeat();
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Decrypts the |encrypted_buffer| and puts the result in |decrypted_buffer|.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns cdm::kSuccess if decryption succeeded. The decrypted result is
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // put in |decrypted_buffer|. If |encrypted_buffer| is empty, the
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |decrypted_buffer| is set to an empty (EOS) buffer.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns cdm::kNoKey if no decryption key was available. In this case
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |decrypted_buffer| should be ignored by the caller.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns cdm::kDecryptError if any decryption error occurred. In this case
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |decrypted_buffer| should be ignored by the caller.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::Status DecryptToMediaDecoderBuffer(
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const cdm::InputBuffer& encrypted_buffer,
124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      scoped_refptr<DecoderBuffer>* decrypted_buffer);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 CurrentTimeStampInMicroseconds() const;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates fake video frames with |duration_in_microseconds|.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of samples generated in the |audio_frames|.
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GenerateFakeAudioFramesFromDuration(int64 duration_in_microseconds,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          cdm::AudioFrames* audio_frames) const;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Generates fake video frames given |input_timestamp|.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns cdm::kSuccess if any audio frame is successfully generated.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cdm::Status GenerateFakeAudioFrames(int64 timestamp_in_microseconds,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      cdm::AudioFrames* audio_frames);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartFileIOTest();
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Callback for CDM File IO test.
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnFileIOTestComplete(bool success);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Keep track of the last session created.
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetSessionId(const std::string& web_session_id);
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AesDecryptor decryptor_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClearKeyCdmHost* host_;
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string key_system_;
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string last_session_id_;
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string next_heartbeat_message_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // In order to simulate LoadSession(), CreateSession() and then
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // UpdateSession() will be called to create a session with known keys.
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // |session_id_for_emulated_loadsession_| is used to keep track of the
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // session_id allocated by aes_decryptor, as the session_id will be returned
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // as |kLoadableWebSessionId|. Future requests for this simulated session
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // need to use |session_id_for_emulated_loadsession_| for all calls
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // to aes_decryptor.
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // |promise_id_for_emulated_loadsession_| is used to keep track of the
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // original LoadSession() promise, as it is not resolved until the
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // UpdateSession() call succeeds.
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(xhwang): Extract testing code from main implementation.
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See http://crbug.com/341751
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::string session_id_for_emulated_loadsession_;
170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32_t promise_id_for_emulated_loadsession_;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Timer delay in milliseconds for the next host_->SetTimer() call.
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int64 timer_delay_ms_;
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Indicates whether a heartbeat timer has been set to prevent multiple timers
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // from running.
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool heartbeat_timer_set_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int channel_count_;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bits_per_channel_;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int samples_per_second_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 output_timestamp_base_in_microseconds_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int total_samples_generated_;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<FFmpegCdmAudioDecoder> audio_decoder_;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CLEAR_KEY_CDM_USE_FFMPEG_DECODER
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<CdmVideoDecoder> video_decoder_;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<FileIOTestRunner> file_io_test_runner_;
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClearKeyCdm);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace media
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_CLEAR_KEY_CDM_H_
201