| 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_impl.h" | 5 #include "content/browser/android/media_player_manager_impl.h" |
| 6 | 6 |
| 7 #include "content/browser/android/content_view_core_impl.h" |
| 7 #include "content/browser/android/media_resource_getter_impl.h" | 8 #include "content/browser/android/media_resource_getter_impl.h" |
| 8 #include "content/browser/web_contents/web_contents_view_android.h" | 9 #include "content/browser/web_contents/web_contents_view_android.h" |
| 9 #include "content/common/media/media_player_messages_android.h" | 10 #include "content/common/media/media_player_messages_android.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 #include "content/public/browser/storage_partition.h" | 14 #include "content/public/browser/storage_partition.h" |
| 15 #include "content/public/browser/web_contents.h" |
| 14 | 16 |
| 15 using media::MediaPlayerAndroid; | 17 using media::MediaPlayerAndroid; |
| 16 | 18 |
| 17 // Threshold on the number of media players per renderer before we start | 19 // Threshold on the number of media players per renderer before we start |
| 18 // attempting to release inactive media players. | 20 // attempting to release inactive media players. |
| 19 static const int kMediaPlayerThreshold = 1; | 21 static const int kMediaPlayerThreshold = 1; |
| 20 | 22 |
| 21 namespace media { | 23 namespace media { |
| 22 | 24 |
| 23 static MediaPlayerManager::FactoryFunction g_factory_function = NULL; | 25 static MediaPlayerManager::FactoryFunction g_factory_function = NULL; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 36 return new content::MediaPlayerManagerImpl(render_view_host); | 38 return new content::MediaPlayerManagerImpl(render_view_host); |
| 37 } | 39 } |
| 38 | 40 |
| 39 } // namespace media | 41 } // namespace media |
| 40 | 42 |
| 41 namespace content { | 43 namespace content { |
| 42 | 44 |
| 43 MediaPlayerManagerImpl::MediaPlayerManagerImpl( | 45 MediaPlayerManagerImpl::MediaPlayerManagerImpl( |
| 44 RenderViewHost* render_view_host) | 46 RenderViewHost* render_view_host) |
| 45 : RenderViewHostObserver(render_view_host), | 47 : RenderViewHostObserver(render_view_host), |
| 46 video_view_(this), | |
| 47 fullscreen_player_id_(-1), | 48 fullscreen_player_id_(-1), |
| 48 web_contents_(WebContents::FromRenderViewHost(render_view_host)) { | 49 web_contents_(WebContents::FromRenderViewHost(render_view_host)) { |
| 49 } | 50 } |
| 50 | 51 |
| 51 MediaPlayerManagerImpl::~MediaPlayerManagerImpl() {} | 52 MediaPlayerManagerImpl::~MediaPlayerManagerImpl() {} |
| 52 | 53 |
| 53 bool MediaPlayerManagerImpl::OnMessageReceived(const IPC::Message& msg) { | 54 bool MediaPlayerManagerImpl::OnMessageReceived(const IPC::Message& msg) { |
| 54 bool handled = true; | 55 bool handled = true; |
| 55 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerImpl, msg) | 56 IPC_BEGIN_MESSAGE_MAP(MediaPlayerManagerImpl, msg) |
| 56 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) | 57 IPC_MESSAGE_HANDLER(MediaPlayerHostMsg_EnterFullscreen, OnEnterFullscreen) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 Send(new MediaPlayerMsg_DidExitFullscreen( | 108 Send(new MediaPlayerMsg_DidExitFullscreen( |
| 108 routing_id(), fullscreen_player_id_)); | 109 routing_id(), fullscreen_player_id_)); |
| 109 MediaPlayerAndroid* player = GetFullscreenPlayer(); | 110 MediaPlayerAndroid* player = GetFullscreenPlayer(); |
| 110 fullscreen_player_id_ = -1; | 111 fullscreen_player_id_ = -1; |
| 111 if (!player) | 112 if (!player) |
| 112 return; | 113 return; |
| 113 if (release_media_player) | 114 if (release_media_player) |
| 114 player->Release(); | 115 player->Release(); |
| 115 else | 116 else |
| 116 player->SetVideoSurface(gfx::ScopedJavaSurface()); | 117 player->SetVideoSurface(gfx::ScopedJavaSurface()); |
| 118 video_view_.reset(); |
| 117 } | 119 } |
| 118 | 120 |
| 119 void MediaPlayerManagerImpl::SetVideoSurface(gfx::ScopedJavaSurface surface) { | 121 void MediaPlayerManagerImpl::SetVideoSurface(gfx::ScopedJavaSurface surface) { |
| 120 MediaPlayerAndroid* player = GetFullscreenPlayer(); | 122 MediaPlayerAndroid* player = GetFullscreenPlayer(); |
| 121 if (player) { | 123 if (player) { |
| 122 player->SetVideoSurface(surface.Pass()); | 124 player->SetVideoSurface(surface.Pass()); |
| 123 Send(new MediaPlayerMsg_DidEnterFullscreen( | 125 Send(new MediaPlayerMsg_DidEnterFullscreen( |
| 124 routing_id(), player->player_id())); | 126 routing_id(), player->player_id())); |
| 125 } | 127 } |
| 126 } | 128 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 165 | 167 |
| 166 void MediaPlayerManagerImpl::OnPause(int player_id) { | 168 void MediaPlayerManagerImpl::OnPause(int player_id) { |
| 167 MediaPlayerAndroid* player = GetPlayer(player_id); | 169 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 168 if (player) | 170 if (player) |
| 169 player->Pause(); | 171 player->Pause(); |
| 170 } | 172 } |
| 171 | 173 |
| 172 void MediaPlayerManagerImpl::OnEnterFullscreen(int player_id) { | 174 void MediaPlayerManagerImpl::OnEnterFullscreen(int player_id) { |
| 173 DCHECK_EQ(fullscreen_player_id_, -1); | 175 DCHECK_EQ(fullscreen_player_id_, -1); |
| 174 | 176 |
| 175 fullscreen_player_id_ = player_id; | 177 if (video_view_.get()) { |
| 176 video_view_.CreateContentVideoView(); | 178 fullscreen_player_id_ = player_id; |
| 179 video_view_->OpenVideo(); |
| 180 } else if (!ContentVideoView::HasContentVideoView()) { |
| 181 // In Android WebView, two ContentViewCores could both try to enter |
| 182 // fullscreen video, we just ignore the second one. |
| 183 fullscreen_player_id_ = player_id; |
| 184 WebContents* web_contents = |
| 185 WebContents::FromRenderViewHost(render_view_host()); |
| 186 ContentViewCoreImpl* content_view_core_impl = |
| 187 ContentViewCoreImpl::FromWebContents(web_contents); |
| 188 video_view_.reset(new ContentVideoView(content_view_core_impl->GetContext(), |
| 189 content_view_core_impl->GetContentVideoViewClient(), this)); |
| 190 } |
| 177 } | 191 } |
| 178 | 192 |
| 179 void MediaPlayerManagerImpl::OnExitFullscreen(int player_id) { | 193 void MediaPlayerManagerImpl::OnExitFullscreen(int player_id) { |
| 180 if (fullscreen_player_id_ == player_id) { | 194 if (fullscreen_player_id_ == player_id) { |
| 181 MediaPlayerAndroid* player = GetPlayer(player_id); | 195 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 182 if (player) | 196 if (player) |
| 183 player->SetVideoSurface(gfx::ScopedJavaSurface()); | 197 player->SetVideoSurface(gfx::ScopedJavaSurface()); |
| 184 video_view_.DestroyContentVideoView(); | |
| 185 fullscreen_player_id_ = -1; | 198 fullscreen_player_id_ = -1; |
| 199 video_view_->OnExitFullscreen(); |
| 200 video_view_.reset(); |
| 186 } | 201 } |
| 187 } | 202 } |
| 188 | 203 |
| 189 void MediaPlayerManagerImpl::OnReleaseResources(int player_id) { | 204 void MediaPlayerManagerImpl::OnReleaseResources(int player_id) { |
| 190 MediaPlayerAndroid* player = GetPlayer(player_id); | 205 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 191 // Don't release the fullscreen player when tab visibility changes, | 206 // Don't release the fullscreen player when tab visibility changes, |
| 192 // it will be released when user hit the back/home button or when | 207 // it will be released when user hit the back/home button or when |
| 193 // OnDestroyPlayer is called. | 208 // OnDestroyPlayer is called. |
| 194 if (player && player_id != fullscreen_player_id_) | 209 if (player && player_id != fullscreen_player_id_) |
| 195 player->Release(); | 210 player->Release(); |
| 196 } | 211 } |
| 197 | 212 |
| 198 void MediaPlayerManagerImpl::OnDestroyPlayer(int player_id) { | 213 void MediaPlayerManagerImpl::OnDestroyPlayer(int player_id) { |
| 199 RemovePlayer(player_id); | 214 RemovePlayer(player_id); |
| 200 if (fullscreen_player_id_ == player_id) | 215 if (fullscreen_player_id_ == player_id) |
| 201 fullscreen_player_id_ = -1; | 216 fullscreen_player_id_ = -1; |
| 202 } | 217 } |
| 203 | 218 |
| 204 void MediaPlayerManagerImpl::DestroyAllMediaPlayers() { | 219 void MediaPlayerManagerImpl::DestroyAllMediaPlayers() { |
| 205 players_.clear(); | 220 players_.clear(); |
| 206 if (fullscreen_player_id_ != -1) { | 221 if (fullscreen_player_id_ != -1) { |
| 207 video_view_.DestroyContentVideoView(); | 222 video_view_.reset(); |
| 208 fullscreen_player_id_ = -1; | 223 fullscreen_player_id_ = -1; |
| 209 } | 224 } |
| 210 } | 225 } |
| 211 | 226 |
| 212 void MediaPlayerManagerImpl::OnDemuxerReady( | 227 void MediaPlayerManagerImpl::OnDemuxerReady( |
| 213 int player_id, | 228 int player_id, |
| 214 const media::MediaPlayerHostMsg_DemuxerReady_Params& params) { | 229 const media::MediaPlayerHostMsg_DemuxerReady_Params& params) { |
| 215 MediaPlayerAndroid* player = GetPlayer(player_id); | 230 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 216 if (player) | 231 if (player) |
| 217 player->DemuxerReady(params); | 232 player->DemuxerReady(params); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 MediaPlayerAndroid* MediaPlayerManagerImpl::GetFullscreenPlayer() { | 287 MediaPlayerAndroid* MediaPlayerManagerImpl::GetFullscreenPlayer() { |
| 273 return GetPlayer(fullscreen_player_id_); | 288 return GetPlayer(fullscreen_player_id_); |
| 274 } | 289 } |
| 275 | 290 |
| 276 void MediaPlayerManagerImpl::OnMediaMetadataChanged( | 291 void MediaPlayerManagerImpl::OnMediaMetadataChanged( |
| 277 int player_id, base::TimeDelta duration, int width, int height, | 292 int player_id, base::TimeDelta duration, int width, int height, |
| 278 bool success) { | 293 bool success) { |
| 279 Send(new MediaPlayerMsg_MediaMetadataChanged( | 294 Send(new MediaPlayerMsg_MediaMetadataChanged( |
| 280 routing_id(), player_id, duration, width, height, success)); | 295 routing_id(), player_id, duration, width, height, success)); |
| 281 if (fullscreen_player_id_ != -1) | 296 if (fullscreen_player_id_ != -1) |
| 282 video_view_.UpdateMediaMetadata(); | 297 video_view_->UpdateMediaMetadata(); |
| 283 } | 298 } |
| 284 | 299 |
| 285 void MediaPlayerManagerImpl::OnPlaybackComplete(int player_id) { | 300 void MediaPlayerManagerImpl::OnPlaybackComplete(int player_id) { |
| 286 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); | 301 Send(new MediaPlayerMsg_MediaPlaybackCompleted(routing_id(), player_id)); |
| 287 if (fullscreen_player_id_ != -1) | 302 if (fullscreen_player_id_ != -1) |
| 288 video_view_.OnPlaybackComplete(); | 303 video_view_->OnPlaybackComplete(); |
| 289 } | 304 } |
| 290 | 305 |
| 291 void MediaPlayerManagerImpl::OnMediaInterrupted(int player_id) { | 306 void MediaPlayerManagerImpl::OnMediaInterrupted(int player_id) { |
| 292 // Tell WebKit that the audio should be paused, then release all resources | 307 // Tell WebKit that the audio should be paused, then release all resources |
| 293 Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id)); | 308 Send(new MediaPlayerMsg_DidMediaPlayerPause(routing_id(), player_id)); |
| 294 OnReleaseResources(player_id); | 309 OnReleaseResources(player_id); |
| 295 } | 310 } |
| 296 | 311 |
| 297 void MediaPlayerManagerImpl::OnBufferingUpdate( | 312 void MediaPlayerManagerImpl::OnBufferingUpdate( |
| 298 int player_id, int percentage) { | 313 int player_id, int percentage) { |
| 299 Send(new MediaPlayerMsg_MediaBufferingUpdate( | 314 Send(new MediaPlayerMsg_MediaBufferingUpdate( |
| 300 routing_id(), player_id, percentage)); | 315 routing_id(), player_id, percentage)); |
| 301 if (fullscreen_player_id_ != -1) | 316 if (fullscreen_player_id_ != -1) |
| 302 video_view_.OnBufferingUpdate(percentage); | 317 video_view_->OnBufferingUpdate(percentage); |
| 303 } | 318 } |
| 304 | 319 |
| 305 void MediaPlayerManagerImpl::OnSeekComplete(int player_id, | 320 void MediaPlayerManagerImpl::OnSeekComplete(int player_id, |
| 306 base::TimeDelta current_time) { | 321 base::TimeDelta current_time) { |
| 307 Send(new MediaPlayerMsg_MediaSeekCompleted( | 322 Send(new MediaPlayerMsg_MediaSeekCompleted( |
| 308 routing_id(), player_id, current_time)); | 323 routing_id(), player_id, current_time)); |
| 309 } | 324 } |
| 310 | 325 |
| 311 void MediaPlayerManagerImpl::OnMediaSeekRequest( | 326 void MediaPlayerManagerImpl::OnMediaSeekRequest( |
| 312 int player_id, base::TimeDelta time_to_seek, bool request_surface) { | 327 int player_id, base::TimeDelta time_to_seek, bool request_surface) { |
| 313 bool request_texture_peer = request_surface; | 328 bool request_texture_peer = request_surface; |
| 314 if (request_surface && player_id == fullscreen_player_id_) { | 329 if (request_surface && player_id == fullscreen_player_id_ && |
| 315 video_view_.CreateContentVideoView(); | 330 video_view_.get()) { |
| 331 video_view_->OpenVideo(); |
| 316 request_texture_peer = false; | 332 request_texture_peer = false; |
| 317 } | 333 } |
| 318 Send(new MediaPlayerMsg_MediaSeekRequest( | 334 Send(new MediaPlayerMsg_MediaSeekRequest( |
| 319 routing_id(), player_id, time_to_seek, request_texture_peer)); | 335 routing_id(), player_id, time_to_seek, request_texture_peer)); |
| 320 } | 336 } |
| 321 | 337 |
| 322 void MediaPlayerManagerImpl::OnError(int player_id, int error) { | 338 void MediaPlayerManagerImpl::OnError(int player_id, int error) { |
| 323 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error)); | 339 Send(new MediaPlayerMsg_MediaError(routing_id(), player_id, error)); |
| 324 if (fullscreen_player_id_ != -1) | 340 if (fullscreen_player_id_ != -1) |
| 325 video_view_.OnMediaPlayerError(error); | 341 video_view_->OnMediaPlayerError(error); |
| 326 } | 342 } |
| 327 | 343 |
| 328 void MediaPlayerManagerImpl::OnVideoSizeChanged( | 344 void MediaPlayerManagerImpl::OnVideoSizeChanged( |
| 329 int player_id, int width, int height) { | 345 int player_id, int width, int height) { |
| 330 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, | 346 Send(new MediaPlayerMsg_MediaVideoSizeChanged(routing_id(), player_id, |
| 331 width, height)); | 347 width, height)); |
| 332 if (fullscreen_player_id_ != -1) | 348 if (fullscreen_player_id_ != -1) |
| 333 video_view_.OnVideoSizeChanged(width, height); | 349 video_view_->OnVideoSizeChanged(width, height); |
| 334 } | 350 } |
| 335 | 351 |
| 336 void MediaPlayerManagerImpl::OnTimeUpdate(int player_id, | 352 void MediaPlayerManagerImpl::OnTimeUpdate(int player_id, |
| 337 base::TimeDelta current_time) { | 353 base::TimeDelta current_time) { |
| 338 Send(new MediaPlayerMsg_MediaTimeUpdate( | 354 Send(new MediaPlayerMsg_MediaTimeUpdate( |
| 339 routing_id(), player_id, current_time)); | 355 routing_id(), player_id, current_time)); |
| 340 } | 356 } |
| 341 | 357 |
| 342 void MediaPlayerManagerImpl::OnReadFromDemuxer( | 358 void MediaPlayerManagerImpl::OnReadFromDemuxer( |
| 343 int player_id, media::DemuxerStream::Type type, bool seek_done) { | 359 int player_id, media::DemuxerStream::Type type, bool seek_done) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); | 407 for (ScopedVector<MediaPlayerAndroid>::iterator it = players_.begin(); |
| 392 it != players_.end(); ++it) { | 408 it != players_.end(); ++it) { |
| 393 if ((*it)->player_id() == player_id) { | 409 if ((*it)->player_id() == player_id) { |
| 394 players_.erase(it); | 410 players_.erase(it); |
| 395 break; | 411 break; |
| 396 } | 412 } |
| 397 } | 413 } |
| 398 } | 414 } |
| 399 | 415 |
| 400 } // namespace content | 416 } // namespace content |
| OLD | NEW |