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

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: Fix trybot detected error. 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
« no previous file with comments | « chrome/browser/media/android/remote/remote_media_player_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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) {
28 // that is unnecessary if we are restarting after pause. 28 if (IsPlayingRemotely(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 (!IsPlayingRemotely(player_id))
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 (!IsPlayingRemotely(player_id))
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 (!IsPlayingRemotely(player_id))
144 if (!player) 140 BrowserMediaPlayerManager::OnResume(player_id);
145 return;
146
147 int player_id = player->player_id();
148 if (player_id == RemotePlayerId()) {
149 // The player is already remote.
150 return;
151 }
152
153 // Before we replace the new remote player, put the old local player back
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 } 141 }
180 142
181 void RemoteMediaPlayerManager::ReplaceRemotePlayerWithLocal() { 143 void RemoteMediaPlayerManager::SwapCurrentPlayer(int player_id) {
182 int player_id = RemotePlayerId(); 144 // Find the remote player
183 if (player_id == -1) 145 auto it = GetAlternativePlayer(player_id);
146 if (it == alternative_players_.end())
184 return; 147 return;
148 MediaPlayerAndroid* new_player = *it;
149 scoped_ptr<MediaPlayerAndroid> old_player = SwapPlayer(player_id, new_player);
150 alternative_players_.weak_erase(it);
151 alternative_players_.push_back(old_player.release());
152 }
185 153
154 void RemoteMediaPlayerManager::SwitchToRemotePlayer(
155 int player_id,
156 const std::string& casting_message) {
157 DCHECK(!IsPlayingRemotely(player_id));
158 SwapCurrentPlayer(player_id);
159 players_playing_remotely_.insert(player_id);
160 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(), player_id));
161 Send(new MediaPlayerMsg_ConnectedToRemoteDevice(RoutingID(), player_id,
162 casting_message));
163 }
164
165 void RemoteMediaPlayerManager::SwitchToLocalPlayer(int player_id) {
166 DCHECK(IsPlayingRemotely(player_id));
167 SwapCurrentPlayer(player_id);
168 players_playing_remotely_.erase(player_id);
169 Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice(RoutingID(), player_id));
170 }
171
172 void RemoteMediaPlayerManager::ReplaceRemotePlayerWithLocal(int player_id) {
173 if (!IsPlayingRemotely(player_id))
174 return;
175 MediaPlayerAndroid* remote_player = GetPlayer(player_id);
176 remote_player->Pause(true);
186 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id)); 177 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(), player_id));
187 Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice(RoutingID(), player_id)); 178 Send(new MediaPlayerMsg_DisconnectedFromRemoteDevice(RoutingID(), player_id));
188 179
189 scoped_ptr<MediaPlayerAndroid> remote_player = 180 SwapCurrentPlayer(player_id);
190 SwapPlayer(player_id, replaced_local_player_.release()); 181 GetLocalPlayer(player_id)->SeekTo(remote_player->GetCurrentTime());
191 if (remote_player) { 182 remote_player->Release();
192 // Seek to the previous player's position. 183 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 }
201
202 bool RemoteMediaPlayerManager::MaybeStartPlayingRemotely(int player_id) {
203 MediaPlayerAndroid* player = GetPlayer(player_id);
204 if (!player)
205 return false;
206
207 RemoteMediaPlayerBridge* remote_player = GetRemotePlayer(player_id);
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 } 184 }
243 185
244 void RemoteMediaPlayerManager::OnRemoteDeviceUnselected(int player_id) { 186 void RemoteMediaPlayerManager::OnRemoteDeviceUnselected(int player_id) {
245 if (player_id == RemotePlayerId()) 187 ReplaceRemotePlayerWithLocal(player_id);
246 ReplaceRemotePlayerWithLocal();
247 } 188 }
248 189
249 void RemoteMediaPlayerManager::OnRemotePlaybackFinished(int player_id) { 190 void RemoteMediaPlayerManager::OnRemotePlaybackFinished(int player_id) {
250 if (player_id == RemotePlayerId()) 191 ReplaceRemotePlayerWithLocal(player_id);
251 ReplaceRemotePlayerWithLocal();
252 } 192 }
253 193
254 void RemoteMediaPlayerManager::OnRouteAvailabilityChanged( 194 void RemoteMediaPlayerManager::OnRouteAvailabilityChanged(
255 int player_id, bool routes_available) { 195 int player_id, bool routes_available) {
256 Send( 196 Send(
257 new MediaPlayerMsg_RemoteRouteAvailabilityChanged(RoutingID(), player_id, 197 new MediaPlayerMsg_RemoteRouteAvailabilityChanged(RoutingID(), player_id,
258 routes_available)); 198 routes_available));
259 } 199 }
260 200
261 void RemoteMediaPlayerManager::ReleaseFullscreenPlayer( 201 void RemoteMediaPlayerManager::ReleaseFullscreenPlayer(
262 MediaPlayerAndroid* player) { 202 MediaPlayerAndroid* player) {
203 int player_id = player->player_id();
263 // Release the original player's resources, not the current fullscreen player 204 // Release the original player's resources, not the current fullscreen player
264 // (which is the remote player). 205 // (which is the remote player).
265 if (replaced_local_player_.get()) 206 if (IsPlayingRemotely(player_id))
266 replaced_local_player_->Release(); 207 GetLocalPlayer(player_id)->Release();
267 else 208 else
268 BrowserMediaPlayerManager::ReleaseFullscreenPlayer(player); 209 BrowserMediaPlayerManager::ReleaseFullscreenPlayer(player);
269 } 210 }
270 211
271 void RemoteMediaPlayerManager::OnPlaying(int player_id) { 212 void RemoteMediaPlayerManager::OnPlaying(int player_id) {
272 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),player_id)); 213 Send(new MediaPlayerMsg_DidMediaPlayerPlay(RoutingID(),player_id));
273 } 214 }
274 215
275 void RemoteMediaPlayerManager::OnPaused(int player_id) { 216 void RemoteMediaPlayerManager::OnPaused(int player_id) {
276 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),player_id)); 217 Send(new MediaPlayerMsg_DidMediaPlayerPause(RoutingID(),player_id));
277 } 218 }
278 219
220 ScopedVector<MediaPlayerAndroid>::iterator
221 RemoteMediaPlayerManager::GetAlternativePlayer(int player_id) {
222 for (auto it = alternative_players_.begin(); it != alternative_players_.end();
223 ++it) {
224 if ((*it)->player_id() == player_id) {
225 return it;
226 }
227 }
228 return alternative_players_.end();
229 }
230
279 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::GetRemotePlayer( 231 RemoteMediaPlayerBridge* RemoteMediaPlayerManager::GetRemotePlayer(
280 int player_id) { 232 int player_id) {
281 if (player_id == RemotePlayerId()) { 233 if (IsPlayingRemotely(player_id))
282 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id)); 234 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id));
283 } else { 235 auto it = GetAlternativePlayer(player_id);
284 for (RemoteMediaPlayerBridge* player : remote_players_) { 236 if (it == alternative_players_.end())
285 if (player->player_id() == player_id) {
286 return player;
287 }
288 }
289 return nullptr; 237 return nullptr;
290 } 238 return static_cast<RemoteMediaPlayerBridge*>(*it);
239 }
240
241 MediaPlayerAndroid* RemoteMediaPlayerManager::GetLocalPlayer(int player_id) {
242 if (!IsPlayingRemotely(player_id))
243 return static_cast<RemoteMediaPlayerBridge*>(GetPlayer(player_id));
244 auto it = GetAlternativePlayer(player_id);
245 if (it == alternative_players_.end())
246 return nullptr;
247 return *it;
291 } 248 }
292 249
293 void RemoteMediaPlayerManager::OnMediaMetadataChanged(int player_id, 250 void RemoteMediaPlayerManager::OnMediaMetadataChanged(int player_id,
294 base::TimeDelta duration, 251 base::TimeDelta duration,
295 int width, 252 int width,
296 int height, 253 int height,
297 bool success) { 254 bool success) {
298 if (player_id == RemotePlayerId() && replaced_local_player_) { 255 if (IsPlayingRemotely(player_id)) {
256 MediaPlayerAndroid* local_player = GetLocalPlayer(player_id);
299 Send(new MediaPlayerMsg_MediaMetadataChanged( 257 Send(new MediaPlayerMsg_MediaMetadataChanged(
300 RoutingID(), player_id, duration, 258 RoutingID(), player_id, duration, local_player->GetVideoWidth(),
301 replaced_local_player_->GetVideoWidth(), 259 local_player->GetVideoHeight(), success));
302 replaced_local_player_->GetVideoHeight(), success));
303 } else { 260 } else {
304 BrowserMediaPlayerManager::OnMediaMetadataChanged(player_id, duration, 261 BrowserMediaPlayerManager::OnMediaMetadataChanged(player_id, duration,
305 width, height, success); 262 width, height, success);
306 } 263 }
307 } 264 }
308 265
266 bool RemoteMediaPlayerManager::IsPlayingRemotely(int player_id) {
267 return players_playing_remotely_.count(player_id) != 0;
268 }
269
309 } // namespace remote_media 270 } // namespace remote_media
OLDNEW
« no previous file with comments | « chrome/browser/media/android/remote/remote_media_player_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698