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 |