Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1378)

Unified Diff: content/browser/media/android/browser_media_player_manager.cc

Issue 714643002: Pause EME player whose external surface is stolen by another player (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..1e7164b36c787ed3b2cca85761597ea9ace1fb15 100644
--- a/content/browser/media/android/browser_media_player_manager.cc
+++ b/content/browser/media/android/browser_media_player_manager.cc
@@ -338,6 +338,20 @@ void BrowserMediaPlayerManager::OnNotifyExternalSurface(
}
}
+void BrowserMediaPlayerManager::ReleasePlayerOfExternalVideoSurfaceIfNeeded(
+ int future_player) {
+ int current_player = ExternalVideoSurfaceContainer::kInvalidPlayerId;
+
+ if (external_video_surface_container_)
+ current_player = external_video_surface_container_->GetCurrentPlayerId();
+
+ if (current_player == ExternalVideoSurfaceContainer::kInvalidPlayerId)
+ 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 +362,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,6 +377,9 @@ 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);
#endif // defined(VIDEO_HOLE)

Powered by Google App Engine
This is Rietveld 408576698