| Index: content/browser/media/android/browser_media_player_manager.cc
|
| diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc
|
| index b4a71e89ae150a93837beaabc5b506faf57ae9ef..f19783bb168189866b21f1b1ccf06ae795ca5a56 100644
|
| --- a/content/browser/media/android/browser_media_player_manager.cc
|
| +++ b/content/browser/media/android/browser_media_player_manager.cc
|
| @@ -127,6 +127,7 @@ MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer(
|
| BrowserMediaPlayerManager::BrowserMediaPlayerManager(
|
| RenderViewHost* render_view_host)
|
| : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)),
|
| + current_cdm_routing_id_(MSG_ROUTING_NONE),
|
| fullscreen_player_id_(-1),
|
| fullscreen_player_is_released_(false),
|
| web_contents_(WebContents::FromRenderViewHost(render_view_host)),
|
| @@ -135,6 +136,24 @@ BrowserMediaPlayerManager::BrowserMediaPlayerManager(
|
|
|
| BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {}
|
|
|
| +bool BrowserMediaPlayerManager::OnMessageReceived(
|
| + const IPC::Message& message,
|
| + RenderFrameHost* render_frame_host) {
|
| + current_cdm_routing_id_ = render_frame_host->GetRoutingID();
|
| + DCHECK_NE(MSG_ROUTING_NONE, current_cdm_routing_id_);
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(BrowserMediaPlayerManager, message)
|
| + IPC_MESSAGE_HANDLER(CdmHostMsg_InitializeCdm, OnInitializeCdm)
|
| + IPC_MESSAGE_HANDLER(CdmHostMsg_CreateSession, OnCreateSession)
|
| + IPC_MESSAGE_HANDLER(CdmHostMsg_UpdateSession, OnUpdateSession)
|
| + IPC_MESSAGE_HANDLER(CdmHostMsg_ReleaseSession, OnReleaseSession)
|
| + IPC_MESSAGE_HANDLER(CdmHostMsg_DestroyCdm, OnDestroyCdm)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + current_cdm_routing_id_ = MSG_ROUTING_NONE;
|
| + return handled;
|
| +}
|
| +
|
| bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
|
| bool handled = true;
|
| IPC_BEGIN_MESSAGE_MAP(BrowserMediaPlayerManager, msg)
|
| @@ -151,11 +170,6 @@ bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
|
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers,
|
| DestroyAllMediaPlayers)
|
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetCdm, OnSetCdm)
|
| - IPC_MESSAGE_HANDLER(CdmHostMsg_InitializeCdm, OnInitializeCdm)
|
| - IPC_MESSAGE_HANDLER(CdmHostMsg_CreateSession, OnCreateSession)
|
| - IPC_MESSAGE_HANDLER(CdmHostMsg_UpdateSession, OnUpdateSession)
|
| - IPC_MESSAGE_HANDLER(CdmHostMsg_ReleaseSession, OnReleaseSession)
|
| - IPC_MESSAGE_HANDLER(CdmHostMsg_DestroyCdm, OnDestroyCdm)
|
| #if defined(VIDEO_HOLE)
|
| IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface,
|
| OnNotifyExternalSurface)
|
| @@ -387,7 +401,7 @@ void BrowserMediaPlayerManager::OnSessionCreated(
|
| uint32 session_id,
|
| const std::string& web_session_id) {
|
| Send(new CdmMsg_SessionCreated(
|
| - routing_id(), cdm_id, session_id, web_session_id));
|
| + GetCdmRoutingId(cdm_id), cdm_id, session_id, web_session_id));
|
| }
|
|
|
| void BrowserMediaPlayerManager::OnSessionMessage(
|
| @@ -396,15 +410,15 @@ void BrowserMediaPlayerManager::OnSessionMessage(
|
| const std::vector<uint8>& message,
|
| const GURL& destination_url) {
|
| Send(new CdmMsg_SessionMessage(
|
| - routing_id(), cdm_id, session_id, message, destination_url));
|
| + GetCdmRoutingId(cdm_id), cdm_id, session_id, message, destination_url));
|
| }
|
|
|
| void BrowserMediaPlayerManager::OnSessionReady(int cdm_id, uint32 session_id) {
|
| - Send(new CdmMsg_SessionReady(routing_id(), cdm_id, session_id));
|
| + Send(new CdmMsg_SessionReady(GetCdmRoutingId(cdm_id), cdm_id, session_id));
|
| }
|
|
|
| void BrowserMediaPlayerManager::OnSessionClosed(int cdm_id, uint32 session_id) {
|
| - Send(new CdmMsg_SessionClosed(routing_id(), cdm_id, session_id));
|
| + Send(new CdmMsg_SessionClosed(GetCdmRoutingId(cdm_id), cdm_id, session_id));
|
| }
|
|
|
| void BrowserMediaPlayerManager::OnSessionError(
|
| @@ -412,8 +426,15 @@ void BrowserMediaPlayerManager::OnSessionError(
|
| uint32 session_id,
|
| media::MediaKeys::KeyError error_code,
|
| uint32 system_code) {
|
| + // If session error happens in a CDM IPC message handler, always use
|
| + // |current_cdm_routing_id_|. Otherwise, the error must be from the
|
| + // MediaDrmBridge. Use the stored CDM routing ID in this case.
|
| + int cdm_routing_id = (current_cdm_routing_id_ != MSG_ROUTING_NONE)
|
| + ? current_cdm_routing_id_
|
| + : GetCdmRoutingId(cdm_id);
|
| +
|
| Send(new CdmMsg_SessionError(
|
| - routing_id(), cdm_id, session_id, error_code, system_code));
|
| + cdm_routing_id, cdm_id, session_id, error_code, system_code));
|
| }
|
|
|
| #if defined(VIDEO_HOLE)
|
| @@ -589,6 +610,8 @@ void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) {
|
| void BrowserMediaPlayerManager::OnInitializeCdm(int cdm_id,
|
| const std::string& key_system,
|
| const GURL& security_origin) {
|
| + DCHECK(cdm_to_routing_id_map_.find(cdm_id) == cdm_to_routing_id_map_.end());
|
| +
|
| if (key_system.size() > kMaxKeySystemLength) {
|
| // This failure will be discovered and reported by OnCreateSession()
|
| // as GetDrmBridge() will return null.
|
| @@ -601,7 +624,8 @@ void BrowserMediaPlayerManager::OnInitializeCdm(int cdm_id,
|
| return;
|
| }
|
|
|
| - AddDrmBridge(cdm_id, key_system, security_origin);
|
| + if (AddDrmBridge(cdm_id, key_system, security_origin))
|
| + cdm_to_routing_id_map_[cdm_id] = current_cdm_routing_id_;
|
| }
|
|
|
| void BrowserMediaPlayerManager::OnCreateSession(
|
| @@ -758,7 +782,7 @@ scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer(
|
| return scoped_ptr<media::MediaPlayerAndroid>(previous_player);
|
| }
|
|
|
| -void BrowserMediaPlayerManager::AddDrmBridge(int cdm_id,
|
| +bool BrowserMediaPlayerManager::AddDrmBridge(int cdm_id,
|
| const std::string& key_system,
|
| const GURL& security_origin) {
|
| DCHECK(!GetDrmBridge(cdm_id));
|
| @@ -769,7 +793,7 @@ void BrowserMediaPlayerManager::AddDrmBridge(int cdm_id,
|
| // This failure will be discovered and reported by OnCreateSession()
|
| // as GetDrmBridge() will return null.
|
| DVLOG(1) << "failed to create drm bridge.";
|
| - return;
|
| + return false;
|
| }
|
|
|
| // TODO(xhwang/ddorwin): Pass the security level from key system.
|
| @@ -781,10 +805,11 @@ void BrowserMediaPlayerManager::AddDrmBridge(int cdm_id,
|
| }
|
| if (!drm_bridge->SetSecurityLevel(security_level)) {
|
| DVLOG(1) << "failed to set security level " << security_level;
|
| - return;
|
| + return false;
|
| }
|
|
|
| drm_bridges_.push_back(drm_bridge.release());
|
| + return true;
|
| }
|
|
|
| void BrowserMediaPlayerManager::RemoveDrmBridge(int cdm_id) {
|
| @@ -797,6 +822,7 @@ void BrowserMediaPlayerManager::RemoveDrmBridge(int cdm_id) {
|
| if ((*it)->cdm_id() == cdm_id) {
|
| drm_bridges_.erase(it);
|
| drm_bridge_player_map_.erase(cdm_id);
|
| + cdm_to_routing_id_map_.erase(cdm_id);
|
| break;
|
| }
|
| }
|
| @@ -884,4 +910,9 @@ void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) {
|
| #endif // defined(VIDEO_HOLE)
|
| }
|
|
|
| +int BrowserMediaPlayerManager::GetCdmRoutingId(int cdm_id) {
|
| + DCHECK(cdm_to_routing_id_map_.find(cdm_id) != cdm_to_routing_id_map_.end());
|
| + return cdm_to_routing_id_map_[cdm_id];
|
| +}
|
| +
|
| } // namespace content
|
|
|