summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/renderer_host/media/media_stream_track_metrics_host.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/renderer_host/media/media_stream_track_metrics_host.cc')
-rw-r--r--chromium/content/browser/renderer_host/media/media_stream_track_metrics_host.cc86
1 files changed, 86 insertions, 0 deletions
diff --git a/chromium/content/browser/renderer_host/media/media_stream_track_metrics_host.cc b/chromium/content/browser/renderer_host/media/media_stream_track_metrics_host.cc
new file mode 100644
index 00000000000..9bae1f72839
--- /dev/null
+++ b/chromium/content/browser/renderer_host/media/media_stream_track_metrics_host.cc
@@ -0,0 +1,86 @@
+// 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_stream_track_metrics_host.h"
+
+#include "base/metrics/histogram.h"
+#include "content/common/media/media_stream_track_metrics_host_messages.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 {
+
+MediaStreamTrackMetricsHost::MediaStreamTrackMetricsHost()
+ : BrowserMessageFilter(MediaStreamTrackMetricsHostMsgStart) {
+}
+
+MediaStreamTrackMetricsHost::~MediaStreamTrackMetricsHost() {
+ // 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) {
+ TrackInfo& info = it->second;
+ ReportDuration(info);
+ }
+ tracks_.clear();
+}
+
+bool MediaStreamTrackMetricsHost::OnMessageReceived(
+ const IPC::Message& message) {
+ bool handled = true;
+
+ IPC_BEGIN_MESSAGE_MAP(MediaStreamTrackMetricsHost, message)
+ IPC_MESSAGE_HANDLER(MediaStreamTrackMetricsHost_AddTrack, OnAddTrack)
+ IPC_MESSAGE_HANDLER(MediaStreamTrackMetricsHost_RemoveTrack, OnRemoveTrack)
+ IPC_MESSAGE_UNHANDLED(handled = false)
+ IPC_END_MESSAGE_MAP()
+
+ return handled;
+}
+
+void MediaStreamTrackMetricsHost::OnAddTrack(uint64 id,
+ bool is_audio,
+ bool is_remote) {
+ DCHECK(tracks_.find(id) == tracks_.end());
+ TrackInfo info = {is_audio, is_remote, base::TimeTicks::Now()};
+ tracks_[id] = info;
+}
+
+void MediaStreamTrackMetricsHost::OnRemoveTrack(uint64 id) {
+ DCHECK(tracks_.find(id) != tracks_.end());
+
+ TrackInfo& info = tracks_[id];
+ ReportDuration(info);
+ tracks_.erase(id);
+}
+
+void MediaStreamTrackMetricsHost::ReportDuration(const TrackInfo& info) {
+ base::TimeDelta duration = base::TimeTicks::Now() - info.timestamp;
+ if (info.is_remote) {
+ if (info.is_audio) {
+ DVLOG(3) << "WebRTC.ReceivedAudioTrackDuration: " << duration.InSeconds();
+ UMA_HISTOGRAM_TIMES_16H("WebRTC.ReceivedAudioTrackDuration", duration);
+ } else {
+ DVLOG(3) << "WebRTC.ReceivedVideoTrackDuration: " << duration.InSeconds();
+ UMA_HISTOGRAM_TIMES_16H("WebRTC.ReceivedVideoTrackDuration", duration);
+ }
+ } else {
+ if (info.is_audio) {
+ DVLOG(3) << "WebRTC.SentAudioTrackDuration: " << duration.InSeconds();
+ UMA_HISTOGRAM_TIMES_16H("WebRTC.SentAudioTrackDuration", duration);
+ } else {
+ DVLOG(3) << "WebRTC.SentVideoTrackDuration: " << duration.InSeconds();
+ UMA_HISTOGRAM_TIMES_16H("WebRTC.SentVideoTrackDuration", duration);
+ }
+ }
+}
+
+} // namespace content