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 "chrome/browser/media/android/remote/remote_media_player_manager.h" | 5 #include "chrome/browser/media/android/remote/remote_media_player_manager.h" |
6 | 6 |
| 7 #include "base/memory/ptr_util.h" |
7 #include "chrome/browser/android/tab_android.h" | 8 #include "chrome/browser/android/tab_android.h" |
8 #include "chrome/common/chrome_content_client.h" | 9 #include "chrome/common/chrome_content_client.h" |
9 #include "content/common/media/media_player_messages_android.h" | 10 #include "content/common/media/media_player_messages_android.h" |
10 #include "third_party/WebKit/public/platform/modules/remoteplayback/WebRemotePla
ybackAvailability.h" | 11 #include "third_party/WebKit/public/platform/modules/remoteplayback/WebRemotePla
ybackAvailability.h" |
11 #include "third_party/skia/include/core/SkBitmap.h" | 12 #include "third_party/skia/include/core/SkBitmap.h" |
12 #include "ui/gfx/android/java_bitmap.h" | 13 #include "ui/gfx/android/java_bitmap.h" |
13 | 14 |
14 using media::MediaPlayerAndroid; | 15 using media::MediaPlayerAndroid; |
15 | 16 |
16 static const int MAX_POSTER_BITMAP_SIZE = 1024 * 1024; | 17 static const int MAX_POSTER_BITMAP_SIZE = 1024 * 1024; |
17 | 18 |
18 namespace remote_media { | 19 namespace remote_media { |
19 | 20 |
20 RemoteMediaPlayerManager::RemoteMediaPlayerManager( | 21 RemoteMediaPlayerManager::RemoteMediaPlayerManager( |
21 content::RenderFrameHost* render_frame_host) | 22 content::RenderFrameHost* render_frame_host) |
22 : BrowserMediaPlayerManager(render_frame_host), | 23 : BrowserMediaPlayerManager(render_frame_host), |
23 weak_ptr_factory_(this) { | 24 weak_ptr_factory_(this) { |
24 } | 25 } |
25 | 26 |
26 RemoteMediaPlayerManager::~RemoteMediaPlayerManager() { | 27 RemoteMediaPlayerManager::~RemoteMediaPlayerManager() { |
27 for (MediaPlayerAndroid* player : alternative_players_) | 28 for (auto& player : alternative_players_) |
28 player->DeleteOnCorrectThread(); | 29 player.release()->DeleteOnCorrectThread(); |
29 | 30 |
30 alternative_players_.weak_clear(); | 31 alternative_players_.clear(); |
31 } | 32 } |
32 | 33 |
33 void RemoteMediaPlayerManager::OnStart(int player_id) { | 34 void RemoteMediaPlayerManager::OnStart(int player_id) { |
34 RemoteMediaPlayerBridge* remote_player = GetRemotePlayer(player_id); | 35 RemoteMediaPlayerBridge* remote_player = GetRemotePlayer(player_id); |
35 if (remote_player && IsPlayingRemotely(player_id)) | 36 if (remote_player && IsPlayingRemotely(player_id)) |
36 remote_player->Start(); | 37 remote_player->Start(); |
37 | 38 |
38 BrowserMediaPlayerManager::OnStart(player_id); | 39 BrowserMediaPlayerManager::OnStart(player_id); |
39 } | 40 } |
40 | 41 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 const GURL& image_url, | 136 const GURL& image_url, |
136 const std::vector<SkBitmap>& bitmaps, | 137 const std::vector<SkBitmap>& bitmaps, |
137 const std::vector<gfx::Size>& original_bitmap_sizes) { | 138 const std::vector<gfx::Size>& original_bitmap_sizes) { |
138 RemoteMediaPlayerBridge* player = GetRemotePlayer(player_id); | 139 RemoteMediaPlayerBridge* player = GetRemotePlayer(player_id); |
139 if (player) | 140 if (player) |
140 player->SetPosterBitmap(bitmaps); | 141 player->SetPosterBitmap(bitmaps); |
141 } | 142 } |
142 | 143 |
143 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::CreateRemoteMediaPlayer( | 144 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::CreateRemoteMediaPlayer( |
144 int player_id) { | 145 int player_id) { |
145 RemoteMediaPlayerBridge* player = | 146 alternative_players_.push_back(base::MakeUnique<RemoteMediaPlayerBridge>( |
146 new RemoteMediaPlayerBridge(player_id, GetUserAgent(), this); | 147 player_id, GetUserAgent(), this)); |
147 alternative_players_.push_back(player); | 148 RemoteMediaPlayerBridge* remote = |
148 player->Initialize(); | 149 static_cast<RemoteMediaPlayerBridge*>(alternative_players_.back().get()); |
149 return player; | 150 remote->Initialize(); |
| 151 return remote; |
150 } | 152 } |
151 | 153 |
152 bool RemoteMediaPlayerManager::SwapCurrentPlayer(int player_id) { | 154 bool RemoteMediaPlayerManager::SwapCurrentPlayer(int player_id) { |
153 // Find the alternative player to swap the current one with. | 155 // Find the alternative player to swap the current one with. |
154 auto it = GetAlternativePlayer(player_id); | 156 auto it = GetAlternativePlayer(player_id); |
155 if (it == alternative_players_.end()) | 157 if (it == alternative_players_.end()) |
156 return false; | 158 return false; |
157 | 159 |
158 MediaPlayerAndroid* new_player = *it; | 160 // Release ownership of the alternative player. |
159 std::unique_ptr<MediaPlayerAndroid> old_player = | 161 std::unique_ptr<MediaPlayerAndroid> old_player = |
160 SwapPlayer(player_id, new_player); | 162 SwapPlayer(player_id, std::move(*it)); |
| 163 alternative_players_.erase(it); |
161 if (!old_player) { | 164 if (!old_player) { |
162 // There's no player to swap with, destroy the alternative player and exit. | |
163 alternative_players_.erase(it); | |
164 return false; | 165 return false; |
165 } | 166 } |
166 | 167 |
167 alternative_players_.weak_erase(it); | 168 alternative_players_.push_back(std::move(old_player)); |
168 alternative_players_.push_back(old_player.release()); | |
169 return true; | 169 return true; |
170 } | 170 } |
171 | 171 |
172 void RemoteMediaPlayerManager::SwitchToRemotePlayer( | 172 void RemoteMediaPlayerManager::SwitchToRemotePlayer( |
173 int player_id, | 173 int player_id, |
174 const std::string& casting_message) { | 174 const std::string& casting_message) { |
175 DCHECK(!IsPlayingRemotely(player_id)); | 175 DCHECK(!IsPlayingRemotely(player_id)); |
176 if (!SwapCurrentPlayer(player_id)) | 176 if (!SwapCurrentPlayer(player_id)) |
177 return; | 177 return; |
178 players_playing_remotely_.insert(player_id); | 178 players_playing_remotely_.insert(player_id); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 } | 241 } |
242 | 242 |
243 void RemoteMediaPlayerManager::OnPlaying(int player_id) { | 243 void RemoteMediaPlayerManager::OnPlaying(int player_id) { |
244 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),player_id)); | 244 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),player_id)); |
245 } | 245 } |
246 | 246 |
247 void RemoteMediaPlayerManager::OnPaused(int player_id) { | 247 void RemoteMediaPlayerManager::OnPaused(int player_id) { |
248 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),player_id)); | 248 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),player_id)); |
249 } | 249 } |
250 | 250 |
251 ScopedVector<MediaPlayerAndroid>::iterator | 251 std::vector<std::unique_ptr<MediaPlayerAndroid>>::iterator |
252 RemoteMediaPlayerManager::GetAlternativePlayer(int player_id) { | 252 RemoteMediaPlayerManager::GetAlternativePlayer(int player_id) { |
253 for (auto it = alternative_players_.begin(); it != alternative_players_.end(); | 253 for (auto it = alternative_players_.begin(); it != alternative_players_.end(); |
254 ++it) { | 254 ++it) { |
255 if ((*it)->player_id() == player_id) { | 255 if ((*it)->player_id() == player_id) { |
256 return it; | 256 return it; |
257 } | 257 } |
258 } | 258 } |
259 return alternative_players_.end(); | 259 return alternative_players_.end(); |
260 } | 260 } |
261 | 261 |
262 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::GetRemotePlayer( | 262 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::GetRemotePlayer( |
263 int player_id) { | 263 int player_id) { |
264 if (IsPlayingRemotely(player_id)) | 264 if (IsPlayingRemotely(player_id)) |
265 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id)); | 265 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id)); |
266 auto it = GetAlternativePlayer(player_id); | 266 auto it = GetAlternativePlayer(player_id); |
267 if (it == alternative_players_.end()) | 267 if (it == alternative_players_.end()) |
268 return nullptr; | 268 return nullptr; |
269 return static_cast<RemoteMediaPlayerBridge*>(*it); | 269 return static_cast<RemoteMediaPlayerBridge*>(it->get()); |
270 } | 270 } |
271 | 271 |
272 MediaPlayerAndroid* RemoteMediaPlayerManager::GetLocalPlayer(int player_id) { | 272 MediaPlayerAndroid* RemoteMediaPlayerManager::GetLocalPlayer(int player_id) { |
273 if (!IsPlayingRemotely(player_id)) | 273 if (!IsPlayingRemotely(player_id)) |
274 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id)); | 274 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id)); |
275 auto it = GetAlternativePlayer(player_id); | 275 auto it = GetAlternativePlayer(player_id); |
276 if (it == alternative_players_.end()) | 276 if (it == alternative_players_.end()) |
277 return nullptr; | 277 return nullptr; |
278 return *it; | 278 return it->get(); |
279 } | 279 } |
280 | 280 |
281 void RemoteMediaPlayerManager::OnMediaMetadataChanged(int player_id, | 281 void RemoteMediaPlayerManager::OnMediaMetadataChanged(int player_id, |
282 base::TimeDelta duration, | 282 base::TimeDelta duration, |
283 int width, | 283 int width, |
284 int height, | 284 int height, |
285 bool success) { | 285 bool success) { |
286 if (IsPlayingRemotely(player_id)) { | 286 if (IsPlayingRemotely(player_id)) { |
287 MediaPlayerAndroid* local_player = GetLocalPlayer(player_id); | 287 MediaPlayerAndroid* local_player = GetLocalPlayer(player_id); |
288 Send(new MediaPlayerMsg_MediaMetadataChanged( | 288 Send(new MediaPlayerMsg_MediaMetadataChanged( |
289 RoutingID(), player_id, duration, local_player->GetVideoWidth(), | 289 RoutingID(), player_id, duration, local_player->GetVideoWidth(), |
290 local_player->GetVideoHeight(), success)); | 290 local_player->GetVideoHeight(), success)); |
291 } else { | 291 } else { |
292 BrowserMediaPlayerManager::OnMediaMetadataChanged(player_id, duration, | 292 BrowserMediaPlayerManager::OnMediaMetadataChanged(player_id, duration, |
293 width, height, success); | 293 width, height, success); |
294 } | 294 } |
295 } | 295 } |
296 } // namespace remote_media | 296 } // namespace remote_media |
OLD | NEW |