| 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 "content/browser/media/android/browser_media_player_manager.h" | 5 #include "content/browser/media/android/browser_media_player_manager.h" |
| 6 | 6 |
| 7 #include "base/android/scoped_java_ref.h" | 7 #include "base/android/scoped_java_ref.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "content/browser/android/content_view_core_impl.h" | 9 #include "content/browser/android/content_view_core_impl.h" |
| 10 #include "content/browser/media/android/browser_demuxer_android.h" | 10 #include "content/browser/media/android/browser_demuxer_android.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 using media::MediaPlayerAndroid; | 32 using media::MediaPlayerAndroid; |
| 33 using media::MediaPlayerBridge; | 33 using media::MediaPlayerBridge; |
| 34 using media::MediaPlayerManager; | 34 using media::MediaPlayerManager; |
| 35 using media::MediaSourcePlayer; | 35 using media::MediaSourcePlayer; |
| 36 | 36 |
| 37 namespace content { | 37 namespace content { |
| 38 | 38 |
| 39 // Threshold on the number of media players per renderer before we start | 39 // Threshold on the number of media players per renderer before we start |
| 40 // attempting to release inactive media players. | 40 // attempting to release inactive media players. |
| 41 const int kMediaPlayerThreshold = 1; | 41 const int kMediaPlayerThreshold = 1; |
| 42 const int kInvalidMediaPlayerId = -1; |
| 42 | 43 |
| 43 static BrowserMediaPlayerManager::Factory g_factory = NULL; | 44 static BrowserMediaPlayerManager::Factory g_factory = NULL; |
| 44 static media::MediaUrlInterceptor* media_url_interceptor_ = NULL; | 45 static media::MediaUrlInterceptor* media_url_interceptor_ = NULL; |
| 45 | 46 |
| 46 // static | 47 // static |
| 47 void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { | 48 void BrowserMediaPlayerManager::RegisterFactory(Factory factory) { |
| 48 g_factory = factory; | 49 g_factory = factory; |
| 49 } | 50 } |
| 50 | 51 |
| 51 // static | 52 // static |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 } | 116 } |
| 116 } | 117 } |
| 117 | 118 |
| 118 NOTREACHED(); | 119 NOTREACHED(); |
| 119 return NULL; | 120 return NULL; |
| 120 } | 121 } |
| 121 | 122 |
| 122 BrowserMediaPlayerManager::BrowserMediaPlayerManager( | 123 BrowserMediaPlayerManager::BrowserMediaPlayerManager( |
| 123 RenderFrameHost* render_frame_host) | 124 RenderFrameHost* render_frame_host) |
| 124 : render_frame_host_(render_frame_host), | 125 : render_frame_host_(render_frame_host), |
| 125 fullscreen_player_id_(-1), | 126 fullscreen_player_id_(kInvalidMediaPlayerId), |
| 126 fullscreen_player_is_released_(false), | 127 fullscreen_player_is_released_(false), |
| 127 web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), | 128 web_contents_(WebContents::FromRenderFrameHost(render_frame_host)), |
| 128 weak_ptr_factory_(this) { | 129 weak_ptr_factory_(this) { |
| 129 } | 130 } |
| 130 | 131 |
| 131 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { | 132 BrowserMediaPlayerManager::~BrowserMediaPlayerManager() { |
| 132 // During the tear down process, OnDestroyPlayer() may or may not be called | 133 // During the tear down process, OnDestroyPlayer() may or may not be called |
| 133 // (e.g. the WebContents may be destroyed before the render process). So | 134 // (e.g. the WebContents may be destroyed before the render process). So |
| 134 // we cannot DCHECK(players_.empty()) here. Instead, all media players in | 135 // we cannot DCHECK(players_.empty()) here. Instead, all media players in |
| 135 // |players_| will be destroyed here because |player_| is a ScopedVector. | 136 // |players_| will be destroyed here because |player_| is a ScopedVector. |
| 136 } | 137 } |
| 137 | 138 |
| 138 void BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { | 139 void BrowserMediaPlayerManager::ExitFullscreen(bool release_media_player) { |
| 139 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) | 140 if (WebContentsDelegate* delegate = web_contents_->GetDelegate()) |
| 140 delegate->ExitFullscreenModeForTab(web_contents_); | 141 delegate->ExitFullscreenModeForTab(web_contents_); |
| 141 if (RenderWidgetHostViewAndroid* view_android = | 142 if (RenderWidgetHostViewAndroid* view_android = |
| 142 static_cast<RenderWidgetHostViewAndroid*>( | 143 static_cast<RenderWidgetHostViewAndroid*>( |
| 143 web_contents_->GetRenderWidgetHostView())) { | 144 web_contents_->GetRenderWidgetHostView())) { |
| 144 view_android->SetOverlayVideoMode(false); | 145 view_android->SetOverlayVideoMode(false); |
| 145 } | 146 } |
| 146 | 147 |
| 147 Send( | 148 Send( |
| 148 new MediaPlayerMsg_DidExitFullscreen(RoutingID(), fullscreen_player_id_)); | 149 new MediaPlayerMsg_DidExitFullscreen(RoutingID(), fullscreen_player_id_)); |
| 149 video_view_.reset(); | 150 video_view_.reset(); |
| 150 MediaPlayerAndroid* player = GetFullscreenPlayer(); | 151 MediaPlayerAndroid* player = GetFullscreenPlayer(); |
| 151 fullscreen_player_id_ = -1; | 152 fullscreen_player_id_ = kInvalidMediaPlayerId; |
| 152 if (!player) | 153 if (!player) |
| 153 return; | 154 return; |
| 154 if (release_media_player) | 155 if (release_media_player) |
| 155 ReleaseFullscreenPlayer(player); | 156 ReleaseFullscreenPlayer(player); |
| 156 else | 157 else |
| 157 player->SetVideoSurface(gfx::ScopedJavaSurface()); | 158 player->SetVideoSurface(gfx::ScopedJavaSurface()); |
| 158 } | 159 } |
| 159 | 160 |
| 160 void BrowserMediaPlayerManager::OnTimeUpdate( | 161 void BrowserMediaPlayerManager::OnTimeUpdate( |
| 161 int player_id, | 162 int player_id, |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 if ((*it)->player_id() == player_id) | 282 if ((*it)->player_id() == player_id) |
| 282 return *it; | 283 return *it; |
| 283 } | 284 } |
| 284 return NULL; | 285 return NULL; |
| 285 } | 286 } |
| 286 | 287 |
| 287 void BrowserMediaPlayerManager::RequestFullScreen(int player_id) { | 288 void BrowserMediaPlayerManager::RequestFullScreen(int player_id) { |
| 288 if (fullscreen_player_id_ == player_id) | 289 if (fullscreen_player_id_ == player_id) |
| 289 return; | 290 return; |
| 290 | 291 |
| 291 if (fullscreen_player_id_ != -1) { | 292 if (fullscreen_player_id_ != kInvalidMediaPlayerId) { |
| 292 // TODO(qinmin): Determine the correct error code we should report to WMPA. | 293 // TODO(qinmin): Determine the correct error code we should report to WMPA. |
| 293 OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); | 294 OnError(player_id, MediaPlayerAndroid::MEDIA_ERROR_DECODE); |
| 294 return; | 295 return; |
| 295 } | 296 } |
| 296 | 297 |
| 297 Send(new MediaPlayerMsg_RequestFullscreen(RoutingID(), player_id)); | 298 Send(new MediaPlayerMsg_RequestFullscreen(RoutingID(), player_id)); |
| 298 } | 299 } |
| 299 | 300 |
| 300 #if defined(VIDEO_HOLE) | 301 #if defined(VIDEO_HOLE) |
| 301 bool | 302 bool |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 player_id, | 369 player_id, |
| 369 base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, | 370 base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, |
| 370 base::Unretained(this)), | 371 base::Unretained(this)), |
| 371 base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, | 372 base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, |
| 372 base::Unretained(this))); | 373 base::Unretained(this))); |
| 373 } | 374 } |
| 374 } | 375 } |
| 375 #endif // defined(VIDEO_HOLE) | 376 #endif // defined(VIDEO_HOLE) |
| 376 | 377 |
| 377 void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { | 378 void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { |
| 378 DCHECK_EQ(fullscreen_player_id_, -1); | 379 DCHECK_EQ(fullscreen_player_id_, kInvalidMediaPlayerId); |
| 379 #if defined(VIDEO_HOLE) | 380 #if defined(VIDEO_HOLE) |
| 380 // If this fullscreen player is started when another player | 381 // If this fullscreen player is started when another player |
| 381 // uses the external surface, release that other player. | 382 // uses the external surface, release that other player. |
| 382 ReleasePlayerOfExternalVideoSurfaceIfNeeded(player_id); | 383 ReleasePlayerOfExternalVideoSurfaceIfNeeded(player_id); |
| 383 if (external_video_surface_container_) | 384 if (external_video_surface_container_) |
| 384 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); | 385 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
| 385 #endif // defined(VIDEO_HOLE) | 386 #endif // defined(VIDEO_HOLE) |
| 386 if (video_view_.get()) { | 387 if (video_view_.get()) { |
| 387 fullscreen_player_id_ = player_id; | 388 fullscreen_player_id_ = player_id; |
| 388 video_view_->OpenVideo(); | 389 video_view_->OpenVideo(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 478 MediaPlayerAndroid* player = GetPlayer(player_id); | 479 MediaPlayerAndroid* player = GetPlayer(player_id); |
| 479 if (player) | 480 if (player) |
| 480 ReleasePlayer(player); | 481 ReleasePlayer(player); |
| 481 if (player_id == fullscreen_player_id_) | 482 if (player_id == fullscreen_player_id_) |
| 482 fullscreen_player_is_released_ = true; | 483 fullscreen_player_is_released_ = true; |
| 483 } | 484 } |
| 484 | 485 |
| 485 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { | 486 void BrowserMediaPlayerManager::OnDestroyPlayer(int player_id) { |
| 486 RemovePlayer(player_id); | 487 RemovePlayer(player_id); |
| 487 if (fullscreen_player_id_ == player_id) | 488 if (fullscreen_player_id_ == player_id) |
| 488 fullscreen_player_id_ = -1; | 489 fullscreen_player_id_ = kInvalidMediaPlayerId; |
| 489 } | 490 } |
| 490 | 491 |
| 491 void BrowserMediaPlayerManager::OnRequestRemotePlayback(int /* player_id */) { | 492 void BrowserMediaPlayerManager::OnRequestRemotePlayback(int /* player_id */) { |
| 492 // Does nothing if we don't have a remote player | 493 // Does nothing if we don't have a remote player |
| 493 } | 494 } |
| 494 | 495 |
| 495 void BrowserMediaPlayerManager::OnRequestRemotePlaybackControl( | 496 void BrowserMediaPlayerManager::OnRequestRemotePlaybackControl( |
| 496 int /* player_id */) { | 497 int /* player_id */) { |
| 497 // Does nothing if we don't have a remote player | 498 // Does nothing if we don't have a remote player |
| 498 } | 499 } |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); | 577 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
| 577 #endif // defined(VIDEO_HOLE) | 578 #endif // defined(VIDEO_HOLE) |
| 578 } | 579 } |
| 579 | 580 |
| 580 void BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { | 581 void BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { |
| 581 player->Release(); | 582 player->Release(); |
| 582 ReleaseMediaResources(player->player_id()); | 583 ReleaseMediaResources(player->player_id()); |
| 583 } | 584 } |
| 584 | 585 |
| 585 } // namespace content | 586 } // namespace content |
| OLD | NEW |