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 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 | 331 |
332 if (is_request) { | 332 if (is_request) { |
333 OnRequestExternalSurface(player_id, rect); | 333 OnRequestExternalSurface(player_id, rect); |
334 } | 334 } |
335 if (external_video_surface_container_) { | 335 if (external_video_surface_container_) { |
336 external_video_surface_container_->OnExternalVideoSurfacePositionChanged( | 336 external_video_surface_container_->OnExternalVideoSurfacePositionChanged( |
337 player_id, rect); | 337 player_id, rect); |
338 } | 338 } |
339 } | 339 } |
340 | 340 |
| 341 void BrowserMediaPlayerManager::ReleasePlayerOfExternalVideoSurfaceIfNeeded( |
| 342 int future_player) { |
| 343 int current_player = ExternalVideoSurfaceContainer::kInvalidPlayerId; |
| 344 |
| 345 if (external_video_surface_container_) |
| 346 current_player = external_video_surface_container_->GetCurrentPlayerId(); |
| 347 |
| 348 if (current_player == ExternalVideoSurfaceContainer::kInvalidPlayerId) |
| 349 return; |
| 350 |
| 351 if (current_player != future_player) |
| 352 OnMediaInterrupted(current_player); |
| 353 } |
| 354 |
341 void BrowserMediaPlayerManager::OnRequestExternalSurface( | 355 void BrowserMediaPlayerManager::OnRequestExternalSurface( |
342 int player_id, const gfx::RectF& rect) { | 356 int player_id, const gfx::RectF& rect) { |
343 if (!external_video_surface_container_) { | 357 if (!external_video_surface_container_) { |
344 ContentBrowserClient* client = GetContentClient()->browser(); | 358 ContentBrowserClient* client = GetContentClient()->browser(); |
345 external_video_surface_container_.reset( | 359 external_video_surface_container_.reset( |
346 client->OverrideCreateExternalVideoSurfaceContainer(web_contents_)); | 360 client->OverrideCreateExternalVideoSurfaceContainer(web_contents_)); |
347 } | 361 } |
348 // It's safe to use base::Unretained(this), because the callbacks will not | 362 // It's safe to use base::Unretained(this), because the callbacks will not |
349 // be called after running ReleaseExternalVideoSurface(). | 363 // be called after running ReleaseExternalVideoSurface(). |
350 if (external_video_surface_container_) { | 364 if (external_video_surface_container_) { |
| 365 // In case we're stealing the external surface from another player. |
| 366 ReleasePlayerOfExternalVideoSurfaceIfNeeded(player_id); |
351 external_video_surface_container_->RequestExternalVideoSurface( | 367 external_video_surface_container_->RequestExternalVideoSurface( |
352 player_id, | 368 player_id, |
353 base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, | 369 base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, |
354 base::Unretained(this)), | 370 base::Unretained(this)), |
355 base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, | 371 base::Bind(&BrowserMediaPlayerManager::DetachExternalVideoSurface, |
356 base::Unretained(this))); | 372 base::Unretained(this))); |
357 } | 373 } |
358 } | 374 } |
359 #endif // defined(VIDEO_HOLE) | 375 #endif // defined(VIDEO_HOLE) |
360 | 376 |
361 void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { | 377 void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { |
362 DCHECK_EQ(fullscreen_player_id_, -1); | 378 DCHECK_EQ(fullscreen_player_id_, -1); |
363 #if defined(VIDEO_HOLE) | 379 #if defined(VIDEO_HOLE) |
| 380 // If this fullscreen player is started when another player |
| 381 // uses the external surface, release that other player. |
| 382 ReleasePlayerOfExternalVideoSurfaceIfNeeded(player_id); |
364 if (external_video_surface_container_) | 383 if (external_video_surface_container_) |
365 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); | 384 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
366 #endif // defined(VIDEO_HOLE) | 385 #endif // defined(VIDEO_HOLE) |
367 if (video_view_.get()) { | 386 if (video_view_.get()) { |
368 fullscreen_player_id_ = player_id; | 387 fullscreen_player_id_ = player_id; |
369 video_view_->OpenVideo(); | 388 video_view_->OpenVideo(); |
370 return; | 389 return; |
371 } else if (!ContentVideoView::GetInstance()) { | 390 } else if (!ContentVideoView::GetInstance()) { |
372 // In Android WebView, two ContentViewCores could both try to enter | 391 // In Android WebView, two ContentViewCores could both try to enter |
373 // fullscreen video, we just ignore the second one. | 392 // fullscreen video, we just ignore the second one. |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); | 576 external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
558 #endif // defined(VIDEO_HOLE) | 577 #endif // defined(VIDEO_HOLE) |
559 } | 578 } |
560 | 579 |
561 void BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { | 580 void BrowserMediaPlayerManager::ReleasePlayer(MediaPlayerAndroid* player) { |
562 player->Release(); | 581 player->Release(); |
563 ReleaseMediaResources(player->player_id()); | 582 ReleaseMediaResources(player->player_id()); |
564 } | 583 } |
565 | 584 |
566 } // namespace content | 585 } // namespace content |
OLD | NEW |