Home | History | Annotate | Download | only in media
      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