Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: content/browser/media/android/browser_media_player_manager.cc

Issue 2742333002: Remove ScopedVector from content/browser/ [1]. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « content/browser/media/android/browser_media_player_manager.h ('k') | content/browser/media/midi_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698