| 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 |