| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/renderer/media/renderer_webmediaplayer_delegate.h" | 5 #include "content/renderer/media/renderer_webmediaplayer_delegate.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 namespace media { | 31 namespace media { |
| 32 | 32 |
| 33 RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate( | 33 RendererWebMediaPlayerDelegate::RendererWebMediaPlayerDelegate( |
| 34 content::RenderFrame* render_frame) | 34 content::RenderFrame* render_frame) |
| 35 : RenderFrameObserver(render_frame), | 35 : RenderFrameObserver(render_frame), |
| 36 default_tick_clock_(new base::DefaultTickClock()), | 36 default_tick_clock_(new base::DefaultTickClock()), |
| 37 tick_clock_(default_tick_clock_.get()) { | 37 tick_clock_(default_tick_clock_.get()) { |
| 38 idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5); | 38 idle_cleanup_interval_ = base::TimeDelta::FromSeconds(5); |
| 39 idle_timeout_ = base::TimeDelta::FromSeconds(15); | 39 idle_timeout_ = base::TimeDelta::FromSeconds(15); |
| 40 | 40 |
| 41 // Idle players time out more aggressively on low end devices. | 41 is_jelly_bean_ = false; |
| 42 is_low_end_device_ = base::SysInfo::IsLowEndDevice(); | |
| 43 | 42 |
| 44 #if defined(OS_ANDROID) | 43 #if defined(OS_ANDROID) |
| 45 // On Android, due to the instability of the OS level media components, we | 44 // On Android, due to the instability of the OS level media components, we |
| 46 // consider all pre-KitKat devices to be low end. | 45 // consider all pre-KitKat devices to be potentially buggy. |
| 47 is_low_end_device_ |= | 46 is_jelly_bean_ |= base::android::BuildInfo::GetInstance()->sdk_int() <= 18; |
| 48 base::android::BuildInfo::GetInstance()->sdk_int() <= 18; | |
| 49 #endif | 47 #endif |
| 50 } | 48 } |
| 51 | 49 |
| 52 RendererWebMediaPlayerDelegate::~RendererWebMediaPlayerDelegate() {} | 50 RendererWebMediaPlayerDelegate::~RendererWebMediaPlayerDelegate() {} |
| 53 | 51 |
| 54 bool RendererWebMediaPlayerDelegate::IsFrameHidden() { | 52 bool RendererWebMediaPlayerDelegate::IsFrameHidden() { |
| 55 if (is_frame_hidden_for_testing_) | 53 if (is_frame_hidden_for_testing_) |
| 56 return true; | 54 return true; |
| 57 | 55 |
| 58 return (render_frame() && render_frame()->IsHidden()) || is_frame_closed_; | 56 return (render_frame() && render_frame()->IsHidden()) || is_frame_closed_; |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_BecamePersistentVideo, | 200 IPC_MESSAGE_HANDLER(MediaPlayerDelegateMsg_BecamePersistentVideo, |
| 203 OnMediaDelegateBecamePersistentVideo) | 201 OnMediaDelegateBecamePersistentVideo) |
| 204 IPC_MESSAGE_UNHANDLED(return false) | 202 IPC_MESSAGE_UNHANDLED(return false) |
| 205 IPC_END_MESSAGE_MAP() | 203 IPC_END_MESSAGE_MAP() |
| 206 return true; | 204 return true; |
| 207 } | 205 } |
| 208 | 206 |
| 209 void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting( | 207 void RendererWebMediaPlayerDelegate::SetIdleCleanupParamsForTesting( |
| 210 base::TimeDelta idle_timeout, | 208 base::TimeDelta idle_timeout, |
| 211 base::TickClock* tick_clock, | 209 base::TickClock* tick_clock, |
| 212 bool is_low_end_device) { | 210 bool is_jelly_bean) { |
| 213 idle_cleanup_interval_ = base::TimeDelta(); | 211 idle_cleanup_interval_ = base::TimeDelta(); |
| 214 idle_timeout_ = idle_timeout; | 212 idle_timeout_ = idle_timeout; |
| 215 tick_clock_ = tick_clock; | 213 tick_clock_ = tick_clock; |
| 216 is_low_end_device_ = is_low_end_device; | 214 is_jelly_bean_ = is_jelly_bean; |
| 217 } | 215 } |
| 218 | 216 |
| 219 bool RendererWebMediaPlayerDelegate::IsIdleCleanupTimerRunningForTesting() | 217 bool RendererWebMediaPlayerDelegate::IsIdleCleanupTimerRunningForTesting() |
| 220 const { | 218 const { |
| 221 return idle_cleanup_timer_.IsRunning(); | 219 return idle_cleanup_timer_.IsRunning(); |
| 222 } | 220 } |
| 223 | 221 |
| 224 void RendererWebMediaPlayerDelegate::SetFrameHiddenForTesting(bool is_hidden) { | 222 void RendererWebMediaPlayerDelegate::SetFrameHiddenForTesting(bool is_hidden) { |
| 225 if (is_hidden == is_frame_hidden_for_testing_) | 223 if (is_hidden == is_frame_hidden_for_testing_) |
| 226 return; | 224 return; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 | 302 |
| 305 // Record UMAs for background video playback. | 303 // Record UMAs for background video playback. |
| 306 RecordBackgroundVideoPlayback(); | 304 RecordBackgroundVideoPlayback(); |
| 307 | 305 |
| 308 // Clean up idle players. | 306 // Clean up idle players. |
| 309 bool aggressive_cleanup = false; | 307 bool aggressive_cleanup = false; |
| 310 | 308 |
| 311 // When we reach the maximum number of idle players, clean them up | 309 // When we reach the maximum number of idle players, clean them up |
| 312 // aggressively. Values chosen after testing on a Galaxy Nexus device for | 310 // aggressively. Values chosen after testing on a Galaxy Nexus device for |
| 313 // http://crbug.com/612909. | 311 // http://crbug.com/612909. |
| 314 if (idle_player_map_.size() > (is_low_end_device_ ? 2u : 8u)) | 312 if (idle_player_map_.size() > (is_jelly_bean_ ? 2u : 8u)) |
| 315 aggressive_cleanup = true; | 313 aggressive_cleanup = true; |
| 316 | 314 |
| 317 // When a player plays on a low-end device, clean up idle players | 315 // When a player plays on a buggy old device, clean up idle players |
| 318 // aggressively. | 316 // aggressively. |
| 319 if (has_played_video_since_last_update_task && is_low_end_device_) | 317 if (has_played_video_since_last_update_task && is_jelly_bean_) |
| 320 aggressive_cleanup = true; | 318 aggressive_cleanup = true; |
| 321 | 319 |
| 322 CleanUpIdlePlayers(aggressive_cleanup ? base::TimeDelta() : idle_timeout_); | 320 CleanUpIdlePlayers(aggressive_cleanup ? base::TimeDelta() : idle_timeout_); |
| 323 | 321 |
| 324 // If there are still idle players, schedule an attempt to clean them up. | 322 // If there are still idle players, schedule an attempt to clean them up. |
| 325 // This construct ensures that the next callback is always | 323 // This construct ensures that the next callback is always |
| 326 // |idle_cleanup_interval_| from now. | 324 // |idle_cleanup_interval_| from now. |
| 327 idle_cleanup_timer_.Stop(); | 325 idle_cleanup_timer_.Stop(); |
| 328 if (!idle_player_map_.empty()) { | 326 if (!idle_player_map_.empty()) { |
| 329 idle_cleanup_timer_.Start( | 327 idle_cleanup_timer_.Start( |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 378 player->OnIdleTimeout(); | 376 player->OnIdleTimeout(); |
| 379 } | 377 } |
| 380 } | 378 } |
| 381 } | 379 } |
| 382 | 380 |
| 383 void RendererWebMediaPlayerDelegate::OnDestruct() { | 381 void RendererWebMediaPlayerDelegate::OnDestruct() { |
| 384 delete this; | 382 delete this; |
| 385 } | 383 } |
| 386 | 384 |
| 387 } // namespace media | 385 } // namespace media |
| OLD | NEW |