summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaybelle@chromium.org <maybelle@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-17 22:10:08 +0000
committermaybelle@chromium.org <maybelle@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-09-17 22:10:08 +0000
commit2f66c2672df12dc9880ff47bc3ee2fb1443129f3 (patch)
treec86ffb301abb921e1df7eaf1e8d9d403f497fa21
parentdfffbcbcc3eb73ba6769f67ff118586a1dd4bfde (diff)
downloadchromium_src-2f66c2672df12dc9880ff47bc3ee2fb1443129f3.zip
chromium_src-2f66c2672df12dc9880ff47bc3ee2fb1443129f3.tar.gz
chromium_src-2f66c2672df12dc9880ff47bc3ee2fb1443129f3.tar.bz2
Remote video pauses when screen is locked or when tab is switched.
The root cause is due to the media resources being released when the screen is locked or the tab is switched, which subsequently calls pause() on all the players. Modified WebMediaPlayerAndroid to indicate if the player is being paused due to a user action. For the downstream change: https://gerrit-int.chromium.org/#/c/44201/ BUG=284472 NOTRY=true Review URL: https://chromiumcodereview.appspot.com/23757047 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@223711 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/media/android/browser_media_player_manager.cc8
-rw-r--r--content/browser/media/android/browser_media_player_manager.h2
-rw-r--r--content/common/media/media_player_messages_android.h4
-rw-r--r--content/renderer/media/android/webmediaplayer_android.cc8
-rw-r--r--content/renderer/media/android/webmediaplayer_android.h1
-rw-r--r--content/renderer/media/android/webmediaplayer_proxy_android.cc7
-rw-r--r--content/renderer/media/android/webmediaplayer_proxy_android.h8
-rw-r--r--media/base/android/media_player_android.h2
-rw-r--r--media/base/android/media_player_bridge.cc2
-rw-r--r--media/base/android/media_player_bridge.h2
-rw-r--r--media/base/android/media_source_player.cc2
-rw-r--r--media/base/android/media_source_player.h2
-rw-r--r--media/base/android/media_source_player_unittest.cc2
13 files changed, 33 insertions, 17 deletions
diff --git a/content/browser/media/android/browser_media_player_manager.cc b/content/browser/media/android/browser_media_player_manager.cc
index 01031c5..76f7634 100644
--- a/content/browser/media/android/browser_media_player_manager.cc
+++ b/content/browser/media/android/browser_media_player_manager.cc
@@ -129,7 +129,7 @@ void BrowserMediaPlayerManager::FullscreenPlayerPlay() {
void BrowserMediaPlayerManager::FullscreenPlayerPause() {
MediaPlayerAndroid* player = GetFullscreenPlayer();
if (player) {
- player->Pause();
+ player->Pause(true);
Send(new MediaPlayerMsg_DidMediaPlayerPause(
routing_id(), fullscreen_player_id_));
}
@@ -411,10 +411,12 @@ void BrowserMediaPlayerManager::OnSeek(int player_id, base::TimeDelta time) {
player->SeekTo(time);
}
-void BrowserMediaPlayerManager::OnPause(int player_id) {
+void BrowserMediaPlayerManager::OnPause(
+ int player_id,
+ bool is_media_related_action) {
MediaPlayerAndroid* player = GetPlayer(player_id);
if (player)
- player->Pause();
+ player->Pause(is_media_related_action);
}
void BrowserMediaPlayerManager::OnSetVolume(int player_id, double volume) {
diff --git a/content/browser/media/android/browser_media_player_manager.h b/content/browser/media/android/browser_media_player_manager.h
index 81eb4ca..29440b9 100644
--- a/content/browser/media/android/browser_media_player_manager.h
+++ b/content/browser/media/android/browser_media_player_manager.h
@@ -115,7 +115,7 @@ class CONTENT_EXPORT BrowserMediaPlayerManager
const GURL& first_party_for_cookies);
virtual void OnStart(int player_id);
virtual void OnSeek(int player_id, base::TimeDelta time);
- virtual void OnPause(int player_id);
+ virtual void OnPause(int player_id, bool is_media_related_action);
virtual void OnSetVolume(int player_id, double volume);
virtual void OnReleaseResources(int player_id);
virtual void OnDestroyPlayer(int player_id);
diff --git a/content/common/media/media_player_messages_android.h b/content/common/media/media_player_messages_android.h
index b318cc2..cd897ad 100644
--- a/content/common/media/media_player_messages_android.h
+++ b/content/common/media/media_player_messages_android.h
@@ -162,7 +162,9 @@ IPC_MESSAGE_ROUTED4(
GURL /* first_party_for_cookies */)
// Pause the player.
-IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Pause, int /* player_id */)
+IPC_MESSAGE_ROUTED2(MediaPlayerHostMsg_Pause,
+ int /* player_id */,
+ bool /* is_media_related_action */)
// Release player resources, but keep the object for future usage.
IPC_MESSAGE_ROUTED1(MediaPlayerHostMsg_Release, int /* player_id */)
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc
index f8b6132..3a87268 100644
--- a/content/renderer/media/android/webmediaplayer_android.cc
+++ b/content/renderer/media/android/webmediaplayer_android.cc
@@ -321,11 +321,15 @@ void WebMediaPlayerAndroid::play() {
}
void WebMediaPlayerAndroid::pause() {
+ pause(true);
+}
+
+void WebMediaPlayerAndroid::pause(bool is_media_related_action) {
#if defined(GOOGLE_TV)
if (audio_renderer_ && !paused())
audio_renderer_->Pause();
#endif
- proxy_->Pause(player_id_);
+ proxy_->Pause(player_id_, is_media_related_action);
UpdatePlayingState(false);
}
@@ -773,7 +777,7 @@ void WebMediaPlayerAndroid::ReleaseMediaResources() {
case WebMediaPlayer::NetworkStateIdle:
case WebMediaPlayer::NetworkStateLoading:
case WebMediaPlayer::NetworkStateLoaded:
- pause();
+ pause(false);
client_->playbackStateChanged();
break;
// If a WebMediaPlayer instance has entered into one of these states,
diff --git a/content/renderer/media/android/webmediaplayer_android.h b/content/renderer/media/android/webmediaplayer_android.h
index 475e2ca..75456c4 100644
--- a/content/renderer/media/android/webmediaplayer_android.h
+++ b/content/renderer/media/android/webmediaplayer_android.h
@@ -95,6 +95,7 @@ class WebMediaPlayerAndroid
// Playback controls.
virtual void play();
virtual void pause();
+ virtual void pause(bool is_media_related_action);
virtual void seek(double seconds);
virtual bool supportsFullscreen() const;
virtual bool supportsSave() const;
diff --git a/content/renderer/media/android/webmediaplayer_proxy_android.cc b/content/renderer/media/android/webmediaplayer_proxy_android.cc
index d371c99..e2f399d 100644
--- a/content/renderer/media/android/webmediaplayer_proxy_android.cc
+++ b/content/renderer/media/android/webmediaplayer_proxy_android.cc
@@ -65,8 +65,11 @@ void WebMediaPlayerProxyAndroid::Start(int player_id) {
Send(new MediaPlayerHostMsg_Start(routing_id(), player_id));
}
-void WebMediaPlayerProxyAndroid::Pause(int player_id) {
- Send(new MediaPlayerHostMsg_Pause(routing_id(), player_id));
+void WebMediaPlayerProxyAndroid::Pause(
+ int player_id,
+ bool is_media_related_action) {
+ Send(new MediaPlayerHostMsg_Pause(
+ routing_id(), player_id, is_media_related_action));
}
void WebMediaPlayerProxyAndroid::Seek(int player_id, base::TimeDelta time) {
diff --git a/content/renderer/media/android/webmediaplayer_proxy_android.h b/content/renderer/media/android/webmediaplayer_proxy_android.h
index 2cd4bb8..ce89435 100644
--- a/content/renderer/media/android/webmediaplayer_proxy_android.h
+++ b/content/renderer/media/android/webmediaplayer_proxy_android.h
@@ -50,8 +50,12 @@ class WebMediaPlayerProxyAndroid : public RenderViewObserver {
// Starts the player.
void Start(int player_id);
- // Pausees the player.
- void Pause(int player_id);
+ // Pauses the player.
+ // is_media_related_action should be true if this pause is coming from an
+ // an action that explicitly pauses the video (user pressing pause, JS, etc.)
+ // Otherwise it should be false if Pause is being called due to other reasons
+ // (cleanup, freeing resources, etc.)
+ void Pause(int player_id, bool is_media_related_action);
// Performs seek on the player.
void Seek(int player_id, base::TimeDelta time);
diff --git a/media/base/android/media_player_android.h b/media/base/android/media_player_android.h
index 464ad89..0968d35 100644
--- a/media/base/android/media_player_android.h
+++ b/media/base/android/media_player_android.h
@@ -41,7 +41,7 @@ class MEDIA_EXPORT MediaPlayerAndroid {
virtual void Start() = 0;
// Pause the media.
- virtual void Pause() = 0;
+ virtual void Pause(bool is_media_related_action) = 0;
// Seek to a particular position. When succeeds, OnSeekComplete() will be
// called. Otherwise, nothing will happen.
diff --git a/media/base/android/media_player_bridge.cc b/media/base/android/media_player_bridge.cc
index 750dd4b..f570bdc 100644
--- a/media/base/android/media_player_bridge.cc
+++ b/media/base/android/media_player_bridge.cc
@@ -181,7 +181,7 @@ void MediaPlayerBridge::Start() {
}
}
-void MediaPlayerBridge::Pause() {
+void MediaPlayerBridge::Pause(bool is_media_related_action) {
if (j_media_player_bridge_.is_null()) {
pending_play_ = false;
} else {
diff --git a/media/base/android/media_player_bridge.h b/media/base/android/media_player_bridge.h
index 85a2960..7bd4beb 100644
--- a/media/base/android/media_player_bridge.h
+++ b/media/base/android/media_player_bridge.h
@@ -55,7 +55,7 @@ class MEDIA_EXPORT MediaPlayerBridge : public MediaPlayerAndroid {
// MediaPlayerAndroid implementation.
virtual void SetVideoSurface(gfx::ScopedJavaSurface surface) OVERRIDE;
virtual void Start() OVERRIDE;
- virtual void Pause() OVERRIDE;
+ virtual void Pause(bool is_media_related_action ALLOW_UNUSED) OVERRIDE;
virtual void SeekTo(base::TimeDelta time) OVERRIDE;
virtual void Release() OVERRIDE;
virtual void SetVolume(double volume) OVERRIDE;
diff --git a/media/base/android/media_source_player.cc b/media/base/android/media_source_player.cc
index 5abf157..fe79d75 100644
--- a/media/base/android/media_source_player.cc
+++ b/media/base/android/media_source_player.cc
@@ -146,7 +146,7 @@ void MediaSourcePlayer::Start() {
StartInternal();
}
-void MediaSourcePlayer::Pause() {
+void MediaSourcePlayer::Pause(bool is_media_related_action) {
DVLOG(1) << __FUNCTION__;
// Since decoder jobs have their own thread, decoding is not fully paused
diff --git a/media/base/android/media_source_player.h b/media/base/android/media_source_player.h
index cb6b2cd..7cfbb94 100644
--- a/media/base/android/media_source_player.h
+++ b/media/base/android/media_source_player.h
@@ -54,7 +54,7 @@ class MEDIA_EXPORT MediaSourcePlayer : public MediaPlayerAndroid,
// MediaPlayerAndroid implementation.
virtual void SetVideoSurface(gfx::ScopedJavaSurface surface) OVERRIDE;
virtual void Start() OVERRIDE;
- virtual void Pause() OVERRIDE;
+ virtual void Pause(bool is_media_related_action ALLOW_UNUSED) OVERRIDE;
virtual void SeekTo(base::TimeDelta timestamp) OVERRIDE;
virtual void Release() OVERRIDE;
virtual void SetVolume(double volume) OVERRIDE;
diff --git a/media/base/android/media_source_player_unittest.cc b/media/base/android/media_source_player_unittest.cc
index ce35807..ccce9ae 100644
--- a/media/base/android/media_source_player_unittest.cc
+++ b/media/base/android/media_source_player_unittest.cc
@@ -402,7 +402,7 @@ TEST_F(MediaSourcePlayerTest, StartImmediatelyAfterPause) {
// Decoder job will not immediately stop after Pause() since it is
// running on another thread.
- player_.Pause();
+ player_.Pause(true);
EXPECT_TRUE(GetMediaDecoderJob(true)->is_decoding());
// Nothing happens when calling Start() again.