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

Side by Side Diff: chrome/browser/media/android/remote/remote_media_player_manager.cc

Issue 1403703005: Refactor Clank cast connect logic (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 "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 "chrome/browser/android/tab_android.h" 7 #include "chrome/browser/android/tab_android.h"
8 #include "chrome/common/chrome_content_client.h" 8 #include "chrome/common/chrome_content_client.h"
9 #include "content/common/media/media_player_messages_android.h" 9 #include "content/common/media/media_player_messages_android.h"
10 #include "third_party/skia/include/core/SkBitmap.h" 10 #include "third_party/skia/include/core/SkBitmap.h"
11 #include "ui/gfx/android/java_bitmap.h" 11 #include "ui/gfx/android/java_bitmap.h"
12 12
13 using media::MediaPlayerAndroid; 13 using media::MediaPlayerAndroid;
14 14
15 namespace remote_media { 15 namespace remote_media {
16 16
17 RemoteMediaPlayerManager::RemoteMediaPlayerManager( 17 RemoteMediaPlayerManager::RemoteMediaPlayerManager(
18 content::RenderFrameHost* render_frame_host) 18 content::RenderFrameHost* render_frame_host)
19 : BrowserMediaPlayerManager(render_frame_host), 19 : BrowserMediaPlayerManager(render_frame_host),
20 weak_ptr_factory_(this) { 20 weak_ptr_factory_(this) {
21 } 21 }
22 22
23 RemoteMediaPlayerManager::~RemoteMediaPlayerManager() {} 23 RemoteMediaPlayerManager::~RemoteMediaPlayerManager() {}
24 24
25 void RemoteMediaPlayerManager::OnStart(int player_id) { 25 void RemoteMediaPlayerManager::OnStart(int player_id) {
26 // TODO(aberent) This assumes this is the first time we have started this 26 RemoteMediaPlayerBridge* remote_player = GetRemotePlayer(player_id);
27 // video, rather than restarting after pause. There is a lot of logic here 27 if (remote_player) {
whywhat 2015/10/14 13:28:50 nit: can this actually be null? should this be an
aberent 2015/10/15 10:31:38 Yes, I think it can be. The player_id comes from t
28 // that is unnecessary if we are restarting after pause. 28 if (players_playing_remotely_.count(player_id)) {
29 if (MaybeStartPlayingRemotely(player_id)) 29 remote_player->Start();
30 return; 30 } else if (remote_player->TakesOverCastDevice()) {
31 31 return;
32 ReplaceRemotePlayerWithLocal(); 32 }
33 }
33 BrowserMediaPlayerManager::OnStart(player_id); 34 BrowserMediaPlayerManager::OnStart(player_id);
34 } 35 }
35 36
36 void RemoteMediaPlayerManager::OnInitialize( 37 void RemoteMediaPlayerManager::OnInitialize(
37 const MediaPlayerHostMsg_Initialize_Params& media_params) { 38 const MediaPlayerHostMsg_Initialize_Params& media_params) {
38 BrowserMediaPlayerManager::OnInitialize(media_params); 39 BrowserMediaPlayerManager::OnInitialize(media_params);
39 40
40 MediaPlayerAndroid* player = GetPlayer(media_params.player_id); 41 MediaPlayerAndroid* player = GetPlayer(media_params.player_id);
41 if (player) { 42 if (player) {
42 CreateRemoteMediaPlayer(player); 43 RemoteMediaPlayerBridge* remote_player = CreateRemoteMediaPlayer(player);
43 RemoteMediaPlayerBridge* remote_player = GetRemotePlayer( 44 remote_player->OnPlayerCreated();
44 media_params.player_id);
45 if (remote_player)
46 remote_player->OnPlayerCreated();
47 } 45 }
48 } 46 }
49 47
50 void RemoteMediaPlayerManager::OnDestroyPlayer(int player_id) { 48 void RemoteMediaPlayerManager::OnDestroyPlayer(int player_id) {
51 RemoteMediaPlayerBridge* player = GetRemotePlayer(player_id); 49 RemoteMediaPlayerBridge* player = GetRemotePlayer(player_id);
52 if (player) 50 if (player)
53 player->OnPlayerDestroyed(); 51 player->OnPlayerDestroyed();
54 BrowserMediaPlayerManager::OnDestroyPlayer(player_id); 52 BrowserMediaPlayerManager::OnDestroyPlayer(player_id);
55 } 53 }
56 54
57 void RemoteMediaPlayerManager::OnReleaseResources(int player_id) { 55 void RemoteMediaPlayerManager::OnReleaseResources(int player_id) {
58 // We only want to release resources of local players. 56 // We only want to release resources of local players.
59 if (player_id != RemotePlayerId()) 57 if (players_playing_remotely_.count(player_id) == 0)
60 BrowserMediaPlayerManager::OnReleaseResources(player_id); 58 BrowserMediaPlayerManager::OnReleaseResources(player_id);
61 } 59 }
62 60
63 void RemoteMediaPlayerManager::OnRequestRemotePlayback(int player_id) { 61 void RemoteMediaPlayerManager::OnRequestRemotePlayback(int player_id) {
64 RemoteMediaPlayerBridge* player = GetRemotePlayer(player_id); 62 RemoteMediaPlayerBridge* player = GetRemotePlayer(player_id);
65 if (player) 63 if (player)
66 player->RequestRemotePlayback(); 64 player->RequestRemotePlayback();
67 } 65 }
68 66
69 void RemoteMediaPlayerManager::OnRequestRemotePlaybackControl(int player_id) { 67 void RemoteMediaPlayerManager::OnRequestRemotePlaybackControl(int player_id) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 player->SetPosterBitmap(bitmaps); 116 player->SetPosterBitmap(bitmaps);
119 } 117 }
120 118
121 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::CreateRemoteMediaPlayer( 119 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::CreateRemoteMediaPlayer(
122 MediaPlayerAndroid* local_player) { 120 MediaPlayerAndroid* local_player) {
123 RemoteMediaPlayerBridge* player = new RemoteMediaPlayerBridge( 121 RemoteMediaPlayerBridge* player = new RemoteMediaPlayerBridge(
124 local_player, 122 local_player,
125 GetUserAgent(), 123 GetUserAgent(),
126 false, 124 false,
127 this); 125 this);
128 remote_players_.push_back(player); 126 alternative_players_.push_back(player);
129 player->Initialize(); 127 player->Initialize();
130 return player; 128 return player;
131 } 129 }
132 130
133 int RemoteMediaPlayerManager::RemotePlayerId() { 131 // OnSuspend and OnResume are called when the local player loses or gains
134 // The remote player is created with the same id as the corresponding local 132 // audio focus. If we are playing remotely then ignore these.
135 // player. 133 void RemoteMediaPlayerManager::OnSuspend(int player_id) {
136 if (replaced_local_player_.get()) 134 if (!players_playing_remotely_.count(player_id))
dgn 2015/10/14 16:05:49 nit: I feel like a [bool isPlayingRemotely(player_
aberent 2015/10/15 10:31:38 Done.
dgn 2015/10/15 11:07:31 Not done here
137 return replaced_local_player_->player_id(); 135 BrowserMediaPlayerManager::OnSuspend(player_id);
138 else
139 return -1;
140 } 136 }
141 137
142 void RemoteMediaPlayerManager::ReplaceLocalPlayerWithRemote( 138 void RemoteMediaPlayerManager::OnResume(int player_id) {
143 MediaPlayerAndroid* player) { 139 if (!players_playing_remotely_.count(player_id))
144 if (!player) 140 BrowserMediaPlayerManager::OnResume(player_id);
141 }
142
143 void RemoteMediaPlayerManager::SwapCurrentPlayer(int player_id) {
144 // Find the remote player
145 ScopedVector<MediaPlayerAndroid>::iterator it =
whywhat 2015/10/14 13:28:50 nit: you could use auto here and elsewhere.
aberent 2015/10/15 10:31:38 Done.
146 GetAlternativePlayer(player_id);
147 if (it == alternative_players_.end())
145 return; 148 return;
149 MediaPlayerAndroid* new_player = *it;
150 scoped_ptr<MediaPlayerAndroid> old_player = SwapPlayer(player_id, new_player);
151 alternative_players_.weak_erase(it);
152 alternative_players_.push_back(old_player.release());
153 }
146 154
147 int player_id = player->player_id(); 155 void RemoteMediaPlayerManager::SwitchToRemotePlayer(int player_id) {
148 if (player_id == RemotePlayerId()) { 156 DCHECK(!players_playing_remotely_.count(player_id));
149 // The player is already remote. 157 SwapCurrentPlayer(player_id);
158 players_playing_remotely_.insert(player_id);
159 }
160
161 void RemoteMediaPlayerManager::SwitchToLocalPlayer(int player_id) {
162 DCHECK(players_playing_remotely_.count(player_id));
163 SwapCurrentPlayer(player_id);
164 players_playing_remotely_.erase(player_id);
165 Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice(RoutingID(), player_id));
166 }
167
168 void RemoteMediaPlayerManager::ReplaceRemotePlayerWithLocal(int player_id) {
169 if (players_playing_remotely_.count(player_id) == 0) {
170 // We are already playing locally
150 return; 171 return;
151 } 172 }
152 173 MediaPlayerAndroid* remote_player = GetPlayer(player_id);
153 // Before we replace the new remote player, put the old local player back 174 remote_player->Pause(true);
154 // in its place.
155 ReplaceRemotePlayerWithLocal();
156
157 // Pause the local player first before replacing it. This will allow the local
158 // player to reset its state, such as the PowerSaveBlocker.
159 // We have to pause locally as well as telling the renderer to pause, because
160 // by the time the renderer comes back to us telling us to pause we will have
161 // switched players.
162 player->Pause(true);
163 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id));
164
165 // Find the remote player
166 for (auto it = remote_players_.begin(); it != remote_players_.end(); ++it) {
167 if ((*it)->player_id() == player_id) {
168 replaced_local_player_ = SwapPlayer(player_id, *it);
169
170 // Seek to the previous player's position.
171 (*it)->SeekTo(player->GetCurrentTime());
172
173 // SwapPlayers takes ownership, so we have to remove the remote player
174 // from the vector.
175 remote_players_.weak_erase(it);
176 break;
177 }
178 }
179 }
180
181 void RemoteMediaPlayerManager::ReplaceRemotePlayerWithLocal() {
182 int player_id = RemotePlayerId();
183 if (player_id == -1)
184 return;
185
186 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id)); 175 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id));
187 Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice(RoutingID(), player_id)); 176 Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice(RoutingID(), player_id));
188 177
189 scoped_ptr<MediaPlayerAndroid> remote_player = 178 SwapCurrentPlayer(player_id);
190 SwapPlayer(player_id, replaced_local_player_.release()); 179 GetLocalPlayer(player_id)->SeekTo(remote_player->GetCurrentTime());
191 if (remote_player) { 180 remote_player->Release();
192 // Seek to the previous player's position. 181 players_playing_remotely_.erase(player_id);
193 GetPlayer(player_id)->SeekTo(remote_player->GetCurrentTime());
194
195 remote_player->Release();
196 // Add the remote player back into the list
197 remote_players_.push_back(
198 static_cast<RemoteMediaPlayerBridge *>(remote_player.release()));
199 }
200 } 182 }
201 183
202 bool RemoteMediaPlayerManager::MaybeStartPlayingRemotely(int player_id) { 184 void RemoteMediaPlayerManager::OnPlayingRemotely(
203 MediaPlayerAndroid* player = GetPlayer(player_id); 185 int player_id,
204 if (!player) 186 const std::string& casting_message) {
205 return false; 187 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), player_id));
206 188 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(RoutingID(), player_id,
207 RemoteMediaPlayerBridge* remote_player = GetRemotePlayer(player_id); 189 casting_message));
208
209 if (!remote_player)
210 return false;
211
212 if (remote_player->IsMediaPlayableRemotely() &&
213 remote_player->IsRemotePlaybackAvailable() &&
214 remote_player->IsRemotePlaybackPreferredForFrame()) {
215 ReplaceLocalPlayerWithRemote(player);
216
217 remote_player->SetNativePlayer();
218 remote_player->Start();
219
220 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), player_id));
221
222 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(
223 RoutingID(),
224 player_id,
225 remote_player->GetCastingMessage()));
226
227 return true;
228 }
229
230 return false;
231 }
232
233 void RemoteMediaPlayerManager::OnRemoteDeviceSelected(int player_id) {
234
235 MediaPlayerAndroid* player = GetPlayer(player_id);
236 if (!player)
237 return;
238
239 if (MaybeStartPlayingRemotely(player_id))
240 return;
241 OnStart(player_id);
242 } 190 }
243 191
244 void RemoteMediaPlayerManager::OnRemoteDeviceUnselected(int player_id) { 192 void RemoteMediaPlayerManager::OnRemoteDeviceUnselected(int player_id) {
245 if (player_id == RemotePlayerId()) 193 ReplaceRemotePlayerWithLocal(player_id);
246 ReplaceRemotePlayerWithLocal();
247 } 194 }
248 195
249 void RemoteMediaPlayerManager::OnRemotePlaybackFinished(int player_id) { 196 void RemoteMediaPlayerManager::OnRemotePlaybackFinished(int player_id) {
250 if (player_id == RemotePlayerId()) 197 ReplaceRemotePlayerWithLocal(player_id);
251 ReplaceRemotePlayerWithLocal();
252 } 198 }
253 199
254 void RemoteMediaPlayerManager::OnRouteAvailabilityChanged( 200 void RemoteMediaPlayerManager::OnRouteAvailabilityChanged(
255 int player_id, bool routes_available) { 201 int player_id, bool routes_available) {
256 Send( 202 Send(
257 new MediaPlayerMsg_RemoteRouteAvailabilityChanged(RoutingID(), player_id, 203 new MediaPlayerMsg_RemoteRouteAvailabilityChanged(RoutingID(), player_id,
258 routes_available)); 204 routes_available));
259 } 205 }
260 206
261 void RemoteMediaPlayerManager::ReleaseFullscreenPlayer( 207 void RemoteMediaPlayerManager::ReleaseFullscreenPlayer(
262 MediaPlayerAndroid* player) { 208 MediaPlayerAndroid* player) {
209 int player_id = player->player_id();
263 // Release the original player's resources, not the current fullscreen player 210 // Release the original player's resources, not the current fullscreen player
264 // (which is the remote player). 211 // (which is the remote player).
265 if (replaced_local_player_.get()) 212 if (players_playing_remotely_.count(player_id))
266 replaced_local_player_->Release(); 213 GetLocalPlayer(player_id)->Release();
267 else 214 else
268 BrowserMediaPlayerManager::ReleaseFullscreenPlayer(player); 215 BrowserMediaPlayerManager::ReleaseFullscreenPlayer(player);
269 } 216 }
270 217
271 void RemoteMediaPlayerManager::OnPlaying(int player_id) { 218 void RemoteMediaPlayerManager::OnPlaying(int player_id) {
272 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),player_id)); 219 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),player_id));
273 } 220 }
274 221
275 void RemoteMediaPlayerManager::OnPaused(int player_id) { 222 void RemoteMediaPlayerManager::OnPaused(int player_id) {
276 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),player_id)); 223 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),player_id));
277 } 224 }
278 225
226 ScopedVector<MediaPlayerAndroid>::iterator
227 RemoteMediaPlayerManager::GetAlternativePlayer(int player_id) {
228 for (auto it = alternative_players_.begin(); it != alternative_players_.end();
229 ++it) {
230 if ((*it)->player_id() == player_id) {
231 return it;
232 }
233 }
234 return alternative_players_.end();
235 }
236
279 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::GetRemotePlayer( 237 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::GetRemotePlayer(
280 int player_id) { 238 int player_id) {
281 if (player_id == RemotePlayerId()) { 239 if (players_playing_remotely_.count(player_id)) {
282 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id)); 240 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id));
283 } else { 241 }
284 for (RemoteMediaPlayerBridge* player : remote_players_) { 242 ScopedVector<MediaPlayerAndroid>::iterator it =
285 if (player->player_id() == player_id) { 243 GetAlternativePlayer(player_id);
286 return player; 244 if (it == alternative_players_.end())
287 }
288 }
289 return nullptr; 245 return nullptr;
246 return static_cast<RemoteMediaPlayerBridge*>(*it);
247 }
248
249 MediaPlayerAndroid* RemoteMediaPlayerManager::GetLocalPlayer(int player_id) {
250 if (!players_playing_remotely_.count(player_id)) {
251 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id));
290 } 252 }
253 ScopedVector<MediaPlayerAndroid>::iterator it =
254 GetAlternativePlayer(player_id);
255 if (it == alternative_players_.end())
256 return nullptr;
257 return *it;
291 } 258 }
292 259
293 void RemoteMediaPlayerManager::OnMediaMetadataChanged(int player_id, 260 void RemoteMediaPlayerManager::OnMediaMetadataChanged(int player_id,
294 base::TimeDelta duration, 261 base::TimeDelta duration,
295 int width, 262 int width,
296 int height, 263 int height,
297 bool success) { 264 bool success) {
298 if (player_id == RemotePlayerId() && replaced_local_player_) { 265 if (players_playing_remotely_.count(player_id)) {
266 MediaPlayerAndroid* local_player = GetLocalPlayer(player_id);
299 Send(new MediaPlayerMsg_MediaMetadataChanged( 267 Send(new MediaPlayerMsg_MediaMetadataChanged(
300 RoutingID(), player_id, duration, 268 RoutingID(), player_id, duration, local_player->GetVideoWidth(),
301 replaced_local_player_->GetVideoWidth(), 269 local_player->GetVideoHeight(), success));
302 replaced_local_player_->GetVideoHeight(), success));
303 } else { 270 } else {
304 BrowserMediaPlayerManager::OnMediaMetadataChanged(player_id, duration, 271 BrowserMediaPlayerManager::OnMediaMetadataChanged(player_id, duration,
305 width, height, success); 272 width, height, success);
306 } 273 }
307 } 274 }
308 275
309 } // namespace remote_media 276 } // namespace remote_media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698