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 #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/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "content/browser/android/content_view_core_impl.h" | 8 #include "content/browser/android/content_view_core_impl.h" |
| 9 #include "content/browser/media/android/browser_demuxer_android.h" | 9 #include "content/browser/media/android/browser_demuxer_android.h" |
| 10 #include "content/browser/media/android/media_resource_getter_impl.h" | 10 #include "content/browser/media/android/media_resource_getter_impl.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume) | 127 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume) |
| 128 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources) | 128 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources) |
| 129 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) | 129 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) |
| 130 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, | 130 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, |
| 131 DestroyAllMediaPlayers) | 131 DestroyAllMediaPlayers) |
| 132 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_InitializeCDM, | 132 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_InitializeCDM, |
| 133 OnInitializeCDM) | 133 OnInitializeCDM) |
| 134 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CreateSession, OnCreateSession) | 134 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CreateSession, OnCreateSession) |
| 135 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_UpdateSession, OnUpdateSession) | 135 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_UpdateSession, OnUpdateSession) |
| 136 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_ReleaseSession, OnReleaseSession) | 136 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_ReleaseSession, OnReleaseSession) |
| 137 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelSession, OnCancelSession) | |
| 137 #if defined(VIDEO_HOLE) | 138 #if defined(VIDEO_HOLE) |
| 138 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface, | 139 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface, |
| 139 OnNotifyExternalSurface) | 140 OnNotifyExternalSurface) |
| 140 #endif // defined(VIDEO_HOLE) | 141 #endif // defined(VIDEO_HOLE) |
| 141 IPC_MESSAGE_UNHANDLED(handled = false) | 142 IPC_MESSAGE_UNHANDLED(handled = false) |
| 142 IPC_END_MESSAGE_MAP() | 143 IPC_END_MESSAGE_MAP() |
| 143 return handled; | 144 return handled; |
| 144 } | 145 } |
| 145 | 146 |
| 146 void BrowserMediaPlayerManager::FullscreenPlayerPlay() { | 147 void BrowserMediaPlayerManager::FullscreenPlayerPlay() { |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 594 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 595 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 595 OnSessionError( | 596 OnSessionError( |
| 596 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); | 597 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 597 return; | 598 return; |
| 598 } | 599 } |
| 599 | 600 |
| 600 if (media_keys_ids_approved_.find(media_keys_id) == | 601 if (media_keys_ids_approved_.find(media_keys_id) == |
| 601 media_keys_ids_approved_.end()) { | 602 media_keys_ids_approved_.end()) { |
| 602 media_keys_ids_pending_approval_.insert(media_keys_id); | 603 media_keys_ids_pending_approval_.insert(media_keys_id); |
| 603 } | 604 } |
| 604 web_contents()->GetDelegate()->RequestProtectedMediaIdentifierPermission( | 605 |
| 605 web_contents(), | 606 BrowserContext* context = |
| 607 web_contents()->GetRenderProcessHost()->GetBrowserContext(); | |
| 608 | |
| 609 context->RequestProtectedMediaIdentifierPermission( | |
| 610 web_contents()->GetRenderProcessHost()->GetID(), | |
| 611 web_contents()->GetRenderViewHost()->GetRoutingID(), | |
| 612 session_id, | |
| 606 drm_bridge->frame_url(), | 613 drm_bridge->frame_url(), |
| 607 base::Bind(&BrowserMediaPlayerManager::GenerateKeyIfAllowed, | 614 base::Bind(&BrowserMediaPlayerManager::GenerateKeyIfAllowed, |
| 608 weak_ptr_factory_.GetWeakPtr(), | 615 weak_ptr_factory_.GetWeakPtr(), |
| 609 media_keys_id, | 616 media_keys_id, |
| 610 session_id, | 617 session_id, |
| 611 type, | 618 type, |
| 612 init_data)); | 619 init_data)); |
| 613 } | 620 } |
| 614 | 621 |
| 615 void BrowserMediaPlayerManager::OnUpdateSession( | 622 void BrowserMediaPlayerManager::OnUpdateSession( |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 647 if (!drm_bridge) { | 654 if (!drm_bridge) { |
| 648 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 655 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 649 OnSessionError( | 656 OnSessionError( |
| 650 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); | 657 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 651 return; | 658 return; |
| 652 } | 659 } |
| 653 | 660 |
| 654 drm_bridge->ReleaseSession(session_id); | 661 drm_bridge->ReleaseSession(session_id); |
| 655 } | 662 } |
| 656 | 663 |
| 664 void BrowserMediaPlayerManager::OnCancelSession(int media_keys_id, | |
| 665 uint32 session_id) { | |
| 666 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | |
| 667 if (!drm_bridge) { | |
| 668 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | |
| 669 OnSessionError( | |
| 670 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); | |
| 671 return; | |
| 672 } | |
| 673 | |
| 674 BrowserContext* context = | |
| 675 web_contents()->GetRenderProcessHost()->GetBrowserContext(); | |
| 676 | |
| 677 context->CancelProtectedMediaIdentifierPermissionRequest( | |
| 678 web_contents()->GetRenderProcessHost()->GetID(), | |
| 679 web_contents()->GetRenderViewHost()->GetRoutingID(), | |
| 680 static_cast<int>(session_id), | |
| 681 drm_bridge->frame_url()); | |
| 682 } | |
| 683 | |
| 657 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { | 684 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { |
| 658 DCHECK(!GetPlayer(player->player_id())); | 685 DCHECK(!GetPlayer(player->player_id())); |
| 659 players_.push_back(player); | 686 players_.push_back(player); |
| 660 if (player->IsRemote()) { | 687 if (player->IsRemote()) { |
| 661 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(routing_id(), | 688 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(routing_id(), |
| 662 player->player_id())); | 689 player->player_id())); |
| 663 } | 690 } |
| 664 } | 691 } |
| 665 | 692 |
| 666 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { | 693 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 739 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 766 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
| 740 if (!player || !drm_bridge) { | 767 if (!player || !drm_bridge) { |
| 741 DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; | 768 DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; |
| 742 return; | 769 return; |
| 743 } | 770 } |
| 744 // TODO(qinmin): add the logic to decide whether we should create the | 771 // TODO(qinmin): add the logic to decide whether we should create the |
| 745 // fullscreen surface for EME lv1. | 772 // fullscreen surface for EME lv1. |
| 746 player->SetDrmBridge(drm_bridge); | 773 player->SetDrmBridge(drm_bridge); |
| 747 } | 774 } |
| 748 | 775 |
| 749 void BrowserMediaPlayerManager::GenerateKeyIfAllowed( | 776 void BrowserMediaPlayerManager::GenerateKeyIfAllowed( |
|
xhwang
2013/12/21 00:40:48
This now should be renamed to CreateSessionIfAllow
Kibeom Kim (inactive)
2013/12/30 12:33:05
Done. (allowed-> permitted)
| |
| 750 int media_keys_id, | 777 int media_keys_id, |
| 751 uint32 session_id, | 778 uint32 session_id, |
| 752 const std::string& type, | 779 const std::string& type, |
| 753 const std::vector<uint8>& init_data, | 780 const std::vector<uint8>& init_data, |
| 754 bool allowed) { | 781 bool allowed) { |
| 782 Send(new MediaKeysMsg_SessionApproved( | |
| 783 routing_id(), media_keys_id, session_id, allowed)); | |
| 784 | |
| 755 if (!allowed) | 785 if (!allowed) |
| 756 return; | 786 return; |
|
ddorwin
2013/12/20 23:59:52
I'm surprised we don't already fire some event her
xhwang
2013/12/21 00:40:48
Yeah, we should call OnSessionError() before we re
Kibeom Kim (inactive)
2013/12/30 12:33:05
Done.
| |
| 757 | 787 |
| 758 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 788 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
| 759 if (!drm_bridge) { | 789 if (!drm_bridge) { |
| 760 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; | 790 DLOG(WARNING) << "No MediaDrmBridge for ID: " << media_keys_id << " found"; |
| 761 OnSessionError( | 791 OnSessionError( |
| 762 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); | 792 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); |
| 763 return; | 793 return; |
|
ddorwin
2013/12/20 23:59:52
Hmm, I see how this case makes using CreateSession
Kibeom Kim (inactive)
2013/12/30 12:33:05
Done.
| |
| 764 } | 794 } |
| 765 media_keys_ids_pending_approval_.erase(media_keys_id); | 795 media_keys_ids_pending_approval_.erase(media_keys_id); |
| 766 media_keys_ids_approved_.insert(media_keys_id); | 796 media_keys_ids_approved_.insert(media_keys_id); |
| 767 drm_bridge->CreateSession(session_id, type, &init_data[0], init_data.size()); | 797 drm_bridge->CreateSession(session_id, type, &init_data[0], init_data.size()); |
| 768 | 798 |
| 769 // TODO(qinmin): currently |media_keys_id| and player ID are identical. | 799 // TODO(qinmin): currently |media_keys_id| and player ID are identical. |
| 770 // This might not be true in the future. | 800 // This might not be true in the future. |
| 771 if (pending_fullscreen_player_id_ != media_keys_id) | 801 if (pending_fullscreen_player_id_ != media_keys_id) |
| 772 return; | 802 return; |
| 773 | 803 |
| 774 pending_fullscreen_player_id_ = -1; | 804 pending_fullscreen_player_id_ = -1; |
| 775 MediaPlayerAndroid* player = GetPlayer(media_keys_id); | 805 MediaPlayerAndroid* player = GetPlayer(media_keys_id); |
| 776 if (player->IsPlaying()) | 806 if (player->IsPlaying()) |
| 777 OnProtectedSurfaceRequested(media_keys_id); | 807 OnProtectedSurfaceRequested(media_keys_id); |
| 778 } | 808 } |
| 779 | 809 |
| 780 } // namespace content | 810 } // namespace content |
| OLD | NEW |