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

Unified Diff: content/renderer/media/renderer_webmediaplayer_delegate.cc

Issue 2333983002: Reduce number of active codecs on low end devices. (Closed)
Patch Set: Fix windows. Created 4 years, 3 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/renderer/media/renderer_webmediaplayer_delegate.cc
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc
index 1eb7c8e7f2dc18ae1d3fcfdd39dff333f85a3593..2ae2b8bd2838c03dae8e2d1218572e4947b200c1 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.cc
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -9,11 +9,16 @@
#include "base/auto_reset.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics_action.h"
+#include "base/sys_info.h"
#include "content/common/media/media_player_delegate_messages.h"
#include "content/public/renderer/render_frame.h"
#include "content/public/renderer/render_thread.h"
#include "third_party/WebKit/public/platform/WebMediaPlayer.h"
+#if defined(OS_ANDROID)
+#include "base/android/build_info.h"
+#endif
+
namespace {
void RecordAction(const base::UserMetricsAction& action) {
@@ -27,10 +32,21 @@ namespace media {
RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate(
content::RenderFrame* render_frame)
: RenderFrameObserver(render_frame),
+ idle_cleanup_timer_(true, true),
default_tick_clock_(new base::DefaultTickClock()),
tick_clock_(default_tick_clock_.get()) {
idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5);
idle_timeout_ = base::TimeDelta::FromSeconds(15);
+
+ // To conserve resources, cleanup idle players more often on low end devices.
+ is_low_end_device_ = base::SysInfo::IsLowEndDevice();
+
+#if defined(OS_ANDROID)
+ // On Android, due to the instability of the OS level media components, we
+ // consider all pre-KitKat devices to be low end.
+ is_low_end_device_ |=
+ base::android::BuildInfo::GetInstance()->sdk_int() <= 18;
+#endif
}
RendererWebMediaPlayerDelegate::~RendererWebMediaPlayerDelegate() {}
@@ -63,6 +79,11 @@ void RendererWebMediaPlayerDelegate::DidPlay(
else
playing_videos_.erase(delegate_id);
RemoveIdleDelegate(delegate_id);
+
+ // Upon receipt of a playback request, suspend everything that's not used.
+ if (is_low_end_device_)
+ CleanupIdleDelegates(base::TimeDelta());
+
Send(new MediaPlayerDelegateHostMsg_OnMediaPlaying(
routing_id(), delegate_id, has_video, has_audio, is_remote,
media_content_type));
@@ -80,7 +101,6 @@ void RendererWebMediaPlayerDelegate::DidPause(int delegate_id,
void RendererWebMediaPlayerDelegate::PlayerGone(int delegate_id) {
DCHECK(id_map_.Lookup(delegate_id));
- RemoveIdleDelegate(delegate_id);
playing_videos_.erase(delegate_id);
Send(new MediaPlayerDelegateHostMsg_OnMediaDestroyed(routing_id(),
delegate_id));
@@ -126,10 +146,12 @@ bool RendererWebMediaPlayerDelegate::OnMessageReceived(
void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting(
base::TimeDelta idle_timeout,
- base::TickClock* tick_clock) {
+ base::TickClock* tick_clock,
+ bool is_low_end_device) {
idle_cleanup_interval_ = base::TimeDelta();
idle_timeout_ = idle_timeout;
tick_clock_ = tick_clock;
+ is_low_end_device_ = is_low_end_device;
}
void RendererWebMediaPlayerDelegate::OnMediaDelegatePause(int delegate_id) {
@@ -171,9 +193,16 @@ void RendererWebMediaPlayerDelegate::AddIdleDelegate(int delegate_id) {
idle_delegate_map_[delegate_id] = tick_clock_->NowTicks();
if (!idle_cleanup_timer_.IsRunning()) {
idle_cleanup_timer_.Start(
- FROM_HERE, idle_cleanup_interval_, this,
- &RendererWebMediaPlayerDelegate::CleanupIdleDelegates);
+ FROM_HERE, idle_cleanup_interval_,
+ base::Bind(&RendererWebMediaPlayerDelegate::CleanupIdleDelegates,
+ base::Unretained(this), idle_timeout_));
}
+
+ // When we reach the maximum number of idle players, aggressively suspend idle
+ // delegates to try and remain under the limit. Values chosen after testing on
+ // a Galaxy Nexus device for http://crbug.com/612909.
+ if (idle_delegate_map_.size() > (is_low_end_device_ ? 2u : 8u))
+ CleanupIdleDelegates(base::TimeDelta());
}
void RendererWebMediaPlayerDelegate::RemoveIdleDelegate(int delegate_id) {
@@ -189,14 +218,15 @@ void RendererWebMediaPlayerDelegate::RemoveIdleDelegate(int delegate_id) {
idle_cleanup_timer_.Stop();
}
-void RendererWebMediaPlayerDelegate::CleanupIdleDelegates() {
+void RendererWebMediaPlayerDelegate::CleanupIdleDelegates(
+ base::TimeDelta timeout) {
// Iterate over the delegates and suspend the idle ones. Note: The call to
// OnHidden() can trigger calls into RemoveIdleDelegate(), so for iterator
// validity we set |idle_cleanup_running_| to true and defer deletions.
base::AutoReset<bool> scoper(&idle_cleanup_running_, true);
const base::TimeTicks now = tick_clock_->NowTicks();
for (auto& idle_delegate_entry : idle_delegate_map_) {
- if (now - idle_delegate_entry.second > idle_timeout_) {
+ if (now - idle_delegate_entry.second > timeout) {
id_map_.Lookup(idle_delegate_entry.first)->OnSuspendRequested(false);
// Whether or not the player accepted the suspension, mark it for removal

Powered by Google App Engine
This is Rietveld 408576698