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/browser/android/browser_media_player_manager.h" | 5 #include "content/browser/android/browser_media_player_manager.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "content/browser/android/browser_demuxer_android.h" |
8 #include "content/browser/android/content_view_core_impl.h" | 9 #include "content/browser/android/content_view_core_impl.h" |
9 #include "content/browser/android/media_resource_getter_impl.h" | 10 #include "content/browser/android/media_resource_getter_impl.h" |
10 #include "content/browser/web_contents/web_contents_view_android.h" | 11 #include "content/browser/web_contents/web_contents_view_android.h" |
11 #include "content/common/media/media_player_messages_android.h" | 12 #include "content/common/media/media_player_messages_android.h" |
12 #include "content/public/browser/browser_context.h" | 13 #include "content/public/browser/browser_context.h" |
13 #include "content/public/browser/render_process_host.h" | 14 #include "content/public/browser/render_process_host.h" |
14 #include "content/public/browser/render_view_host.h" | 15 #include "content/public/browser/render_view_host.h" |
15 #include "content/public/browser/storage_partition.h" | 16 #include "content/public/browser/storage_partition.h" |
16 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
17 #include "media/base/android/media_drm_bridge.h" | 18 #include "media/base/android/media_drm_bridge.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 } | 73 } |
73 | 74 |
74 NOTREACHED(); | 75 NOTREACHED(); |
75 return NULL; | 76 return NULL; |
76 } | 77 } |
77 #endif | 78 #endif |
78 | 79 |
79 BrowserMediaPlayerManager::BrowserMediaPlayerManager( | 80 BrowserMediaPlayerManager::BrowserMediaPlayerManager( |
80 RenderViewHost* render_view_host) | 81 RenderViewHost* render_view_host) |
81 : RenderViewHostObserver(render_view_host), | 82 : RenderViewHostObserver(render_view_host), |
| 83 browser_demuxer_(new BrowserDemuxerAndroid(render_view_host)), |
82 fullscreen_player_id_(-1), | 84 fullscreen_player_id_(-1), |
83 web_contents_(WebContents::FromRenderViewHost(render_view_host)) { | 85 web_contents_(WebContents::FromRenderViewHost(render_view_host)) { |
84 } | 86 } |
85 | 87 |
86 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {} | 88 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() {} |
87 | 89 |
88 bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) { | 90 bool BrowserMediaPlayerManager::OnMessageReceived(const IPC::Message& msg) { |
89 bool handled = true; | 91 bool handled = true; |
90 IPC_BEGIN_MESSAGE_MAP(BrowserMediaPlayerManager, msg) | 92 IPC_BEGIN_MESSAGE_MAP(BrowserMediaPlayerManager, msg) |
91 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) | 93 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) |
92 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen) | 94 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen) |
93 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Initialize, OnInitialize) | 95 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Initialize, OnInitialize) |
94 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Start, OnStart) | 96 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Start, OnStart) |
95 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Seek, OnSeek) | 97 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Seek, OnSeek) |
96 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Pause, OnPause) | 98 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Pause, OnPause) |
97 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume) | 99 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_SetVolume, OnSetVolume) |
98 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources) | 100 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_Release, OnReleaseResources) |
99 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) | 101 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) |
100 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, | 102 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, |
101 DestroyAllMediaPlayers) | 103 DestroyAllMediaPlayers) |
102 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DemuxerReady, OnDemuxerReady) | |
103 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ReadFromDemuxerAck, | |
104 OnReadFromDemuxerAck) | |
105 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DurationChanged, | |
106 OnDurationChanged) | |
107 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaSeekRequestAck, | |
108 OnMediaSeekRequestAck) | |
109 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_InitializeCDM, | 104 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_InitializeCDM, |
110 OnInitializeCDM) | 105 OnInitializeCDM) |
111 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_GenerateKeyRequest, | 106 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_GenerateKeyRequest, |
112 OnGenerateKeyRequest) | 107 OnGenerateKeyRequest) |
113 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_AddKey, OnAddKey) | 108 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_AddKey, OnAddKey) |
114 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelKeyRequest, | 109 IPC_MESSAGE_HANDLER(MediaKeysHostMsg_CancelKeyRequest, |
115 OnCancelKeyRequest) | 110 OnCancelKeyRequest) |
116 #if defined(GOOGLE_TV) | 111 #if defined(GOOGLE_TV) |
117 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface, | 112 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_NotifyExternalSurface, |
118 OnNotifyExternalSurface) | 113 OnNotifyExternalSurface) |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 } | 213 } |
219 | 214 |
220 void BrowserMediaPlayerManager::OnVideoSizeChanged( | 215 void BrowserMediaPlayerManager::OnVideoSizeChanged( |
221 int player_id, int width, int height) { | 216 int player_id, int width, int height) { |
222 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, | 217 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, |
223 width, height)); | 218 width, height)); |
224 if (fullscreen_player_id_ != -1) | 219 if (fullscreen_player_id_ != -1) |
225 video_view_->OnVideoSizeChanged(width, height); | 220 video_view_->OnVideoSizeChanged(width, height); |
226 } | 221 } |
227 | 222 |
228 void BrowserMediaPlayerManager::AddDemuxerClient( | |
229 int demuxer_client_id, | |
230 media::DemuxerAndroidClient* client) { | |
231 demuxer_clients_.AddWithID(client, demuxer_client_id); | |
232 } | |
233 | |
234 void BrowserMediaPlayerManager::RemoveDemuxerClient(int demuxer_client_id) { | |
235 demuxer_clients_.Remove(demuxer_client_id); | |
236 } | |
237 | |
238 void BrowserMediaPlayerManager::RequestDemuxerData( | |
239 int demuxer_client_id, media::DemuxerStream::Type type) { | |
240 DCHECK(demuxer_clients_.Lookup(demuxer_client_id)) << demuxer_client_id; | |
241 Send(new MediaPlayerMsg_ReadFromDemuxer( | |
242 routing_id(), demuxer_client_id, type)); | |
243 } | |
244 | |
245 void BrowserMediaPlayerManager::RequestMediaResources(int player_id) { | 223 void BrowserMediaPlayerManager::RequestMediaResources(int player_id) { |
246 int num_active_player = 0; | 224 int num_active_player = 0; |
247 ScopedVector<MediaPlayerAndroid>::iterator it; | 225 ScopedVector<MediaPlayerAndroid>::iterator it; |
248 for (it = players_.begin(); it != players_.end(); ++it) { | 226 for (it = players_.begin(); it != players_.end(); ++it) { |
249 if (!(*it)->IsPlayerReady()) | 227 if (!(*it)->IsPlayerReady()) |
250 continue; | 228 continue; |
251 | 229 |
252 // The player is already active, ignore it. | 230 // The player is already active, ignore it. |
253 if ((*it)->player_id() == player_id) | 231 if ((*it)->player_id() == player_id) |
254 return; | 232 return; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
311 } | 289 } |
312 | 290 |
313 void BrowserMediaPlayerManager::DestroyAllMediaPlayers() { | 291 void BrowserMediaPlayerManager::DestroyAllMediaPlayers() { |
314 players_.clear(); | 292 players_.clear(); |
315 if (fullscreen_player_id_ != -1) { | 293 if (fullscreen_player_id_ != -1) { |
316 video_view_.reset(); | 294 video_view_.reset(); |
317 fullscreen_player_id_ = -1; | 295 fullscreen_player_id_ = -1; |
318 } | 296 } |
319 } | 297 } |
320 | 298 |
321 void BrowserMediaPlayerManager::RequestDemuxerSeek(int demuxer_client_id, | |
322 base::TimeDelta time_to_seek, | |
323 unsigned seek_request_id) { | |
324 DCHECK(demuxer_clients_.Lookup(demuxer_client_id)) << demuxer_client_id; | |
325 Send(new MediaPlayerMsg_MediaSeekRequest( | |
326 routing_id(), demuxer_client_id, time_to_seek, seek_request_id)); | |
327 } | |
328 | |
329 void BrowserMediaPlayerManager::RequestDemuxerConfigs(int demuxer_client_id) { | |
330 DCHECK(demuxer_clients_.Lookup(demuxer_client_id)) << demuxer_client_id; | |
331 Send(new MediaPlayerMsg_MediaConfigRequest(routing_id(), demuxer_client_id)); | |
332 } | |
333 | |
334 void BrowserMediaPlayerManager::OnProtectedSurfaceRequested(int player_id) { | 299 void BrowserMediaPlayerManager::OnProtectedSurfaceRequested(int player_id) { |
335 if (fullscreen_player_id_ == player_id) | 300 if (fullscreen_player_id_ == player_id) |
336 return; | 301 return; |
337 if (fullscreen_player_id_ != -1) { | 302 if (fullscreen_player_id_ != -1) { |
338 // TODO(qinmin): Determine the correct error code we should report to WMPA. | 303 // TODO(qinmin): Determine the correct error code we should report to WMPA. |
339 OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); | 304 OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); |
340 return; | 305 return; |
341 } | 306 } |
342 OnEnterFullscreen(player_id); | 307 OnEnterFullscreen(player_id); |
343 } | 308 } |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 void BrowserMediaPlayerManager::OnInitialize( | 389 void BrowserMediaPlayerManager::OnInitialize( |
425 int player_id, | 390 int player_id, |
426 const GURL& url, | 391 const GURL& url, |
427 MediaPlayerHostMsg_Initialize_Type type, | 392 MediaPlayerHostMsg_Initialize_Type type, |
428 const GURL& first_party_for_cookies) { | 393 const GURL& first_party_for_cookies) { |
429 RemovePlayer(player_id); | 394 RemovePlayer(player_id); |
430 | 395 |
431 RenderProcessHost* host = render_view_host()->GetProcess(); | 396 RenderProcessHost* host = render_view_host()->GetProcess(); |
432 AddPlayer(CreateMediaPlayer( | 397 AddPlayer(CreateMediaPlayer( |
433 player_id, url, type, first_party_for_cookies, | 398 player_id, url, type, first_party_for_cookies, |
434 host->GetBrowserContext()->IsOffTheRecord(), this, this)); | 399 host->GetBrowserContext()->IsOffTheRecord(), this, browser_demuxer_)); |
435 } | 400 } |
436 | 401 |
437 void BrowserMediaPlayerManager::OnStart(int player_id) { | 402 void BrowserMediaPlayerManager::OnStart(int player_id) { |
438 MediaPlayerAndroid* player = GetPlayer(player_id); | 403 MediaPlayerAndroid* player = GetPlayer(player_id); |
439 if (player) | 404 if (player) |
440 player->Start(); | 405 player->Start(); |
441 } | 406 } |
442 | 407 |
443 void BrowserMediaPlayerManager::OnSeek(int player_id, base::TimeDelta time) { | 408 void BrowserMediaPlayerManager::OnSeek(int player_id, base::TimeDelta time) { |
444 MediaPlayerAndroid* player = GetPlayer(player_id); | 409 MediaPlayerAndroid* player = GetPlayer(player_id); |
(...skipping 28 matching lines...) Expand all Loading... |
473 view->NotifyExternalSurface(player_id, false, gfx::RectF()); | 438 view->NotifyExternalSurface(player_id, false, gfx::RectF()); |
474 #endif | 439 #endif |
475 } | 440 } |
476 | 441 |
477 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { | 442 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { |
478 RemovePlayer(player_id); | 443 RemovePlayer(player_id); |
479 if (fullscreen_player_id_ == player_id) | 444 if (fullscreen_player_id_ == player_id) |
480 fullscreen_player_id_ = -1; | 445 fullscreen_player_id_ = -1; |
481 } | 446 } |
482 | 447 |
483 void BrowserMediaPlayerManager::OnDemuxerReady( | |
484 int player_id, | |
485 const media::DemuxerConfigs& configs) { | |
486 // TODO(scherkus): Rename |player_id| to |demuxer_client_id| after splitting | |
487 // demuxer IPC messages into their own group. | |
488 media::DemuxerAndroidClient* client = demuxer_clients_.Lookup(player_id); | |
489 if (client) | |
490 client->OnDemuxerConfigsAvailable(configs); | |
491 } | |
492 | |
493 void BrowserMediaPlayerManager::OnReadFromDemuxerAck( | |
494 int player_id, | |
495 const media::DemuxerData& data) { | |
496 // TODO(scherkus): Rename |player_id| to |demuxer_client_id| after splitting | |
497 // demuxer IPC messages into their own group. | |
498 media::DemuxerAndroidClient* client = demuxer_clients_.Lookup(player_id); | |
499 if (client) | |
500 client->OnDemuxerDataAvailable(data); | |
501 } | |
502 | |
503 void BrowserMediaPlayerManager::OnMediaSeekRequestAck( | |
504 int player_id, unsigned seek_request_id) { | |
505 // TODO(scherkus): Rename |player_id| to |demuxer_client_id| after splitting | |
506 // demuxer IPC messages into their own group. | |
507 media::DemuxerAndroidClient* client = demuxer_clients_.Lookup(player_id); | |
508 if (client) | |
509 client->OnDemuxerSeeked(seek_request_id); | |
510 } | |
511 | |
512 void BrowserMediaPlayerManager::OnInitializeCDM( | 448 void BrowserMediaPlayerManager::OnInitializeCDM( |
513 int media_keys_id, | 449 int media_keys_id, |
514 const std::vector<uint8>& uuid) { | 450 const std::vector<uint8>& uuid) { |
515 AddDrmBridge(media_keys_id, uuid); | 451 AddDrmBridge(media_keys_id, uuid); |
516 // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| | 452 // In EME v0.1b MediaKeys lives in the media element. So the |media_keys_id| |
517 // is the same as the |player_id|. | 453 // is the same as the |player_id|. |
518 OnSetMediaKeys(media_keys_id, media_keys_id); | 454 OnSetMediaKeys(media_keys_id, media_keys_id); |
519 } | 455 } |
520 | 456 |
521 void BrowserMediaPlayerManager::OnGenerateKeyRequest( | 457 void BrowserMediaPlayerManager::OnGenerateKeyRequest( |
(...skipping 24 matching lines...) Expand all Loading... |
546 } | 482 } |
547 | 483 |
548 void BrowserMediaPlayerManager::OnCancelKeyRequest( | 484 void BrowserMediaPlayerManager::OnCancelKeyRequest( |
549 int media_keys_id, | 485 int media_keys_id, |
550 const std::string& session_id) { | 486 const std::string& session_id) { |
551 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); | 487 MediaDrmBridge* drm_bridge = GetDrmBridge(media_keys_id); |
552 if (drm_bridge) | 488 if (drm_bridge) |
553 drm_bridge->CancelKeyRequest(session_id); | 489 drm_bridge->CancelKeyRequest(session_id); |
554 } | 490 } |
555 | 491 |
556 void BrowserMediaPlayerManager::OnDurationChanged( | |
557 int player_id, const base::TimeDelta& duration) { | |
558 // TODO(scherkus): Rename |player_id| to |demuxer_client_id| after splitting | |
559 // demuxer IPC messages into their own group. | |
560 media::DemuxerAndroidClient* client = demuxer_clients_.Lookup(player_id); | |
561 if (client) | |
562 client->OnDemuxerDurationChanged(duration); | |
563 } | |
564 | |
565 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { | 492 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { |
566 DCHECK(!GetPlayer(player->player_id())); | 493 DCHECK(!GetPlayer(player->player_id())); |
567 players_.push_back(player); | 494 players_.push_back(player); |
568 } | 495 } |
569 | 496 |
570 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { | 497 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { |
571 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 498 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
572 it != players_.end(); ++it) { | 499 it != players_.end(); ++it) { |
573 if ((*it)->player_id() == player_id) { | 500 if ((*it)->player_id() == player_id) { |
574 players_.erase(it); | 501 players_.erase(it); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
615 if (!player || !drm_bridge) { | 542 if (!player || !drm_bridge) { |
616 DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; | 543 DVLOG(1) << "OnSetMediaKeys(): Player and MediaKeys must be present."; |
617 return; | 544 return; |
618 } | 545 } |
619 // TODO(qinmin): add the logic to decide whether we should create the | 546 // TODO(qinmin): add the logic to decide whether we should create the |
620 // fullscreen surface for EME lv1. | 547 // fullscreen surface for EME lv1. |
621 player->SetDrmBridge(drm_bridge); | 548 player->SetDrmBridge(drm_bridge); |
622 } | 549 } |
623 | 550 |
624 } // namespace content | 551 } // namespace content |
OLD | NEW |