Chromium Code Reviews| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/android/scoped_java_ref.h" | 9 #include "base/android/scoped_java_ref.h" |
| 10 #include "base/memory/ptr_util.h" | |
| 10 #include "base/memory/singleton.h" | 11 #include "base/memory/singleton.h" |
| 11 #include "content/browser/frame_host/render_frame_host_impl.h" | 12 #include "content/browser/frame_host/render_frame_host_impl.h" |
| 12 #include "content/browser/media/android/media_resource_getter_impl.h" | 13 #include "content/browser/media/android/media_resource_getter_impl.h" |
| 13 #include "content/browser/media/android/media_throttler.h" | 14 #include "content/browser/media/android/media_throttler.h" |
| 14 #include "content/browser/media/android/media_web_contents_observer_android.h" | 15 #include "content/browser/media/android/media_web_contents_observer_android.h" |
| 15 #include "content/browser/renderer_host/render_view_host_impl.h" | 16 #include "content/browser/renderer_host/render_view_host_impl.h" |
| 16 #include "content/browser/web_contents/web_contents_impl.h" | 17 #include "content/browser/web_contents/web_contents_impl.h" |
| 17 #include "content/common/media/media_player_messages_android.h" | 18 #include "content/common/media/media_player_messages_android.h" |
| 18 #include "content/public/browser/browser_context.h" | 19 #include "content/public/browser/browser_context.h" |
| 19 #include "content/public/browser/browser_thread.h" | 20 #include "content/public/browser/browser_thread.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 return g_factory(rfh); | 73 return g_factory(rfh); |
| 73 return new BrowserMediaPlayerManager(rfh); | 74 return new BrowserMediaPlayerManager(rfh); |
| 74 } | 75 } |
| 75 | 76 |
| 76 #if !defined(USE_AURA) | 77 #if !defined(USE_AURA) |
| 77 ContentViewCore* BrowserMediaPlayerManager::GetContentViewCore() const { | 78 ContentViewCore* BrowserMediaPlayerManager::GetContentViewCore() const { |
| 78 return ContentViewCoreImpl::FromWebContents(web_contents()); | 79 return ContentViewCoreImpl::FromWebContents(web_contents()); |
| 79 } | 80 } |
| 80 #endif | 81 #endif |
| 81 | 82 |
| 82 MediaPlayerAndroid* BrowserMediaPlayerManager::CreateMediaPlayer( | 83 std::unique_ptr<MediaPlayerAndroid> |
| 84 BrowserMediaPlayerManager::CreateMediaPlayer( | |
| 83 const MediaPlayerHostMsg_Initialize_Params& media_player_params, | 85 const MediaPlayerHostMsg_Initialize_Params& media_player_params, |
| 84 bool hide_url_log) { | 86 bool hide_url_log) { |
| 85 switch (media_player_params.type) { | 87 switch (media_player_params.type) { |
| 86 case MEDIA_PLAYER_TYPE_REMOTE_ONLY: | 88 case MEDIA_PLAYER_TYPE_REMOTE_ONLY: |
| 87 case MEDIA_PLAYER_TYPE_URL: { | 89 case MEDIA_PLAYER_TYPE_URL: { |
| 88 const std::string user_agent = GetContentClient()->GetUserAgent(); | 90 const std::string user_agent = GetContentClient()->GetUserAgent(); |
| 89 MediaPlayerBridge* media_player_bridge = new MediaPlayerBridge( | 91 std::unique_ptr<MediaPlayerAndroid> media_player_bridge( |
|
Avi (use Gerrit)
2017/03/13 15:23:34
Not MakeUnique? :(
leonhsl(Using Gerrit)
2017/03/14 02:17:12
I was using MakeUnique, but trybots compile failed
danakj
2017/03/14 15:09:55
Just cast it when you return
class B : public A {
| |
| 90 media_player_params.player_id, media_player_params.url, | 92 new MediaPlayerBridge( |
| 91 media_player_params.first_party_for_cookies, user_agent, hide_url_log, | 93 media_player_params.player_id, media_player_params.url, |
| 92 this, | 94 media_player_params.first_party_for_cookies, user_agent, |
| 93 base::Bind(&BrowserMediaPlayerManager::OnDecoderResourcesReleased, | 95 hide_url_log, this, |
| 94 weak_ptr_factory_.GetWeakPtr()), | 96 base::Bind(&BrowserMediaPlayerManager::OnDecoderResourcesReleased, |
| 95 media_player_params.frame_url, media_player_params.allow_credentials); | 97 weak_ptr_factory_.GetWeakPtr()), |
| 98 media_player_params.frame_url, | |
| 99 media_player_params.allow_credentials)); | |
| 96 | 100 |
| 97 if (media_player_params.type == MEDIA_PLAYER_TYPE_REMOTE_ONLY) | 101 if (media_player_params.type == MEDIA_PLAYER_TYPE_REMOTE_ONLY) |
| 98 return media_player_bridge; | 102 return media_player_bridge; |
| 99 | 103 |
| 100 bool should_block = false; | 104 bool should_block = false; |
| 101 bool extract_metadata = | 105 bool extract_metadata = |
| 102 // Initialize the player will cause MediaMetadataExtractor to decode | 106 // Initialize the player will cause MediaMetadataExtractor to decode |
| 103 // small chunks of data. | 107 // small chunks of data. |
| 104 RequestDecoderResources(media_player_params.player_id, true); | 108 RequestDecoderResources(media_player_params.player_id, true); |
| 105 #if !defined(USE_AURA) | 109 #if !defined(USE_AURA) |
| 106 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) { | 110 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) { |
| 107 should_block = | 111 should_block = |
| 108 delegate->ShouldBlockMediaRequest(media_player_params.url); | 112 delegate->ShouldBlockMediaRequest(media_player_params.url); |
| 109 } else { | 113 } else { |
| 110 extract_metadata = false; | 114 extract_metadata = false; |
| 111 } | 115 } |
| 112 #endif | 116 #endif |
| 113 if (!extract_metadata) { | 117 if (!extract_metadata) { |
| 114 // May reach here due to prerendering or throttling. Don't extract the | 118 // May reach here due to prerendering or throttling. Don't extract the |
| 115 // metadata since it is expensive. | 119 // metadata since it is expensive. |
| 116 // TODO(qinmin): extract the metadata once the user decided to load | 120 // TODO(qinmin): extract the metadata once the user decided to load |
| 117 // the page. | 121 // the page. |
| 118 OnMediaMetadataChanged(media_player_params.player_id, base::TimeDelta(), | 122 OnMediaMetadataChanged(media_player_params.player_id, base::TimeDelta(), |
| 119 0, 0, false); | 123 0, 0, false); |
| 120 } else if (!should_block) { | 124 } else if (!should_block) { |
| 121 media_player_bridge->Initialize(); | 125 static_cast<MediaPlayerBridge*>(media_player_bridge.get()) |
| 126 ->Initialize(); | |
| 122 } | 127 } |
| 123 return media_player_bridge; | 128 return media_player_bridge; |
| 124 } | 129 } |
| 125 } | 130 } |
| 126 | 131 |
| 127 NOTREACHED(); | 132 NOTREACHED(); |
| 128 return NULL; | 133 return nullptr; |
| 129 } | 134 } |
| 130 | 135 |
| 131 BrowserMediaPlayerManager::BrowserMediaPlayerManager( | 136 BrowserMediaPlayerManager::BrowserMediaPlayerManager( |
| 132 RenderFrameHost* render_frame_host) | 137 RenderFrameHost* render_frame_host) |
| 133 : render_frame_host_(render_frame_host), | 138 : render_frame_host_(render_frame_host), |
| 134 fullscreen_player_id_(kInvalidMediaPlayerId), | 139 fullscreen_player_id_(kInvalidMediaPlayerId), |
| 135 fullscreen_player_is_released_(false), | 140 fullscreen_player_is_released_(false), |
| 136 web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), | 141 web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), |
| 137 weak_ptr_factory_(this) { | 142 weak_ptr_factory_(this) { |
| 138 } | 143 } |
| 139 | 144 |
| 140 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { | 145 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { |
| 141 // During the tear down process, OnDestroyPlayer() may or may not be called | 146 // During the tear down process, OnDestroyPlayer() may or may not be called |
| 142 // (e.g. the WebContents may be destroyed before the render process). So | 147 // (e.g. the WebContents may be destroyed before the render process). So |
| 143 // we cannot DCHECK(players_.empty()) here. Instead, all media players in | 148 // we cannot DCHECK(players_.empty()) here. Instead, all media players in |
| 144 // |players_| will be destroyed here because |player_| is a ScopedVector. | 149 // |players_| will be destroyed here because |player_| is a |
| 150 // std::vector<std::unique_ptr<>>. | |
| 145 | 151 |
| 146 for (MediaPlayerAndroid* player : players_) | 152 for (auto& player : players_) |
| 147 player->DeleteOnCorrectThread(); | 153 player.release()->DeleteOnCorrectThread(); |
|
Avi (use Gerrit)
2017/03/13 15:23:34
This is... odd, but no worse than before.
| |
| 148 | 154 |
| 149 players_.weak_clear(); | 155 players_.clear(); |
| 150 } | 156 } |
| 151 | 157 |
| 152 void BrowserMediaPlayerManager::DidExitFullscreen(bool release_media_player) { | 158 void BrowserMediaPlayerManager::DidExitFullscreen(bool release_media_player) { |
| 153 #if defined(USE_AURA) | 159 #if defined(USE_AURA) |
| 154 // TODO(crbug.com/548024) | 160 // TODO(crbug.com/548024) |
| 155 NOTIMPLEMENTED(); | 161 NOTIMPLEMENTED(); |
| 156 #else | 162 #else |
| 157 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) | 163 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) |
| 158 delegate->ExitFullscreenModeForTab(web_contents_); | 164 delegate->ExitFullscreenModeForTab(web_contents_); |
| 159 | 165 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 273 media::MediaUrlInterceptor* | 279 media::MediaUrlInterceptor* |
| 274 BrowserMediaPlayerManager::GetMediaUrlInterceptor() { | 280 BrowserMediaPlayerManager::GetMediaUrlInterceptor() { |
| 275 return media_url_interceptor_; | 281 return media_url_interceptor_; |
| 276 } | 282 } |
| 277 | 283 |
| 278 MediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() { | 284 MediaPlayerAndroid* BrowserMediaPlayerManager::GetFullscreenPlayer() { |
| 279 return GetPlayer(fullscreen_player_id_); | 285 return GetPlayer(fullscreen_player_id_); |
| 280 } | 286 } |
| 281 | 287 |
| 282 MediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { | 288 MediaPlayerAndroid* BrowserMediaPlayerManager::GetPlayer(int player_id) { |
| 283 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 289 for (const auto& player : players_) { |
| 284 it != players_.end(); ++it) { | 290 if (player->player_id() == player_id) |
| 285 if ((*it)->player_id() == player_id) | 291 return player.get(); |
| 286 return *it; | |
| 287 } | 292 } |
| 288 return NULL; | 293 return nullptr; |
| 289 } | 294 } |
| 290 | 295 |
| 291 bool BrowserMediaPlayerManager::RequestPlay(int player_id, | 296 bool BrowserMediaPlayerManager::RequestPlay(int player_id, |
| 292 base::TimeDelta duration, | 297 base::TimeDelta duration, |
| 293 bool has_audio) { | 298 bool has_audio) { |
| 294 DCHECK(player_id_to_delegate_id_map_.find(player_id) != | 299 DCHECK(player_id_to_delegate_id_map_.find(player_id) != |
| 295 player_id_to_delegate_id_map_.end()); | 300 player_id_to_delegate_id_map_.end()); |
| 296 return MediaWebContentsObserverAndroid::FromWebContents(web_contents_) | 301 return MediaWebContentsObserverAndroid::FromWebContents(web_contents_) |
| 297 ->RequestPlay(render_frame_host_, | 302 ->RequestPlay(render_frame_host_, |
| 298 player_id_to_delegate_id_map_[player_id], has_audio, | 303 player_id_to_delegate_id_map_[player_id], has_audio, |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 } | 354 } |
| 350 #endif // defined(USE_AURA) | 355 #endif // defined(USE_AURA) |
| 351 } | 356 } |
| 352 | 357 |
| 353 void BrowserMediaPlayerManager::OnInitialize( | 358 void BrowserMediaPlayerManager::OnInitialize( |
| 354 const MediaPlayerHostMsg_Initialize_Params& media_player_params) { | 359 const MediaPlayerHostMsg_Initialize_Params& media_player_params) { |
| 355 DestroyPlayer(media_player_params.player_id); | 360 DestroyPlayer(media_player_params.player_id); |
| 356 | 361 |
| 357 RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( | 362 RenderProcessHostImpl* host = static_cast<RenderProcessHostImpl*>( |
| 358 web_contents()->GetRenderProcessHost()); | 363 web_contents()->GetRenderProcessHost()); |
| 359 MediaPlayerAndroid* player = CreateMediaPlayer( | 364 auto player = CreateMediaPlayer(media_player_params, |
| 360 media_player_params, host->GetBrowserContext()->IsOffTheRecord()); | 365 host->GetBrowserContext()->IsOffTheRecord()); |
| 361 | 366 |
| 362 if (!player) | 367 if (!player) |
| 363 return; | 368 return; |
| 364 | 369 |
| 365 AddPlayer(player, media_player_params.delegate_id); | 370 AddPlayer(std::move(player), media_player_params.delegate_id); |
| 366 } | 371 } |
| 367 | 372 |
| 368 void BrowserMediaPlayerManager::OnStart(int player_id) { | 373 void BrowserMediaPlayerManager::OnStart(int player_id) { |
| 369 MediaPlayerAndroid* player = GetPlayer(player_id); | 374 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 370 if (!player) | 375 if (!player) |
| 371 return; | 376 return; |
| 372 | 377 |
| 373 if (RequestDecoderResources(player_id, false)) { | 378 if (RequestDecoderResources(player_id, false)) { |
| 374 StartInternal(player_id); | 379 StartInternal(player_id); |
| 375 } else if (WebContentsDelegate* delegate = web_contents_->GetDelegate()){ | 380 } else if (WebContentsDelegate* delegate = web_contents_->GetDelegate()){ |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 428 void BrowserMediaPlayerManager::OnRequestRemotePlaybackStop( | 433 void BrowserMediaPlayerManager::OnRequestRemotePlaybackStop( |
| 429 int /* player_id */) { | 434 int /* player_id */) { |
| 430 // Does nothing if we don't have a remote player | 435 // Does nothing if we don't have a remote player |
| 431 } | 436 } |
| 432 | 437 |
| 433 bool BrowserMediaPlayerManager::IsPlayingRemotely(int player_id) { | 438 bool BrowserMediaPlayerManager::IsPlayingRemotely(int player_id) { |
| 434 return false; | 439 return false; |
| 435 } | 440 } |
| 436 | 441 |
| 437 void BrowserMediaPlayerManager::AddPlayer( | 442 void BrowserMediaPlayerManager::AddPlayer( |
| 438 MediaPlayerAndroid* player, int delegate_id) { | 443 std::unique_ptr<MediaPlayerAndroid> player, |
| 444 int delegate_id) { | |
| 439 DCHECK(!GetPlayer(player->player_id())); | 445 DCHECK(!GetPlayer(player->player_id())); |
| 440 players_.push_back(player); | 446 players_.push_back(std::move(player)); |
| 441 player_id_to_delegate_id_map_[player->player_id()] = | 447 player_id_to_delegate_id_map_[players_.back()->player_id()] = delegate_id; |
| 442 delegate_id; | |
| 443 } | 448 } |
| 444 | 449 |
| 445 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) { | 450 void BrowserMediaPlayerManager::DestroyPlayer(int player_id) { |
| 446 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 451 for (auto it = players_.begin(); it != players_.end(); ++it) { |
| 447 it != players_.end(); ++it) { | |
| 448 if ((*it)->player_id() == player_id) { | 452 if ((*it)->player_id() == player_id) { |
| 449 (*it)->DeleteOnCorrectThread(); | 453 it->release()->DeleteOnCorrectThread(); |
| 450 players_.weak_erase(it); | 454 players_.erase(it); |
| 451 break; | 455 break; |
| 452 } | 456 } |
| 453 } | 457 } |
| 454 active_players_.erase(player_id); | 458 active_players_.erase(player_id); |
| 455 player_id_to_delegate_id_map_.erase(player_id); | 459 player_id_to_delegate_id_map_.erase(player_id); |
| 456 } | 460 } |
| 457 | 461 |
| 458 void BrowserMediaPlayerManager::ReleaseResources(int player_id) { | 462 void BrowserMediaPlayerManager::ReleaseResources(int player_id) { |
| 459 MediaPlayerAndroid* player = GetPlayer(player_id); | 463 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 460 if (player) | 464 if (player) |
| 461 ReleasePlayer(player); | 465 ReleasePlayer(player); |
| 462 if (player_id == fullscreen_player_id_) | 466 if (player_id == fullscreen_player_id_) |
| 463 fullscreen_player_is_released_ = true; | 467 fullscreen_player_is_released_ = true; |
| 464 } | 468 } |
| 465 | 469 |
| 466 std::unique_ptr<media::MediaPlayerAndroid> | 470 std::unique_ptr<MediaPlayerAndroid> BrowserMediaPlayerManager::SwapPlayer( |
| 467 BrowserMediaPlayerManager::SwapPlayer(int player_id, | 471 int player_id, |
| 468 media::MediaPlayerAndroid* player) { | 472 MediaPlayerAndroid* player) { |
| 469 media::MediaPlayerAndroid* previous_player = NULL; | 473 std::unique_ptr<MediaPlayerAndroid> previous_player; |
| 470 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 474 for (auto it = players_.begin(); it != players_.end(); ++it) { |
| 471 it != players_.end(); ++it) { | |
| 472 if ((*it)->player_id() == player_id) { | 475 if ((*it)->player_id() == player_id) { |
| 473 previous_player = *it; | 476 previous_player = std::move(*it); |
| 474 MediaWebContentsObserverAndroid::FromWebContents(web_contents_) | 477 MediaWebContentsObserverAndroid::FromWebContents(web_contents_) |
| 475 ->DisconnectMediaSession(render_frame_host_, | 478 ->DisconnectMediaSession(render_frame_host_, |
| 476 player_id_to_delegate_id_map_[player_id]); | 479 player_id_to_delegate_id_map_[player_id]); |
| 477 players_.weak_erase(it); | 480 players_.erase(it); |
| 478 players_.push_back(player); | 481 players_.push_back(base::WrapUnique(player)); |
| 479 break; | 482 break; |
| 480 } | 483 } |
| 481 } | 484 } |
| 482 return std::unique_ptr<media::MediaPlayerAndroid>(previous_player); | 485 return previous_player; |
| 483 } | 486 } |
| 484 | 487 |
| 485 bool BrowserMediaPlayerManager::RequestDecoderResources( | 488 bool BrowserMediaPlayerManager::RequestDecoderResources( |
| 486 int player_id, bool temporary) { | 489 int player_id, bool temporary) { |
| 487 if (!MediaThrottler::GetInstance()->RequestDecoderResources()) | 490 if (!MediaThrottler::GetInstance()->RequestDecoderResources()) |
| 488 return false; | 491 return false; |
| 489 | 492 |
| 490 ActivePlayerMap::iterator it; | 493 ActivePlayerMap::iterator it; |
| 491 // The player is already active, ignore it. A long running player should not | 494 // The player is already active, ignore it. A long running player should not |
| 492 // request temporary permissions. | 495 // request temporary permissions. |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 559 if (!player) | 562 if (!player) |
| 560 return; | 563 return; |
| 561 player->Start(); | 564 player->Start(); |
| 562 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { | 565 if (fullscreen_player_id_ == player_id && fullscreen_player_is_released_) { |
| 563 video_view_->OpenVideo(); | 566 video_view_->OpenVideo(); |
| 564 fullscreen_player_is_released_ = false; | 567 fullscreen_player_is_released_ = false; |
| 565 } | 568 } |
| 566 } | 569 } |
| 567 | 570 |
| 568 } // namespace content | 571 } // namespace content |
| OLD | NEW |