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