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" | |
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" | 7 #include "content/common/media/media_player_messages_android.h" |
11 #include "content/public/common/renderer_preferences.h" | 8 #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" | 9 #include "content/renderer/media/android/renderer_media_player_manager.h" |
14 #include "content/renderer/media/android/webmediaplayer_android.h" | 10 #include "content/renderer/media/android/webmediaplayer_android.h" |
| 11 #include "content/renderer/media/crypto/renderer_cdm_manager.h" |
15 #include "content/renderer/render_view_impl.h" | 12 #include "content/renderer/render_view_impl.h" |
16 #include "ui/gfx/rect_f.h" | 13 #include "ui/gfx/rect_f.h" |
17 | 14 |
18 namespace content { | 15 namespace content { |
19 | 16 |
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( | 17 RendererMediaPlayerManager::RendererMediaPlayerManager( |
27 RenderFrame* render_frame) | 18 RenderFrame* render_frame) |
28 : RenderFrameObserver(render_frame), | 19 : RenderFrameObserver(render_frame), |
29 next_media_player_id_(0), | 20 next_media_player_id_(0), |
30 fullscreen_frame_(NULL), | 21 fullscreen_frame_(NULL), |
31 pending_fullscreen_frame_(NULL) { | 22 pending_fullscreen_frame_(NULL) { |
32 } | 23 } |
33 | 24 |
34 RendererMediaPlayerManager::~RendererMediaPlayerManager() { | 25 RendererMediaPlayerManager::~RendererMediaPlayerManager() { |
35 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; | 26 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; |
(...skipping 27 matching lines...) Expand all Loading... |
63 OnConnectedToRemoteDevice) | 54 OnConnectedToRemoteDevice) |
64 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice, | 55 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DisconnectedFromRemoteDevice, |
65 OnDisconnectedFromRemoteDevice) | 56 OnDisconnectedFromRemoteDevice) |
66 IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen, | 57 IPC_MESSAGE_HANDLER(MediaPlayerMsg_RequestFullscreen, |
67 OnRequestFullscreen) | 58 OnRequestFullscreen) |
68 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen) | 59 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidEnterFullscreen, OnDidEnterFullscreen) |
69 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen) | 60 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidExitFullscreen, OnDidExitFullscreen) |
70 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay) | 61 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPlay, OnPlayerPlay) |
71 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause) | 62 IPC_MESSAGE_HANDLER(MediaPlayerMsg_DidMediaPlayerPause, OnPlayerPause) |
72 IPC_MESSAGE_HANDLER(MediaPlayerMsg_PauseVideo, OnPauseVideo) | 63 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) | 64 IPC_MESSAGE_UNHANDLED(handled = false) |
79 IPC_END_MESSAGE_MAP() | 65 IPC_END_MESSAGE_MAP() |
80 return handled; | 66 return handled; |
81 } | 67 } |
82 | 68 |
83 void RendererMediaPlayerManager::Initialize( | 69 void RendererMediaPlayerManager::Initialize( |
84 MediaPlayerHostMsg_Initialize_Type type, | 70 MediaPlayerHostMsg_Initialize_Type type, |
85 int player_id, | 71 int player_id, |
86 const GURL& url, | 72 const GURL& url, |
87 const GURL& first_party_for_cookies, | 73 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)); | 230 Send(new MediaPlayerHostMsg_EnterFullscreen(routing_id(), player_id)); |
245 } | 231 } |
246 | 232 |
247 void RendererMediaPlayerManager::ExitFullscreen(int player_id) { | 233 void RendererMediaPlayerManager::ExitFullscreen(int player_id) { |
248 pending_fullscreen_frame_ = NULL; | 234 pending_fullscreen_frame_ = NULL; |
249 fullscreen_frame_ = NULL; | 235 fullscreen_frame_ = NULL; |
250 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id)); | 236 Send(new MediaPlayerHostMsg_ExitFullscreen(routing_id(), player_id)); |
251 } | 237 } |
252 | 238 |
253 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) { | 239 void RendererMediaPlayerManager::SetCdm(int player_id, int cdm_id) { |
254 if (cdm_id == kInvalidCdmId) | 240 if (cdm_id == RendererCdmManager::kInvalidCdmId) { |
| 241 NOTREACHED(); |
255 return; | 242 return; |
| 243 } |
256 Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id)); | 244 Send(new MediaPlayerHostMsg_SetCdm(routing_id(), player_id, cdm_id)); |
257 } | 245 } |
258 | 246 |
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); | |
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( | 247 int RendererMediaPlayerManager::RegisterMediaPlayer( |
352 WebMediaPlayerAndroid* player) { | 248 WebMediaPlayerAndroid* player) { |
353 media_players_[next_media_player_id_] = player; | 249 media_players_[next_media_player_id_] = player; |
354 return next_media_player_id_++; | 250 return next_media_player_id_++; |
355 } | 251 } |
356 | 252 |
357 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { | 253 void RendererMediaPlayerManager::UnregisterMediaPlayer(int player_id) { |
358 media_players_.erase(player_id); | 254 media_players_.erase(player_id); |
359 } | 255 } |
360 | 256 |
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() { | 257 void RendererMediaPlayerManager::ReleaseVideoResources() { |
370 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; | 258 std::map<int, WebMediaPlayerAndroid*>::iterator player_it; |
371 for (player_it = media_players_.begin(); player_it != media_players_.end(); | 259 for (player_it = media_players_.begin(); player_it != media_players_.end(); |
372 ++player_it) { | 260 ++player_it) { |
373 WebMediaPlayerAndroid* player = player_it->second; | 261 WebMediaPlayerAndroid* player = player_it->second; |
374 | 262 |
375 // Do not release if an audio track is still playing | 263 // Do not release if an audio track is still playing |
376 if (player && (player->paused() || player->hasVideo())) | 264 if (player && (player->paused() || player->hasVideo())) |
377 player->ReleaseMediaResources(); | 265 player->ReleaseMediaResources(); |
378 } | 266 } |
379 } | 267 } |
380 | 268 |
381 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer( | 269 WebMediaPlayerAndroid* RendererMediaPlayerManager::GetMediaPlayer( |
382 int player_id) { | 270 int player_id) { |
383 std::map<int, WebMediaPlayerAndroid*>::iterator iter = | 271 std::map<int, WebMediaPlayerAndroid*>::iterator iter = |
384 media_players_.find(player_id); | 272 media_players_.find(player_id); |
385 if (iter != media_players_.end()) | 273 if (iter != media_players_.end()) |
386 return iter->second; | 274 return iter->second; |
387 return NULL; | 275 return NULL; |
388 } | 276 } |
389 | 277 |
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) { | 278 bool RendererMediaPlayerManager::CanEnterFullscreen(blink::WebFrame* frame) { |
396 return (!fullscreen_frame_ && !pending_fullscreen_frame_) | 279 return (!fullscreen_frame_ && !pending_fullscreen_frame_) |
397 || ShouldEnterFullscreen(frame); | 280 || ShouldEnterFullscreen(frame); |
398 } | 281 } |
399 | 282 |
400 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) { | 283 void RendererMediaPlayerManager::DidEnterFullscreen(blink::WebFrame* frame) { |
401 pending_fullscreen_frame_ = NULL; | 284 pending_fullscreen_frame_ = NULL; |
402 fullscreen_frame_ = frame; | 285 fullscreen_frame_ = frame; |
403 } | 286 } |
404 | 287 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 | 334 |
452 bool | 335 bool |
453 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { | 336 RendererMediaPlayerManager::ShouldUseVideoOverlayForEmbeddedEncryptedVideo() { |
454 const RendererPreferences& prefs = static_cast<RenderFrameImpl*>( | 337 const RendererPreferences& prefs = static_cast<RenderFrameImpl*>( |
455 render_frame())->render_view()->renderer_preferences(); | 338 render_frame())->render_view()->renderer_preferences(); |
456 return prefs.use_video_overlay_for_embedded_encrypted_video; | 339 return prefs.use_video_overlay_for_embedded_encrypted_video; |
457 } | 340 } |
458 #endif // defined(VIDEO_HOLE) | 341 #endif // defined(VIDEO_HOLE) |
459 | 342 |
460 } // namespace content | 343 } // namespace content |
OLD | NEW |