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/media/android/browser_media_player_manager.h" | 5 #include "content/browser/media/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/content_view_core_impl.h" | 8 #include "content/browser/android/content_view_core_impl.h" |
9 #include "content/browser/media/android/browser_demuxer_android.h" | 9 #include "content/browser/media/android/browser_demuxer_android.h" |
10 #include "content/browser/media/android/media_resource_getter_impl.h" | 10 #include "content/browser/media/android/media_resource_getter_impl.h" |
11 #include "content/browser/renderer_host/render_view_host_impl.h" | 11 #include "content/browser/renderer_host/render_view_host_impl.h" |
12 #include "content/browser/web_contents/web_contents_view_android.h" | 12 #include "content/browser/web_contents/web_contents_view_android.h" |
13 #include "content/common/media/media_player_messages_android.h" | 13 #include "content/common/media/media_player_messages_android.h" |
14 #include "content/public/browser/android/content_view_core.h" | 14 #include "content/public/browser/android/content_view_core.h" |
| 15 #include "content/public/browser/android/external_video_surface_container.h" |
15 #include "content/public/browser/browser_context.h" | 16 #include "content/public/browser/browser_context.h" |
16 #include "content/public/browser/render_process_host.h" | 17 #include "content/public/browser/render_process_host.h" |
17 #include "content/public/browser/render_view_host.h" | 18 #include "content/public/browser/render_view_host.h" |
18 #include "content/public/browser/storage_partition.h" | 19 #include "content/public/browser/storage_partition.h" |
19 #include "content/public/browser/web_contents.h" | 20 #include "content/public/browser/web_contents.h" |
20 #include "content/public/browser/web_contents_delegate.h" | 21 #include "content/public/browser/web_contents_delegate.h" |
21 #include "content/public/common/content_client.h" | 22 #include "content/public/common/content_client.h" |
22 #include "content/public/common/content_switches.h" | 23 #include "content/public/common/content_switches.h" |
23 #include "media/base/android/media_drm_bridge.h" | 24 #include "media/base/android/media_drm_bridge.h" |
24 #include "media/base/android/media_player_bridge.h" | 25 #include "media/base/android/media_player_bridge.h" |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && | 320 if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && |
320 fullscreen_player_id_ != (*it)->player_id()) { | 321 fullscreen_player_id_ != (*it)->player_id()) { |
321 (*it)->Release(); | 322 (*it)->Release(); |
322 Send(new MediaPlayerMsg_MediaPlayerReleased( | 323 Send(new MediaPlayerMsg_MediaPlayerReleased( |
323 routing_id(), (*it)->player_id())); | 324 routing_id(), (*it)->player_id())); |
324 } | 325 } |
325 } | 326 } |
326 } | 327 } |
327 | 328 |
328 void BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { | 329 void BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { |
329 // Nothing needs to be done. | 330 #if defined(VIDEO_HOLE) |
| 331 ExternalVideoSurfaceContainer* surface_container = |
| 332 ExternalVideoSurfaceContainer::FromWebContents(web_contents_); |
| 333 if (surface_container) |
| 334 surface_container->ReleaseExternalVideoSurface(player_id); |
| 335 #endif // defined(VIDEO_HOLE) |
330 } | 336 } |
331 | 337 |
332 media::MediaResourceGetter* | 338 media::MediaResourceGetter* |
333 BrowserMediaPlayerManager::GetMediaResourceGetter() { | 339 BrowserMediaPlayerManager::GetMediaResourceGetter() { |
334 if (!media_resource_getter_.get()) { | 340 if (!media_resource_getter_.get()) { |
335 RenderProcessHost* host = web_contents()->GetRenderProcessHost(); | 341 RenderProcessHost* host = web_contents()->GetRenderProcessHost(); |
336 BrowserContext* context = host->GetBrowserContext(); | 342 BrowserContext* context = host->GetBrowserContext(); |
337 StoragePartition* partition = host->GetStoragePartition(); | 343 StoragePartition* partition = host->GetStoragePartition(); |
338 fileapi::FileSystemContext* file_system_context = | 344 fileapi::FileSystemContext* file_system_context = |
339 partition ? partition->GetFileSystemContext() : NULL; | 345 partition ? partition->GetFileSystemContext() : NULL; |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 MediaPlayerAndroid* player = GetPlayer(player_id); | 463 MediaPlayerAndroid* player = GetPlayer(player_id); |
458 if (player) | 464 if (player) |
459 player->SetVideoSurface(gfx::ScopedJavaSurface()); | 465 player->SetVideoSurface(gfx::ScopedJavaSurface()); |
460 } | 466 } |
461 | 467 |
462 void BrowserMediaPlayerManager::OnNotifyExternalSurface( | 468 void BrowserMediaPlayerManager::OnNotifyExternalSurface( |
463 int player_id, bool is_request, const gfx::RectF& rect) { | 469 int player_id, bool is_request, const gfx::RectF& rect) { |
464 if (!web_contents_) | 470 if (!web_contents_) |
465 return; | 471 return; |
466 | 472 |
467 WebContentsViewAndroid* view = | 473 ExternalVideoSurfaceContainer::CreateForWebContents(web_contents_); |
468 static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); | 474 ExternalVideoSurfaceContainer* surface_container = |
469 if (view) | 475 ExternalVideoSurfaceContainer::FromWebContents(web_contents_); |
470 view->NotifyExternalSurface(player_id, is_request, rect); | 476 if (!surface_container) |
| 477 return; |
| 478 |
| 479 if (is_request) { |
| 480 // It's safe to use base::Unretained(this), because the callbacks will not |
| 481 // be called after running ReleaseExternalVideoSurface(). |
| 482 surface_container->RequestExternalVideoSurface( |
| 483 player_id, |
| 484 base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, |
| 485 base::Unretained(this)), |
| 486 base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, |
| 487 base::Unretained(this))); |
| 488 } |
| 489 surface_container->OnExternalVideoSurfacePositionChanged(player_id, rect); |
471 } | 490 } |
472 #endif // defined(VIDEO_HOLE) | 491 #endif // defined(VIDEO_HOLE) |
473 | 492 |
474 void BrowserMediaPlayerManager::DisableFullscreenEncryptedMediaPlayback() { | 493 void BrowserMediaPlayerManager::DisableFullscreenEncryptedMediaPlayback() { |
475 if (fullscreen_player_id_ == -1) | 494 if (fullscreen_player_id_ == -1) |
476 return; | 495 return; |
477 | 496 |
478 // If the fullscreen player is not playing back encrypted video, do nothing. | 497 // If the fullscreen player is not playing back encrypted video, do nothing. |
479 MediaDrmBridge* drm_bridge = GetDrmBridge(fullscreen_player_id_); | 498 MediaDrmBridge* drm_bridge = GetDrmBridge(fullscreen_player_id_); |
480 if (!drm_bridge) | 499 if (!drm_bridge) |
481 return; | 500 return; |
482 | 501 |
483 // Exit fullscreen. | 502 // Exit fullscreen. |
484 pending_fullscreen_player_id_ = fullscreen_player_id_; | 503 pending_fullscreen_player_id_ = fullscreen_player_id_; |
485 OnExitFullscreen(fullscreen_player_id_); | 504 OnExitFullscreen(fullscreen_player_id_); |
486 } | 505 } |
487 | 506 |
488 void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { | 507 void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { |
489 DCHECK_EQ(fullscreen_player_id_, -1); | 508 DCHECK_EQ(fullscreen_player_id_, -1); |
490 if (media_keys_ids_pending_approval_.find(player_id) != | 509 if (media_keys_ids_pending_approval_.find(player_id) != |
491 media_keys_ids_pending_approval_.end()) { | 510 media_keys_ids_pending_approval_.end()) { |
492 return; | 511 return; |
493 } | 512 } |
494 | 513 |
| 514 #if defined(VIDEO_HOLE) |
| 515 ExternalVideoSurfaceContainer* surface_container = |
| 516 ExternalVideoSurfaceContainer::FromWebContents(web_contents_); |
| 517 if (surface_container) |
| 518 surface_container->ReleaseExternalVideoSurface(player_id); |
| 519 #endif // defined(VIDEO_HOLE) |
495 if (video_view_.get()) { | 520 if (video_view_.get()) { |
496 fullscreen_player_id_ = player_id; | 521 fullscreen_player_id_ = player_id; |
497 video_view_->OpenVideo(); | 522 video_view_->OpenVideo(); |
498 } else if (!ContentVideoView::GetInstance()) { | 523 } else if (!ContentVideoView::GetInstance()) { |
499 // In Android WebView, two ContentViewCores could both try to enter | 524 // In Android WebView, two ContentViewCores could both try to enter |
500 // fullscreen video, we just ignore the second one. | 525 // fullscreen video, we just ignore the second one. |
501 fullscreen_player_id_ = player_id; | 526 fullscreen_player_id_ = player_id; |
502 video_view_.reset(new ContentVideoView(this)); | 527 video_view_.reset(new ContentVideoView(this)); |
503 } | 528 } |
504 } | 529 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { | 588 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { |
564 // To be overridden by subclasses. | 589 // To be overridden by subclasses. |
565 } | 590 } |
566 | 591 |
567 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { | 592 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { |
568 MediaPlayerAndroid* player = GetPlayer(player_id); | 593 MediaPlayerAndroid* player = GetPlayer(player_id); |
569 if (player) | 594 if (player) |
570 player->Release(); | 595 player->Release(); |
571 if (player_id == fullscreen_player_id_) | 596 if (player_id == fullscreen_player_id_) |
572 fullscreen_player_is_released_ = true; | 597 fullscreen_player_is_released_ = true; |
573 | |
574 #if defined(VIDEO_HOLE) | |
575 WebContentsViewAndroid* view = | |
576 static_cast<WebContentsViewAndroid*>(web_contents_->GetView()); | |
577 if (view) | |
578 view->NotifyExternalSurface(player_id, false, gfx::RectF()); | |
579 #endif // defined(VIDEO_HOLE) | |
580 } | 598 } |
581 | 599 |
582 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { | 600 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { |
583 RemovePlayer(player_id); | 601 RemovePlayer(player_id); |
584 if (fullscreen_player_id_ == player_id) | 602 if (fullscreen_player_id_ == player_id) |
585 fullscreen_player_id_ = -1; | 603 fullscreen_player_id_ = -1; |
586 } | 604 } |
587 | 605 |
588 void BrowserMediaPlayerManager::OnInitializeCDM( | 606 void BrowserMediaPlayerManager::OnInitializeCDM( |
589 int media_keys_id, | 607 int media_keys_id, |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 if (player->IsPlaying()) | 876 if (player->IsPlaying()) |
859 OnProtectedSurfaceRequested(media_keys_id); | 877 OnProtectedSurfaceRequested(media_keys_id); |
860 } | 878 } |
861 | 879 |
862 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( | 880 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( |
863 MediaPlayerAndroid* player) { | 881 MediaPlayerAndroid* player) { |
864 player->Release(); | 882 player->Release(); |
865 } | 883 } |
866 | 884 |
867 } // namespace content | 885 } // namespace content |
OLD | NEW |