| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/android/renderer_media_player_manager.h" | 5 #include "content/renderer/media/android/renderer_media_player_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "content/common/media/cdm_messages.h" | |
| 10 #include "content/common/media/media_player_messages_android.h" | 9 #include "content/common/media/media_player_messages_android.h" |
| 11 #include "content/public/common/renderer_preferences.h" | 10 #include "content/public/common/renderer_preferences.h" |
| 12 #include "content/renderer/media/android/proxy_media_keys.h" | |
| 13 #include "content/renderer/media/android/renderer_media_player_manager.h" | 11 #include "content/renderer/media/android/renderer_media_player_manager.h" |
| 14 #include "content/renderer/media/android/webmediaplayer_android.h" | 12 #include "content/renderer/media/android/webmediaplayer_android.h" |
| 13 #include "content/renderer/media/crypto/renderer_cdm_manager.h" |
| 15 #include "content/renderer/render_view_impl.h" | 14 #include "content/renderer/render_view_impl.h" |
| 16 #include "ui/gfx/rect_f.h" | 15 #include "ui/gfx/rect_f.h" |
| 17 | 16 |
| 18 namespace content { | 17 namespace content { |
| 19 | 18 |
| 20 // Maximum sizes for various EME API parameters. These are checks to prevent | |
| 21 // unnecessarily large messages from being passed around, and the sizes | |
| 22 // are somewhat arbitrary as the EME spec doesn't specify any limits. | |
| 23 const size_t kMaxWebSessionIdLength = 512; | |
| 24 const size_t kMaxSessionMessageLength = 10240; // 10 KB | |
| 25 | |
| 26 RendererMediaPlayerManager::RendererMediaPlayerManager( | 19 RendererMediaPlayerManager::RendererMediaPlayerManager( |
| 27 RenderFrame* render_frame) | 20 RenderFrame* render_frame) |
| 28 : RenderFrameObserver(render_frame), | 21 : RenderFrameObserver(render_frame), |
| 29 next_media_player_id_(0), | 22 next_media_player_id_(0), |
| 30 fullscreen_frame_(NULL), | 23 fullscreen_frame_(NULL), |
| 31 pending_fullscreen_frame_(NULL) { | 24 pending_fullscreen_frame_(NULL) { |
| 32 } | 25 } |
| 33 | 26 |
| 34 RendererMediaPlayerManager::~RendererMediaPlayerManager() { | 27 RendererMediaPlayerManager::~RendererMediaPlayerManager() { |
| 35 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; | 28 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 63 OnConnectedToRemoteDevice) | 56 OnConnectedToRemoteDevice) |
| 64 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice, | 57 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice, |
| 65 OnDisconnectedFromRemoteDevice) | 58 OnDisconnectedFromRemoteDevice) |
| 66 IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen, | 59 IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen, |
| 67 OnRequestFullscreen) | 60 OnRequestFullscreen) |
| 68 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen) | 61 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen) |
| 69 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen) | 62 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen) |
| 70 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay) | 63 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay) |
| 71 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause) | 64 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause) |
| 72 IPC_MESSAGE_HANDLER(MediaPlayerMsg_PauseVideo, OnPauseVideo) | 65 IPC_MESSAGE_HANDLER(MediaPlayerMsg_PauseVideo, OnPauseVideo) |
| 73 IPC_MESSAGE_HANDLER(CdmMsg_SessionCreated, OnSessionCreated) | |
| 74 IPC_MESSAGE_HANDLER(CdmMsg_SessionMessage, OnSessionMessage) | |
| 75 IPC_MESSAGE_HANDLER(CdmMsg_SessionReady, OnSessionReady) | |
| 76 IPC_MESSAGE_HANDLER(CdmMsg_SessionClosed, OnSessionClosed) | |
| 77 IPC_MESSAGE_HANDLER(CdmMsg_SessionError, OnSessionError) | |
| 78 IPC_MESSAGE_UNHANDLED(handled = false) | 66 IPC_MESSAGE_UNHANDLED(handled = false) |
| 79 IPC_END_MESSAGE_MAP() | 67 IPC_END_MESSAGE_MAP() |
| 80 return handled; | 68 return handled; |
| 81 } | 69 } |
| 82 | 70 |
| 83 void RendererMediaPlayerManager::Initialize( | 71 void RendererMediaPlayerManager::Initialize( |
| 84 MediaPlayerHostMsg_Initialize_Type type, | 72 MediaPlayerHostMsg_Initialize_Type type, |
| 85 int player_id, | 73 int player_id, |
| 86 const GURL& url, | 74 const GURL& url, |
| 87 const GURL& first_party_for_cookies, | 75 const GURL& first_party_for_cookies, |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id)); | 232 Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id)); |
| 245 } | 233 } |
| 246 | 234 |
| 247 void RendererMediaPlayerManager::ExitFullscreen(int player_id) { | 235 void RendererMediaPlayerManager::ExitFullscreen(int player_id) { |
| 248 pending_fullscreen_frame_ = NULL; | 236 pending_fullscreen_frame_ = NULL; |
| 249 fullscreen_frame_ = NULL; | 237 fullscreen_frame_ = NULL; |
| 250 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id)); | 238 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id)); |
| 251 } | 239 } |
| 252 | 240 |
| 253 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) { | 241 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) { |
| 254 if (cdm_id == kInvalidCdmId) | 242 if (cdm_id == RendererCdmManager::kInvalidCdmId) { |
| 243 NOTREACHED(); |
| 255 return; | 244 return; |
| 245 } |
| 256 Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id)); | 246 Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id)); |
| 257 } | 247 } |
| 258 | 248 |
| 259 void RendererMediaPlayerManager::InitializeCdm(int cdm_id, | |
| 260 ProxyMediaKeys* media_keys, | |
| 261 const std::string& key_system, | |
| 262 const GURL& security_origin) { | |
| 263 DCHECK_NE(cdm_id, kInvalidCdmId); | |
| 264 RegisterMediaKeys(cdm_id, media_keys); | |
| 265 Send(new CdmHostMsg_InitializeCdm( | |
| 266 routing_id(), cdm_id, key_system, security_origin)); | |
| 267 } | |
| 268 | |
| 269 void RendererMediaPlayerManager::CreateSession( | |
| 270 int cdm_id, | |
| 271 uint32 session_id, | |
| 272 CdmHostMsg_CreateSession_ContentType content_type, | |
| 273 const std::vector<uint8>& init_data) { | |
| 274 DCHECK(GetMediaKeys(cdm_id)) << "|cdm_id| not registered."; | |
| 275 Send(new CdmHostMsg_CreateSession( | |
| 276 routing_id(), cdm_id, session_id, content_type, init_data)); | |
| 277 } | |
| 278 | |
| 279 void RendererMediaPlayerManager::UpdateSession( | |
| 280 int cdm_id, | |
| 281 uint32 session_id, | |
| 282 const std::vector<uint8>& response) { | |
| 283 DCHECK(GetMediaKeys(cdm_id)) << "|cdm_id| not registered."; | |
| 284 Send( | |
| 285 new CdmHostMsg_UpdateSession(routing_id(), cdm_id, session_id, response)); | |
| 286 } | |
| 287 | |
| 288 void RendererMediaPlayerManager::ReleaseSession(int cdm_id, uint32 session_id) { | |
| 289 DCHECK(GetMediaKeys(cdm_id)) << "|cdm_id| not registered."; | |
| 290 Send(new CdmHostMsg_ReleaseSession(routing_id(), cdm_id, session_id)); | |
| 291 } | |
| 292 | |
| 293 void RendererMediaPlayerManager::DestroyCdm(int cdm_id) { | |
| 294 DCHECK(GetMediaKeys(cdm_id)) << "|cdm_id| not registered."; | |
| 295 Send(new CdmHostMsg_DestroyCdm(routing_id(), cdm_id)); | |
| 296 media_keys_.erase(cdm_id); | |
| 297 } | |
| 298 | |
| 299 void RendererMediaPlayerManager::OnSessionCreated( | |
| 300 int cdm_id, | |
| 301 uint32 session_id, | |
| 302 const std::string& web_session_id) { | |
| 303 if (web_session_id.length() > kMaxWebSessionIdLength) { | |
| 304 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); | |
| 305 return; | |
| 306 } | |
| 307 | |
| 308 ProxyMediaKeys* media_keys = GetMediaKeys(cdm_id); | |
| 309 if (media_keys) | |
| 310 media_keys->OnSessionCreated(session_id, web_session_id); | |
| 311 } | |
| 312 | |
| 313 void RendererMediaPlayerManager::OnSessionMessage( | |
| 314 int cdm_id, | |
| 315 uint32 session_id, | |
| 316 const std::vector<uint8>& message, | |
| 317 const GURL& destination_url) { | |
| 318 if (message.size() > kMaxSessionMessageLength) { | |
| 319 OnSessionError(cdm_id, session_id, media::MediaKeys::kUnknownError, 0); | |
| 320 return; | |
| 321 } | |
| 322 | |
| 323 ProxyMediaKeys* media_keys = GetMediaKeys(cdm_id); | |
| 324 if (media_keys) | |
| 325 media_keys->OnSessionMessage(session_id, message, destination_url.spec()); | |
| 326 } | |
| 327 | |
| 328 void RendererMediaPlayerManager::OnSessionReady(int cdm_id, uint32 session_id) { | |
| 329 ProxyMediaKeys* media_keys = GetMediaKeys(cdm_id); | |
| 330 if (media_keys) | |
| 331 media_keys->OnSessionReady(session_id); | |
| 332 } | |
| 333 | |
| 334 void RendererMediaPlayerManager::OnSessionClosed(int cdm_id, | |
| 335 uint32 session_id) { | |
| 336 ProxyMediaKeys* media_keys = GetMediaKeys(cdm_id); | |
| 337 if (media_keys) | |
| 338 media_keys->OnSessionClosed(session_id); | |
| 339 } | |
| 340 | |
| 341 void RendererMediaPlayerManager::OnSessionError( | |
| 342 int cdm_id, | |
| 343 uint32 session_id, | |
| 344 media::MediaKeys::KeyError error_code, | |
| 345 uint32 system_code) { | |
| 346 ProxyMediaKeys* media_keys = GetMediaKeys(cdm_id); | |
| 347 if (media_keys) | |
| 348 media_keys->OnSessionError(session_id, error_code, system_code); | |
| 349 } | |
| 350 | |
| 351 int RendererMediaPlayerManager::RegisterMediaPlayer( | 249 int RendererMediaPlayerManager::RegisterMediaPlayer( |
| 352 WebMediaPlayerAndroid* player) { | 250 WebMediaPlayerAndroid* player) { |
| 353 media_players_[next_media_player_id_] = player; | 251 media_players_[next_media_player_id_] = player; |
| 354 return next_media_player_id_++; | 252 return next_media_player_id_++; |
| 355 } | 253 } |
| 356 | 254 |
| 357 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { | 255 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { |
| 358 media_players_.erase(player_id); | 256 media_players_.erase(player_id); |
| 359 } | 257 } |
| 360 | 258 |
| 361 void RendererMediaPlayerManager::RegisterMediaKeys(int cdm_id, | |
| 362 ProxyMediaKeys* media_keys) { | |
| 363 // Only allowed to register once. | |
| 364 DCHECK(media_keys_.find(cdm_id) == media_keys_.end()); | |
| 365 | |
| 366 media_keys_[cdm_id] = media_keys; | |
| 367 } | |
| 368 | |
| 369 void RendererMediaPlayerManager::ReleaseVideoResources() { | 259 void RendererMediaPlayerManager::ReleaseVideoResources() { |
| 370 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; | 260 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; |
| 371 for (player_it = media_players_.begin(); player_it != media_players_.end(); | 261 for (player_it = media_players_.begin(); player_it != media_players_.end(); |
| 372 ++player_it) { | 262 ++player_it) { |
| 373 WebMediaPlayerAndroid* player = player_it->second; | 263 WebMediaPlayerAndroid* player = player_it->second; |
| 374 | 264 |
| 375 // Do not release if an audio track is still playing | 265 // Do not release if an audio track is still playing |
| 376 if (player && (player->paused() || player->hasVideo())) | 266 if (player && (player->paused() || player->hasVideo())) |
| 377 player->ReleaseMediaResources(); | 267 player->ReleaseMediaResources(); |
| 378 } | 268 } |
| 379 } | 269 } |
| 380 | 270 |
| 381 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer( | 271 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer( |
| 382 int player_id) { | 272 int player_id) { |
| 383 std::map<int, WebMediaPlayerAndroid*>::iterator iter = | 273 std::map<int, WebMediaPlayerAndroid*>::iterator iter = |
| 384 media_players_.find(player_id); | 274 media_players_.find(player_id); |
| 385 if (iter != media_players_.end()) | 275 if (iter != media_players_.end()) |
| 386 return iter->second; | 276 return iter->second; |
| 387 return NULL; | 277 return NULL; |
| 388 } | 278 } |
| 389 | 279 |
| 390 ProxyMediaKeys* RendererMediaPlayerManager::GetMediaKeys(int cdm_id) { | |
| 391 std::map<int, ProxyMediaKeys*>::iterator iter = media_keys_.find(cdm_id); | |
| 392 return (iter != media_keys_.end()) ? iter->second : NULL; | |
| 393 } | |
| 394 | |
| 395 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) { | 280 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) { |
| 396 return (!fullscreen_frame_ && !pending_fullscreen_frame_) | 281 return (!fullscreen_frame_ && !pending_fullscreen_frame_) |
| 397 || ShouldEnterFullscreen(frame); | 282 || ShouldEnterFullscreen(frame); |
| 398 } | 283 } |
| 399 | 284 |
| 400 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) { | 285 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) { |
| 401 pending_fullscreen_frame_ = NULL; | 286 pending_fullscreen_frame_ = NULL; |
| 402 fullscreen_frame_ = frame; | 287 fullscreen_frame_ = frame; |
| 403 } | 288 } |
| 404 | 289 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 | 336 |
| 452 bool | 337 bool |
| 453 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { | 338 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { |
| 454 const RendererPreferences& prefs = static_cast<RenderFrameImpl*>( | 339 const RendererPreferences& prefs = static_cast<RenderFrameImpl*>( |
| 455 render_frame())->render_view()->renderer_preferences(); | 340 render_frame())->render_view()->renderer_preferences(); |
| 456 return prefs.use_video_overlay_for_embedded_encrypted_video; | 341 return prefs.use_video_overlay_for_embedded_encrypted_video; |
| 457 } | 342 } |
| 458 #endif // defined(VIDEO_HOLE) | 343 #endif // defined(VIDEO_HOLE) |
| 459 | 344 |
| 460 } // namespace content | 345 } // namespace content |
| OLD | NEW |