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