Index: content/browser/media/android/browser_media_player_manager.cc |
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc |
index 37bd64cd82b76f6bdee87b2f30860d1d6f55c871..aa85f8998c4b0b8f5716c56b80b4c543efb29444 100644 |
--- a/content/browser/media/android/browser_media_player_manager.cc |
+++ b/content/browser/media/android/browser_media_player_manager.cc |
@@ -338,6 +338,18 @@ void BrowserMediaPlayerManager::OnNotifyExternalSurface( |
} |
} |
+void BrowserMediaPlayerManager::ReleasePlayerOfExternalVideoSurfaceIfNeeded( |
+ int future_player) { |
+ int current_player = -1; |
+ if (external_video_surface_container_) |
+ current_player = external_video_surface_container_->GetCurrentPlayerId(); |
+ if (current_player < 0) |
+ return; |
+ |
+ if (current_player != future_player) |
+ OnMediaInterrupted(current_player); |
+} |
+ |
void BrowserMediaPlayerManager::OnRequestExternalSurface( |
int player_id, const gfx::RectF& rect) { |
if (!external_video_surface_container_) { |
@@ -348,6 +360,8 @@ void BrowserMediaPlayerManager::OnRequestExternalSurface( |
// It's safe to use base::Unretained(this), because the callbacks will not |
// be called after running ReleaseExternalVideoSurface(). |
if (external_video_surface_container_) { |
+ // In case we're stealing the external surface from another player. |
+ ReleasePlayerOfExternalVideoSurfaceIfNeeded(player_id); |
external_video_surface_container_->RequestExternalVideoSurface( |
player_id, |
base::Bind(&BrowserMediaPlayerManager::AttachExternalVideoSurface, |
@@ -361,8 +375,11 @@ void BrowserMediaPlayerManager::OnRequestExternalSurface( |
void BrowserMediaPlayerManager::OnEnterFullscreen(int player_id) { |
DCHECK_EQ(fullscreen_player_id_, -1); |
#if defined(VIDEO_HOLE) |
+ // If this fullscreen player is started when another player |
+ // uses the external surface, release that other player. |
+ ReleasePlayerOfExternalVideoSurfaceIfNeeded(player_id); |
if (external_video_surface_container_) |
- external_video_surface_container_->ReleaseExternalVideoSurface(player_id); |
+ external_video_surface_container_->ReleaseCurrentExternalVideoSurface(); |
#endif // defined(VIDEO_HOLE) |
if (video_view_.get()) { |
fullscreen_player_id_ = player_id; |