| 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/android/scoped_java_ref.h" | 7 #include "base/android/scoped_java_ref.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "content/browser/android/content_view_core_impl.h" | 9 #include "content/browser/android/content_view_core_impl.h" |
| 10 #include "content/browser/media/android/browser_demuxer_android.h" | 10 #include "content/browser/media/android/browser_demuxer_android.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 const std::string user_agent = GetContentClient()->GetUserAgent(); | 76 const std::string user_agent = GetContentClient()->GetUserAgent(); |
| 77 MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( | 77 MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( |
| 78 media_player_params.player_id, | 78 media_player_params.player_id, |
| 79 media_player_params.url, | 79 media_player_params.url, |
| 80 media_player_params.first_party_for_cookies, | 80 media_player_params.first_party_for_cookies, |
| 81 user_agent, | 81 user_agent, |
| 82 hide_url_log, | 82 hide_url_log, |
| 83 manager, | 83 manager, |
| 84 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, | 84 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, |
| 85 weak_ptr_factory_.GetWeakPtr()), | 85 weak_ptr_factory_.GetWeakPtr()), |
| 86 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, | |
| 87 weak_ptr_factory_.GetWeakPtr()), | |
| 88 media_player_params.frame_url, | 86 media_player_params.frame_url, |
| 89 media_player_params.allow_credentials); | 87 media_player_params.allow_credentials); |
| 90 BrowserMediaPlayerManager* browser_media_player_manager = | 88 BrowserMediaPlayerManager* browser_media_player_manager = |
| 91 static_cast<BrowserMediaPlayerManager*>(manager); | 89 static_cast<BrowserMediaPlayerManager*>(manager); |
| 92 ContentViewCoreImpl* content_view_core_impl = | 90 ContentViewCoreImpl* content_view_core_impl = |
| 93 static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( | 91 static_cast<ContentViewCoreImpl*>(ContentViewCore::FromWebContents( |
| 94 browser_media_player_manager->web_contents_)); | 92 browser_media_player_manager->web_contents_)); |
| 95 if (!content_view_core_impl) { | 93 if (!content_view_core_impl) { |
| 96 // May reach here due to prerendering. Don't extract the metadata | 94 // May reach here due to prerendering. Don't extract the metadata |
| 97 // since it is expensive. | 95 // since it is expensive. |
| 98 // TODO(qinmin): extract the metadata once the user decided to load | 96 // TODO(qinmin): extract the metadata once the user decided to load |
| 99 // the page. | 97 // the page. |
| 100 browser_media_player_manager->OnMediaMetadataChanged( | 98 browser_media_player_manager->OnMediaMetadataChanged( |
| 101 media_player_params.player_id, base::TimeDelta(), 0, 0, false); | 99 media_player_params.player_id, base::TimeDelta(), 0, 0, false); |
| 102 } else if (!content_view_core_impl->ShouldBlockMediaRequest( | 100 } else if (!content_view_core_impl->ShouldBlockMediaRequest( |
| 103 media_player_params.url)) { | 101 media_player_params.url)) { |
| 104 media_player_bridge->Initialize(); | 102 media_player_bridge->Initialize(); |
| 105 } | 103 } |
| 106 return media_player_bridge; | 104 return media_player_bridge; |
| 107 } | 105 } |
| 108 | 106 |
| 109 case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { | 107 case MEDIA_PLAYER_TYPE_MEDIA_SOURCE: { |
| 110 return new MediaSourcePlayer( | 108 return new MediaSourcePlayer( |
| 111 media_player_params.player_id, | 109 media_player_params.player_id, |
| 112 manager, | 110 manager, |
| 113 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, | 111 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesRequested, |
| 114 weak_ptr_factory_.GetWeakPtr()), | 112 weak_ptr_factory_.GetWeakPtr()), |
| 115 base::Bind(&BrowserMediaPlayerManager::OnMediaResourcesReleased, | |
| 116 weak_ptr_factory_.GetWeakPtr()), | |
| 117 demuxer->CreateDemuxer(media_player_params.demuxer_client_id), | 113 demuxer->CreateDemuxer(media_player_params.demuxer_client_id), |
| 118 media_player_params.frame_url); | 114 media_player_params.frame_url); |
| 119 } | 115 } |
| 120 } | 116 } |
| 121 | 117 |
| 122 NOTREACHED(); | 118 NOTREACHED(); |
| 123 return NULL; | 119 return NULL; |
| 124 } | 120 } |
| 125 | 121 |
| 126 BrowserMediaPlayerManager::BrowserMediaPlayerManager( | 122 BrowserMediaPlayerManager::BrowserMediaPlayerManager( |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 player->SetVolume(volume); | 488 player->SetVolume(volume); |
| 493 } | 489 } |
| 494 | 490 |
| 495 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { | 491 void BrowserMediaPlayerManager::OnSetPoster(int player_id, const GURL& url) { |
| 496 // To be overridden by subclasses. | 492 // To be overridden by subclasses. |
| 497 } | 493 } |
| 498 | 494 |
| 499 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { | 495 void BrowserMediaPlayerManager::OnReleaseResources(int player_id) { |
| 500 MediaPlayerAndroid* player = GetPlayer(player_id); | 496 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 501 if (player) | 497 if (player) |
| 502 player->Release(); | 498 ReleasePlayer(player); |
| 503 if (player_id == fullscreen_player_id_) | 499 if (player_id == fullscreen_player_id_) |
| 504 fullscreen_player_is_released_ = true; | 500 fullscreen_player_is_released_ = true; |
| 505 } | 501 } |
| 506 | 502 |
| 507 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { | 503 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { |
| 508 RemovePlayer(player_id); | 504 RemovePlayer(player_id); |
| 509 if (fullscreen_player_id_ == player_id) | 505 if (fullscreen_player_id_ == player_id) |
| 510 fullscreen_player_id_ = -1; | 506 fullscreen_player_id_ = -1; |
| 511 } | 507 } |
| 512 | 508 |
| 513 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { | 509 void BrowserMediaPlayerManager::AddPlayer(MediaPlayerAndroid* player) { |
| 514 DCHECK(!GetPlayer(player->player_id())); | 510 DCHECK(!GetPlayer(player->player_id())); |
| 515 players_.push_back(player); | 511 players_.push_back(player); |
| 516 } | 512 } |
| 517 | 513 |
| 518 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { | 514 void BrowserMediaPlayerManager::RemovePlayer(int player_id) { |
| 519 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 515 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
| 520 it != players_.end(); ++it) { | 516 it != players_.end(); ++it) { |
| 521 MediaPlayerAndroid* player = *it; | 517 if ((*it)->player_id() == player_id) { |
| 522 if (player->player_id() == player_id) { | 518 ReleaseMediaResources(player_id); |
| 523 players_.erase(it); | 519 players_.erase(it); |
| 524 break; | 520 break; |
| 525 } | 521 } |
| 526 } | 522 } |
| 527 } | 523 } |
| 528 | 524 |
| 529 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( | 525 scoped_ptr<media::MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( |
| 530 int player_id, media::MediaPlayerAndroid* player) { | 526 int player_id, media::MediaPlayerAndroid* player) { |
| 531 media::MediaPlayerAndroid* previous_player = NULL; | 527 media::MediaPlayerAndroid* previous_player = NULL; |
| 532 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 528 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
| 533 it != players_.end(); ++it) { | 529 it != players_.end(); ++it) { |
| 534 if ((*it)->player_id() == player_id) { | 530 if ((*it)->player_id() == player_id) { |
| 535 previous_player = *it; | 531 previous_player = *it; |
| 532 ReleaseMediaResources(player_id); |
| 536 players_.weak_erase(it); | 533 players_.weak_erase(it); |
| 537 players_.push_back(player); | 534 players_.push_back(player); |
| 538 break; | 535 break; |
| 539 } | 536 } |
| 540 } | 537 } |
| 541 return scoped_ptr<media::MediaPlayerAndroid>(previous_player); | 538 return scoped_ptr<media::MediaPlayerAndroid>(previous_player); |
| 542 } | 539 } |
| 543 | 540 |
| 544 int BrowserMediaPlayerManager::RoutingID() { | 541 int BrowserMediaPlayerManager::RoutingID() { |
| 545 return render_frame_host_->GetRoutingID(); | 542 return render_frame_host_->GetRoutingID(); |
| 546 } | 543 } |
| 547 | 544 |
| 548 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { | 545 bool BrowserMediaPlayerManager::Send(IPC::Message* msg) { |
| 549 return render_frame_host_->Send(msg); | 546 return render_frame_host_->Send(msg); |
| 550 } | 547 } |
| 551 | 548 |
| 552 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( | 549 void BrowserMediaPlayerManager::ReleaseFullscreenPlayer( |
| 553 MediaPlayerAndroid* player) { | 550 MediaPlayerAndroid* player) { |
| 554 player->Release(); | 551 ReleasePlayer(player); |
| 555 } | 552 } |
| 556 | 553 |
| 557 void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { | 554 void BrowserMediaPlayerManager::OnMediaResourcesRequested(int player_id) { |
| 558 int num_active_player = 0; | 555 int num_active_player = 0; |
| 559 ScopedVector<MediaPlayerAndroid>::iterator it; | 556 ScopedVector<MediaPlayerAndroid>::iterator it; |
| 560 for (it = players_.begin(); it != players_.end(); ++it) { | 557 for (it = players_.begin(); it != players_.end(); ++it) { |
| 561 if (!(*it)->IsPlayerReady()) | 558 if (!(*it)->IsPlayerReady()) |
| 562 continue; | 559 continue; |
| 563 | 560 |
| 564 // The player is already active, ignore it. | 561 // The player is already active, ignore it. |
| 565 if ((*it)->player_id() == player_id) | 562 if ((*it)->player_id() == player_id) |
| 566 return; | 563 return; |
| 567 else | 564 else |
| 568 num_active_player++; | 565 num_active_player++; |
| 569 } | 566 } |
| 570 | 567 |
| 571 // Number of active players are less than the threshold, do nothing. | 568 // Number of active players are less than the threshold, do nothing. |
| 572 if (num_active_player < kMediaPlayerThreshold) | 569 if (num_active_player < kMediaPlayerThreshold) |
| 573 return; | 570 return; |
| 574 | 571 |
| 575 for (it = players_.begin(); it != players_.end(); ++it) { | 572 for (it = players_.begin(); it != players_.end(); ++it) { |
| 576 if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && | 573 if ((*it)->IsPlayerReady() && !(*it)->IsPlaying() && |
| 577 fullscreen_player_id_ != (*it)->player_id()) { | 574 fullscreen_player_id_ != (*it)->player_id()) { |
| 578 (*it)->Release(); | 575 ReleasePlayer(*it); |
| 579 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), | 576 Send(new MediaPlayerMsg_MediaPlayerReleased(RoutingID(), |
| 580 (*it)->player_id())); | 577 (*it)->player_id())); |
| 581 } | 578 } |
| 582 } | 579 } |
| 583 } | 580 } |
| 584 | 581 |
| 585 void BrowserMediaPlayerManager::OnMediaResourcesReleased(int player_id) { | 582 void BrowserMediaPlayerManager::ReleaseMediaResources(int player_id) { |
| 586 #if defined(VIDEO_HOLE) | 583 #if defined(VIDEO_HOLE) |
| 587 MediaPlayerAndroid* player = GetPlayer(player_id); | 584 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 588 if (player && player->IsSurfaceInUse()) | 585 if (player && player->IsSurfaceInUse()) |
| 589 return; | 586 return; |
| 590 if (external_video_surface_container_) | 587 if (external_video_surface_container_) |
| 591 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); | 588 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
| 592 #endif // defined(VIDEO_HOLE) | 589 #endif // defined(VIDEO_HOLE) |
| 593 } | 590 } |
| 594 | 591 |
| 592 void BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { |
| 593 player->Release(); |
| 594 ReleaseMediaResources(player->player_id()); |
| 595 } |
| 596 |
| 595 } // namespace content | 597 } // namespace content |
| OLD | NEW |