cdm_adapter.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef MEDIA_CDM_PPAPI_CDM_ADAPTER_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MEDIA_CDM_PPAPI_CDM_ADAPTER_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <string> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/basictypes.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/compiler_specific.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "build/build_config.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/cdm/ppapi/api/content_decryption_module.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/cdm/ppapi/cdm_helpers.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/cdm/ppapi/cdm_wrapper.h" 1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "media/cdm/ppapi/linked_ptr.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/c/pp_stdint.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/c/private/pp_content_decryptor.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/cpp/completion_callback.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/cpp/private/content_decryptor_private.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/cpp/var.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/cpp/var_array_buffer.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/utility/completion_callback_factory.h" 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_CHROMEOS) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/cpp/private/output_protection_private.h" 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/cpp/private/platform_verification.h" 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace media { 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// GetCdmHostFunc implementation. 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void* GetCdmHost(int host_interface_version, void* user_data); 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// An adapter class for abstracting away PPAPI interaction and threading for a 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Content Decryption Module (CDM). 3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class CdmAdapter : public pp::Instance, 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public pp::ContentDecryptor_Private, 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public cdm::Host_1, 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public cdm::Host_2 { 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CdmAdapter(PP_Instance instance, pp::Module* module); 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~CdmAdapter(); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 46 // pp::Instance implementation. 47 virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) { 48 return true; 49 } 50 51 // PPP_ContentDecryptor_Private implementation. 52 // Note: Results of calls to these methods must be reported through the 53 // PPB_ContentDecryptor_Private interface. 54 // TODO(jrummell): |can_challenge_platform| should be removed. 55 virtual void Initialize(const std::string& key_system, 56 bool can_challenge_platform) OVERRIDE; 57 virtual void GenerateKeyRequest(const std::string& type, 58 pp::VarArrayBuffer init_data) OVERRIDE; 59 virtual void AddKey(const std::string& session_id, 60 pp::VarArrayBuffer key, 61 pp::VarArrayBuffer init_data) OVERRIDE; 62 virtual void CancelKeyRequest(const std::string& session_id) OVERRIDE; 63 virtual void Decrypt( 64 pp::Buffer_Dev encrypted_buffer, 65 const PP_EncryptedBlockInfo& encrypted_block_info) OVERRIDE; 66 virtual void InitializeAudioDecoder( 67 const PP_AudioDecoderConfig& decoder_config, 68 pp::Buffer_Dev extra_data_buffer) OVERRIDE; 69 virtual void InitializeVideoDecoder( 70 const PP_VideoDecoderConfig& decoder_config, 71 pp::Buffer_Dev extra_data_buffer) OVERRIDE; 72 virtual void DeinitializeDecoder(PP_DecryptorStreamType decoder_type, 73 uint32_t request_id) OVERRIDE; 74 virtual void ResetDecoder(PP_DecryptorStreamType decoder_type, 75 uint32_t request_id) OVERRIDE; 76 virtual void DecryptAndDecode( 77 PP_DecryptorStreamType decoder_type, 78 pp::Buffer_Dev encrypted_buffer, 79 const PP_EncryptedBlockInfo& encrypted_block_info) OVERRIDE; 80 81 // cdm::Host implementation. 82 virtual cdm::Buffer* Allocate(uint32_t capacity) OVERRIDE; 83 virtual void SetTimer(int64_t delay_ms, void* context) OVERRIDE; 84 virtual double GetCurrentWallTimeInSeconds() OVERRIDE; 85 virtual void SendKeyMessage( 86 const char* session_id, uint32_t session_id_length, 87 const char* message, uint32_t message_length, 88 const char* default_url, uint32_t default_url_length) OVERRIDE; 89 virtual void SendKeyError(const char* session_id, 90 uint32_t session_id_length, 91 cdm::MediaKeyError error_code, 92 uint32_t system_code) OVERRIDE; 93 virtual void GetPrivateData(int32_t* instance, 94 GetPrivateInterface* get_interface) OVERRIDE; 95 96 // cdm::Host_2 implementation. 97 virtual void SendPlatformChallenge( 98 const char* service_id, uint32_t service_id_length, 99 const char* challenge, uint32_t challenge_length) OVERRIDE; 100 virtual void EnableOutputProtection( 101 uint32_t desired_protection_mask) OVERRIDE; 102 virtual void QueryOutputProtectionStatus() OVERRIDE; 103 virtual void OnDeferredInitializationDone( 104 cdm::StreamType stream_type, 105 cdm::Status decoder_status) OVERRIDE; 106 107 private: 108 struct SessionInfo { 109 SessionInfo(const std::string& key_system_in, 110 const std::string& session_id_in) 111 : key_system(key_system_in), 112 session_id(session_id_in) {} 113 const std::string key_system; 114 const std::string session_id; 115 }; 116 117 typedef linked_ptr<DecryptedBlockImpl> LinkedDecryptedBlock; 118 typedef linked_ptr<VideoFrameImpl> LinkedVideoFrame; 119 typedef linked_ptr<AudioFramesImpl> LinkedAudioFrames; 120 121 bool CreateCdmInstance(const std::string& key_system); 122 123 void SendUnknownKeyError(const std::string& key_system, 124 const std::string& session_id); 125 126 void SendKeyAdded(const std::string& key_system, 127 const std::string& session_id); 128 129 // TODO(jrummell): Drop the |key_system| parameter. 130 void SendKeyErrorInternal(const std::string& key_system, 131 const std::string& session_id, 132 cdm::MediaKeyError error_code, 133 uint32_t system_code); 134 135 // <code>PPB_ContentDecryptor_Private</code> dispatchers. These are passed to 136 // <code>callback_factory_</code> to ensure that calls into 137 // <code>PPP_ContentDecryptor_Private</code> are asynchronous. 138 void KeyAdded(int32_t result, const SessionInfo& session_info); 139 void KeyMessage(int32_t result, 140 const SessionInfo& session_info, 141 const std::vector<uint8>& message, 142 const std::string& default_url); 143 void KeyError(int32_t result, 144 const SessionInfo& session_info, 145 cdm::MediaKeyError error_code, 146 uint32_t system_code); 147 void DeliverBlock(int32_t result, 148 const cdm::Status& status, 149 const LinkedDecryptedBlock& decrypted_block, 150 const PP_DecryptTrackingInfo& tracking_info); 151 void DecoderInitializeDone(int32_t result, 152 PP_DecryptorStreamType decoder_type, 153 uint32_t request_id, 154 bool success); 155 void DecoderDeinitializeDone(int32_t result, 156 PP_DecryptorStreamType decoder_type, 157 uint32_t request_id); 158 void DecoderResetDone(int32_t result, 159 PP_DecryptorStreamType decoder_type, 160 uint32_t request_id); 161 void DeliverFrame(int32_t result, 162 const cdm::Status& status, 163 const LinkedVideoFrame& video_frame, 164 const PP_DecryptTrackingInfo& tracking_info); 165 void DeliverSamples(int32_t result, 166 const cdm::Status& status, 167 const LinkedAudioFrames& audio_frames, 168 const PP_DecryptTrackingInfo& tracking_info); 169 170 // Helper for SetTimer(). 171 void TimerExpired(int32_t result, void* context); 172 173 bool IsValidVideoFrame(const LinkedVideoFrame& video_frame); 174 175 176#if defined(OS_CHROMEOS) 177 void SendPlatformChallengeDone(int32_t result); 178 void EnableProtectionDone(int32_t result); 179 void QueryOutputProtectionStatusDone(int32_t result); 180 181 pp::OutputProtection_Private output_protection_; 182 pp::PlatformVerification platform_verification_; 183 184 // Since PPAPI doesn't provide handlers for CompletionCallbacks with more than 185 // one output we need to manage our own. These values are only read by 186 // SendPlatformChallengeDone(). 187 pp::Var signed_data_output_; 188 pp::Var signed_data_signature_output_; 189 pp::Var platform_key_certificate_output_; 190 bool challenge_in_progress_; 191 192 // Same as above, these are only read by QueryOutputProtectionStatusDone(). 193 uint32_t output_link_mask_; 194 uint32_t output_protection_mask_; 195 bool query_output_protection_in_progress_; 196#endif 197 198 PpbBufferAllocator allocator_; 199 pp::CompletionCallbackFactory<CdmAdapter> callback_factory_; 200 linked_ptr<CdmWrapper> cdm_; 201 std::string key_system_; 202 203 // If the CDM returned kDeferredInitialization during InitializeAudioDecoder() 204 // or InitializeVideoDecoder(), the (Audio|Video)DecoderConfig.request_id is 205 // saved for the future call to OnDeferredInitializationDone(). 206 bool deferred_initialize_audio_decoder_; 207 uint32_t deferred_audio_decoder_config_id_; 208 bool deferred_initialize_video_decoder_; 209 uint32_t deferred_video_decoder_config_id_; 210 211 DISALLOW_COPY_AND_ASSIGN(CdmAdapter); 212}; 213 214} // namespace media 215 216#endif // MEDIA_CDM_PPAPI_CDM_ADAPTER_H_ 217