Chromium Code Reviews| Index: content/browser/renderer_host/media/media_track_lifetime_metrics_host.cc |
| diff --git a/content/browser/renderer_host/media/media_track_lifetime_metrics_host.cc b/content/browser/renderer_host/media/media_track_lifetime_metrics_host.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..651d317994aaf8e9961ad0c3f57598e73c15a1f3 |
| --- /dev/null |
| +++ b/content/browser/renderer_host/media/media_track_lifetime_metrics_host.cc |
| @@ -0,0 +1,92 @@ |
| +// Copyright 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/renderer_host/media/media_track_lifetime_metrics_host.h" |
| + |
| +#include "base/metrics/histogram.h" |
| +#include "content/common/media/media_track_lifetime_metrics_messages.h" |
| +#include "content/public/browser/render_process_host.h" |
| + |
| +// We use a histogram with a maximum bucket of 16 hours to infinity |
| +// for track durations. |
| +#define UMA_HISTOGRAM_TIMES_16H(name, sample) \ |
| + UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, \ |
| + base::TimeDelta::FromMilliseconds(100), \ |
| + base::TimeDelta::FromHours(16), \ |
| + 50); |
| + |
| +namespace content { |
| + |
| +MediaTrackLifetimeMetricsHost::MediaTrackLifetimeMetricsHost( |
| + RenderProcessHost* owner) |
| + : BrowserMessageFilter(MediaTrackLifetimeMetricsHostMsgStart), |
| + owner_(owner) { |
| + owner_->AddObserver(this); |
| +} |
| + |
| +MediaTrackLifetimeMetricsHost::~MediaTrackLifetimeMetricsHost() { |
| + owner_->RemoveObserver(this); |
| + |
| + DCHECK(tracks_.empty()); |
| +} |
| + |
| +bool MediaTrackLifetimeMetricsHost::OnMessageReceived( |
| + const IPC::Message& message, |
| + bool* message_was_ok) { |
| + bool handled = true; |
| + |
| + IPC_BEGIN_MESSAGE_MAP_EX(MediaTrackLifetimeMetricsHost, |
| + message, |
| + *message_was_ok) |
| + IPC_MESSAGE_HANDLER(MediaTrackLifetimeMetrics_AddTrack, OnAddTrack) |
| + IPC_MESSAGE_HANDLER(MediaTrackLifetimeMetrics_RemoveTrack, OnRemoveTrack) |
| + IPC_MESSAGE_UNHANDLED(handled = false) |
| + IPC_END_MESSAGE_MAP_EX() |
| + |
| + return handled; |
| +} |
| + |
| +void MediaTrackLifetimeMetricsHost::RenderProcessExited( |
| + RenderProcessHost* host, |
| + base::ProcessHandle handle, |
| + base::TerminationStatus status, |
| + int exit_code) { |
| + DCHECK_EQ(owner_, host); |
| + |
| + // Our render process has exited. We won't receive any more IPC |
| + // messages from it. Assume all tracks ended now. |
| + for (TrackMap::iterator it = tracks_.begin(); |
| + it != tracks_.end(); |
| + ++it) { |
| + ReportDuration(it->second.first, it->second.second); |
|
perkj_chrome
2014/03/11 08:05:21
nit: can you use temp variables instead of second.
Jói
2014/03/11 17:36:33
I added a temp IsAudioPlusTimestamp variable then
|
| + } |
| + tracks_.clear(); |
| +} |
| + |
| +void MediaTrackLifetimeMetricsHost::OnAddTrack(const std::string& id, |
| + bool is_audio) { |
| + DCHECK(tracks_.find(id) == tracks_.end()); |
|
perkj_chrome
2014/03/11 08:05:21
To make this a bit harder - the same track can the
|
| + |
| + tracks_[id] = IsAudioPlusTimestamp(is_audio, base::TimeTicks::Now()); |
| +} |
| + |
| +void MediaTrackLifetimeMetricsHost::OnRemoveTrack(const std::string& id) { |
| + DCHECK(tracks_.find(id) != tracks_.end()); |
| + |
| + IsAudioPlusTimestamp& info = tracks_[id]; |
| + ReportDuration(info.first, info.second); |
| + tracks_.erase(id); |
| +} |
| + |
| +void MediaTrackLifetimeMetricsHost::ReportDuration(bool is_audio, |
| + base::TimeTicks start_time) { |
| + base::TimeDelta duration = start_time - base::TimeTicks::Now(); |
| + if (is_audio) { |
| + UMA_HISTOGRAM_TIMES_16H("WebRTC.ReceivedAudioTrackDuration", duration); |
|
perkj_chrome
2014/03/11 08:05:21
Will we not have the same problem for local tracks
Jói
2014/03/11 17:36:33
I think we had settled on track duration in the de
|
| + } else { |
| + UMA_HISTOGRAM_TIMES_16H("WebRTC.ReceivedVideoTrackDuration", duration); |
| + } |
| +} |
| + |
| +} // namespace content |