Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / browser / media / android / browser_media_player_manager.cc
index 04cde98..185e0b3 100644 (file)
@@ -39,9 +39,8 @@ static const int kMediaPlayerThreshold = 1;
 // prevent unnecessarily large messages from being passed around, and the sizes
 // are somewhat arbitrary as the EME specification doesn't specify any limits.
 static const size_t kEmeUuidSize = 16;
-static const size_t kEmeTypeMaximum = 50;  // Type is a MIME type.
-static const size_t kEmeInitDataMaximum = 10240;  // 10 KB
-static const size_t kEmeResponseMaximum = 10240;  // 10 KB
+static const size_t kEmeInitDataMaximum = 64 * 1024;  // 64 KB
+static const size_t kEmeResponseMaximum = 64 * 1024;  // 64 KB
 
 namespace content {
 
@@ -117,6 +116,7 @@ BrowserMediaPlayerManager::BrowserMediaPlayerManager(
     : WebContentsObserver(WebContents::FromRenderViewHost(render_view_host)),
       fullscreen_player_id_(-1),
       pending_fullscreen_player_id_(-1),
+      fullscreen_player_is_released_(false),
       web_contents_(WebContents::FromRenderViewHost(render_view_host)),
       weak_ptr_factory_(this) {
 }
@@ -133,6 +133,7 @@ bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Seek, OnSeek)
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Pause, OnPause)
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume)
+    IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetPoster, OnSetPoster)
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources)
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer)
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers,
@@ -142,8 +143,7 @@ bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
     IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CreateSession, OnCreateSession)
     IPC_MESSAGE_HANDLER(MediaKeysHostMsg_UpdateSession, OnUpdateSession)
     IPC_MESSAGE_HANDLER(MediaKeysHostMsg_ReleaseSession, OnReleaseSession)
-    IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelAllPendingSessionCreations,
-                        OnCancelAllPendingSessionCreations)
+    IPC_MESSAGE_HANDLER(MediaKeysHostMsg_DestroyCdm, OnDestroyCdm)
 #if defined(VIDEO_HOLE)
     IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface,
                         OnNotifyExternalSurface)
@@ -156,6 +156,10 @@ bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
 void BrowserMediaPlayerManager::FullscreenPlayerPlay() {
   MediaPlayerAndroid* player = GetFullscreenPlayer();
   if (player) {
+    if (fullscreen_player_is_released_) {
+      video_view_->OpenVideo();
+      fullscreen_player_is_released_ = false;
+    }
     player->Start();
     Send(new MediaPlayerMsg_DidMediaPlayerPlay(
         routing_id(), fullscreen_player_id_));
@@ -202,24 +206,11 @@ void BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) {
   if (!player)
     return;
   if (release_media_player)
-    player->Release();
+    ReleaseFullscreenPlayer(player);
   else
     player->SetVideoSurface(gfx::ScopedJavaSurface());
 }
 
-void BrowserMediaPlayerManager::SuspendFullscreen() {
-  MediaPlayerAndroid* player = GetFullscreenPlayer();
-  if (player)
-    player->SetVideoSurface(gfx::ScopedJavaSurface());
-}
-
-void BrowserMediaPlayerManager::ResumeFullscreen(
-    gfx::ScopedJavaSurface surface) {
-  MediaPlayerAndroid* player = GetFullscreenPlayer();
-  if (player)
-    player->SetVideoSurface(surface.Pass());
-}
-
 void BrowserMediaPlayerManager::OnTimeUpdate(int player_id,
                                              base::TimeDelta current_time) {
   Send(new MediaPlayerMsg_MediaTimeUpdate(
@@ -427,7 +418,7 @@ void BrowserMediaPlayerManager::OnSessionMessage(
     int media_keys_id,
     uint32 session_id,
     const std::vector<uint8>& message,
-    const std::string& destination_url) {
+    const GURL& destination_url) {
   Send(new MediaKeysMsg_SessionMessage(
       routing_id(), media_keys_id, session_id, message, destination_url));
 }
@@ -568,10 +559,16 @@ void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) {
     player->SetVolume(volume);
 }
 
+void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) {
+  // To be overridden by subclasses.
+}
+
 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) {
   MediaPlayerAndroid* player = GetPlayer(player_id);
   if (player)
     player->Release();
+  if (player_id == fullscreen_player_id_)
+    fullscreen_player_is_released_ = true;
 
 #if defined(VIDEO_HOLE)
   WebContentsViewAndroid* view =
@@ -607,22 +604,37 @@ void BrowserMediaPlayerManager::OnInitializeCDM(
 void BrowserMediaPlayerManager::OnCreateSession(
     int media_keys_id,
     uint32 session_id,
-    const std::string& type,
+    MediaKeysHostMsg_CreateSession_Type content_type,
     const std::vector<uint8>& init_data) {
-  if (type.length() > kEmeTypeMaximum) {
-    OnSessionError(
-        media_keys_id, session_id, media::MediaKeys::kUnknownError, 0);
-    return;
-  }
   if (init_data.size() > kEmeInitDataMaximum) {
+    LOG(WARNING) << "InitData for ID: " << media_keys_id
+                 << " too long: " << init_data.size();
     OnSessionError(
         media_keys_id, session_id, media::MediaKeys::kUnknownError, 0);
     return;
   }
 
+  // Convert the session content type into a MIME type. "audio" and "video"
+  // don't matter, so using "video" for the MIME type.
+  // Ref:
+  // https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#dom-createsession
+  std::string mime_type;
+  switch (content_type) {
+    case CREATE_SESSION_TYPE_WEBM:
+      mime_type = "video/webm";
+      break;
+    case CREATE_SESSION_TYPE_MP4:
+      mime_type = "video/mp4";
+      break;
+    default:
+      NOTREACHED();
+      return;
+  }
+
   if (CommandLine::ForCurrentProcess()
       ->HasSwitch(switches::kDisableInfobarForProtectedMediaIdentifier)) {
-    CreateSessionIfPermitted(media_keys_id, session_id, type, init_data, true);
+    CreateSessionIfPermitted(
+        media_keys_id, session_id, mime_type, init_data, true);
     return;
   }
 
@@ -652,7 +664,7 @@ void BrowserMediaPlayerManager::OnCreateSession(
                  weak_ptr_factory_.GetWeakPtr(),
                  media_keys_id,
                  session_id,
-                 type,
+                 mime_type,
                  init_data));
 }
 
@@ -669,8 +681,8 @@ void BrowserMediaPlayerManager::OnUpdateSession(
   }
 
   if (response.size() > kEmeResponseMaximum) {
-    DLOG(WARNING) << "Response for ID: " << media_keys_id
-                  << " too long: " << response.size();
+    LOG(WARNING) << "Response for ID: " << media_keys_id
+                 << " too long: " << response.size();
     OnSessionError(
         media_keys_id, session_id, media::MediaKeys::kUnknownError, 0);
     return;
@@ -698,11 +710,16 @@ void BrowserMediaPlayerManager::OnReleaseSession(int media_keys_id,
   drm_bridge->ReleaseSession(session_id);
 }
 
-void BrowserMediaPlayerManager::OnCancelAllPendingSessionCreations(
-    int media_keys_id) {
+void BrowserMediaPlayerManager::OnDestroyCdm(int media_keys_id) {
   MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id);
   if (!drm_bridge) return;
 
+  CancelAllPendingSessionCreations(media_keys_id);
+  RemoveDrmBridge(media_keys_id);
+}
+
+void BrowserMediaPlayerManager::CancelAllPendingSessionCreations(
+    int media_keys_id) {
   BrowserContext* context =
       web_contents()->GetRenderProcessHost()->GetBrowserContext();
   context->CancelProtectedMediaIdentifierPermissionRequests(media_keys_id);
@@ -809,7 +826,7 @@ void BrowserMediaPlayerManager::OnSetMediaKeys(int player_id,
 void BrowserMediaPlayerManager::CreateSessionIfPermitted(
     int media_keys_id,
     uint32 session_id,
-    const std::string& type,
+    const std::string& content_type,
     const std::vector<uint8>& init_data,
     bool permitted) {
   if (!permitted) {
@@ -827,7 +844,13 @@ void BrowserMediaPlayerManager::CreateSessionIfPermitted(
   }
   media_keys_ids_pending_approval_.erase(media_keys_id);
   media_keys_ids_approved_.insert(media_keys_id);
-  drm_bridge->CreateSession(session_id, type, &init_data[0], init_data.size());
+
+  if (!drm_bridge->CreateSession(
+           session_id, content_type, &init_data[0], init_data.size())) {
+    return;
+  }
+
+  // TODO(xhwang): Move the following code to OnSessionReady.
 
   // TODO(qinmin): currently |media_keys_id| and player ID are identical.
   // This might not be true in the future.
@@ -840,4 +863,9 @@ void BrowserMediaPlayerManager::CreateSessionIfPermitted(
     OnProtectedSurfaceRequested(media_keys_id);
 }
 
+void BrowserMediaPlayerManager::ReleaseFullscreenPlayer(
+    MediaPlayerAndroid* player) {
+    player->Release();
+}
+
 }  // namespace content