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 "base/bind.h" 8 #include "base/message_loop/message_loop.h" 9 #include "content/common/media/media_player_messages_android.h" 10 #include "content/renderer/media/android/proxy_media_keys.h" 11 #include "content/renderer/media/android/renderer_media_player_manager.h" 12 #include "content/renderer/media/android/webmediaplayer_android.h" 13 #include "ui/gfx/rect_f.h" 14 15 // Maximum sizes for various EME message parameters. These are checks to 16 // prevent unnecessarily large messages from being passed around, and the sizes 17 // are somewhat arbitrary as the EME specification doesn't specify any limits. 18 static const size_t kEmeWebSessionIdMaximum = 512; 19 static const size_t kEmeMessageMaximum = 10240; // 10 KB 20 static const size_t kEmeDestinationUrlMaximum = 2048; // 2 KB 21 22 namespace content { 23 24 RendererMediaPlayerManager::RendererMediaPlayerManager(RenderView* render_view) 25 : RenderViewObserver(render_view), 26 next_media_player_id_(0), 27 fullscreen_frame_(NULL), 28 pending_fullscreen_frame_(NULL) {} 29 30 RendererMediaPlayerManager::~RendererMediaPlayerManager() { 31 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; 32 for (player_it = media_players_.begin(); 33 player_it != media_players_.end(); ++player_it) { 34 WebMediaPlayerAndroid* player = player_it->second; 35 player->Detach(); 36 } 37 38 Send(new MediaPlayerHostMsg_DestroyAllMediaPlayers(routing_id())); 39 } 40 41 bool RendererMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) { 42 bool handled = true; 43 IPC_BEGIN_MESSAGE_MAP(RendererMediaPlayerManager, msg) 44 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaMetadataChanged, 45 OnMediaMetadataChanged) 46 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaPlaybackCompleted, 47 OnMediaPlaybackCompleted) 48 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaBufferingUpdate, 49 OnMediaBufferingUpdate) 50 IPC_MESSAGE_HANDLER(MediaPlayerMsg_SeekRequest, OnSeekRequest) 51 IPC_MESSAGE_HANDLER(MediaPlayerMsg_SeekCompleted, OnSeekCompleted) 52 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaError, OnMediaError) 53 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaVideoSizeChanged, 54 OnVideoSizeChanged) 55 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaTimeUpdate, OnTimeUpdate) 56 IPC_MESSAGE_HANDLER(MediaPlayerMsg_MediaPlayerReleased, 57 OnMediaPlayerReleased) 58 IPC_MESSAGE_HANDLER(MediaPlayerMsg_ConnectedToRemoteDevice, 59 OnConnectedToRemoteDevice) 60 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice, 61 OnDisconnectedFromRemoteDevice) 62 IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen, 63 OnRequestFullscreen) 64 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen) 65 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen) 66 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay) 67 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause) 68 IPC_MESSAGE_HANDLER(MediaKeysMsg_SessionCreated, OnSessionCreated) 69 IPC_MESSAGE_HANDLER(MediaKeysMsg_SessionMessage, OnSessionMessage) 70 IPC_MESSAGE_HANDLER(MediaKeysMsg_SessionReady, OnSessionReady) 71 IPC_MESSAGE_HANDLER(MediaKeysMsg_SessionClosed, OnSessionClosed) 72 IPC_MESSAGE_HANDLER(MediaKeysMsg_SessionError, OnSessionError) 73 IPC_MESSAGE_UNHANDLED(handled = false) 74 IPC_END_MESSAGE_MAP() 75 return handled; 76 } 77 78 void RendererMediaPlayerManager::Initialize( 79 MediaPlayerHostMsg_Initialize_Type type, 80 int player_id, 81 const GURL& url, 82 const GURL& first_party_for_cookies, 83 int demuxer_client_id) { 84 Send(new MediaPlayerHostMsg_Initialize( 85 routing_id(), type, player_id, url, first_party_for_cookies, 86 demuxer_client_id)); 87 } 88 89 void RendererMediaPlayerManager::Start(int player_id) { 90 Send(new MediaPlayerHostMsg_Start(routing_id(), player_id)); 91 } 92 93 void RendererMediaPlayerManager::Pause( 94 int player_id, 95 bool is_media_related_action) { 96 Send(new MediaPlayerHostMsg_Pause( 97 routing_id(), player_id, is_media_related_action)); 98 } 99 100 void RendererMediaPlayerManager::Seek( 101 int player_id, 102 const base::TimeDelta& time) { 103 Send(new MediaPlayerHostMsg_Seek(routing_id(), player_id, time)); 104 } 105 106 void RendererMediaPlayerManager::SetVolume(int player_id, double volume) { 107 Send(new MediaPlayerHostMsg_SetVolume(routing_id(), player_id, volume)); 108 } 109 110 void RendererMediaPlayerManager::ReleaseResources(int player_id) { 111 Send(new MediaPlayerHostMsg_Release(routing_id(), player_id)); 112 } 113 114 void RendererMediaPlayerManager::DestroyPlayer(int player_id) { 115 Send(new MediaPlayerHostMsg_DestroyMediaPlayer(routing_id(), player_id)); 116 } 117 118 void RendererMediaPlayerManager::OnMediaMetadataChanged( 119 int player_id, 120 base::TimeDelta duration, 121 int width, 122 int height, 123 bool success) { 124 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 125 if (player) 126 player->OnMediaMetadataChanged(duration, width, height, success); 127 } 128 129 void RendererMediaPlayerManager::OnMediaPlaybackCompleted(int player_id) { 130 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 131 if (player) 132 player->OnPlaybackComplete(); 133 } 134 135 void RendererMediaPlayerManager::OnMediaBufferingUpdate(int player_id, 136 int percent) { 137 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 138 if (player) 139 player->OnBufferingUpdate(percent); 140 } 141 142 void RendererMediaPlayerManager::OnSeekRequest( 143 int player_id, 144 const base::TimeDelta& time_to_seek) { 145 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 146 if (player) 147 player->OnSeekRequest(time_to_seek); 148 } 149 150 void RendererMediaPlayerManager::OnSeekCompleted( 151 int player_id, 152 const base::TimeDelta& current_time) { 153 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 154 if (player) 155 player->OnSeekComplete(current_time); 156 } 157 158 void RendererMediaPlayerManager::OnMediaError(int player_id, int error) { 159 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 160 if (player) 161 player->OnMediaError(error); 162 } 163 164 void RendererMediaPlayerManager::OnVideoSizeChanged(int player_id, 165 int width, 166 int height) { 167 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 168 if (player) 169 player->OnVideoSizeChanged(width, height); 170 } 171 172 void RendererMediaPlayerManager::OnTimeUpdate(int player_id, 173 base::TimeDelta current_time) { 174 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 175 if (player) 176 player->OnTimeUpdate(current_time); 177 } 178 179 void RendererMediaPlayerManager::OnMediaPlayerReleased(int player_id) { 180 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 181 if (player) 182 player->OnPlayerReleased(); 183 } 184 185 void RendererMediaPlayerManager::OnConnectedToRemoteDevice(int player_id) { 186 WebMediaPlayerAndroid* player = GetMediaPlayer(player_id); 187 if (player) 188 player->OnConnectedToRemoteDevice(); 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::EnterFullscreen(int player_id, 228 blink::WebFrame* frame) { 229 pending_fullscreen_frame_ = frame; 230 Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id)); 231 } 232 233 void RendererMediaPlayerManager::ExitFullscreen(int player_id) { 234 pending_fullscreen_frame_ = NULL; 235 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id)); 236 } 237 238 void RendererMediaPlayerManager::InitializeCDM(int media_keys_id, 239 ProxyMediaKeys* media_keys, 240 const std::vector<uint8>& uuid, 241 const GURL& frame_url) { 242 RegisterMediaKeys(media_keys_id, media_keys); 243 Send(new MediaKeysHostMsg_InitializeCDM( 244 routing_id(), media_keys_id, uuid, frame_url)); 245 } 246 247 void RendererMediaPlayerManager::CreateSession( 248 int media_keys_id, 249 uint32 session_id, 250 const std::string& type, 251 const std::vector<uint8>& init_data) { 252 Send(new MediaKeysHostMsg_CreateSession( 253 routing_id(), media_keys_id, session_id, type, init_data)); 254 } 255 256 void RendererMediaPlayerManager::UpdateSession( 257 int media_keys_id, 258 uint32 session_id, 259 const std::vector<uint8>& response) { 260 Send(new MediaKeysHostMsg_UpdateSession( 261 routing_id(), media_keys_id, session_id, response)); 262 } 263 264 void RendererMediaPlayerManager::ReleaseSession(int media_keys_id, 265 uint32 session_id) { 266 Send(new MediaKeysHostMsg_ReleaseSession( 267 routing_id(), media_keys_id, session_id)); 268 } 269 270 void RendererMediaPlayerManager::OnSessionCreated( 271 int media_keys_id, 272 uint32 session_id, 273 const std::string& web_session_id) { 274 if (web_session_id.length() > kEmeWebSessionIdMaximum) { 275 OnSessionError( 276 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); 277 return; 278 } 279 280 ProxyMediaKeys* media_keys = GetMediaKeys(media_keys_id); 281 if (media_keys) 282 media_keys->OnSessionCreated(session_id, web_session_id); 283 } 284 285 void RendererMediaPlayerManager::OnSessionMessage( 286 int media_keys_id, 287 uint32 session_id, 288 const std::vector<uint8>& message, 289 const std::string& destination_url) { 290 if (message.size() > kEmeMessageMaximum) { 291 OnSessionError( 292 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); 293 return; 294 } 295 if (destination_url.length() > kEmeDestinationUrlMaximum) { 296 OnSessionError( 297 media_keys_id, session_id, media::MediaKeys::kUnknownError, 0); 298 return; 299 } 300 301 ProxyMediaKeys* media_keys = GetMediaKeys(media_keys_id); 302 if (media_keys) 303 media_keys->OnSessionMessage(session_id, message, destination_url); 304 } 305 306 void RendererMediaPlayerManager::OnSessionReady(int media_keys_id, 307 uint32 session_id) { 308 ProxyMediaKeys* media_keys = GetMediaKeys(media_keys_id); 309 if (media_keys) 310 media_keys->OnSessionReady(session_id); 311 } 312 313 void RendererMediaPlayerManager::OnSessionClosed(int media_keys_id, 314 uint32 session_id) { 315 ProxyMediaKeys* media_keys = GetMediaKeys(media_keys_id); 316 if (media_keys) 317 media_keys->OnSessionClosed(session_id); 318 } 319 320 void RendererMediaPlayerManager::OnSessionError( 321 int media_keys_id, 322 uint32 session_id, 323 media::MediaKeys::KeyError error_code, 324 int system_code) { 325 ProxyMediaKeys* media_keys = GetMediaKeys(media_keys_id); 326 if (media_keys) 327 media_keys->OnSessionError(session_id, error_code, system_code); 328 } 329 330 int RendererMediaPlayerManager::RegisterMediaPlayer( 331 WebMediaPlayerAndroid* player) { 332 media_players_[next_media_player_id_] = player; 333 return next_media_player_id_++; 334 } 335 336 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { 337 media_players_.erase(player_id); 338 media_keys_.erase(player_id); 339 } 340 341 void RendererMediaPlayerManager::RegisterMediaKeys(int media_keys_id, 342 ProxyMediaKeys* media_keys) { 343 // WebMediaPlayerAndroid must have already been registered for 344 // |media_keys_id|. For now |media_keys_id| is the same as player_id 345 // used in other methods. 346 DCHECK(media_players_.find(media_keys_id) != media_players_.end()); 347 348 // Only allowed to register once. 349 DCHECK(media_keys_.find(media_keys_id) == media_keys_.end()); 350 351 media_keys_[media_keys_id] = media_keys; 352 } 353 354 void RendererMediaPlayerManager::ReleaseVideoResources() { 355 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; 356 for (player_it = media_players_.begin(); 357 player_it != media_players_.end(); ++player_it) { 358 WebMediaPlayerAndroid* player = player_it->second; 359 360 // Do not release if an audio track is still playing 361 if (player && (player->paused() || player->hasVideo())) 362 player->ReleaseMediaResources(); 363 } 364 } 365 366 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer( 367 int player_id) { 368 std::map<int, WebMediaPlayerAndroid*>::iterator iter = 369 media_players_.find(player_id); 370 if (iter != media_players_.end()) 371 return iter->second; 372 return NULL; 373 } 374 375 ProxyMediaKeys* RendererMediaPlayerManager::GetMediaKeys(int media_keys_id) { 376 std::map<int, ProxyMediaKeys*>::iterator iter = 377 media_keys_.find(media_keys_id); 378 return (iter != media_keys_.end()) ? iter->second : NULL; 379 } 380 381 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) { 382 return (!fullscreen_frame_ && !pending_fullscreen_frame_) 383 || ShouldEnterFullscreen(frame); 384 } 385 386 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) { 387 pending_fullscreen_frame_ = NULL; 388 fullscreen_frame_ = frame; 389 } 390 391 void RendererMediaPlayerManager::DidExitFullscreen() { 392 fullscreen_frame_ = NULL; 393 } 394 395 bool RendererMediaPlayerManager::IsInFullscreen(blink::WebFrame* frame) { 396 return fullscreen_frame_ == frame; 397 } 398 399 bool RendererMediaPlayerManager::ShouldEnterFullscreen(blink::WebFrame* frame) { 400 return fullscreen_frame_ == frame || pending_fullscreen_frame_ == frame; 401 } 402 403 #if defined(VIDEO_HOLE) 404 void RendererMediaPlayerManager::RequestExternalSurface( 405 int player_id, 406 const gfx::RectF& geometry) { 407 Send(new MediaPlayerHostMsg_NotifyExternalSurface( 408 routing_id(), player_id, true, geometry)); 409 } 410 411 void RendererMediaPlayerManager::DidCommitCompositorFrame() { 412 std::map<int, gfx::RectF> geometry_change; 413 RetrieveGeometryChanges(&geometry_change); 414 for (std::map<int, gfx::RectF>::iterator it = geometry_change.begin(); 415 it != geometry_change.end(); 416 ++it) { 417 Send(new MediaPlayerHostMsg_NotifyExternalSurface( 418 routing_id(), it->first, false, it->second)); 419 } 420 } 421 422 void RendererMediaPlayerManager::RetrieveGeometryChanges( 423 std::map<int, gfx::RectF>* changes) { 424 DCHECK(changes->empty()); 425 for (std::map<int, WebMediaPlayerAndroid*>::iterator player_it = 426 media_players_.begin(); 427 player_it != media_players_.end(); 428 ++player_it) { 429 WebMediaPlayerAndroid* player = player_it->second; 430 431 if (player && player->hasVideo()) { 432 gfx::RectF rect; 433 if (player->RetrieveGeometryChange(&rect)) { 434 (*changes)[player_it->first] = rect; 435 } 436 } 437 } 438 } 439 #endif // defined(VIDEO_HOLE) 440 441 } // namespace content 442