1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
// 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) {
if (tracks_.find(id) != tracks_.end())
return;
TrackInfo info = {is_audio, is_remote, base::TimeTicks::Now()};
tracks_[id] = info;
}
void MediaStreamTrackMetricsHost::OnRemoveTrack(uint64 id) {
if (tracks_.find(id) == tracks_.end())
return;
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
|