| 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 #include "media/cdm/ppapi/cdm_adapter.h" | 5 #include "media/cdm/ppapi/cdm_adapter.h" |
| 6 | 6 |
| 7 #include "media/base/limits.h" |
| 7 #include "media/cdm/ppapi/cdm_file_io_impl.h" | 8 #include "media/cdm/ppapi/cdm_file_io_impl.h" |
| 8 #include "media/cdm/ppapi/cdm_helpers.h" | 9 #include "media/cdm/ppapi/cdm_helpers.h" |
| 9 #include "media/cdm/ppapi/cdm_logging.h" | 10 #include "media/cdm/ppapi/cdm_logging.h" |
| 10 #include "media/cdm/ppapi/supported_cdm_versions.h" | 11 #include "media/cdm/ppapi/supported_cdm_versions.h" |
| 11 #include "ppapi/c/ppb_console.h" | 12 #include "ppapi/c/ppb_console.h" |
| 12 #include "ppapi/cpp/private/uma_private.h" | 13 #include "ppapi/cpp/private/uma_private.h" |
| 13 | 14 |
| 14 #if defined(CHECK_DOCUMENT_URL) | 15 #if defined(CHECK_DOCUMENT_URL) |
| 15 #include "ppapi/cpp/dev/url_util_dev.h" | 16 #include "ppapi/cpp/dev/url_util_dev.h" |
| 16 #include "ppapi/cpp/instance_handle.h" | 17 #include "ppapi/cpp/instance_handle.h" |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 } | 317 } |
| 317 #endif // defined(CHECK_DOCUMENT_URL) | 318 #endif // defined(CHECK_DOCUMENT_URL) |
| 318 | 319 |
| 319 if (!cdm_ && !CreateCdmInstance(key_system)) | 320 if (!cdm_ && !CreateCdmInstance(key_system)) |
| 320 return; | 321 return; |
| 321 | 322 |
| 322 PP_DCHECK(cdm_); | 323 PP_DCHECK(cdm_); |
| 323 key_system_ = key_system; | 324 key_system_ = key_system; |
| 324 } | 325 } |
| 325 | 326 |
| 327 void CdmAdapter::SetServerCertificate(uint32_t promise_id, |
| 328 pp::VarArrayBuffer server_certificate) { |
| 329 const uint8_t* server_certificate_ptr = |
| 330 static_cast<const uint8_t*>(server_certificate.Map()); |
| 331 const uint32_t server_certificate_size = server_certificate.ByteLength(); |
| 332 |
| 333 if (!server_certificate_ptr || |
| 334 server_certificate_size < media::limits::kMinCertificateLength || |
| 335 server_certificate_size > media::limits::kMinCertificateLength) { |
| 336 RejectPromise( |
| 337 promise_id, cdm::kInvalidAccessError, 0, "Incorrect certificate."); |
| 338 return; |
| 339 } |
| 340 |
| 341 // Initialize() doesn't report an error, so SetServerCertificate() can be |
| 342 // called even if Initialize() failed. |
| 343 // TODO(jrummell): Remove this code when prefixed EME gets removed. |
| 344 if (!cdm_) { |
| 345 RejectPromise(promise_id, |
| 346 cdm::kInvalidStateError, |
| 347 0, |
| 348 "CDM has not been initialized."); |
| 349 return; |
| 350 } |
| 351 |
| 352 if (!cdm_->SetServerCertificate( |
| 353 promise_id, server_certificate_ptr, server_certificate_size)) { |
| 354 // CDM_4 and CDM_5 don't support this method, so reject the promise. |
| 355 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); |
| 356 } |
| 357 } |
| 358 |
| 326 void CdmAdapter::CreateSession(uint32_t promise_id, | 359 void CdmAdapter::CreateSession(uint32_t promise_id, |
| 327 const std::string& init_data_type, | 360 const std::string& init_data_type, |
| 328 pp::VarArrayBuffer init_data, | 361 pp::VarArrayBuffer init_data, |
| 329 PP_SessionType session_type) { | 362 PP_SessionType session_type) { |
| 330 // Initialize() doesn't report an error, so CreateSession() can be called | 363 // Initialize() doesn't report an error, so CreateSession() can be called |
| 331 // even if Initialize() failed. | 364 // even if Initialize() failed. |
| 332 // TODO(jrummell): Remove this code when prefixed EME gets removed. | 365 // TODO(jrummell): Remove this code when prefixed EME gets removed. |
| 333 // TODO(jrummell): Verify that Initialize() failing does not resolve the | 366 // TODO(jrummell): Verify that Initialize() failing does not resolve the |
| 334 // MediaKeys.create() promise. | 367 // MediaKeys.create() promise. |
| 335 if (!cdm_) { | 368 if (!cdm_) { |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 418 |
| 386 void CdmAdapter::CloseSession(uint32_t promise_id, | 419 void CdmAdapter::CloseSession(uint32_t promise_id, |
| 387 const std::string& web_session_id) { | 420 const std::string& web_session_id) { |
| 388 if (!cdm_->CloseSession( | 421 if (!cdm_->CloseSession( |
| 389 promise_id, web_session_id.data(), web_session_id.length())) { | 422 promise_id, web_session_id.data(), web_session_id.length())) { |
| 390 // CDM_4 and CDM_5 don't support this method, so reject the promise. | 423 // CDM_4 and CDM_5 don't support this method, so reject the promise. |
| 391 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); | 424 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); |
| 392 } | 425 } |
| 393 } | 426 } |
| 394 | 427 |
| 395 void CdmAdapter::ReleaseSession(uint32_t promise_id, | 428 void CdmAdapter::RemoveSession(uint32_t promise_id, |
| 396 const std::string& web_session_id) { | 429 const std::string& web_session_id) { |
| 397 cdm_->RemoveSession( | 430 cdm_->RemoveSession( |
| 398 promise_id, web_session_id.data(), web_session_id.length()); | 431 promise_id, web_session_id.data(), web_session_id.length()); |
| 399 } | 432 } |
| 400 | 433 |
| 401 void CdmAdapter::GetUsableKeyIds(uint32_t promise_id, | 434 void CdmAdapter::GetUsableKeyIds(uint32_t promise_id, |
| 402 const std::string& web_session_id) { | 435 const std::string& web_session_id) { |
| 403 if (!cdm_->GetUsableKeyIds( | 436 if (!cdm_->GetUsableKeyIds( |
| 404 promise_id, web_session_id.data(), web_session_id.length())) { | 437 promise_id, web_session_id.data(), web_session_id.length())) { |
| 405 // CDM_4 and CDM_5 don't support this method, so reject the promise. | 438 // CDM_4 and CDM_5 don't support this method, so reject the promise. |
| 406 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); | 439 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 838 PP_DCHECK(result == PP_OK); | 871 PP_DCHECK(result == PP_OK); |
| 839 pp::ContentDecryptor_Private::PromiseResolvedWithSession(promise_id, | 872 pp::ContentDecryptor_Private::PromiseResolvedWithSession(promise_id, |
| 840 web_session_id); | 873 web_session_id); |
| 841 } | 874 } |
| 842 | 875 |
| 843 void CdmAdapter::SendPromiseResolvedWithUsableKeyIdsInternal( | 876 void CdmAdapter::SendPromiseResolvedWithUsableKeyIdsInternal( |
| 844 int32_t result, | 877 int32_t result, |
| 845 uint32_t promise_id, | 878 uint32_t promise_id, |
| 846 std::vector<std::vector<uint8> > key_ids) { | 879 std::vector<std::vector<uint8> > key_ids) { |
| 847 PP_DCHECK(result == PP_OK); | 880 PP_DCHECK(result == PP_OK); |
| 848 // TODO(jrummell): Implement this event in subsequent CL. | 881 pp::ContentDecryptor_Private::PromiseResolvedWithKeyIds(promise_id, key_ids); |
| 849 // (http://crbug.com/358271). | |
| 850 } | 882 } |
| 851 | 883 |
| 852 void CdmAdapter::SendPromiseRejectedInternal(int32_t result, | 884 void CdmAdapter::SendPromiseRejectedInternal(int32_t result, |
| 853 uint32_t promise_id, | 885 uint32_t promise_id, |
| 854 const SessionError& error) { | 886 const SessionError& error) { |
| 855 PP_DCHECK(result == PP_OK); | 887 PP_DCHECK(result == PP_OK); |
| 856 pp::ContentDecryptor_Private::PromiseRejected( | 888 pp::ContentDecryptor_Private::PromiseRejected( |
| 857 promise_id, | 889 promise_id, |
| 858 CdmExceptionTypeToPpCdmExceptionType(error.error), | 890 CdmExceptionTypeToPpCdmExceptionType(error.error), |
| 859 error.system_code, | 891 error.system_code, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 CdmExceptionTypeToPpCdmExceptionType(error.error), | 929 CdmExceptionTypeToPpCdmExceptionType(error.error), |
| 898 error.system_code, | 930 error.system_code, |
| 899 error.error_description); | 931 error.error_description); |
| 900 } | 932 } |
| 901 | 933 |
| 902 void CdmAdapter::SendSessionUsableKeysChangeInternal( | 934 void CdmAdapter::SendSessionUsableKeysChangeInternal( |
| 903 int32_t result, | 935 int32_t result, |
| 904 const std::string& web_session_id, | 936 const std::string& web_session_id, |
| 905 bool has_additional_usable_key) { | 937 bool has_additional_usable_key) { |
| 906 PP_DCHECK(result == PP_OK); | 938 PP_DCHECK(result == PP_OK); |
| 907 // TODO(jrummell): Implement this event in subsequent CL. | 939 pp::ContentDecryptor_Private::SessionKeysChange(web_session_id, |
| 908 // (http://crbug.com/358271). | 940 has_additional_usable_key); |
| 909 } | 941 } |
| 910 | 942 |
| 911 void CdmAdapter::SendExpirationChangeInternal(int32_t result, | 943 void CdmAdapter::SendExpirationChangeInternal(int32_t result, |
| 912 const std::string& web_session_id, | 944 const std::string& web_session_id, |
| 913 cdm::Time new_expiry_time) { | 945 cdm::Time new_expiry_time) { |
| 914 PP_DCHECK(result == PP_OK); | 946 PP_DCHECK(result == PP_OK); |
| 915 // TODO(jrummell): Implement this event in subsequent CL. | 947 pp::ContentDecryptor_Private::SessionExpirationChange(web_session_id, |
| 916 // (http://crbug.com/358271). | 948 new_expiry_time); |
| 917 } | 949 } |
| 918 | 950 |
| 919 void CdmAdapter::DeliverBlock(int32_t result, | 951 void CdmAdapter::DeliverBlock(int32_t result, |
| 920 const cdm::Status& status, | 952 const cdm::Status& status, |
| 921 const LinkedDecryptedBlock& decrypted_block, | 953 const LinkedDecryptedBlock& decrypted_block, |
| 922 const PP_DecryptTrackingInfo& tracking_info) { | 954 const PP_DecryptTrackingInfo& tracking_info) { |
| 923 PP_DCHECK(result == PP_OK); | 955 PP_DCHECK(result == PP_OK); |
| 924 PP_DecryptedBlockInfo decrypted_block_info = {}; | 956 PP_DecryptedBlockInfo decrypted_block_info = {}; |
| 925 decrypted_block_info.tracking_info = tracking_info; | 957 decrypted_block_info.tracking_info = tracking_info; |
| 926 decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp(); | 958 decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp(); |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1357 } // namespace media | 1389 } // namespace media |
| 1358 | 1390 |
| 1359 namespace pp { | 1391 namespace pp { |
| 1360 | 1392 |
| 1361 // Factory function for your specialization of the Module object. | 1393 // Factory function for your specialization of the Module object. |
| 1362 Module* CreateModule() { | 1394 Module* CreateModule() { |
| 1363 return new media::CdmAdapterModule(); | 1395 return new media::CdmAdapterModule(); |
| 1364 } | 1396 } |
| 1365 | 1397 |
| 1366 } // namespace pp | 1398 } // namespace pp |
| OLD | NEW |