diff options
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.cc | 86 |
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 |