Chromium Code Reviews| 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 "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 Loading... | |
| 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 |
| OLD | NEW |