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/cdm/ppapi/cdm_file_io_impl.h" | 7 #include "media/cdm/ppapi/cdm_file_io_impl.h" |
8 #include "media/cdm/ppapi/cdm_helpers.h" | 8 #include "media/cdm/ppapi/cdm_helpers.h" |
9 #include "media/cdm/ppapi/cdm_logging.h" | 9 #include "media/cdm/ppapi/cdm_logging.h" |
10 #include "media/cdm/ppapi/supported_cdm_versions.h" | 10 #include "media/cdm/ppapi/supported_cdm_versions.h" |
(...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
380 web_session_id.data(), | 380 web_session_id.data(), |
381 web_session_id.length(), | 381 web_session_id.length(), |
382 response_ptr, | 382 response_ptr, |
383 response_size); | 383 response_size); |
384 } | 384 } |
385 | 385 |
386 void CdmAdapter::CloseSession(uint32_t promise_id, | 386 void CdmAdapter::CloseSession(uint32_t promise_id, |
387 const std::string& web_session_id) { | 387 const std::string& web_session_id) { |
388 if (!cdm_->CloseSession( | 388 if (!cdm_->CloseSession( |
389 promise_id, web_session_id.data(), web_session_id.length())) { | 389 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. | 390 // CDM_4 doesn't support this method, so reject the promise. |
391 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); | 391 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); |
392 } | 392 } |
393 } | 393 } |
394 | 394 |
395 void CdmAdapter::ReleaseSession(uint32_t promise_id, | 395 void CdmAdapter::ReleaseSession(uint32_t promise_id, |
396 const std::string& web_session_id) { | 396 const std::string& web_session_id) { |
397 cdm_->RemoveSession( | 397 cdm_->RemoveSession( |
398 promise_id, web_session_id.data(), web_session_id.length()); | 398 promise_id, web_session_id.data(), web_session_id.length()); |
399 } | 399 } |
400 | 400 |
401 void CdmAdapter::GetUsableKeyIds(uint32_t promise_id, | 401 void CdmAdapter::GetUsableKeyIds(uint32_t promise_id, |
402 const std::string& web_session_id) { | 402 const std::string& web_session_id) { |
403 if (!cdm_->GetUsableKeyIds( | 403 if (!cdm_->GetUsableKeyIds( |
404 promise_id, web_session_id.data(), web_session_id.length())) { | 404 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. | 405 // CDM_4 doesn't support this method, so reject the promise. |
406 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); | 406 RejectPromise(promise_id, cdm::kNotSupportedError, 0, "Not implemented."); |
407 } | 407 } |
408 } | 408 } |
409 | 409 |
410 // Note: In the following decryption/decoding related functions, errors are NOT | 410 // Note: In the following decryption/decoding related functions, errors are NOT |
411 // reported via KeyError, but are reported via corresponding PPB calls. | 411 // reported via KeyError, but are reported via corresponding PPB calls. |
412 | 412 |
413 void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer, | 413 void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer, |
414 const PP_EncryptedBlockInfo& encrypted_block_info) { | 414 const PP_EncryptedBlockInfo& encrypted_block_info) { |
415 PP_DCHECK(!encrypted_buffer.is_null()); | 415 PP_DCHECK(!encrypted_buffer.is_null()); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 } | 597 } |
598 | 598 |
599 void CdmAdapter::TimerExpired(int32_t result, void* context) { | 599 void CdmAdapter::TimerExpired(int32_t result, void* context) { |
600 PP_DCHECK(result == PP_OK); | 600 PP_DCHECK(result == PP_OK); |
601 cdm_->TimerExpired(context); | 601 cdm_->TimerExpired(context); |
602 } | 602 } |
603 | 603 |
604 // cdm::Host_4 methods | 604 // cdm::Host_4 methods |
605 | 605 |
606 double CdmAdapter::GetCurrentWallTimeInSeconds() { | 606 double CdmAdapter::GetCurrentWallTimeInSeconds() { |
607 return GetCurrentTime(); | 607 return GetCurrentWallTime(); |
608 } | 608 } |
609 | 609 |
610 void CdmAdapter::OnSessionCreated(uint32_t session_id, | 610 void CdmAdapter::OnSessionCreated(uint32_t session_id, |
611 const char* web_session_id, | 611 const char* web_session_id, |
612 uint32_t web_session_id_length) { | 612 uint32_t web_session_id_length) { |
613 uint32_t promise_id = cdm_->LookupPromiseId(session_id); | 613 uint32_t promise_id = cdm_->LookupPromiseId(session_id); |
614 cdm_->AssignWebSessionId(session_id, web_session_id, web_session_id_length); | 614 cdm_->AssignWebSessionId(session_id, web_session_id, web_session_id_length); |
615 OnResolveNewSessionPromise(promise_id, web_session_id, web_session_id_length); | 615 OnResolveNewSessionPromise(promise_id, web_session_id, web_session_id_length); |
616 } | 616 } |
617 | 617 |
(...skipping 10 matching lines...) Expand all Loading... |
628 destination_url, | 628 destination_url, |
629 destination_url_length); | 629 destination_url_length); |
630 } | 630 } |
631 | 631 |
632 void CdmAdapter::OnSessionReady(uint32_t session_id) { | 632 void CdmAdapter::OnSessionReady(uint32_t session_id) { |
633 uint32_t promise_id = cdm_->LookupPromiseId(session_id); | 633 uint32_t promise_id = cdm_->LookupPromiseId(session_id); |
634 if (promise_id) { | 634 if (promise_id) { |
635 OnResolvePromise(promise_id); | 635 OnResolvePromise(promise_id); |
636 } else { | 636 } else { |
637 std::string web_session_id = cdm_->LookupWebSessionId(session_id); | 637 std::string web_session_id = cdm_->LookupWebSessionId(session_id); |
638 OnSessionReady(web_session_id.data(), web_session_id.length()); | 638 PostOnMain(callback_factory_.NewCallback( |
| 639 &CdmAdapter::SendSessionReadyInternal, web_session_id)); |
639 } | 640 } |
640 } | 641 } |
641 | 642 |
642 void CdmAdapter::OnSessionClosed(uint32_t session_id) { | 643 void CdmAdapter::OnSessionClosed(uint32_t session_id) { |
643 uint32_t promise_id = cdm_->LookupPromiseId(session_id); | 644 uint32_t promise_id = cdm_->LookupPromiseId(session_id); |
644 std::string web_session_id = cdm_->LookupWebSessionId(session_id); | 645 std::string web_session_id = cdm_->LookupWebSessionId(session_id); |
645 cdm_->DropWebSessionId(web_session_id); | 646 cdm_->DropWebSessionId(web_session_id); |
646 if (promise_id) { | 647 if (promise_id) { |
647 OnResolvePromise(promise_id); | 648 OnResolvePromise(promise_id); |
648 } else { | 649 } else { |
(...skipping 29 matching lines...) Expand all Loading... |
678 std::string web_session_id = cdm_->LookupWebSessionId(session_id); | 679 std::string web_session_id = cdm_->LookupWebSessionId(session_id); |
679 OnSessionError(web_session_id.data(), | 680 OnSessionError(web_session_id.data(), |
680 web_session_id.length(), | 681 web_session_id.length(), |
681 error, | 682 error, |
682 system_code, | 683 system_code, |
683 NULL, | 684 NULL, |
684 0); | 685 0); |
685 } | 686 } |
686 } | 687 } |
687 | 688 |
688 // cdm::Host_5 and cdm::Host_6 methods | 689 // cdm::Host_6 methods |
689 | |
690 cdm::Time CdmAdapter::GetCurrentTime() { | |
691 return GetCurrentWallTime(); | |
692 } | |
693 | 690 |
694 cdm::Time CdmAdapter::GetCurrentWallTime() { | 691 cdm::Time CdmAdapter::GetCurrentWallTime() { |
695 return pp::Module::Get()->core()->GetTime(); | 692 return pp::Module::Get()->core()->GetTime(); |
696 } | 693 } |
697 | 694 |
698 void CdmAdapter::OnResolvePromise(uint32_t promise_id) { | |
699 PostOnMain(callback_factory_.NewCallback( | |
700 &CdmAdapter::SendPromiseResolvedInternal, promise_id)); | |
701 | |
702 // CDM_5 doesn't support OnSessionKeysChange(), so simulate one if requested. | |
703 // Passing "true" which may result in false positives for retrying. | |
704 std::string session_id; | |
705 if (cdm_->SessionUsableKeysEventNeeded(promise_id, &session_id)) | |
706 OnSessionKeysChange(session_id.data(), session_id.length(), true); | |
707 } | |
708 | |
709 void CdmAdapter::OnResolveNewSessionPromise(uint32_t promise_id, | 695 void CdmAdapter::OnResolveNewSessionPromise(uint32_t promise_id, |
710 const char* web_session_id, | 696 const char* web_session_id, |
711 uint32_t web_session_id_length) { | 697 uint32_t web_session_id_length) { |
712 PostOnMain(callback_factory_.NewCallback( | 698 PostOnMain(callback_factory_.NewCallback( |
713 &CdmAdapter::SendPromiseResolvedWithSessionInternal, | 699 &CdmAdapter::SendPromiseResolvedWithSessionInternal, |
714 promise_id, | 700 promise_id, |
715 std::string(web_session_id, web_session_id_length))); | 701 std::string(web_session_id, web_session_id_length))); |
| 702 } |
716 | 703 |
717 // CDM_5 doesn't support OnSessionKeysChange(), so simulate one if requested. | 704 void CdmAdapter::OnResolvePromise(uint32_t promise_id) { |
718 // Passing "true" which may result in false positives for retrying. | 705 PostOnMain(callback_factory_.NewCallback( |
719 std::string session_id; | 706 &CdmAdapter::SendPromiseResolvedInternal, promise_id)); |
720 if (cdm_->SessionUsableKeysEventNeeded(promise_id, &session_id)) | |
721 OnSessionKeysChange(web_session_id, web_session_id_length, true); | |
722 } | 707 } |
723 | 708 |
724 void CdmAdapter::OnResolveKeyIdsPromise(uint32_t promise_id, | 709 void CdmAdapter::OnResolveKeyIdsPromise(uint32_t promise_id, |
725 const cdm::BinaryData* usable_key_ids, | 710 const cdm::BinaryData* usable_key_ids, |
726 uint32_t usable_key_ids_length) { | 711 uint32_t usable_key_ids_length) { |
727 std::vector<std::vector<uint8> > key_ids; | 712 std::vector<std::vector<uint8> > key_ids; |
728 for (uint32_t i = 0; i < usable_key_ids_length; ++i) { | 713 for (uint32_t i = 0; i < usable_key_ids_length; ++i) { |
729 key_ids.push_back( | 714 key_ids.push_back( |
730 std::vector<uint8>(usable_key_ids[i].data, | 715 std::vector<uint8>(usable_key_ids[i].data, |
731 usable_key_ids[i].data + usable_key_ids[i].length)); | 716 usable_key_ids[i].data + usable_key_ids[i].length)); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
763 uint32_t message_length, | 748 uint32_t message_length, |
764 const char* destination_url, | 749 const char* destination_url, |
765 uint32_t destination_url_length) { | 750 uint32_t destination_url_length) { |
766 PostOnMain(callback_factory_.NewCallback( | 751 PostOnMain(callback_factory_.NewCallback( |
767 &CdmAdapter::SendSessionMessageInternal, | 752 &CdmAdapter::SendSessionMessageInternal, |
768 std::string(web_session_id, web_session_id_length), | 753 std::string(web_session_id, web_session_id_length), |
769 std::vector<uint8>(message, message + message_length), | 754 std::vector<uint8>(message, message + message_length), |
770 std::string(destination_url, destination_url_length))); | 755 std::string(destination_url, destination_url_length))); |
771 } | 756 } |
772 | 757 |
773 void CdmAdapter::OnSessionKeysChange(const char* web_session_id, | |
774 uint32_t web_session_id_length, | |
775 bool has_additional_usable_key) { | |
776 OnSessionUsableKeysChange( | |
777 web_session_id, web_session_id_length, has_additional_usable_key); | |
778 } | |
779 | |
780 void CdmAdapter::OnSessionUsableKeysChange(const char* web_session_id, | 758 void CdmAdapter::OnSessionUsableKeysChange(const char* web_session_id, |
781 uint32_t web_session_id_length, | 759 uint32_t web_session_id_length, |
782 bool has_additional_usable_key) { | 760 bool has_additional_usable_key) { |
783 PostOnMain(callback_factory_.NewCallback( | 761 PostOnMain(callback_factory_.NewCallback( |
784 &CdmAdapter::SendSessionUsableKeysChangeInternal, | 762 &CdmAdapter::SendSessionUsableKeysChangeInternal, |
785 std::string(web_session_id, web_session_id_length), | 763 std::string(web_session_id, web_session_id_length), |
786 has_additional_usable_key)); | 764 has_additional_usable_key)); |
787 } | 765 } |
788 | 766 |
789 void CdmAdapter::OnExpirationChange(const char* web_session_id, | 767 void CdmAdapter::OnExpirationChange(const char* web_session_id, |
790 uint32_t web_session_id_length, | 768 uint32_t web_session_id_length, |
791 cdm::Time new_expiry_time) { | 769 cdm::Time new_expiry_time) { |
792 PostOnMain(callback_factory_.NewCallback( | 770 PostOnMain(callback_factory_.NewCallback( |
793 &CdmAdapter::SendExpirationChangeInternal, | 771 &CdmAdapter::SendExpirationChangeInternal, |
794 std::string(web_session_id, web_session_id_length), | 772 std::string(web_session_id, web_session_id_length), |
795 new_expiry_time)); | 773 new_expiry_time)); |
796 } | 774 } |
797 | 775 |
798 void CdmAdapter::OnSessionReady(const char* web_session_id, | |
799 uint32_t web_session_id_length) { | |
800 PostOnMain(callback_factory_.NewCallback( | |
801 &CdmAdapter::SendSessionReadyInternal, | |
802 std::string(web_session_id, web_session_id_length))); | |
803 } | |
804 | |
805 void CdmAdapter::OnSessionClosed(const char* web_session_id, | 776 void CdmAdapter::OnSessionClosed(const char* web_session_id, |
806 uint32_t web_session_id_length) { | 777 uint32_t web_session_id_length) { |
807 PostOnMain(callback_factory_.NewCallback( | 778 PostOnMain(callback_factory_.NewCallback( |
808 &CdmAdapter::SendSessionClosedInternal, | 779 &CdmAdapter::SendSessionClosedInternal, |
809 std::string(web_session_id, web_session_id_length))); | 780 std::string(web_session_id, web_session_id_length))); |
810 } | 781 } |
811 | 782 |
812 void CdmAdapter::OnSessionError(const char* web_session_id, | 783 void CdmAdapter::OnSessionError(const char* web_session_id, |
813 uint32_t web_session_id_length, | 784 uint32_t web_session_id_length, |
814 cdm::Error error, | 785 cdm::Error error, |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 // Always update this DCHECK when updating this function. | 1276 // Always update this DCHECK when updating this function. |
1306 // If this check fails, update this function and DCHECK or update | 1277 // If this check fails, update this function and DCHECK or update |
1307 // IsSupportedCdmHostVersion. | 1278 // IsSupportedCdmHostVersion. |
1308 | 1279 |
1309 PP_DCHECK( | 1280 PP_DCHECK( |
1310 // Future version is not supported. | 1281 // Future version is not supported. |
1311 !IsSupportedCdmHostVersion(cdm::Host_6::kVersion + 1) && | 1282 !IsSupportedCdmHostVersion(cdm::Host_6::kVersion + 1) && |
1312 // Current version is supported. | 1283 // Current version is supported. |
1313 IsSupportedCdmHostVersion(cdm::Host_6::kVersion) && | 1284 IsSupportedCdmHostVersion(cdm::Host_6::kVersion) && |
1314 // Include all previous supported versions (if any) here. | 1285 // Include all previous supported versions (if any) here. |
1315 IsSupportedCdmHostVersion(cdm::Host_5::kVersion) && | 1286 // Host_5 is not supported. |
1316 IsSupportedCdmHostVersion(cdm::Host_4::kVersion) && | 1287 IsSupportedCdmHostVersion(cdm::Host_4::kVersion) && |
1317 // One older than the oldest supported version is not supported. | 1288 // One older than the oldest supported version is not supported. |
1318 !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1)); | 1289 !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1)); |
1319 PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version)); | 1290 PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version)); |
1320 | 1291 |
1321 CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data); | 1292 CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data); |
1322 CDM_DLOG() << "Create CDM Host with version " << host_interface_version; | 1293 CDM_DLOG() << "Create CDM Host with version " << host_interface_version; |
1323 switch (host_interface_version) { | 1294 switch (host_interface_version) { |
1324 case cdm::Host_4::kVersion: | 1295 case cdm::Host_4::kVersion: |
1325 return static_cast<cdm::Host_4*>(cdm_adapter); | 1296 return static_cast<cdm::Host_4*>(cdm_adapter); |
1326 case cdm::Host_5::kVersion: | |
1327 return static_cast<cdm::Host_5*>(cdm_adapter); | |
1328 case cdm::Host_6::kVersion: | 1297 case cdm::Host_6::kVersion: |
1329 return static_cast<cdm::Host_6*>(cdm_adapter); | 1298 return static_cast<cdm::Host_6*>(cdm_adapter); |
1330 default: | 1299 default: |
1331 PP_NOTREACHED(); | 1300 PP_NOTREACHED(); |
1332 return NULL; | 1301 return NULL; |
1333 } | 1302 } |
1334 } | 1303 } |
1335 | 1304 |
1336 // This object is the global object representing this plugin library as long | 1305 // This object is the global object representing this plugin library as long |
1337 // as it is loaded. | 1306 // as it is loaded. |
(...skipping 19 matching lines...) Expand all Loading... |
1357 } // namespace media | 1326 } // namespace media |
1358 | 1327 |
1359 namespace pp { | 1328 namespace pp { |
1360 | 1329 |
1361 // Factory function for your specialization of the Module object. | 1330 // Factory function for your specialization of the Module object. |
1362 Module* CreateModule() { | 1331 Module* CreateModule() { |
1363 return new media::CdmAdapterModule(); | 1332 return new media::CdmAdapterModule(); |
1364 } | 1333 } |
1365 | 1334 |
1366 } // namespace pp | 1335 } // namespace pp |
OLD | NEW |