Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(500)

Side by Side Diff: media/cdm/ppapi/cdm_adapter.cc

Issue 265993002: Add Promises for EME (Chromium side) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 case PP_DECRYPTORSTREAMTYPE_AUDIO: 203 case PP_DECRYPTORSTREAMTYPE_AUDIO:
204 return cdm::kStreamTypeAudio; 204 return cdm::kStreamTypeAudio;
205 case PP_DECRYPTORSTREAMTYPE_VIDEO: 205 case PP_DECRYPTORSTREAMTYPE_VIDEO:
206 return cdm::kStreamTypeVideo; 206 return cdm::kStreamTypeVideo;
207 } 207 }
208 208
209 PP_NOTREACHED(); 209 PP_NOTREACHED();
210 return cdm::kStreamTypeVideo; 210 return cdm::kStreamTypeVideo;
211 } 211 }
212 212
213 cdm::SessionType PpSessionTypeToCdmSessionType(PP_SessionType session_type) {
214 switch (session_type) {
215 case PP_SESSIONTYPE_TEMPORARY:
216 return cdm::SessionType::kTemporary;
217 case PP_SESSIONTYPE_PERSISTENT:
218 return cdm::SessionType::kPersistent;
219 default:
220 PP_NOTREACHED();
221 return cdm::SessionType::kTemporary;
222 }
223 }
224
213 } // namespace 225 } // namespace
214 226
215 namespace media { 227 namespace media {
216 228
217 CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module) 229 CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module)
218 : pp::Instance(instance), 230 : pp::Instance(instance),
219 pp::ContentDecryptor_Private(this), 231 pp::ContentDecryptor_Private(this),
220 #if defined(OS_CHROMEOS) 232 #if defined(OS_CHROMEOS)
221 output_protection_(this), 233 output_protection_(this),
222 platform_verification_(this), 234 platform_verification_(this),
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 } 292 }
281 #endif // defined(CHECK_DOCUMENT_URL) 293 #endif // defined(CHECK_DOCUMENT_URL)
282 294
283 if (!cdm_ && !CreateCdmInstance(key_system)) 295 if (!cdm_ && !CreateCdmInstance(key_system))
284 return; 296 return;
285 297
286 PP_DCHECK(cdm_); 298 PP_DCHECK(cdm_);
287 key_system_ = key_system; 299 key_system_ = key_system;
288 } 300 }
289 301
290 void CdmAdapter::CreateSession(uint32_t session_id, 302 void CdmAdapter::CreateSession(uint32_t promise_id,
291 const std::string& content_type, 303 const std::string& init_data_type,
292 pp::VarArrayBuffer init_data) { 304 pp::VarArrayBuffer init_data,
305 PP_SessionType session_type) {
293 // Initialize() doesn't report an error, so CreateSession() can be called 306 // Initialize() doesn't report an error, so CreateSession() can be called
294 // even if Initialize() failed. 307 // even if Initialize() failed.
295 if (!cdm_) { 308 if (!cdm_) {
296 OnSessionError(session_id, cdm::kUnknownError, 0); 309 RejectPromise(
310 promise_id, "InvalidStateError", 0, "CDM has not been initialized.");
297 return; 311 return;
298 } 312 }
299 313
300 cdm_->CreateSession(session_id, 314 cdm_->CreateSession(promise_id,
301 content_type.data(), 315 init_data_type.data(),
302 content_type.size(), 316 init_data_type.size(),
303 static_cast<const uint8_t*>(init_data.Map()), 317 static_cast<const uint8_t*>(init_data.Map()),
304 init_data.ByteLength()); 318 init_data.ByteLength(),
319 PpSessionTypeToCdmSessionType(session_type));
305 } 320 }
306 321
307 void CdmAdapter::LoadSession(uint32_t session_id, 322 void CdmAdapter::LoadSession(uint32_t promise_id,
308 const std::string& web_session_id) { 323 const std::string& web_session_id) {
309 // Initialize() doesn't report an error, so LoadSession() can be called 324 // Initialize() doesn't report an error, so LoadSession() can be called
310 // even if Initialize() failed. 325 // even if Initialize() failed.
311 if (!cdm_) { 326 if (!cdm_) {
312 OnSessionError(session_id, cdm::kUnknownError, 0); 327 RejectPromise(
328 promise_id, "InvalidStateError", 0, "CDM has not been initialized.");
313 return; 329 return;
314 } 330 }
315 331
316 cdm_->LoadSession(session_id, web_session_id.data(), web_session_id.size()); 332 cdm_->LoadSession(promise_id, web_session_id.data(), web_session_id.size());
317 } 333 }
318 334
319 void CdmAdapter::UpdateSession(uint32_t session_id, 335 void CdmAdapter::UpdateSession(uint32_t promise_id,
336 const std::string& web_session_id,
320 pp::VarArrayBuffer response) { 337 pp::VarArrayBuffer response) {
321 const uint8_t* response_ptr = static_cast<const uint8_t*>(response.Map()); 338 const uint8_t* response_ptr = static_cast<const uint8_t*>(response.Map());
322 const uint32_t response_size = response.ByteLength(); 339 const uint32_t response_size = response.ByteLength();
323 340
341 PP_DCHECK(!web_session_id.empty());
342
324 if (!response_ptr || response_size <= 0) { 343 if (!response_ptr || response_size <= 0) {
325 OnSessionError(session_id, cdm::kUnknownError, 0); 344 RejectPromise(promise_id, "SyntaxError", 0, "response is empty.");
326 return; 345 return;
327 } 346 }
328 cdm_->UpdateSession(session_id, response_ptr, response_size); 347
348 cdm_->UpdateSession(promise_id,
349 web_session_id.data(),
350 web_session_id.length(),
351 response_ptr,
352 response_size);
329 } 353 }
330 354
331 void CdmAdapter::ReleaseSession(uint32_t session_id) { 355 void CdmAdapter::ReleaseSession(uint32_t promise_id,
332 cdm_->ReleaseSession(session_id); 356 const std::string& web_session_id) {
357 cdm_->ReleaseSession(
358 promise_id, web_session_id.data(), web_session_id.length());
333 } 359 }
334 360
335 // Note: In the following decryption/decoding related functions, errors are NOT 361 // Note: In the following decryption/decoding related functions, errors are NOT
336 // reported via KeyError, but are reported via corresponding PPB calls. 362 // reported via KeyError, but are reported via corresponding PPB calls.
337 363
338 void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer, 364 void CdmAdapter::Decrypt(pp::Buffer_Dev encrypted_buffer,
339 const PP_EncryptedBlockInfo& encrypted_block_info) { 365 const PP_EncryptedBlockInfo& encrypted_block_info) {
340 PP_DCHECK(!encrypted_buffer.is_null()); 366 PP_DCHECK(!encrypted_buffer.is_null());
341 367
342 // Release a buffer that the caller indicated it is finished with. 368 // Release a buffer that the caller indicated it is finished with.
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 549
524 void CdmAdapter::TimerExpired(int32_t result, void* context) { 550 void CdmAdapter::TimerExpired(int32_t result, void* context) {
525 PP_DCHECK(result == PP_OK); 551 PP_DCHECK(result == PP_OK);
526 cdm_->TimerExpired(context); 552 cdm_->TimerExpired(context);
527 } 553 }
528 554
529 double CdmAdapter::GetCurrentWallTimeInSeconds() { 555 double CdmAdapter::GetCurrentWallTimeInSeconds() {
530 return pp::Module::Get()->core()->GetTime(); 556 return pp::Module::Get()->core()->GetTime();
531 } 557 }
532 558
559 // cdm::Host_5 methods
560
561 void CdmAdapter::OnResolvePromise(uint32_t promise_id) {
562 PostOnMain(callback_factory_.NewCallback(
563 &CdmAdapter::SendPromiseResolvedInternal, promise_id));
564 }
565
566 void CdmAdapter::OnResolveNewSessionPromise(uint32_t promise_id,
567 const char* web_session_id,
568 uint32_t web_session_id_length) {
569 PostOnMain(callback_factory_.NewCallback(
570 &CdmAdapter::SendPromiseResolvedWithSessionInternal,
571 promise_id,
572 std::string(web_session_id, web_session_id_length)));
573 }
574
575 void CdmAdapter::OnRejectPromise(uint32_t promise_id,
576 const char* error_name,
577 uint32_t error_name_length,
578 uint32_t system_code,
579 const char* error_message,
580 uint32_t error_message_length) {
581 RejectPromise(promise_id,
582 std::string(error_name, error_name_length),
583 system_code,
584 std::string(error_message, error_message_length));
585 }
586
587 void CdmAdapter::RejectPromise(uint32_t promise_id,
588 const std::string& error_name,
589 uint32_t system_code,
590 const std::string& error_message) {
591 PostOnMain(callback_factory_.NewCallback(
592 &CdmAdapter::SendPromiseRejectedInternal,
593 promise_id,
594 SessionError(error_name, system_code, error_message)));
595 }
596
597 void CdmAdapter::OnSessionMessage(const char* web_session_id,
598 uint32_t web_session_id_length,
599 const char* message,
600 uint32_t message_length,
601 const char* destination_url,
602 uint32_t destination_url_length) {
603 PostOnMain(callback_factory_.NewCallback(
604 &CdmAdapter::SendSessionMessageInternal,
605 std::string(web_session_id, web_session_id_length),
606 std::vector<uint8>(message, message + message_length),
607 std::string(destination_url, destination_url_length)));
608 }
609
610 void CdmAdapter::OnSessionReady(const char* web_session_id,
611 uint32_t web_session_id_length) {
612 PostOnMain(callback_factory_.NewCallback(
613 &CdmAdapter::SendSessionReadyInternal,
614 std::string(web_session_id, web_session_id_length)));
615 }
616
617 void CdmAdapter::OnSessionClosed(const char* web_session_id,
618 uint32_t web_session_id_length) {
619 PostOnMain(callback_factory_.NewCallback(
620 &CdmAdapter::SendSessionClosedInternal,
621 std::string(web_session_id, web_session_id_length)));
622 }
623
624 void CdmAdapter::OnSessionError(const char* web_session_id,
625 uint32_t web_session_id_length,
626 const char* error_name,
627 uint32_t error_name_length,
628 uint32_t system_code,
629 const char* error_message,
630 uint32_t error_message_length) {
631 PostOnMain(callback_factory_.NewCallback(
632 &CdmAdapter::SendSessionErrorInternal,
633 std::string(web_session_id, web_session_id_length),
634 SessionError(std::string(error_name, error_name_length),
635 system_code,
636 std::string(error_message, error_message_length))));
637 }
638
639 // cdm::Host_4 methods
640
533 void CdmAdapter::OnSessionCreated(uint32_t session_id, 641 void CdmAdapter::OnSessionCreated(uint32_t session_id,
534 const char* web_session_id, 642 const char* web_session_id,
535 uint32_t web_session_id_length) { 643 uint32_t web_session_id_length) {
536 PostOnMain(callback_factory_.NewCallback( 644 uint32_t promise_id = cdm_->LookupPromiseId(session_id);
537 &CdmAdapter::SendSessionCreatedInternal, 645 cdm_->AssignWebSessionId(session_id, web_session_id, web_session_id_length);
538 session_id, 646 OnResolveNewSessionPromise(promise_id, web_session_id, web_session_id_length);
539 std::string(web_session_id, web_session_id_length)));
540 } 647 }
541 648
542 void CdmAdapter::OnSessionMessage(uint32_t session_id, 649 void CdmAdapter::OnSessionMessage(uint32_t session_id,
543 const char* message, 650 const char* message,
544 uint32_t message_length, 651 uint32_t message_length,
545 const char* destination_url, 652 const char* destination_url,
546 uint32_t destination_url_length) { 653 uint32_t destination_url_length) {
547 PostOnMain(callback_factory_.NewCallback( 654 std::string web_session_id = cdm_->LookupWebSessionId(session_id);
548 &CdmAdapter::SendSessionMessageInternal, 655 OnSessionMessage(web_session_id.data(),
549 session_id, 656 web_session_id.length(),
550 std::vector<uint8>(message, message + message_length), 657 message,
551 std::string(destination_url, destination_url_length))); 658 message_length,
659 destination_url,
660 destination_url_length);
552 } 661 }
553 662
554 void CdmAdapter::OnSessionReady(uint32_t session_id) { 663 void CdmAdapter::OnSessionReady(uint32_t session_id) {
555 PostOnMain(callback_factory_.NewCallback( 664 uint32_t promise_id = cdm_->LookupPromiseId(session_id);
556 &CdmAdapter::SendSessionReadyInternal, session_id)); 665 if (promise_id) {
666 OnResolvePromise(promise_id);
667 } else {
668 std::string web_session_id = cdm_->LookupWebSessionId(session_id);
669 OnSessionReady(web_session_id.data(), web_session_id.length());
670 }
557 } 671 }
558 672
559 void CdmAdapter::OnSessionClosed(uint32_t session_id) { 673 void CdmAdapter::OnSessionClosed(uint32_t session_id) {
560 PostOnMain(callback_factory_.NewCallback( 674 uint32_t promise_id = cdm_->LookupPromiseId(session_id);
561 &CdmAdapter::SendSessionClosedInternal, session_id)); 675 std::string web_session_id = cdm_->LookupWebSessionId(session_id);
676 cdm_->DropWebSessionId(web_session_id);
677 if (promise_id) {
678 OnResolvePromise(promise_id);
679 } else {
680 OnSessionClosed(web_session_id.data(), web_session_id.length());
681 }
562 } 682 }
563 683
564 void CdmAdapter::OnSessionError(uint32_t session_id, 684 void CdmAdapter::OnSessionError(uint32_t session_id,
565 cdm::MediaKeyError error_code, 685 cdm::MediaKeyError error_code,
566 uint32_t system_code) { 686 uint32_t system_code) {
567 PostOnMain(callback_factory_.NewCallback( 687 uint32_t promise_id = cdm_->LookupPromiseId(session_id);
568 &CdmAdapter::SendSessionErrorInternal, 688
569 session_id, 689 // Existing cdm::MediaKeyError don't map to DOM error names. Convert them
570 error_code, 690 // into non-standard names so that the prefixed API can extract them.
571 system_code)); 691 // TODO(jrummell): Remove this conversion and the inverse when CDM4 is gone.
692 std::string error_name;
693 switch (error_code) {
694 case cdm::MediaKeyError::kClientError:
695 error_name = "CDM4ClientError";
696 break;
697 case cdm::MediaKeyError::kOutputError:
698 error_name = "CDM4OutputError";
699 break;
700 case cdm::MediaKeyError::kUnknownError:
701 default:
702 error_name = "CDM4UnknownError";
703 break;
704 }
705
706 if (promise_id) {
707 RejectPromise(promise_id, error_name, system_code, std::string());
708 } else {
709 std::string web_session_id = cdm_->LookupWebSessionId(session_id);
710 OnSessionError(web_session_id.data(),
711 web_session_id.length(),
712 error_name.data(),
713 error_name.length(),
714 system_code,
715 NULL,
716 0);
717 }
572 } 718 }
573 719
574 void CdmAdapter::SendSessionCreatedInternal(int32_t result, 720 // Helpers to pass the event to Pepper.
575 uint32_t session_id, 721
576 const std::string& web_session_id) { 722 void CdmAdapter::SendPromiseResolvedInternal(int32_t result,
723 uint32_t promise_id) {
577 PP_DCHECK(result == PP_OK); 724 PP_DCHECK(result == PP_OK);
578 pp::ContentDecryptor_Private::SessionCreated(session_id, web_session_id); 725 pp::ContentDecryptor_Private::PromiseResolved(promise_id);
579 } 726 }
580 727
581 void CdmAdapter::SendSessionMessageInternal(int32_t result, 728 void CdmAdapter::SendPromiseResolvedWithSessionInternal(
582 uint32_t session_id, 729 int32_t result,
583 const std::vector<uint8>& message, 730 uint32_t promise_id,
584 const std::string& default_url) { 731 const std::string& web_session_id) {
732 PP_DCHECK(result == PP_OK);
733 pp::ContentDecryptor_Private::PromiseResolvedWithSession(promise_id,
734 web_session_id);
735 }
736
737 void CdmAdapter::SendPromiseRejectedInternal(int32_t result,
738 uint32_t promise_id,
739 const SessionError& error) {
740 PP_DCHECK(result == PP_OK);
741 pp::ContentDecryptor_Private::PromiseRejected(
742 promise_id, error.error_name, error.system_code, error.error_description);
743 }
744
745 void CdmAdapter::SendSessionMessageInternal(
746 int32_t result,
747 const std::string& web_session_id,
748 const std::vector<uint8>& message,
749 const std::string& destination_url) {
585 PP_DCHECK(result == PP_OK); 750 PP_DCHECK(result == PP_OK);
586 751
587 pp::VarArrayBuffer message_array_buffer(message.size()); 752 pp::VarArrayBuffer message_array_buffer(message.size());
588 if (message.size() > 0) { 753 if (message.size() > 0) {
589 memcpy(message_array_buffer.Map(), message.data(), message.size()); 754 memcpy(message_array_buffer.Map(), message.data(), message.size());
590 } 755 }
591 756
592 pp::ContentDecryptor_Private::SessionMessage( 757 pp::ContentDecryptor_Private::SessionMessage(
593 session_id, message_array_buffer, default_url); 758 web_session_id, message_array_buffer, destination_url);
594 } 759 }
595 760
596 void CdmAdapter::SendSessionReadyInternal(int32_t result, uint32_t session_id) { 761 void CdmAdapter::SendSessionReadyInternal(int32_t result,
762 const std::string& web_session_id) {
597 PP_DCHECK(result == PP_OK); 763 PP_DCHECK(result == PP_OK);
598 pp::ContentDecryptor_Private::SessionReady(session_id); 764 pp::ContentDecryptor_Private::SessionReady(web_session_id);
599 } 765 }
600 766
601 void CdmAdapter::SendSessionClosedInternal(int32_t result, 767 void CdmAdapter::SendSessionClosedInternal(int32_t result,
602 uint32_t session_id) { 768 const std::string& web_session_id) {
603 PP_DCHECK(result == PP_OK); 769 PP_DCHECK(result == PP_OK);
604 pp::ContentDecryptor_Private::SessionClosed(session_id); 770 pp::ContentDecryptor_Private::SessionClosed(web_session_id);
605 } 771 }
606 772
607 void CdmAdapter::SendSessionErrorInternal(int32_t result, 773 void CdmAdapter::SendSessionErrorInternal(int32_t result,
608 uint32_t session_id, 774 const std::string& web_session_id,
609 cdm::MediaKeyError error_code, 775 const SessionError& error) {
610 uint32_t system_code) {
611 PP_DCHECK(result == PP_OK); 776 PP_DCHECK(result == PP_OK);
612 pp::ContentDecryptor_Private::SessionError( 777 pp::ContentDecryptor_Private::SessionError(web_session_id,
613 session_id, error_code, system_code); 778 error.error_name,
779 error.system_code,
780 error.error_description);
614 } 781 }
615 782
616 void CdmAdapter::DeliverBlock(int32_t result, 783 void CdmAdapter::DeliverBlock(int32_t result,
617 const cdm::Status& status, 784 const cdm::Status& status,
618 const LinkedDecryptedBlock& decrypted_block, 785 const LinkedDecryptedBlock& decrypted_block,
619 const PP_DecryptTrackingInfo& tracking_info) { 786 const PP_DecryptTrackingInfo& tracking_info) {
620 PP_DCHECK(result == PP_OK); 787 PP_DCHECK(result == PP_OK);
621 PP_DecryptedBlockInfo decrypted_block_info; 788 PP_DecryptedBlockInfo decrypted_block_info;
622 decrypted_block_info.tracking_info = tracking_info; 789 decrypted_block_info.tracking_info = tracking_info;
623 decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp(); 790 decrypted_block_info.tracking_info.timestamp = decrypted_block->Timestamp();
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
892 cdm_->OnPlatformChallengeResponse(response); 1059 cdm_->OnPlatformChallengeResponse(response);
893 return; 1060 return;
894 } 1061 }
895 1062
896 pp::VarArrayBuffer signed_data_var(signed_data_output_); 1063 pp::VarArrayBuffer signed_data_var(signed_data_output_);
897 pp::VarArrayBuffer signed_data_signature_var(signed_data_signature_output_); 1064 pp::VarArrayBuffer signed_data_signature_var(signed_data_signature_output_);
898 std::string platform_key_certificate_string = 1065 std::string platform_key_certificate_string =
899 platform_key_certificate_output_.AsString(); 1066 platform_key_certificate_output_.AsString();
900 1067
901 cdm::PlatformChallengeResponse response = { 1068 cdm::PlatformChallengeResponse response = {
902 static_cast<uint8_t*>(signed_data_var.Map()), 1069 static_cast<uint8_t*>(signed_data_var.Map()),
903 signed_data_var.ByteLength(), 1070 signed_data_var.ByteLength(),
904 1071 static_cast<uint8_t*>(signed_data_signature_var.Map()),
905 static_cast<uint8_t*>(signed_data_signature_var.Map()), 1072 signed_data_signature_var.ByteLength(),
906 signed_data_signature_var.ByteLength(), 1073 reinterpret_cast<const uint8_t*>(platform_key_certificate_string.data()),
907 1074 static_cast<uint32_t>(platform_key_certificate_string.length())};
908 reinterpret_cast<const uint8_t*>(platform_key_certificate_string.c_str()),
909 static_cast<uint32_t>(platform_key_certificate_string.length())
910 };
911 cdm_->OnPlatformChallengeResponse(response); 1075 cdm_->OnPlatformChallengeResponse(response);
912 1076
913 signed_data_var.Unmap(); 1077 signed_data_var.Unmap();
914 signed_data_signature_var.Unmap(); 1078 signed_data_signature_var.Unmap();
915 } 1079 }
916 1080
917 void CdmAdapter::EnableProtectionDone(int32_t result) { 1081 void CdmAdapter::EnableProtectionDone(int32_t result) {
918 // Does nothing since clients must call QueryOutputProtectionStatus() to 1082 // Does nothing since clients must call QueryOutputProtectionStatus() to
919 // inspect the protection status on a regular basis. 1083 // inspect the protection status on a regular basis.
920 CDM_DLOG() << __FUNCTION__ << " : " << result; 1084 CDM_DLOG() << __FUNCTION__ << " : " << result;
921 } 1085 }
922 1086
923 void CdmAdapter::QueryOutputProtectionStatusDone(int32_t result) { 1087 void CdmAdapter::QueryOutputProtectionStatusDone(int32_t result) {
924 PP_DCHECK(query_output_protection_in_progress_); 1088 PP_DCHECK(query_output_protection_in_progress_);
925 query_output_protection_in_progress_ = false; 1089 query_output_protection_in_progress_ = false;
926 1090
927 // Return a protection status of none on error. 1091 // Return a protection status of none on error.
928 if (result != PP_OK) 1092 if (result != PP_OK)
929 output_link_mask_ = output_protection_mask_ = 0; 1093 output_link_mask_ = output_protection_mask_ = 0;
930 1094
931 cdm_->OnQueryOutputProtectionStatus(output_link_mask_, 1095 cdm_->OnQueryOutputProtectionStatus(output_link_mask_,
932 output_protection_mask_); 1096 output_protection_mask_);
933 } 1097 }
934 #endif 1098 #endif
935 1099
1100 CdmAdapter::SessionError::SessionError(std::string error_name,
1101 uint32_t system_code,
1102 std::string error_description)
1103 : error_name(error_name),
ddorwin 2014/05/05 18:37:49 How will we transition from CDM_5 to prefixed? The
jrummell 2014/05/08 23:37:45 Done.
1104 system_code(system_code),
1105 error_description(error_description) {
1106 }
1107
936 void* GetCdmHost(int host_interface_version, void* user_data) { 1108 void* GetCdmHost(int host_interface_version, void* user_data) {
937 if (!host_interface_version || !user_data) 1109 if (!host_interface_version || !user_data)
938 return NULL; 1110 return NULL;
939 1111
940 COMPILE_ASSERT( 1112 COMPILE_ASSERT(
941 cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_4::kVersion, 1113 cdm::ContentDecryptionModule::Host::kVersion == cdm::Host_5::kVersion,
942 update_code_below); 1114 update_code_below);
943 1115
944 // Ensure IsSupportedCdmHostVersion matches implementation of this function. 1116 // Ensure IsSupportedCdmHostVersion matches implementation of this function.
945 // Always update this DCHECK when updating this function. 1117 // Always update this DCHECK when updating this function.
946 // If this check fails, update this function and DCHECK or update 1118 // If this check fails, update this function and DCHECK or update
947 // IsSupportedCdmHostVersion. 1119 // IsSupportedCdmHostVersion.
948 1120
949 PP_DCHECK( 1121 PP_DCHECK(
950 // Future version is not supported. 1122 // Future version is not supported.
951 !IsSupportedCdmHostVersion(cdm::Host_4::kVersion + 1) && 1123 !IsSupportedCdmHostVersion(cdm::Host_5::kVersion + 1) &&
952 // Current version is supported. 1124 // Current version is supported.
1125 IsSupportedCdmHostVersion(cdm::Host_5::kVersion) &&
1126 // Include all previous supported versions (if any) here.
953 IsSupportedCdmHostVersion(cdm::Host_4::kVersion) && 1127 IsSupportedCdmHostVersion(cdm::Host_4::kVersion) &&
954 // Include all previous supported versions (if any) here.
955 // No supported previous versions.
956 // One older than the oldest supported version is not supported. 1128 // One older than the oldest supported version is not supported.
957 !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1)); 1129 !IsSupportedCdmHostVersion(cdm::Host_4::kVersion - 1));
958 PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version)); 1130 PP_DCHECK(IsSupportedCdmHostVersion(host_interface_version));
959 1131
960 CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data); 1132 CdmAdapter* cdm_adapter = static_cast<CdmAdapter*>(user_data);
961 CDM_DLOG() << "Create CDM Host with version " << host_interface_version; 1133 CDM_DLOG() << "Create CDM Host with version " << host_interface_version;
962 switch (host_interface_version) { 1134 switch (host_interface_version) {
963 case cdm::Host_4::kVersion: 1135 case cdm::Host_4::kVersion:
964 return static_cast<cdm::Host_4*>(cdm_adapter); 1136 return static_cast<cdm::Host_4*>(cdm_adapter);
1137 case cdm::Host_5::kVersion:
1138 return static_cast<cdm::Host_5*>(cdm_adapter);
965 default: 1139 default:
966 PP_NOTREACHED(); 1140 PP_NOTREACHED();
967 return NULL; 1141 return NULL;
968 } 1142 }
969 } 1143 }
970 1144
971 // This object is the global object representing this plugin library as long 1145 // This object is the global object representing this plugin library as long
972 // as it is loaded. 1146 // as it is loaded.
973 class CdmAdapterModule : public pp::Module { 1147 class CdmAdapterModule : public pp::Module {
974 public: 1148 public:
(...skipping 17 matching lines...) Expand all
992 } // namespace media 1166 } // namespace media
993 1167
994 namespace pp { 1168 namespace pp {
995 1169
996 // Factory function for your specialization of the Module object. 1170 // Factory function for your specialization of the Module object.
997 Module* CreateModule() { 1171 Module* CreateModule() {
998 return new media::CdmAdapterModule(); 1172 return new media::CdmAdapterModule();
999 } 1173 }
1000 1174
1001 } // namespace pp 1175 } // namespace pp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698