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 |