| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/android/media_player_manager_android.h" | 5 #include "content/browser/android/media_player_manager_android.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "content/browser/android/cookie_getter_impl.h" | 8 #include "content/browser/android/cookie_getter_impl.h" |
| 9 #include "content/browser/android/external_video_surface_view_holder.h" |
| 9 #include "content/common/media/media_player_messages.h" | 10 #include "content/common/media/media_player_messages.h" |
| 10 #include "content/public/browser/browser_context.h" | 11 #include "content/public/browser/browser_context.h" |
| 11 #include "content/public/browser/render_process_host.h" | 12 #include "content/public/browser/render_process_host.h" |
| 12 #include "content/public/browser/render_view_host.h" | 13 #include "content/public/browser/render_view_host.h" |
| 13 | 14 |
| 14 using media::MediaPlayerBridge; | 15 using media::MediaPlayerBridge; |
| 15 | 16 |
| 16 // Threshold on the number of media players per renderer before we start | 17 // Threshold on the number of media players per renderer before we start |
| 17 // attempting to release inactive media players. | 18 // attempting to release inactive media players. |
| 18 static const int kMediaPlayerThreshold = 1; | 19 static const int kMediaPlayerThreshold = 1; |
| 19 | 20 |
| 20 namespace content { | 21 namespace content { |
| 21 | 22 |
| 22 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid( | 23 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid( |
| 23 RenderViewHost* render_view_host) | 24 RenderViewHost* render_view_host) |
| 24 : RenderViewHostObserver(render_view_host), | 25 : RenderViewHostObserver(render_view_host), |
| 25 ALLOW_THIS_IN_INITIALIZER_LIST(video_view_(this)), | 26 ALLOW_THIS_IN_INITIALIZER_LIST(video_view_(this)), |
| 26 fullscreen_player_id_(-1) { | 27 fullscreen_player_id_(-1), |
| 28 external_video_surface_user_id_(-1), |
| 29 external_video_surface_view_holder_(NULL) { |
| 27 } | 30 } |
| 28 | 31 |
| 29 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {} | 32 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {} |
| 30 | 33 |
| 31 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) { | 34 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) { |
| 32 bool handled = true; | 35 bool handled = true; |
| 33 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg) | 36 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg) |
| 34 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) | 37 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) |
| 35 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen) | 38 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_ExitFullscreen, OnExitFullscreen) |
| 36 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerInitialize, OnInitialize) | 39 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerInitialize, OnInitialize) |
| 37 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerStart, OnStart) | 40 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerStart, OnStart) |
| 38 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerSeek, OnSeek) | 41 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerSeek, OnSeek) |
| 39 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerPause, OnPause) | 42 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerPause, OnPause) |
| 40 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerRelease, | 43 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_MediaPlayerRelease, |
| 41 OnReleaseResources) | 44 OnReleaseResources) |
| 42 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) | 45 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyMediaPlayer, OnDestroyPlayer) |
| 43 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, | 46 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_DestroyAllMediaPlayers, |
| 44 DestroyAllMediaPlayers) | 47 DestroyAllMediaPlayers) |
| 48 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_RequestExternalSurface, |
| 49 OnRequestExternalSurface) |
| 45 IPC_MESSAGE_UNHANDLED(handled = false) | 50 IPC_MESSAGE_UNHANDLED(handled = false) |
| 46 IPC_END_MESSAGE_MAP() | 51 IPC_END_MESSAGE_MAP() |
| 47 return handled; | 52 return handled; |
| 48 } | 53 } |
| 49 | 54 |
| 50 void MediaPlayerManagerAndroid::FullscreenPlayerPlay() { | 55 void MediaPlayerManagerAndroid::FullscreenPlayerPlay() { |
| 51 MediaPlayerBridge* player = GetFullscreenPlayer(); | 56 MediaPlayerBridge* player = GetFullscreenPlayer(); |
| 52 if (player) { | 57 if (player) { |
| 53 player->Start(); | 58 player->Start(); |
| 54 Send(new MediaPlayerMsg_DidMediaPlayerPlay( | 59 Send(new MediaPlayerMsg_DidMediaPlayerPlay( |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 video_view_.DestroyContentVideoView(); | 169 video_view_.DestroyContentVideoView(); |
| 165 fullscreen_player_id_ = -1; | 170 fullscreen_player_id_ = -1; |
| 166 } | 171 } |
| 167 } | 172 } |
| 168 | 173 |
| 169 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) { | 174 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) { |
| 170 MediaPlayerBridge* player = GetPlayer(player_id); | 175 MediaPlayerBridge* player = GetPlayer(player_id); |
| 171 // Don't release the fullscreen player when tab visibility changes, | 176 // Don't release the fullscreen player when tab visibility changes, |
| 172 // it will be released when user hit the back/home button or when | 177 // it will be released when user hit the back/home button or when |
| 173 // OnDestroyPlayer is called. | 178 // OnDestroyPlayer is called. |
| 179 if (player && external_video_surface_user_id_ == player_id) { |
| 180 if (external_video_surface_view_holder_) |
| 181 external_video_surface_view_holder_->unregisterPlayer(player); |
| 182 external_video_surface_user_id_ = -1; |
| 183 } |
| 174 if (player && player_id != fullscreen_player_id_) | 184 if (player && player_id != fullscreen_player_id_) |
| 175 player->Release(); | 185 player->Release(); |
| 176 } | 186 } |
| 177 | 187 |
| 178 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) { | 188 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) { |
| 189 if (external_video_surface_user_id_ == player_id) { |
| 190 external_video_surface_user_id_ = -1; |
| 191 |
| 192 MediaPlayerBridge* player = GetPlayer(player_id); |
| 193 if (external_video_surface_view_holder_ && player) |
| 194 external_video_surface_view_holder_->unregisterPlayer(player); |
| 195 } |
| 179 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); | 196 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); |
| 180 it != players_.end(); ++it) { | 197 it != players_.end(); ++it) { |
| 181 if ((*it)->player_id() == player_id) { | 198 if ((*it)->player_id() == player_id) { |
| 182 players_.erase(it); | 199 players_.erase(it); |
| 183 break; | 200 break; |
| 184 } | 201 } |
| 185 } | 202 } |
| 186 if (fullscreen_player_id_ == player_id) | 203 if (fullscreen_player_id_ == player_id) |
| 187 fullscreen_player_id_ = -1; | 204 fullscreen_player_id_ = -1; |
| 188 } | 205 } |
| 189 | 206 |
| 190 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() { | 207 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() { |
| 208 MediaPlayerBridge* external_surface_user = |
| 209 GetPlayer(external_video_surface_user_id_); |
| 210 if (external_video_surface_view_holder_ && external_surface_user) { |
| 211 external_video_surface_view_holder_->unregisterPlayer( |
| 212 external_surface_user); |
| 213 } |
| 191 players_.clear(); | 214 players_.clear(); |
| 192 if (fullscreen_player_id_ != -1) { | 215 if (fullscreen_player_id_ != -1) { |
| 193 video_view_.DestroyContentVideoView(); | 216 video_view_.DestroyContentVideoView(); |
| 194 fullscreen_player_id_ = -1; | 217 fullscreen_player_id_ = -1; |
| 195 } | 218 } |
| 219 external_video_surface_user_id_ = -1; |
| 220 } |
| 221 |
| 222 void MediaPlayerManagerAndroid::OnRequestExternalSurface(int player_id) { |
| 223 if (external_video_surface_user_id_ != -1) { |
| 224 MediaPlayerBridge* player = GetPlayer(external_video_surface_user_id_); |
| 225 if (external_video_surface_view_holder_) |
| 226 external_video_surface_view_holder_->unregisterPlayer(player); |
| 227 } |
| 228 external_video_surface_user_id_ = player_id; |
| 229 MediaPlayerBridge* player = GetPlayer(player_id); |
| 230 if (external_video_surface_view_holder_) |
| 231 external_video_surface_view_holder_->registerPlayer(player); |
| 196 } | 232 } |
| 197 | 233 |
| 198 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) { | 234 MediaPlayerBridge* MediaPlayerManagerAndroid::GetPlayer(int player_id) { |
| 199 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); | 235 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); |
| 200 it != players_.end(); ++it) { | 236 it != players_.end(); ++it) { |
| 201 if ((*it)->player_id() == player_id) | 237 if ((*it)->player_id() == player_id) |
| 202 return *it; | 238 return *it; |
| 203 } | 239 } |
| 204 return NULL; | 240 return NULL; |
| 205 } | 241 } |
| 206 | 242 |
| 207 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() { | 243 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() { |
| 208 return GetPlayer(fullscreen_player_id_); | 244 return GetPlayer(fullscreen_player_id_); |
| 209 } | 245 } |
| 210 | 246 |
| 247 void MediaPlayerManagerAndroid::SetExternalVideoSurfaceViewHolder( |
| 248 ExternalVideoSurfaceViewHolder* holder) { |
| 249 external_video_surface_view_holder_ = holder; |
| 250 |
| 251 MediaPlayerBridge* player = GetPlayer(external_video_surface_user_id_); |
| 252 if (external_video_surface_view_holder_ && player) |
| 253 external_video_surface_view_holder_->registerPlayer(player); |
| 254 } |
| 255 |
| 211 void MediaPlayerManagerAndroid::OnPrepared(int player_id, | 256 void MediaPlayerManagerAndroid::OnPrepared(int player_id, |
| 212 base::TimeDelta duration) { | 257 base::TimeDelta duration) { |
| 213 Send(new MediaPlayerMsg_MediaPrepared(routing_id(), player_id, duration)); | 258 Send(new MediaPlayerMsg_MediaPrepared(routing_id(), player_id, duration)); |
| 214 if (fullscreen_player_id_ != -1) | 259 if (fullscreen_player_id_ != -1) |
| 215 video_view_.UpdateMediaMetadata(); | 260 video_view_.UpdateMediaMetadata(); |
| 216 } | 261 } |
| 217 | 262 |
| 218 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) { | 263 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) { |
| 219 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); | 264 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); |
| 220 if (fullscreen_player_id_ != -1) | 265 if (fullscreen_player_id_ != -1) |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 } | 337 } |
| 293 } | 338 } |
| 294 } | 339 } |
| 295 | 340 |
| 296 void MediaPlayerManagerAndroid::ReleaseMediaResources( | 341 void MediaPlayerManagerAndroid::ReleaseMediaResources( |
| 297 MediaPlayerBridge* player) { | 342 MediaPlayerBridge* player) { |
| 298 // Nothing needs to be done. | 343 // Nothing needs to be done. |
| 299 } | 344 } |
| 300 | 345 |
| 301 } // namespace content | 346 } // namespace content |
| OLD | NEW |