Home | History | Annotate | Download | only in android
      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
      3 // found in the LICENSE file.
      4 
      5 #include "content/renderer/media/android/renderer_media_player_manager.h"
      6 
      7 #include "content/common/media/media_player_messages_android.h"
      8 #include "content/public/common/renderer_preferences.h"
      9 #include "content/renderer/media/android/renderer_media_player_manager.h"
     10 #include "content/renderer/media/android/webmediaplayer_android.h"
     11 #include "content/renderer/media/crypto/renderer_cdm_manager.h"
     12 #include "content/renderer/render_view_impl.h"
     13 #include "ui/gfx/rect_f.h"
     14 
     15 namespace content {
     16 
     17 RendererMediaPlayerManager::RendererMediaPlayerManager(
     18     RenderFrame* render_frame)
     19     : RenderFrameObserver(render_frame),
     20       next_media_player_id_(0),
     21       fullscreen_frame_(NULL),
     22       pending_fullscreen_frame_(NULL) {
     23 }
     24 
     25 RendererMediaPlayerManager::~RendererMediaPlayerManager() {
     26   DCHECK(media_players_.empty())
     27       << "RendererMediaPlayerManager is owned by RenderFrameImpl and is "
     28          "destroyed only after all media players are destroyed.";
     29 }
     30 
     31 bool RendererMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) {
     32   bool handled = true;
     33   IPC_BEGIN_MESSAGE_MAP(RendererMediaPlayerManager, msg)
     34     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaMetadataChanged,
     35                         OnMediaMetadataChanged)
     36     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaPlaybackCompleted,
     37                         OnMediaPlaybackCompleted)
     38     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaBufferingUpdate,
     39                         OnMediaBufferingUpdate)
     40     IPC_MESSAGE_HANDLER(MediaPlayerMsg_SeekRequest, OnSeekRequest)
     41     IPC_MESSAGE_HANDLER(MediaPlayerMsg_SeekCompleted, OnSeekCompleted)
     42     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaError, OnMediaError)
     43     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaVideoSizeChanged,
     44                         OnVideoSizeChanged)
     45     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaTimeUpdate, OnTimeUpdate)
     46     IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaPlayerReleased,
     47                         OnMediaPlayerReleased)
     48     IPC_MESSAGE_HANDLER(MediaPlayerMsg_ConnectedToRemoteDevice,
     49                         OnConnectedToRemoteDevice)
     50     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice,
     51                         OnDisconnectedFromRemoteDevice)
     52     IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen,
     53                         OnRequestFullscreen)
     54     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen)
     55     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen)
     56     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay)
     57     IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause)
     58     IPC_MESSAGE_HANDLER(MediaPlayerMsg_PauseVideo, OnPauseVideo)
     59   IPC_MESSAGE_UNHANDLED(handled = false)
     60   IPC_END_MESSAGE_MAP()
     61   return handled;
     62 }
     63 
     64 void RendererMediaPlayerManager::Initialize(
     65     MediaPlayerHostMsg_Initialize_Type type,
     66     int player_id,
     67     const GURL& url,
     68     const GURL& first_party_for_cookies,
     69     int demuxer_client_id,
     70     const GURL& frame_url,
     71     bool allow_credentials) {
     72   MediaPlayerHostMsg_Initialize_Params media_player_params;
     73   media_player_params.type = type;
     74   media_player_params.player_id = player_id;
     75   media_player_params.demuxer_client_id = demuxer_client_id;
     76   media_player_params.url = url;
     77   media_player_params.first_party_for_cookies = first_party_for_cookies;
     78   media_player_params.frame_url = frame_url;
     79   media_player_params.allow_credentials = allow_credentials;
     80 
     81   Send(new MediaPlayerHostMsg_Initialize(routing_id(), media_player_params));
     82 }
     83 
     84 void RendererMediaPlayerManager::Start(int player_id) {
     85   Send(new MediaPlayerHostMsg_Start(routing_id(), player_id));
     86 }
     87 
     88 void RendererMediaPlayerManager::Pause(
     89     int player_id,
     90     bool is_media_related_action) {
     91   Send(new MediaPlayerHostMsg_Pause(
     92       routing_id(), player_id, is_media_related_action));
     93 }
     94 
     95 void RendererMediaPlayerManager::Seek(
     96     int player_id,
     97     const base::TimeDelta& time) {
     98   Send(new MediaPlayerHostMsg_Seek(routing_id(), player_id, time));
     99 }
    100 
    101 void RendererMediaPlayerManager::SetVolume(int player_id, double volume) {
    102   Send(new MediaPlayerHostMsg_SetVolume(routing_id(), player_id, volume));
    103 }
    104 
    105 void RendererMediaPlayerManager::SetPoster(int player_id, const GURL& poster) {
    106   Send(new MediaPlayerHostMsg_SetPoster(routing_id(), player_id, poster));
    107 }
    108 
    109 void RendererMediaPlayerManager::ReleaseResources(int player_id) {
    110   Send(new MediaPlayerHostMsg_Release(routing_id(), player_id));
    111 }
    112 
    113 void RendererMediaPlayerManager::DestroyPlayer(int player_id) {
    114   Send(new MediaPlayerHostMsg_DestroyMediaPlayer(routing_id(), player_id));
    115 }
    116 
    117 void RendererMediaPlayerManager::OnMediaMetadataChanged(
    118     int player_id,
    119     base::TimeDelta duration,
    120     int width,
    121     int height,
    122     bool success) {
    123   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    124   if (player)
    125     player->OnMediaMetadataChanged(duration, width, height, success);
    126 }
    127 
    128 void RendererMediaPlayerManager::OnMediaPlaybackCompleted(int player_id) {
    129   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    130   if (player)
    131     player->OnPlaybackComplete();
    132 }
    133 
    134 void RendererMediaPlayerManager::OnMediaBufferingUpdate(int player_id,
    135                                                         int percent) {
    136   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    137   if (player)
    138     player->OnBufferingUpdate(percent);
    139 }
    140 
    141 void RendererMediaPlayerManager::OnSeekRequest(
    142     int player_id,
    143     const base::TimeDelta& time_to_seek) {
    144   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    145   if (player)
    146     player->OnSeekRequest(time_to_seek);
    147 }
    148 
    149 void RendererMediaPlayerManager::OnSeekCompleted(
    150     int player_id,
    151     const base::TimeDelta& current_time) {
    152   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    153   if (player)
    154     player->OnSeekComplete(current_time);
    155 }
    156 
    157 void RendererMediaPlayerManager::OnMediaError(int player_id, int error) {
    158   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    159   if (player)
    160     player->OnMediaError(error);
    161 }
    162 
    163 void RendererMediaPlayerManager::OnVideoSizeChanged(int player_id,
    164                                                     int width,
    165                                                     int height) {
    166   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    167   if (player)
    168     player->OnVideoSizeChanged(width, height);
    169 }
    170 
    171 void RendererMediaPlayerManager::OnTimeUpdate(int player_id,
    172                                               base::TimeDelta current_time) {
    173   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    174   if (player)
    175     player->OnTimeUpdate(current_time);
    176 }
    177 
    178 void RendererMediaPlayerManager::OnMediaPlayerReleased(int player_id) {
    179   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    180   if (player)
    181     player->OnPlayerReleased();
    182 }
    183 
    184 void RendererMediaPlayerManager::OnConnectedToRemoteDevice(int player_id,
    185     const std::string& remote_playback_message) {
    186   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    187   if (player)
    188     player->OnConnectedToRemoteDevice(remote_playback_message);
    189 }
    190 
    191 void RendererMediaPlayerManager::OnDisconnectedFromRemoteDevice(int player_id) {
    192   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    193   if (player)
    194     player->OnDisconnectedFromRemoteDevice();
    195 }
    196 
    197 void RendererMediaPlayerManager::OnDidEnterFullscreen(int player_id) {
    198   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    199   if (player)
    200     player->OnDidEnterFullscreen();
    201 }
    202 
    203 void RendererMediaPlayerManager::OnDidExitFullscreen(int player_id) {
    204   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    205   if (player)
    206     player->OnDidExitFullscreen();
    207 }
    208 
    209 void RendererMediaPlayerManager::OnPlayerPlay(int player_id) {
    210   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    211   if (player)
    212     player->OnMediaPlayerPlay();
    213 }
    214 
    215 void RendererMediaPlayerManager::OnPlayerPause(int player_id) {
    216   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    217   if (player)
    218     player->OnMediaPlayerPause();
    219 }
    220 
    221 void RendererMediaPlayerManager::OnRequestFullscreen(int player_id) {
    222   WebMediaPlayerAndroid* player = GetMediaPlayer(player_id);
    223   if (player)
    224     player->OnRequestFullscreen();
    225 }
    226 
    227 void RendererMediaPlayerManager::OnPauseVideo() {
    228   ReleaseVideoResources();
    229 }
    230 
    231 void RendererMediaPlayerManager::EnterFullscreen(int player_id,
    232                                                  blink::WebFrame* frame) {
    233   pending_fullscreen_frame_ = frame;
    234   Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id));
    235 }
    236 
    237 void RendererMediaPlayerManager::ExitFullscreen(int player_id) {
    238   pending_fullscreen_frame_ = NULL;
    239   fullscreen_frame_ = NULL;
    240   Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id));
    241 }
    242 
    243 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) {
    244   if (cdm_id == RendererCdmManager::kInvalidCdmId) {
    245     NOTREACHED();
    246     return;
    247   }
    248   Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id));
    249 }
    250 
    251 int RendererMediaPlayerManager::RegisterMediaPlayer(
    252     WebMediaPlayerAndroid* player) {
    253   media_players_[next_media_player_id_] = player;
    254   return next_media_player_id_++;
    255 }
    256 
    257 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) {
    258   media_players_.erase(player_id);
    259 }
    260 
    261 void RendererMediaPlayerManager::ReleaseVideoResources() {
    262   std::map<int, WebMediaPlayerAndroid*>::iterator player_it;
    263   for (player_it = media_players_.begin(); player_it != media_players_.end();
    264        ++player_it) {
    265     WebMediaPlayerAndroid* player = player_it->second;
    266 
    267     // Do not release if an audio track is still playing
    268     if (player && (player->paused() || player->hasVideo()))
    269       player->ReleaseMediaResources();
    270   }
    271 }
    272 
    273 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer(
    274     int player_id) {
    275   std::map<int, WebMediaPlayerAndroid*>::iterator iter =
    276       media_players_.find(player_id);
    277   if (iter != media_players_.end())
    278     return iter->second;
    279   return NULL;
    280 }
    281 
    282 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) {
    283   return (!fullscreen_frame_ && !pending_fullscreen_frame_)
    284       || ShouldEnterFullscreen(frame);
    285 }
    286 
    287 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) {
    288   pending_fullscreen_frame_ = NULL;
    289   fullscreen_frame_ = frame;
    290 }
    291 
    292 void RendererMediaPlayerManager::DidExitFullscreen() {
    293   fullscreen_frame_ = NULL;
    294 }
    295 
    296 bool RendererMediaPlayerManager::IsInFullscreen(blink::WebFrame* frame) {
    297   return fullscreen_frame_ == frame;
    298 }
    299 
    300 bool RendererMediaPlayerManager::ShouldEnterFullscreen(blink::WebFrame* frame) {
    301   return fullscreen_frame_ == frame || pending_fullscreen_frame_ == frame;
    302 }
    303 
    304 #if defined(VIDEO_HOLE)
    305 void RendererMediaPlayerManager::RequestExternalSurface(
    306     int player_id,
    307     const gfx::RectF& geometry) {
    308   Send(new MediaPlayerHostMsg_NotifyExternalSurface(
    309       routing_id(), player_id, true, geometry));
    310 }
    311 
    312 void RendererMediaPlayerManager::DidCommitCompositorFrame() {
    313   std::map<int, gfx::RectF> geometry_change;
    314   RetrieveGeometryChanges(&geometry_change);
    315   for (std::map<int, gfx::RectF>::iterator it = geometry_change.begin();
    316        it != geometry_change.end();
    317        ++it) {
    318     Send(new MediaPlayerHostMsg_NotifyExternalSurface(
    319         routing_id(), it->first, false, it->second));
    320   }
    321 }
    322 
    323 void RendererMediaPlayerManager::RetrieveGeometryChanges(
    324     std::map<int, gfx::RectF>* changes) {
    325   DCHECK(changes->empty());
    326   for (std::map<int, WebMediaPlayerAndroid*>::iterator player_it =
    327            media_players_.begin();
    328        player_it != media_players_.end();
    329        ++player_it) {
    330     WebMediaPlayerAndroid* player = player_it->second;
    331 
    332     if (player && player->hasVideo()) {
    333       if (player->UpdateBoundaryRectangle())
    334         (*changes)[player_it->first] = player->GetBoundaryRectangle();
    335     }
    336   }
    337 }
    338 
    339 bool
    340 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() {
    341   const RendererPreferences& prefs = static_cast<RenderFrameImpl*>(
    342       render_frame())->render_view()->renderer_preferences();
    343   return prefs.use_video_overlay_for_embedded_encrypted_video;
    344 }
    345 #endif  // defined(VIDEO_HOLE)
    346 
    347 }  // namespace content
    348