Chromium Code Reviews| 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/content_view_core_impl.h" | |
| 8 #include "content/browser/android/media_resource_getter_impl.h" | 9 #include "content/browser/android/media_resource_getter_impl.h" |
| 9 #include "content/browser/web_contents/web_contents_view_android.h" | 10 #include "content/browser/web_contents/web_contents_view_android.h" |
| 10 #include "content/common/media/media_player_messages.h" | 11 #include "content/common/media/media_player_messages.h" |
| 11 #include "content/public/browser/browser_context.h" | 12 #include "content/public/browser/browser_context.h" |
| 12 #include "content/public/browser/render_process_host.h" | 13 #include "content/public/browser/render_process_host.h" |
| 13 #include "content/public/browser/render_view_host.h" | 14 #include "content/public/browser/render_view_host.h" |
| 14 #include "content/public/browser/storage_partition.h" | 15 #include "content/public/browser/storage_partition.h" |
| 16 #include "content/public/browser/web_contents.h" | |
| 15 | 17 |
| 16 using media::MediaPlayerBridge; | 18 using media::MediaPlayerBridge; |
| 17 | 19 |
| 18 // Threshold on the number of media players per renderer before we start | 20 // Threshold on the number of media players per renderer before we start |
| 19 // attempting to release inactive media players. | 21 // attempting to release inactive media players. |
| 20 static const int kMediaPlayerThreshold = 1; | 22 static const int kMediaPlayerThreshold = 1; |
| 21 | 23 |
| 22 namespace content { | 24 namespace content { |
| 23 | 25 |
| 24 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid( | 26 MediaPlayerManagerAndroid::MediaPlayerManagerAndroid( |
| 25 RenderViewHost* render_view_host) | 27 RenderViewHost* render_view_host) |
| 26 : RenderViewHostObserver(render_view_host), | 28 : RenderViewHostObserver(render_view_host), |
| 27 ALLOW_THIS_IN_INITIALIZER_LIST(video_view_(this)), | |
| 28 fullscreen_player_id_(-1), | 29 fullscreen_player_id_(-1), |
| 29 web_contents_(WebContents::FromRenderViewHost(render_view_host)) { | 30 web_contents_(WebContents::FromRenderViewHost(render_view_host)) { |
| 30 } | 31 } |
| 31 | 32 |
| 32 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {} | 33 MediaPlayerManagerAndroid::~MediaPlayerManagerAndroid() {} |
| 33 | 34 |
| 34 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) { | 35 bool MediaPlayerManagerAndroid::OnMessageReceived(const IPC::Message& msg) { |
| 35 bool handled = true; | 36 bool handled = true; |
| 36 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg) | 37 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerAndroid, msg) |
| 37 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) | 38 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 80 Send(new MediaPlayerMsg_DidExitFullscreen( | 81 Send(new MediaPlayerMsg_DidExitFullscreen( |
| 81 routing_id(), fullscreen_player_id_)); | 82 routing_id(), fullscreen_player_id_)); |
| 82 MediaPlayerBridge* player = GetFullscreenPlayer(); | 83 MediaPlayerBridge* player = GetFullscreenPlayer(); |
| 83 fullscreen_player_id_ = -1; | 84 fullscreen_player_id_ = -1; |
| 84 if (!player) | 85 if (!player) |
| 85 return; | 86 return; |
| 86 if (release_media_player) | 87 if (release_media_player) |
| 87 player->Release(); | 88 player->Release(); |
| 88 else | 89 else |
| 89 player->SetVideoSurface(NULL); | 90 player->SetVideoSurface(NULL); |
| 91 video_view_.reset(); | |
| 90 } | 92 } |
| 91 | 93 |
| 92 void MediaPlayerManagerAndroid::SetVideoSurface(jobject surface) { | 94 void MediaPlayerManagerAndroid::SetVideoSurface(jobject surface) { |
| 93 MediaPlayerBridge* player = GetFullscreenPlayer(); | 95 MediaPlayerBridge* player = GetFullscreenPlayer(); |
| 94 if (player) { | 96 if (player) { |
| 95 player->SetVideoSurface(surface); | 97 player->SetVideoSurface(surface); |
| 96 Send(new MediaPlayerMsg_DidEnterFullscreen( | 98 Send(new MediaPlayerMsg_DidEnterFullscreen( |
| 97 routing_id(), player->player_id())); | 99 routing_id(), player->player_id())); |
| 98 } | 100 } |
| 99 } | 101 } |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 148 } | 150 } |
| 149 | 151 |
| 150 void MediaPlayerManagerAndroid::OnPause(int player_id) { | 152 void MediaPlayerManagerAndroid::OnPause(int player_id) { |
| 151 MediaPlayerBridge* player = GetPlayer(player_id); | 153 MediaPlayerBridge* player = GetPlayer(player_id); |
| 152 if (player) | 154 if (player) |
| 153 player->Pause(); | 155 player->Pause(); |
| 154 } | 156 } |
| 155 | 157 |
| 156 void MediaPlayerManagerAndroid::OnEnterFullscreen(int player_id) { | 158 void MediaPlayerManagerAndroid::OnEnterFullscreen(int player_id) { |
| 157 DCHECK_EQ(fullscreen_player_id_, -1); | 159 DCHECK_EQ(fullscreen_player_id_, -1); |
| 158 | 160 if (video_view_.get()) |
| 159 fullscreen_player_id_ = player_id; | 161 video_view_->OpenVideo(); |
| 160 video_view_.CreateContentVideoView(); | 162 else { |
| 163 fullscreen_player_id_ = player_id; | |
| 164 WebContents* web_contents = | |
| 165 WebContents::FromRenderViewHost(render_view_host()); | |
| 166 ContentViewCoreImpl* content_view_core_impl = | |
| 167 ContentViewCoreImpl::FromWebContents(web_contents); | |
| 168 video_view_.reset(new ContentVideoView(content_view_core_impl->GetContext(), | |
|
joth
2013/05/15 22:38:57
I'm not sure what stops two competing ContentViewC
michaelbai
2013/05/22 18:08:39
hmm, that's no a common use case, it needs user's
| |
| 169 content_view_core_impl->GetContentVideoViewClient(), this)); | |
| 170 } | |
| 161 } | 171 } |
| 162 | 172 |
| 163 void MediaPlayerManagerAndroid::OnExitFullscreen(int player_id) { | 173 void MediaPlayerManagerAndroid::OnExitFullscreen(int player_id) { |
| 164 if (fullscreen_player_id_ == player_id) { | 174 if (fullscreen_player_id_ == player_id) { |
| 165 MediaPlayerBridge* player = GetPlayer(player_id); | 175 MediaPlayerBridge* player = GetPlayer(player_id); |
| 166 if (player) | 176 if (player) |
| 167 player->SetVideoSurface(NULL); | 177 player->SetVideoSurface(NULL); |
| 168 video_view_.DestroyContentVideoView(); | |
| 169 fullscreen_player_id_ = -1; | 178 fullscreen_player_id_ = -1; |
| 179 video_view_->OnExitFullscreen(); | |
| 180 video_view_.reset(); | |
| 170 } | 181 } |
| 171 } | 182 } |
| 172 | 183 |
| 173 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) { | 184 void MediaPlayerManagerAndroid::OnReleaseResources(int player_id) { |
| 174 MediaPlayerBridge* player = GetPlayer(player_id); | 185 MediaPlayerBridge* player = GetPlayer(player_id); |
| 175 // Don't release the fullscreen player when tab visibility changes, | 186 // Don't release the fullscreen player when tab visibility changes, |
| 176 // it will be released when user hit the back/home button or when | 187 // it will be released when user hit the back/home button or when |
| 177 // OnDestroyPlayer is called. | 188 // OnDestroyPlayer is called. |
| 178 if (player && player_id != fullscreen_player_id_) | 189 if (player && player_id != fullscreen_player_id_) |
| 179 player->Release(); | 190 player->Release(); |
| 180 } | 191 } |
| 181 | 192 |
| 182 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) { | 193 void MediaPlayerManagerAndroid::OnDestroyPlayer(int player_id) { |
| 183 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); | 194 for (ScopedVector<MediaPlayerBridge>::iterator it = players_.begin(); |
| 184 it != players_.end(); ++it) { | 195 it != players_.end(); ++it) { |
| 185 if ((*it)->player_id() == player_id) { | 196 if ((*it)->player_id() == player_id) { |
| 186 players_.erase(it); | 197 players_.erase(it); |
| 187 break; | 198 break; |
| 188 } | 199 } |
| 189 } | 200 } |
| 190 if (fullscreen_player_id_ == player_id) | 201 if (fullscreen_player_id_ == player_id) |
| 191 fullscreen_player_id_ = -1; | 202 fullscreen_player_id_ = -1; |
| 192 } | 203 } |
| 193 | 204 |
| 194 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() { | 205 void MediaPlayerManagerAndroid::DestroyAllMediaPlayers() { |
| 195 players_.clear(); | 206 players_.clear(); |
| 196 if (fullscreen_player_id_ != -1) { | 207 if (fullscreen_player_id_ != -1) { |
| 197 video_view_.DestroyContentVideoView(); | 208 video_view_.reset(); |
| 198 fullscreen_player_id_ = -1; | 209 fullscreen_player_id_ = -1; |
| 199 } | 210 } |
| 200 } | 211 } |
| 201 | 212 |
| 202 void MediaPlayerManagerAndroid::AttachExternalVideoSurface(int player_id, | 213 void MediaPlayerManagerAndroid::AttachExternalVideoSurface(int player_id, |
| 203 jobject surface) { | 214 jobject surface) { |
| 204 MediaPlayerBridge* player = GetPlayer(player_id); | 215 MediaPlayerBridge* player = GetPlayer(player_id); |
| 205 if (player) | 216 if (player) |
| 206 player->SetVideoSurface(surface); | 217 player->SetVideoSurface(surface); |
| 207 } | 218 } |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 233 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() { | 244 MediaPlayerBridge* MediaPlayerManagerAndroid::GetFullscreenPlayer() { |
| 234 return GetPlayer(fullscreen_player_id_); | 245 return GetPlayer(fullscreen_player_id_); |
| 235 } | 246 } |
| 236 | 247 |
| 237 void MediaPlayerManagerAndroid::OnMediaMetadataChanged( | 248 void MediaPlayerManagerAndroid::OnMediaMetadataChanged( |
| 238 int player_id, base::TimeDelta duration, int width, int height, | 249 int player_id, base::TimeDelta duration, int width, int height, |
| 239 bool success) { | 250 bool success) { |
| 240 Send(new MediaPlayerMsg_MediaMetadataChanged( | 251 Send(new MediaPlayerMsg_MediaMetadataChanged( |
| 241 routing_id(), player_id, duration, width, height, success)); | 252 routing_id(), player_id, duration, width, height, success)); |
| 242 if (fullscreen_player_id_ != -1) | 253 if (fullscreen_player_id_ != -1) |
| 243 video_view_.UpdateMediaMetadata(); | 254 video_view_->UpdateMediaMetadata(); |
| 244 } | 255 } |
| 245 | 256 |
| 246 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) { | 257 void MediaPlayerManagerAndroid::OnPlaybackComplete(int player_id) { |
| 247 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); | 258 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); |
| 248 if (fullscreen_player_id_ != -1) | 259 if (fullscreen_player_id_ != -1) |
| 249 video_view_.OnPlaybackComplete(); | 260 video_view_->OnPlaybackComplete(); |
| 250 } | 261 } |
| 251 | 262 |
| 252 void MediaPlayerManagerAndroid::OnMediaInterrupted(int player_id) { | 263 void MediaPlayerManagerAndroid::OnMediaInterrupted(int player_id) { |
| 253 // Tell WebKit that the audio should be paused, then release all resources | 264 // Tell WebKit that the audio should be paused, then release all resources |
| 254 Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id)); | 265 Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id)); |
| 255 OnReleaseResources(player_id); | 266 OnReleaseResources(player_id); |
| 256 } | 267 } |
| 257 | 268 |
| 258 void MediaPlayerManagerAndroid::OnBufferingUpdate( | 269 void MediaPlayerManagerAndroid::OnBufferingUpdate( |
| 259 int player_id, int percentage) { | 270 int player_id, int percentage) { |
| 260 Send(new MediaPlayerMsg_MediaBufferingUpdate( | 271 Send(new MediaPlayerMsg_MediaBufferingUpdate( |
| 261 routing_id(), player_id, percentage)); | 272 routing_id(), player_id, percentage)); |
| 262 if (fullscreen_player_id_ != -1) | 273 if (fullscreen_player_id_ != -1) |
| 263 video_view_.OnBufferingUpdate(percentage); | 274 video_view_->OnBufferingUpdate(percentage); |
| 264 } | 275 } |
| 265 | 276 |
| 266 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id, | 277 void MediaPlayerManagerAndroid::OnSeekComplete(int player_id, |
| 267 base::TimeDelta current_time) { | 278 base::TimeDelta current_time) { |
| 268 Send(new MediaPlayerMsg_MediaSeekCompleted( | 279 Send(new MediaPlayerMsg_MediaSeekCompleted( |
| 269 routing_id(), player_id, current_time)); | 280 routing_id(), player_id, current_time)); |
| 270 } | 281 } |
| 271 | 282 |
| 272 void MediaPlayerManagerAndroid::OnError(int player_id, int error) { | 283 void MediaPlayerManagerAndroid::OnError(int player_id, int error) { |
| 273 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error)); | 284 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error)); |
| 274 if (fullscreen_player_id_ != -1) | 285 if (fullscreen_player_id_ != -1) |
| 275 video_view_.OnMediaPlayerError(error); | 286 video_view_->OnMediaPlayerError(error); |
| 276 } | 287 } |
| 277 | 288 |
| 278 void MediaPlayerManagerAndroid::OnVideoSizeChanged( | 289 void MediaPlayerManagerAndroid::OnVideoSizeChanged( |
| 279 int player_id, int width, int height) { | 290 int player_id, int width, int height) { |
| 280 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, | 291 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, |
| 281 width, height)); | 292 width, height)); |
| 282 if (fullscreen_player_id_ != -1) | 293 if (fullscreen_player_id_ != -1) |
| 283 video_view_.OnVideoSizeChanged(width, height); | 294 video_view_->OnVideoSizeChanged(width, height); |
| 284 } | 295 } |
| 285 | 296 |
| 286 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id, | 297 void MediaPlayerManagerAndroid::OnTimeUpdate(int player_id, |
| 287 base::TimeDelta current_time) { | 298 base::TimeDelta current_time) { |
| 288 Send(new MediaPlayerMsg_MediaTimeUpdate( | 299 Send(new MediaPlayerMsg_MediaTimeUpdate( |
| 289 routing_id(), player_id, current_time)); | 300 routing_id(), player_id, current_time)); |
| 290 } | 301 } |
| 291 | 302 |
| 292 void MediaPlayerManagerAndroid::RequestMediaResources( | 303 void MediaPlayerManagerAndroid::RequestMediaResources( |
| 293 MediaPlayerBridge* player) { | 304 MediaPlayerBridge* player) { |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 320 } | 331 } |
| 321 } | 332 } |
| 322 } | 333 } |
| 323 | 334 |
| 324 void MediaPlayerManagerAndroid::ReleaseMediaResources( | 335 void MediaPlayerManagerAndroid::ReleaseMediaResources( |
| 325 MediaPlayerBridge* player) { | 336 MediaPlayerBridge* player) { |
| 326 // Nothing needs to be done. | 337 // Nothing needs to be done. |
| 327 } | 338 } |
| 328 | 339 |
| 329 } // namespace content | 340 } // namespace content |
| OLD | NEW |