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 |