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

Side by Side Diff: content/browser/media/android/browser_media_player_manager.cc

Issue 276973005: BrowserMediaPlayerManager manages MediaKeys objects. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments addressed 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 | Annotate | Revision Log
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 "content/browser/media/android/browser_media_player_manager.h" 5 #include "content/browser/media/android/browser_media_player_manager.h"
6 6
7 #include "base/android/scoped_java_ref.h" 7 #include "base/android/scoped_java_ref.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/stl_util.h"
9 #include "content/browser/android/content_view_core_impl.h" 10 #include "content/browser/android/content_view_core_impl.h"
10 #include "content/browser/media/android/browser_demuxer_android.h" 11 #include "content/browser/media/android/browser_demuxer_android.h"
11 #include "content/browser/media/android/media_resource_getter_impl.h" 12 #include "content/browser/media/android/media_resource_getter_impl.h"
12 #include "content/browser/renderer_host/render_view_host_impl.h" 13 #include "content/browser/renderer_host/render_view_host_impl.h"
13 #include "content/browser/web_contents/web_contents_view_android.h" 14 #include "content/browser/web_contents/web_contents_view_android.h"
14 #include "content/common/media/cdm_messages.h" 15 #include "content/common/media/cdm_messages.h"
15 #include "content/common/media/media_player_messages_android.h" 16 #include "content/common/media/media_player_messages_android.h"
16 #include "content/public/browser/android/content_view_core.h" 17 #include "content/public/browser/android/content_view_core.h"
17 #include "content/public/browser/android/external_video_surface_container.h" 18 #include "content/public/browser/android/external_video_surface_container.h"
18 #include "content/public/browser/browser_context.h" 19 #include "content/public/browser/browser_context.h"
19 #include "content/public/browser/content_browser_client.h" 20 #include "content/public/browser/content_browser_client.h"
20 #include "content/public/browser/render_process_host.h" 21 #include "content/public/browser/render_process_host.h"
21 #include "content/public/browser/render_view_host.h" 22 #include "content/public/browser/render_view_host.h"
22 #include "content/public/browser/storage_partition.h" 23 #include "content/public/browser/storage_partition.h"
23 #include "content/public/browser/web_contents.h" 24 #include "content/public/browser/web_contents.h"
24 #include "content/public/browser/web_contents_delegate.h" 25 #include "content/public/browser/web_contents_delegate.h"
25 #include "content/public/common/content_client.h" 26 #include "content/public/common/content_client.h"
26 #include "content/public/common/content_switches.h" 27 #include "content/public/common/content_switches.h"
27 #include "media/base/android/media_drm_bridge.h"
28 #include "media/base/android/media_player_bridge.h" 28 #include "media/base/android/media_player_bridge.h"
29 #include "media/base/android/media_source_player.h" 29 #include "media/base/android/media_source_player.h"
30 #include "media/base/cdm_factory.h"
30 #include "media/base/media_switches.h" 31 #include "media/base/media_switches.h"
31 32
32 using media::MediaDrmBridge; 33 using media::MediaKeys;
33 using media::MediaPlayerAndroid; 34 using media::MediaPlayerAndroid;
34 using media::MediaPlayerBridge; 35 using media::MediaPlayerBridge;
35 using media::MediaPlayerManager; 36 using media::MediaPlayerManager;
36 using media::MediaSourcePlayer; 37 using media::MediaSourcePlayer;
37 38
38 namespace content { 39 namespace content {
39 40
40 // Threshold on the number of media players per renderer before we start 41 // Threshold on the number of media players per renderer before we start
41 // attempting to release inactive media players. 42 // attempting to release inactive media players.
42 const int kMediaPlayerThreshold = 1; 43 const int kMediaPlayerThreshold = 1;
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 336
336 MediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { 337 MediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) {
337 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 338 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
338 it != players_.end(); ++it) { 339 it != players_.end(); ++it) {
339 if ((*it)->player_id() == player_id) 340 if ((*it)->player_id() == player_id)
340 return *it; 341 return *it;
341 } 342 }
342 return NULL; 343 return NULL;
343 } 344 }
344 345
345 MediaDrmBridge* BrowserMediaPlayerManager::GetDrmBridge(int cdm_id) { 346 MediaKeys* BrowserMediaPlayerManager::GetCdm(int cdm_id) {
346 for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); 347 CdmMap::const_iterator iter = cdm_map_.find(cdm_id);
347 it != drm_bridges_.end(); ++it) { 348 return (iter == cdm_map_.end()) ? NULL : iter->second;
348 if ((*it)->cdm_id() == cdm_id)
349 return *it;
350 }
351 return NULL;
352 } 349 }
353 350
354 void BrowserMediaPlayerManager::DestroyAllMediaPlayers() { 351 void BrowserMediaPlayerManager::DestroyAllMediaPlayers() {
355 players_.clear(); 352 players_.clear();
356 drm_bridges_.clear(); 353 STLDeleteValues(&cdm_map_);
357 if (fullscreen_player_id_ != -1) { 354 if (fullscreen_player_id_ != -1) {
358 video_view_.reset(); 355 video_view_.reset();
359 fullscreen_player_id_ = -1; 356 fullscreen_player_id_ = -1;
360 } 357 }
361 } 358 }
362 359
363 void BrowserMediaPlayerManager::RequestFullScreen(int player_id) { 360 void BrowserMediaPlayerManager::RequestFullScreen(int player_id) {
364 if (fullscreen_player_id_ == player_id) 361 if (fullscreen_player_id_ == player_id)
365 return; 362 return;
366 363
(...skipping 20 matching lines...) Expand all
387 uint32 session_id, 384 uint32 session_id,
388 const std::string& web_session_id) { 385 const std::string& web_session_id) {
389 Send(new CdmMsg_SessionCreated( 386 Send(new CdmMsg_SessionCreated(
390 routing_id(), cdm_id, session_id, web_session_id)); 387 routing_id(), cdm_id, session_id, web_session_id));
391 } 388 }
392 389
393 void BrowserMediaPlayerManager::OnSessionMessage( 390 void BrowserMediaPlayerManager::OnSessionMessage(
394 int cdm_id, 391 int cdm_id,
395 uint32 session_id, 392 uint32 session_id,
396 const std::vector<uint8>& message, 393 const std::vector<uint8>& message,
397 const GURL& destination_url) { 394 const std::string& destination_url) {
395 GURL destination_gurl(destination_url);
396 if (!destination_gurl.is_valid() && !destination_gurl.is_empty()) {
397 DLOG(WARNING) << "SessionMessage destination_url is invalid : "
398 << destination_gurl.possibly_invalid_spec();
399 destination_gurl = GURL::EmptyGURL(); // Replace invalid destination_url.
400 }
401
398 Send(new CdmMsg_SessionMessage( 402 Send(new CdmMsg_SessionMessage(
399 routing_id(), cdm_id, session_id, message, destination_url)); 403 routing_id(), cdm_id, session_id, message, destination_gurl));
400 } 404 }
401 405
402 void BrowserMediaPlayerManager::OnSessionReady(int cdm_id, uint32 session_id) { 406 void BrowserMediaPlayerManager::OnSessionReady(int cdm_id, uint32 session_id) {
403 Send(new CdmMsg_SessionReady(routing_id(), cdm_id, session_id)); 407 Send(new CdmMsg_SessionReady(routing_id(), cdm_id, session_id));
404 } 408 }
405 409
406 void BrowserMediaPlayerManager::OnSessionClosed(int cdm_id, uint32 session_id) { 410 void BrowserMediaPlayerManager::OnSessionClosed(int cdm_id, uint32 session_id) {
407 Send(new CdmMsg_SessionClosed(routing_id(), cdm_id, session_id)); 411 Send(new CdmMsg_SessionClosed(routing_id(), cdm_id, session_id));
408 } 412 }
409 413
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 RemovePlayer(player_id); 588 RemovePlayer(player_id);
585 if (fullscreen_player_id_ == player_id) 589 if (fullscreen_player_id_ == player_id)
586 fullscreen_player_id_ = -1; 590 fullscreen_player_id_ = -1;
587 } 591 }
588 592
589 void BrowserMediaPlayerManager::OnInitializeCdm(int cdm_id, 593 void BrowserMediaPlayerManager::OnInitializeCdm(int cdm_id,
590 const std::string& key_system, 594 const std::string& key_system,
591 const GURL& security_origin) { 595 const GURL& security_origin) {
592 if (key_system.size() > kMaxKeySystemLength) { 596 if (key_system.size() > kMaxKeySystemLength) {
593 // This failure will be discovered and reported by OnCreateSession() 597 // This failure will be discovered and reported by OnCreateSession()
594 // as GetDrmBridge() will return null. 598 // as GetCdm() will return null.
595 NOTREACHED() << "Invalid key system: " << key_system; 599 NOTREACHED() << "Invalid key system: " << key_system;
596 return; 600 return;
597 } 601 }
598 602
599 if (!MediaDrmBridge::IsKeySystemSupported(key_system)) { 603 AddCdm(cdm_id, key_system, security_origin);
600 NOTREACHED() << "Unsupported key system: " << key_system;
601 return;
602 }
603
604 AddDrmBridge(cdm_id, key_system, security_origin);
605 } 604 }
606 605
607 void BrowserMediaPlayerManager::OnCreateSession( 606 void BrowserMediaPlayerManager::OnCreateSession(
608 int cdm_id, 607 int cdm_id,
609 uint32 session_id, 608 uint32 session_id,
610 CdmHostMsg_CreateSession_ContentType content_type, 609 CdmHostMsg_CreateSession_ContentType content_type,
611 const std::vector<uint8>& init_data) { 610 const std::vector<uint8>& init_data) {
612 if (init_data.size() > kMaxInitDataLength) { 611 if (init_data.size() > kMaxInitDataLength) {
613 LOG(WARNING) << "InitData for ID: " << cdm_id 612 LOG(WARNING) << "InitData for ID: " << cdm_id
614 << " too long: " << init_data.size(); 613 << " too long: " << init_data.size();
(...skipping 17 matching lines...) Expand all
632 NOTREACHED(); 631 NOTREACHED();
633 return; 632 return;
634 } 633 }
635 634
636 if (CommandLine::ForCurrentProcess() 635 if (CommandLine::ForCurrentProcess()
637 ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) { 636 ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) {
638 CreateSessionIfPermitted(cdm_id, session_id, mime_type, init_data, true); 637 CreateSessionIfPermitted(cdm_id, session_id, mime_type, init_data, true);
639 return; 638 return;
640 } 639 }
641 640
642 MediaDrmBridge* drm_bridge = GetDrmBridge(cdm_id); 641 MediaKeys* cdm = GetCdm(cdm_id);
643 if (!drm_bridge) { 642 if (!cdm) {
644 DLOG(WARNING) << "No MediaDrmBridge for ID: " << cdm_id << " found"; 643 DLOG(WARNING) << "No CDM for ID " << cdm_id << " found";
645 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); 644 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
646 return; 645 return;
647 } 646 }
648 647
649 BrowserContext* context = 648 BrowserContext* context =
650 web_contents()->GetRenderProcessHost()->GetBrowserContext(); 649 web_contents()->GetRenderProcessHost()->GetBrowserContext();
651 650
651 std::map<int, GURL>::const_iterator iter =
652 cdm_security_origin_map_.find(cdm_id);
653 if (iter == cdm_security_origin_map_.end()) {
654 NOTREACHED();
655 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
656 return;
657 }
658
652 context->RequestProtectedMediaIdentifierPermission( 659 context->RequestProtectedMediaIdentifierPermission(
653 web_contents()->GetRenderProcessHost()->GetID(), 660 web_contents()->GetRenderProcessHost()->GetID(),
654 web_contents()->GetRenderViewHost()->GetRoutingID(), 661 web_contents()->GetRenderViewHost()->GetRoutingID(),
655 static_cast<int>(session_id), 662 static_cast<int>(session_id),
656 cdm_id, 663 cdm_id,
657 drm_bridge->security_origin(), 664 iter->second,
658 base::Bind(&BrowserMediaPlayerManager::CreateSessionIfPermitted, 665 base::Bind(&BrowserMediaPlayerManager::CreateSessionIfPermitted,
659 weak_ptr_factory_.GetWeakPtr(), 666 weak_ptr_factory_.GetWeakPtr(),
660 cdm_id, 667 cdm_id,
661 session_id, 668 session_id,
662 mime_type, 669 mime_type,
663 init_data)); 670 init_data));
664 } 671 }
665 672
666 void BrowserMediaPlayerManager::OnUpdateSession( 673 void BrowserMediaPlayerManager::OnUpdateSession(
667 int cdm_id, 674 int cdm_id,
668 uint32 session_id, 675 uint32 session_id,
669 const std::vector<uint8>& response) { 676 const std::vector<uint8>& response) {
670 MediaDrmBridge* drm_bridge = GetDrmBridge(cdm_id); 677 MediaKeys* cdm = GetCdm(cdm_id);
671 if (!drm_bridge) { 678 if (!cdm) {
672 DLOG(WARNING) << "No MediaDrmBridge for ID: " << cdm_id << " found"; 679 DLOG(WARNING) << "No CDM for ID " << cdm_id << " found";
673 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); 680 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
674 return; 681 return;
675 } 682 }
676 683
677 if (response.size() > kMaxSessionResponseLength) { 684 if (response.size() > kMaxSessionResponseLength) {
678 LOG(WARNING) << "Response for ID: " << cdm_id 685 LOG(WARNING) << "Response for ID " << cdm_id
679 << " too long: " << response.size(); 686 << " is too long: " << response.size();
680 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); 687 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
681 return; 688 return;
682 } 689 }
683 690
684 drm_bridge->UpdateSession(session_id, &response[0], response.size()); 691 cdm->UpdateSession(session_id, &response[0], response.size());
685 692
686 DrmBridgePlayerMap::const_iterator iter = drm_bridge_player_map_.find(cdm_id); 693 CdmToPlayerMap::const_iterator iter = cdm_to_player_map_.find(cdm_id);
687 if (iter == drm_bridge_player_map_.end()) 694 if (iter == cdm_to_player_map_.end())
688 return; 695 return;
689 696
690 int player_id = iter->second; 697 int player_id = iter->second;
691 MediaPlayerAndroid* player = GetPlayer(player_id); 698 MediaPlayerAndroid* player = GetPlayer(player_id);
692 if (player) 699 if (player)
693 player->OnKeyAdded(); 700 player->OnKeyAdded();
694 } 701 }
695 702
696 void BrowserMediaPlayerManager::OnReleaseSession(int cdm_id, 703 void BrowserMediaPlayerManager::OnReleaseSession(int cdm_id,
697 uint32 session_id) { 704 uint32 session_id) {
698 MediaDrmBridge* drm_bridge = GetDrmBridge(cdm_id); 705 MediaKeys* cdm = GetCdm(cdm_id);
699 if (!drm_bridge) { 706 if (!cdm) {
700 DLOG(WARNING) << "No MediaDrmBridge for ID: " << cdm_id << " found"; 707 DLOG(WARNING) << "No CDM for ID " << cdm_id << " found";
701 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); 708 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
702 return; 709 return;
703 } 710 }
704 711
705 drm_bridge->ReleaseSession(session_id); 712 cdm->ReleaseSession(session_id);
706 } 713 }
707 714
708 void BrowserMediaPlayerManager::OnDestroyCdm(int cdm_id) { 715 void BrowserMediaPlayerManager::OnDestroyCdm(int cdm_id) {
709 MediaDrmBridge* drm_bridge = GetDrmBridge(cdm_id); 716 MediaKeys* cdm = GetCdm(cdm_id);
710 if (!drm_bridge) return; 717 if (!cdm)
718 return;
711 719
712 CancelAllPendingSessionCreations(cdm_id); 720 CancelAllPendingSessionCreations(cdm_id);
713 RemoveDrmBridge(cdm_id); 721 RemoveCdm(cdm_id);
714 } 722 }
715 723
716 void BrowserMediaPlayerManager::CancelAllPendingSessionCreations(int cdm_id) { 724 void BrowserMediaPlayerManager::CancelAllPendingSessionCreations(int cdm_id) {
717 BrowserContext* context = 725 BrowserContext* context =
718 web_contents()->GetRenderProcessHost()->GetBrowserContext(); 726 web_contents()->GetRenderProcessHost()->GetBrowserContext();
719 context->CancelProtectedMediaIdentifierPermissionRequests(cdm_id); 727 context->CancelProtectedMediaIdentifierPermissionRequests(cdm_id);
720 } 728 }
721 729
722 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { 730 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) {
723 DCHECK(!GetPlayer(player->player_id())); 731 DCHECK(!GetPlayer(player->player_id()));
724 players_.push_back(player); 732 players_.push_back(player);
725 } 733 }
726 734
727 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { 735 void BrowserMediaPlayerManager::RemovePlayer(int player_id) {
728 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 736 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
729 it != players_.end(); ++it) { 737 it != players_.end(); ++it) {
730 MediaPlayerAndroid* player = *it; 738 MediaPlayerAndroid* player = *it;
731 if (player->player_id() == player_id) { 739 if (player->player_id() == player_id) {
732 players_.erase(it); 740 players_.erase(it);
733 break; 741 break;
734 } 742 }
735 } 743 }
736 744
737 for (DrmBridgePlayerMap::iterator it = drm_bridge_player_map_.begin(); 745 for (CdmToPlayerMap::iterator it = cdm_to_player_map_.begin();
738 it != drm_bridge_player_map_.end(); ++it) { 746 it != cdm_to_player_map_.end();
747 ++it) {
739 if (it->second == player_id) { 748 if (it->second == player_id) {
740 drm_bridge_player_map_.erase(it); 749 cdm_to_player_map_.erase(it);
741 break; 750 break;
742 } 751 }
743 } 752 }
744 } 753 }
745 754
746 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( 755 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer(
747 int player_id, media::MediaPlayerAndroid* player) { 756 int player_id, media::MediaPlayerAndroid* player) {
748 media::MediaPlayerAndroid* previous_player = NULL; 757 media::MediaPlayerAndroid* previous_player = NULL;
749 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); 758 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin();
750 it != players_.end(); ++it) { 759 it != players_.end(); ++it) {
751 if ((*it)->player_id() == player_id) { 760 if ((*it)->player_id() == player_id) {
752 previous_player = *it; 761 previous_player = *it;
753 players_.weak_erase(it); 762 players_.weak_erase(it);
754 players_.push_back(player); 763 players_.push_back(player);
755 break; 764 break;
756 } 765 }
757 } 766 }
758 return scoped_ptr<media::MediaPlayerAndroid>(previous_player); 767 return scoped_ptr<media::MediaPlayerAndroid>(previous_player);
759 } 768 }
760 769
761 void BrowserMediaPlayerManager::AddDrmBridge(int cdm_id, 770 void BrowserMediaPlayerManager::AddCdm(int cdm_id,
762 const std::string& key_system, 771 const std::string& key_system,
763 const GURL& security_origin) { 772 const GURL& security_origin) {
764 DCHECK(!GetDrmBridge(cdm_id)); 773 DCHECK(!GetCdm(cdm_id));
774 base::WeakPtr<BrowserMediaPlayerManager> weak_this =
775 weak_ptr_factory_.GetWeakPtr();
765 776
766 scoped_ptr<MediaDrmBridge> drm_bridge( 777 scoped_ptr<MediaKeys> cdm(media::CreateBrowserCdm(
767 MediaDrmBridge::Create(cdm_id, key_system, security_origin, this)); 778 key_system,
768 if (!drm_bridge) { 779 base::Bind(
780 &BrowserMediaPlayerManager::OnSessionCreated, weak_this, cdm_id),
781 base::Bind(
782 &BrowserMediaPlayerManager::OnSessionMessage, weak_this, cdm_id),
783 base::Bind(
784 &BrowserMediaPlayerManager::OnSessionReady, weak_this, cdm_id),
785 base::Bind(
786 &BrowserMediaPlayerManager::OnSessionClosed, weak_this, cdm_id),
787 base::Bind(
788 &BrowserMediaPlayerManager::OnSessionError, weak_this, cdm_id)));
789
790 if (!cdm) {
769 // This failure will be discovered and reported by OnCreateSession() 791 // This failure will be discovered and reported by OnCreateSession()
770 // as GetDrmBridge() will return null. 792 // as GetCdm() will return null.
771 DVLOG(1) << "failed to create drm bridge."; 793 DVLOG(1) << "failed to create CDM.";
772 return; 794 return;
773 } 795 }
774 796
775 // TODO(xhwang/ddorwin): Pass the security level from key system. 797 cdm_map_[cdm_id] = cdm.release();
776 MediaDrmBridge::SecurityLevel security_level = 798 cdm_security_origin_map_[cdm_id] = security_origin;
777 MediaDrmBridge::SECURITY_LEVEL_3;
778 if (CommandLine::ForCurrentProcess()
779 ->HasSwitch(switches::kMediaDrmEnableNonCompositing)) {
780 security_level = MediaDrmBridge::SECURITY_LEVEL_1;
781 }
782 if (!drm_bridge->SetSecurityLevel(security_level)) {
783 DVLOG(1) << "failed to set security level " << security_level;
784 return;
785 }
786
787 drm_bridges_.push_back(drm_bridge.release());
788 } 799 }
789 800
790 void BrowserMediaPlayerManager::RemoveDrmBridge(int cdm_id) { 801 void BrowserMediaPlayerManager::RemoveCdm(int cdm_id) {
791 // TODO(xhwang): Detach DrmBridge from the player it's set to. In prefixed 802 // TODO(xhwang): Detach CDM from the player it's set to. In prefixed
792 // EME implementation the current code is fine because we always destroy the 803 // EME implementation the current code is fine because we always destroy the
793 // player before we destroy the DrmBridge. This will not always be the case 804 // player before we destroy the DrmBridge. This will not always be the case
794 // in unprefixed EME implementation. 805 // in unprefixed EME implementation.
795 for (ScopedVector<MediaDrmBridge>::iterator it = drm_bridges_.begin(); 806 CdmMap::iterator iter = cdm_map_.find(cdm_id);
796 it != drm_bridges_.end(); ++it) { 807 if (iter != cdm_map_.end()) {
797 if ((*it)->cdm_id() == cdm_id) { 808 delete iter->second;
798 drm_bridges_.erase(it); 809 cdm_map_.erase(iter);
799 drm_bridge_player_map_.erase(cdm_id);
800 break;
801 }
802 } 810 }
811 cdm_to_player_map_.erase(cdm_id);
812 cdm_security_origin_map_.erase(cdm_id);
803 } 813 }
804 814
805 void BrowserMediaPlayerManager::OnSetCdm(int player_id, int cdm_id) { 815 void BrowserMediaPlayerManager::OnSetCdm(int player_id, int cdm_id) {
806 MediaPlayerAndroid* player = GetPlayer(player_id); 816 MediaPlayerAndroid* player = GetPlayer(player_id);
807 MediaDrmBridge* drm_bridge = GetDrmBridge(cdm_id); 817 MediaKeys* cdm = GetCdm(cdm_id);
808 if (!drm_bridge || !player) { 818 if (!cdm || !player) {
809 DVLOG(1) << "Cannot set CDM on the specified player."; 819 DVLOG(1) << "Cannot set CDM on the specified player.";
810 return; 820 return;
811 } 821 }
812 822
813 // TODO(qinmin): add the logic to decide whether we should create the 823 // TODO(qinmin): add the logic to decide whether we should create the
814 // fullscreen surface for EME lv1. 824 // fullscreen surface for EME lv1.
815 player->SetDrmBridge(drm_bridge); 825 player->SetCdm(cdm);
816 // Do now support setting one CDM on multiple players. 826 // Do now support setting one CDM on multiple players.
817 DCHECK(drm_bridge_player_map_.find(cdm_id) == drm_bridge_player_map_.end()); 827
818 drm_bridge_player_map_[cdm_id] = player_id; 828 if (ContainsKey(cdm_to_player_map_, cdm_id)) {
829 DVLOG(1) << "CDM is already set on another player.";
830 return;
831 }
832
833 cdm_to_player_map_[cdm_id] = player_id;
819 } 834 }
820 835
821 void BrowserMediaPlayerManager::CreateSessionIfPermitted( 836 void BrowserMediaPlayerManager::CreateSessionIfPermitted(
822 int cdm_id, 837 int cdm_id,
823 uint32 session_id, 838 uint32 session_id,
824 const std::string& content_type, 839 const std::string& content_type,
825 const std::vector<uint8>& init_data, 840 const std::vector<uint8>& init_data,
826 bool permitted) { 841 bool permitted) {
827 if (!permitted) { 842 if (!permitted) {
828 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); 843 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
829 return; 844 return;
830 } 845 }
831 846
832 MediaDrmBridge* drm_bridge = GetDrmBridge(cdm_id); 847 MediaKeys* cdm = GetCdm(cdm_id);
833 if (!drm_bridge) { 848 if (!cdm) {
834 DLOG(WARNING) << "No MediaDrmBridge for ID: " << cdm_id << " found"; 849 DLOG(WARNING) << "No CDM for ID: " << cdm_id << " found";
835 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); 850 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0);
836 return; 851 return;
837 } 852 }
838 853
839 // This could fail, in which case a SessionError will be fired. 854 // This could fail, in which case a SessionError will be fired.
840 drm_bridge->CreateSession( 855 cdm->CreateSession(session_id, content_type, &init_data[0], init_data.size());
841 session_id, content_type, &init_data[0], init_data.size());
842 } 856 }
843 857
844 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( 858 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer(
845 MediaPlayerAndroid* player) { 859 MediaPlayerAndroid* player) {
846 player->Release(); 860 player->Release();
847 } 861 }
848 862
849 void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { 863 void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) {
850 int num_active_player = 0; 864 int num_active_player = 0;
851 ScopedVector<MediaPlayerAndroid>::iterator it; 865 ScopedVector<MediaPlayerAndroid>::iterator it;
(...skipping 26 matching lines...) Expand all
878 #if defined(VIDEO_HOLE) 892 #if defined(VIDEO_HOLE)
879 MediaPlayerAndroid* player = GetPlayer(player_id); 893 MediaPlayerAndroid* player = GetPlayer(player_id);
880 if (player && player->IsSurfaceInUse()) 894 if (player && player->IsSurfaceInUse())
881 return; 895 return;
882 if (external_video_surface_container_) 896 if (external_video_surface_container_)
883 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); 897 external_video_surface_container_->ReleaseExternalVideoSurface(player_id);
884 #endif // defined(VIDEO_HOLE) 898 #endif // defined(VIDEO_HOLE)
885 } 899 }
886 900
887 } // namespace content 901 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698