1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/browser/renderer_host/media/media_stream_track_metrics_host.h" 6 7 #include "base/metrics/histogram.h" 8 #include "content/common/media/media_stream_track_metrics_host_messages.h" 9 10 // We use a histogram with a maximum bucket of 16 hours to infinity 11 // for track durations. 12 #define UMA_HISTOGRAM_TIMES_16H(name, sample) \ 13 UMA_HISTOGRAM_CUSTOM_TIMES(name, sample, \ 14 base::TimeDelta::FromMilliseconds(100), \ 15 base::TimeDelta::FromHours(16), \ 16 50); 17 18 namespace content { 19 20 MediaStreamTrackMetricsHost::MediaStreamTrackMetricsHost() 21 : BrowserMessageFilter(MediaStreamTrackMetricsHostMsgStart) { 22 } 23 24 MediaStreamTrackMetricsHost::~MediaStreamTrackMetricsHost() { 25 // Our render process has exited. We won't receive any more IPC 26 // messages from it. Assume all tracks ended now. 27 for (TrackMap::iterator it = tracks_.begin(); 28 it != tracks_.end(); 29 ++it) { 30 TrackInfo& info = it->second; 31 ReportDuration(info); 32 } 33 tracks_.clear(); 34 } 35 36 bool MediaStreamTrackMetricsHost::OnMessageReceived( 37 const IPC::Message& message) { 38 bool handled = true; 39 40 IPC_BEGIN_MESSAGE_MAP(MediaStreamTrackMetricsHost, message) 41 IPC_MESSAGE_HANDLER(MediaStreamTrackMetricsHost_AddTrack, OnAddTrack) 42 IPC_MESSAGE_HANDLER(MediaStreamTrackMetricsHost_RemoveTrack, OnRemoveTrack) 43 IPC_MESSAGE_UNHANDLED(handled = false) 44 IPC_END_MESSAGE_MAP() 45 46 return handled; 47 } 48 49 void MediaStreamTrackMetricsHost::OnAddTrack(uint64 id, 50 bool is_audio, 51 bool is_remote) { 52 DCHECK(tracks_.find(id) == tracks_.end()); 53 TrackInfo info = {is_audio, is_remote, base::TimeTicks::Now()}; 54 tracks_[id] = info; 55 } 56 57 void MediaStreamTrackMetricsHost::OnRemoveTrack(uint64 id) { 58 DCHECK(tracks_.find(id) != tracks_.end()); 59 60 TrackInfo& info = tracks_[id]; 61 ReportDuration(info); 62 tracks_.erase(id); 63 } 64 65 void MediaStreamTrackMetricsHost::ReportDuration(const TrackInfo& info) { 66 base::TimeDelta duration = base::TimeTicks::Now() - info.timestamp; 67 if (info.is_remote) { 68 if (info.is_audio) { 69 DVLOG(3) << "WebRTC.ReceivedAudioTrackDuration: " << duration.InSeconds(); 70 UMA_HISTOGRAM_TIMES_16H("WebRTC.ReceivedAudioTrackDuration", duration); 71 } else { 72 DVLOG(3) << "WebRTC.ReceivedVideoTrackDuration: " << duration.InSeconds(); 73 UMA_HISTOGRAM_TIMES_16H("WebRTC.ReceivedVideoTrackDuration", duration); 74 } 75 } else { 76 if (info.is_audio) { 77 DVLOG(3) << "WebRTC.SentAudioTrackDuration: " << duration.InSeconds(); 78 UMA_HISTOGRAM_TIMES_16H("WebRTC.SentAudioTrackDuration", duration); 79 } else { 80 DVLOG(3) << "WebRTC.SentVideoTrackDuration: " << duration.InSeconds(); 81 UMA_HISTOGRAM_TIMES_16H("WebRTC.SentVideoTrackDuration", duration); 82 } 83 } 84 } 85 86 } // namespace content 87