| 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 |