Index: media/blink/webmediaplayer_impl.cc |
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc |
index bee9dae7d4bf96ad51364d16362d77d3c4f0dd28..5be9452d38f572d1cd0acb5b9da0f1a7499771ce 100644 |
--- a/media/blink/webmediaplayer_impl.cc |
+++ b/media/blink/webmediaplayer_impl.cc |
@@ -147,6 +147,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
delegate_(delegate), |
defer_load_cb_(params.defer_load_cb()), |
context_3d_cb_(params.context_3d_cb()), |
+ adjust_allocated_memory_cb_(params.adjust_allocated_memory_cb()), |
+ last_reported_memory_usage_(0), |
supports_save_(true), |
chunk_demuxer_(NULL), |
// Threaded compositing isn't enabled universally yet. |
@@ -165,6 +167,8 @@ WebMediaPlayerImpl::WebMediaPlayerImpl( |
AsWeakPtr(), |
base::Bind(&IgnoreCdmAttached))), |
renderer_factory_(renderer_factory.Pass()) { |
+ DCHECK(!adjust_allocated_memory_cb_.is_null()); |
+ |
media_log_->AddEvent( |
media_log_->CreateEvent(MediaLogEvent::WEBMEDIAPLAYER_CREATED)); |
@@ -209,6 +213,9 @@ WebMediaPlayerImpl::~WebMediaPlayerImpl() { |
base::Bind(&base::WaitableEvent::Signal, base::Unretained(&waiter))); |
waiter.Wait(); |
+ if (last_reported_memory_usage_) |
+ adjust_allocated_memory_cb_.Run(-last_reported_memory_usage_); |
+ |
compositor_task_runner_->DeleteSoon(FROM_HERE, compositor_); |
media_log_->AddEvent( |
@@ -244,6 +251,9 @@ void WebMediaPlayerImpl::DoLoad(LoadType load_type, |
SetNetworkState(WebMediaPlayer::NetworkStateLoading); |
SetReadyState(WebMediaPlayer::ReadyStateHaveNothing); |
media_log_->AddEvent(media_log_->CreateLoadEvent(url.spec())); |
+ memory_usage_reporting_timer_.Start( |
+ FROM_HERE, base::TimeDelta::FromMilliseconds(500), this, |
+ &WebMediaPlayerImpl::ReportMemoryUsage); |
// Media source pipelines can start immediately. |
if (load_type == LoadTypeMediaSource) { |
@@ -1083,4 +1093,23 @@ void WebMediaPlayerImpl::UpdatePausedTime() { |
ended_ ? pipeline_.GetMediaDuration() : pipeline_.GetMediaTime(); |
} |
+void WebMediaPlayerImpl::ReportMemoryUsage() { |
+ DCHECK(main_task_runner_->BelongsToCurrentThread()); |
+ |
+ const PipelineStatistics stats = pipeline_.GetStatistics(); |
+ const int64_t current_memory_usage = |
+ stats.audio_memory_usage + stats.video_memory_usage + |
+ (data_source_ ? data_source_->GetMemoryUsage() : 0) + |
+ (demuxer_ ? demuxer_->GetMemoryUsage() : 0); |
+ |
+ DVLOG(2) << "Memory Usage -- Audio: " << stats.audio_memory_usage |
+ << ", Video: " << stats.video_memory_usage << ", DataSource: " |
+ << (data_source_ ? data_source_->GetMemoryUsage() : 0) |
+ << ", Demuxer: " << (demuxer_ ? demuxer_->GetMemoryUsage() : 0); |
+ |
+ const int64_t delta = current_memory_usage - last_reported_memory_usage_; |
+ last_reported_memory_usage_ = current_memory_usage; |
+ adjust_allocated_memory_cb_.Run(delta); |
+} |
+ |
} // namespace media |