Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ | 5 #ifndef MEDIA_CDM_CDM_WRAPPER_H_ |
| 6 #define MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ | 6 #define MEDIA_CDM_CDM_WRAPPER_H_ |
| 7 | 7 |
| 8 #include <map> | |
| 9 #include <queue> | |
| 10 #include <string> | 8 #include <string> |
| 11 | 9 |
| 12 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 13 #include "media/cdm/api/content_decryption_module.h" | 11 #include "media/cdm/api/content_decryption_module.h" |
| 14 #include "media/cdm/ppapi/cdm_helpers.h" | 12 #include "media/cdm/supported_cdm_versions.h" |
| 15 #include "media/cdm/ppapi/supported_cdm_versions.h" | 13 |
| 14 #if defined(PLUGIN_IMPLEMENTATION) | |
|
xhwang
2015/10/23 17:15:29
Thinking it again PLUGIN_IMPLEMENTATION seems too
jrummell
2015/10/23 23:41:36
Done.
| |
| 16 #include "ppapi/cpp/logging.h" | 15 #include "ppapi/cpp/logging.h" |
| 16 #define PLATFORM_DCHECK PP_DCHECK | |
| 17 #else | |
| 18 #include "base/logging.h" | |
| 19 #define PLATFORM_DCHECK DCHECK | |
| 20 #endif | |
| 17 | 21 |
| 18 namespace media { | 22 namespace media { |
| 19 | 23 |
| 20 // CdmWrapper wraps different versions of ContentDecryptionModule interfaces and | 24 // CdmWrapper wraps different versions of ContentDecryptionModule interfaces and |
| 21 // exposes a common interface to the caller. | 25 // exposes a common interface to the caller. |
| 22 // | 26 // |
| 23 // The caller should call CdmWrapper::Create() to create a CDM instance. | 27 // The caller should call CdmWrapper::Create() to create a CDM instance. |
| 24 // CdmWrapper will first try to create a CDM instance that supports the latest | 28 // CdmWrapper will first try to create a CDM instance that supports the latest |
| 25 // CDM interface (ContentDecryptionModule). If such an instance cannot be | 29 // CDM interface (ContentDecryptionModule). If such an instance cannot be |
| 26 // created (e.g. an older CDM was loaded), CdmWrapper will try to create a CDM | 30 // created (e.g. an older CDM was loaded), CdmWrapper will try to create a CDM |
| 27 // that supports an older version of CDM interface (e.g. | 31 // that supports an older version of CDM interface (e.g. |
| 28 // ContentDecryptionModule_*). Internally CdmWrapper converts the CdmWrapper | 32 // ContentDecryptionModule_*). Internally CdmWrapper converts the CdmWrapper |
| 29 // calls to corresponding ContentDecryptionModule calls. | 33 // calls to corresponding ContentDecryptionModule calls. |
| 30 // | 34 // |
| 31 // Note that CdmWrapper interface always reflects the latest state of content | |
| 32 // decryption related PPAPI APIs (e.g. pp::ContentDecryptor_Private). | |
| 33 // | |
| 34 // Since this file is highly templated and default implementations are short | 35 // Since this file is highly templated and default implementations are short |
| 35 // (just a shim layer in most cases), everything is done in this header file. | 36 // (just a shim layer in most cases), everything is done in this header file. |
| 36 class CdmWrapper { | 37 class CdmWrapper { |
| 37 public: | 38 public: |
| 38 static CdmWrapper* Create(const char* key_system, | 39 static CdmWrapper* Create(const char* key_system, |
| 39 uint32_t key_system_size, | 40 uint32_t key_system_size, |
| 40 GetCdmHostFunc get_cdm_host_func, | 41 GetCdmHostFunc get_cdm_host_func, |
| 41 void* user_data); | 42 void* user_data); |
| 42 | 43 |
| 43 virtual ~CdmWrapper() {}; | 44 virtual ~CdmWrapper(){}; |
| 44 | 45 |
| 45 virtual void Initialize(bool allow_distinctive_identifier, | 46 virtual void Initialize(bool allow_distinctive_identifier, |
| 46 bool allow_persistent_state) = 0; | 47 bool allow_persistent_state) = 0; |
| 47 virtual void SetServerCertificate(uint32_t promise_id, | 48 virtual void SetServerCertificate(uint32_t promise_id, |
| 48 const uint8_t* server_certificate_data, | 49 const uint8_t* server_certificate_data, |
| 49 uint32_t server_certificate_data_size) = 0; | 50 uint32_t server_certificate_data_size) = 0; |
| 50 virtual void CreateSessionAndGenerateRequest(uint32_t promise_id, | 51 virtual void CreateSessionAndGenerateRequest(uint32_t promise_id, |
| 51 cdm::SessionType session_type, | 52 cdm::SessionType session_type, |
| 52 cdm::InitDataType init_data_type, | 53 cdm::InitDataType init_data_type, |
| 53 const uint8_t* init_data, | 54 const uint8_t* init_data, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 99 // Template class that does the CdmWrapper -> CdmInterface conversion. Default | 100 // Template class that does the CdmWrapper -> CdmInterface conversion. Default |
| 100 // implementations are provided. Any methods that need special treatment should | 101 // implementations are provided. Any methods that need special treatment should |
| 101 // be specialized. | 102 // be specialized. |
| 102 template <class CdmInterface> | 103 template <class CdmInterface> |
| 103 class CdmWrapperImpl : public CdmWrapper { | 104 class CdmWrapperImpl : public CdmWrapper { |
| 104 public: | 105 public: |
| 105 static CdmWrapper* Create(const char* key_system, | 106 static CdmWrapper* Create(const char* key_system, |
| 106 uint32_t key_system_size, | 107 uint32_t key_system_size, |
| 107 GetCdmHostFunc get_cdm_host_func, | 108 GetCdmHostFunc get_cdm_host_func, |
| 108 void* user_data) { | 109 void* user_data) { |
| 109 void* cdm_instance = ::CreateCdmInstance( | 110 void* cdm_instance = |
| 110 CdmInterface::kVersion, key_system, key_system_size, get_cdm_host_func, | 111 ::CreateCdmInstance(CdmInterface::kVersion, key_system, key_system_size, |
| 111 user_data); | 112 get_cdm_host_func, user_data); |
| 112 if (!cdm_instance) | 113 if (!cdm_instance) |
| 113 return NULL; | 114 return NULL; |
| 114 | 115 |
| 115 return new CdmWrapperImpl<CdmInterface>( | 116 return new CdmWrapperImpl<CdmInterface>( |
| 116 static_cast<CdmInterface*>(cdm_instance)); | 117 static_cast<CdmInterface*>(cdm_instance)); |
| 117 } | 118 } |
| 118 | 119 |
| 119 ~CdmWrapperImpl() override { | 120 ~CdmWrapperImpl() override { cdm_->Destroy(); } |
| 120 cdm_->Destroy(); | |
| 121 } | |
| 122 | 121 |
| 123 void Initialize(bool allow_distinctive_identifier, | 122 void Initialize(bool allow_distinctive_identifier, |
| 124 bool allow_persistent_state) override { | 123 bool allow_persistent_state) override { |
| 125 cdm_->Initialize(allow_distinctive_identifier, allow_persistent_state); | 124 cdm_->Initialize(allow_distinctive_identifier, allow_persistent_state); |
| 126 } | 125 } |
| 127 | 126 |
| 128 void SetServerCertificate( | 127 void SetServerCertificate(uint32_t promise_id, |
| 129 uint32_t promise_id, | 128 const uint8_t* server_certificate_data, |
| 130 const uint8_t* server_certificate_data, | 129 uint32_t server_certificate_data_size) override { |
| 131 uint32_t server_certificate_data_size) override { | 130 cdm_->SetServerCertificate(promise_id, server_certificate_data, |
| 132 cdm_->SetServerCertificate( | 131 server_certificate_data_size); |
| 133 promise_id, server_certificate_data, server_certificate_data_size); | |
| 134 } | 132 } |
| 135 | 133 |
| 136 void CreateSessionAndGenerateRequest( | 134 void CreateSessionAndGenerateRequest(uint32_t promise_id, |
| 137 uint32_t promise_id, | 135 cdm::SessionType session_type, |
| 138 cdm::SessionType session_type, | 136 cdm::InitDataType init_data_type, |
| 139 cdm::InitDataType init_data_type, | 137 const uint8_t* init_data, |
| 140 const uint8_t* init_data, | 138 uint32_t init_data_size) override { |
| 141 uint32_t init_data_size) override { | |
| 142 cdm_->CreateSessionAndGenerateRequest( | 139 cdm_->CreateSessionAndGenerateRequest( |
| 143 promise_id, session_type, init_data_type, init_data, init_data_size); | 140 promise_id, session_type, init_data_type, init_data, init_data_size); |
| 144 } | 141 } |
| 145 | 142 |
| 146 void LoadSession(uint32_t promise_id, | 143 void LoadSession(uint32_t promise_id, |
| 147 cdm::SessionType session_type, | 144 cdm::SessionType session_type, |
| 148 const char* session_id, | 145 const char* session_id, |
| 149 uint32_t session_id_size) override { | 146 uint32_t session_id_size) override { |
| 150 cdm_->LoadSession(promise_id, session_type, session_id, session_id_size); | 147 cdm_->LoadSession(promise_id, session_type, session_id, session_id_size); |
| 151 } | 148 } |
| 152 | 149 |
| 153 void UpdateSession(uint32_t promise_id, | 150 void UpdateSession(uint32_t promise_id, |
| 154 const char* session_id, | 151 const char* session_id, |
| 155 uint32_t session_id_size, | 152 uint32_t session_id_size, |
| 156 const uint8_t* response, | 153 const uint8_t* response, |
| 157 uint32_t response_size) override { | 154 uint32_t response_size) override { |
| 158 cdm_->UpdateSession(promise_id, session_id, session_id_size, response, | 155 cdm_->UpdateSession(promise_id, session_id, session_id_size, response, |
| 159 response_size); | 156 response_size); |
| 160 } | 157 } |
| 161 | 158 |
| 162 void CloseSession(uint32_t promise_id, | 159 void CloseSession(uint32_t promise_id, |
| 163 const char* session_id, | 160 const char* session_id, |
| 164 uint32_t session_id_size) override { | 161 uint32_t session_id_size) override { |
| 165 cdm_->CloseSession(promise_id, session_id, session_id_size); | 162 cdm_->CloseSession(promise_id, session_id, session_id_size); |
| 166 } | 163 } |
| 167 | 164 |
| 168 void RemoveSession(uint32_t promise_id, | 165 void RemoveSession(uint32_t promise_id, |
| 169 const char* session_id, | 166 const char* session_id, |
| 170 uint32_t session_id_size) override { | 167 uint32_t session_id_size) override { |
| 171 cdm_->RemoveSession(promise_id, session_id, session_id_size); | 168 cdm_->RemoveSession(promise_id, session_id, session_id_size); |
| 172 } | 169 } |
| 173 | 170 |
| 174 void TimerExpired(void* context) override { | 171 void TimerExpired(void* context) override { cdm_->TimerExpired(context); } |
| 175 cdm_->TimerExpired(context); | |
| 176 } | |
| 177 | 172 |
| 178 cdm::Status Decrypt(const cdm::InputBuffer& encrypted_buffer, | 173 cdm::Status Decrypt(const cdm::InputBuffer& encrypted_buffer, |
| 179 cdm::DecryptedBlock* decrypted_buffer) override { | 174 cdm::DecryptedBlock* decrypted_buffer) override { |
| 180 return cdm_->Decrypt(encrypted_buffer, decrypted_buffer); | 175 return cdm_->Decrypt(encrypted_buffer, decrypted_buffer); |
| 181 } | 176 } |
| 182 | 177 |
| 183 cdm::Status InitializeAudioDecoder( | 178 cdm::Status InitializeAudioDecoder( |
| 184 const cdm::AudioDecoderConfig& audio_decoder_config) override { | 179 const cdm::AudioDecoderConfig& audio_decoder_config) override { |
| 185 return cdm_->InitializeAudioDecoder(audio_decoder_config); | 180 return cdm_->InitializeAudioDecoder(audio_decoder_config); |
| 186 } | 181 } |
| 187 | 182 |
| 188 cdm::Status InitializeVideoDecoder( | 183 cdm::Status InitializeVideoDecoder( |
| 189 const cdm::VideoDecoderConfig& video_decoder_config) override { | 184 const cdm::VideoDecoderConfig& video_decoder_config) override { |
| 190 return cdm_->InitializeVideoDecoder(video_decoder_config); | 185 return cdm_->InitializeVideoDecoder(video_decoder_config); |
| 191 } | 186 } |
| 192 | 187 |
| 193 void DeinitializeDecoder(cdm::StreamType decoder_type) override { | 188 void DeinitializeDecoder(cdm::StreamType decoder_type) override { |
| 194 cdm_->DeinitializeDecoder(decoder_type); | 189 cdm_->DeinitializeDecoder(decoder_type); |
| 195 } | 190 } |
| 196 | 191 |
| 197 void ResetDecoder(cdm::StreamType decoder_type) override { | 192 void ResetDecoder(cdm::StreamType decoder_type) override { |
| 198 cdm_->ResetDecoder(decoder_type); | 193 cdm_->ResetDecoder(decoder_type); |
| 199 } | 194 } |
| 200 | 195 |
| 201 cdm::Status DecryptAndDecodeFrame( | 196 cdm::Status DecryptAndDecodeFrame(const cdm::InputBuffer& encrypted_buffer, |
| 202 const cdm::InputBuffer& encrypted_buffer, | 197 cdm::VideoFrame* video_frame) override { |
| 203 cdm::VideoFrame* video_frame) override { | |
| 204 return cdm_->DecryptAndDecodeFrame(encrypted_buffer, video_frame); | 198 return cdm_->DecryptAndDecodeFrame(encrypted_buffer, video_frame); |
| 205 } | 199 } |
| 206 | 200 |
| 207 cdm::Status DecryptAndDecodeSamples( | 201 cdm::Status DecryptAndDecodeSamples(const cdm::InputBuffer& encrypted_buffer, |
| 208 const cdm::InputBuffer& encrypted_buffer, | 202 cdm::AudioFrames* audio_frames) override { |
| 209 cdm::AudioFrames* audio_frames) override { | |
| 210 return cdm_->DecryptAndDecodeSamples(encrypted_buffer, audio_frames); | 203 return cdm_->DecryptAndDecodeSamples(encrypted_buffer, audio_frames); |
| 211 } | 204 } |
| 212 | 205 |
| 213 void OnPlatformChallengeResponse( | 206 void OnPlatformChallengeResponse( |
| 214 const cdm::PlatformChallengeResponse& response) override { | 207 const cdm::PlatformChallengeResponse& response) override { |
| 215 cdm_->OnPlatformChallengeResponse(response); | 208 cdm_->OnPlatformChallengeResponse(response); |
| 216 } | 209 } |
| 217 | 210 |
| 218 void OnQueryOutputProtectionStatus( | 211 void OnQueryOutputProtectionStatus(cdm::QueryResult result, |
| 219 cdm::QueryResult result, | 212 uint32_t link_mask, |
| 220 uint32_t link_mask, | 213 uint32_t output_protection_mask) override { |
| 221 uint32_t output_protection_mask) override { | |
| 222 cdm_->OnQueryOutputProtectionStatus(result, link_mask, | 214 cdm_->OnQueryOutputProtectionStatus(result, link_mask, |
| 223 output_protection_mask); | 215 output_protection_mask); |
| 224 } | 216 } |
| 225 | 217 |
| 226 private: | 218 private: |
| 227 CdmWrapperImpl(CdmInterface* cdm) : cdm_(cdm) { | 219 CdmWrapperImpl(CdmInterface* cdm) : cdm_(cdm) { PLATFORM_DCHECK(cdm_); } |
| 228 PP_DCHECK(cdm_); | |
| 229 } | |
| 230 | 220 |
| 231 CdmInterface* cdm_; | 221 CdmInterface* cdm_; |
| 232 | 222 |
| 233 DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl); | 223 DISALLOW_COPY_AND_ASSIGN(CdmWrapperImpl); |
| 234 }; | 224 }; |
| 235 | 225 |
| 236 // Overrides for the cdm::Host_7 methods. | 226 // Overrides for the cdm::Host_7 methods. |
| 237 // TODO(jrummell): Remove these once Host_7 interface is removed. | 227 // TODO(jrummell): Remove these once Host_7 interface is removed. |
| 238 | 228 |
| 239 template <> | 229 template <> |
| 240 void CdmWrapperImpl<cdm::ContentDecryptionModule_7>::Initialize( | 230 void CdmWrapperImpl<cdm::ContentDecryptionModule_7>::Initialize( |
| 241 bool allow_distinctive_identifier, | 231 bool allow_distinctive_identifier, |
| 242 bool allow_persistent_state) { | 232 bool allow_persistent_state) {} |
| 243 } | |
| 244 | 233 |
| 245 template <> | 234 template <> |
| 246 void CdmWrapperImpl<cdm::ContentDecryptionModule_7>:: | 235 void CdmWrapperImpl<cdm::ContentDecryptionModule_7>:: |
| 247 CreateSessionAndGenerateRequest(uint32_t promise_id, | 236 CreateSessionAndGenerateRequest(uint32_t promise_id, |
| 248 cdm::SessionType session_type, | 237 cdm::SessionType session_type, |
| 249 cdm::InitDataType init_data_type, | 238 cdm::InitDataType init_data_type, |
| 250 const uint8_t* init_data, | 239 const uint8_t* init_data, |
| 251 uint32_t init_data_size) { | 240 uint32_t init_data_size) { |
| 252 std::string init_data_type_as_string = "unknown"; | 241 std::string init_data_type_as_string = "unknown"; |
| 253 switch (init_data_type) { | 242 switch (init_data_type) { |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 272 GetCdmHostFunc get_cdm_host_func, | 261 GetCdmHostFunc get_cdm_host_func, |
| 273 void* user_data) { | 262 void* user_data) { |
| 274 static_assert(cdm::ContentDecryptionModule::kVersion == | 263 static_assert(cdm::ContentDecryptionModule::kVersion == |
| 275 cdm::ContentDecryptionModule_8::kVersion, | 264 cdm::ContentDecryptionModule_8::kVersion, |
| 276 "update the code below"); | 265 "update the code below"); |
| 277 | 266 |
| 278 // Ensure IsSupportedCdmInterfaceVersion() matches this implementation. | 267 // Ensure IsSupportedCdmInterfaceVersion() matches this implementation. |
| 279 // Always update this DCHECK when updating this function. | 268 // Always update this DCHECK when updating this function. |
| 280 // If this check fails, update this function and DCHECK or update | 269 // If this check fails, update this function and DCHECK or update |
| 281 // IsSupportedCdmInterfaceVersion(). | 270 // IsSupportedCdmInterfaceVersion(). |
| 282 PP_DCHECK(!IsSupportedCdmInterfaceVersion( | 271 PLATFORM_DCHECK(!IsSupportedCdmInterfaceVersion( |
| 283 cdm::ContentDecryptionModule_8::kVersion + 1) && | 272 cdm::ContentDecryptionModule_8::kVersion + 1) && |
| 284 IsSupportedCdmInterfaceVersion( | 273 IsSupportedCdmInterfaceVersion( |
| 285 cdm::ContentDecryptionModule_8::kVersion) && | 274 cdm::ContentDecryptionModule_8::kVersion) && |
| 286 IsSupportedCdmInterfaceVersion( | 275 IsSupportedCdmInterfaceVersion( |
| 287 cdm::ContentDecryptionModule_7::kVersion) && | 276 cdm::ContentDecryptionModule_7::kVersion) && |
| 288 !IsSupportedCdmInterfaceVersion( | 277 !IsSupportedCdmInterfaceVersion( |
| 289 cdm::ContentDecryptionModule_7::kVersion - 1)); | 278 cdm::ContentDecryptionModule_7::kVersion - 1)); |
| 290 | 279 |
| 291 // Try to create the CDM using the latest CDM interface version. | 280 // Try to create the CDM using the latest CDM interface version. |
| 292 CdmWrapper* cdm_wrapper = | 281 CdmWrapper* cdm_wrapper = |
| 293 CdmWrapperImpl<cdm::ContentDecryptionModule>::Create( | 282 CdmWrapperImpl<cdm::ContentDecryptionModule>::Create( |
| 294 key_system, key_system_size, get_cdm_host_func, user_data); | 283 key_system, key_system_size, get_cdm_host_func, user_data); |
| 295 | 284 |
| 296 // If |cdm_wrapper| is NULL, try to create the CDM using older supported | 285 // If |cdm_wrapper| is NULL, try to create the CDM using older supported |
| 297 // versions of the CDM interface here. | 286 // versions of the CDM interface here. |
| 298 if (!cdm_wrapper) { | 287 if (!cdm_wrapper) { |
| 299 cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_7>::Create( | 288 cdm_wrapper = CdmWrapperImpl<cdm::ContentDecryptionModule_7>::Create( |
| 300 key_system, key_system_size, get_cdm_host_func, user_data); | 289 key_system, key_system_size, get_cdm_host_func, user_data); |
| 301 } | 290 } |
| 302 | 291 |
| 303 return cdm_wrapper; | 292 return cdm_wrapper; |
| 304 } | 293 } |
| 305 | 294 |
| 306 // When updating the CdmAdapter, ensure you've updated the CdmWrapper to contain | 295 // When updating the CdmAdapter, ensure you've updated the CdmWrapper to contain |
| 307 // stub implementations for new or modified methods that the older CDM interface | 296 // stub implementations for new or modified methods that the older CDM interface |
| 308 // does not have. | 297 // does not have. |
| 309 // Also update supported_cdm_versions.h. | 298 // Also update supported_cdm_versions.h. |
| 310 static_assert(cdm::ContentDecryptionModule::kVersion == | 299 static_assert(cdm::ContentDecryptionModule::kVersion == |
| 311 cdm::ContentDecryptionModule_8::kVersion, | 300 cdm::ContentDecryptionModule_8::kVersion, |
| 312 "ensure cdm wrapper templates have old version support"); | 301 "ensure cdm wrapper templates have old version support"); |
| 313 | 302 |
| 314 } // namespace media | 303 } // namespace media |
| 315 | 304 |
| 316 #endif // MEDIA_CDM_PPAPI_CDM_WRAPPER_H_ | 305 #endif // MEDIA_CDM_CDM_WRAPPER_H_ |
| OLD | NEW |