Chromium Code Reviews| Index: webrtc/video/send_statistics_proxy.cc |
| diff --git a/webrtc/video/send_statistics_proxy.cc b/webrtc/video/send_statistics_proxy.cc |
| index 729c77535d27c3cbd492aa946f63d71687f314e6..9a781819edfec8a76a89c6101fd78abdaee7bb04 100644 |
| --- a/webrtc/video/send_statistics_proxy.cc |
| +++ b/webrtc/video/send_statistics_proxy.cc |
| @@ -98,10 +98,26 @@ SendStatisticsProxy::UmaSamplesContainer::UmaSamplesContainer( |
| input_frame_rate_tracker_(100u, 10u), |
| sent_frame_rate_tracker_(100u, 10u), |
| first_rtcp_stats_time_ms_(-1), |
| + first_rtp_stats_time_ms_(-1), |
| start_stats_(stats) {} |
| SendStatisticsProxy::UmaSamplesContainer::~UmaSamplesContainer() {} |
| +void AccumulateRtpStats(const VideoSendStream::Stats& stats, |
| + const VideoSendStream::Config& config, |
| + StreamDataCounters* total_rtp_stats, |
| + StreamDataCounters* rtx_stats) { |
| + for (auto it : stats.substreams) { |
| + const std::vector<uint32_t> rtx_ssrcs = config.rtp.rtx.ssrcs; |
| + if (std::find(rtx_ssrcs.begin(), rtx_ssrcs.end(), it.first) != |
| + rtx_ssrcs.end()) { |
| + rtx_stats->Add(it.second.rtp_stats); |
| + } else { |
| + total_rtp_stats->Add(it.second.rtp_stats); |
| + } |
| + } |
| +} |
| + |
| void SendStatisticsProxy::UmaSamplesContainer::UpdateHistograms( |
| const VideoSendStream::Config& config, |
| const VideoSendStream::Stats& current_stats) { |
| @@ -223,6 +239,51 @@ void SendStatisticsProxy::UmaSamplesContainer::UpdateHistograms( |
| } |
| } |
| } |
| + |
| + if (first_rtp_stats_time_ms_ != -1) { |
| + int64_t elapsed_sec = |
| + (clock_->TimeInMilliseconds() - first_rtp_stats_time_ms_) / 1000; |
| + if (elapsed_sec >= metrics::kMinRunTimeInSeconds) { |
| + StreamDataCounters rtp; |
| + StreamDataCounters rtx; |
| + AccumulateRtpStats(current_stats, config, &rtp, &rtx); |
| + StreamDataCounters start_rtp; |
| + StreamDataCounters start_rtx; |
| + AccumulateRtpStats(start_stats_, config, &start_rtp, &start_rtx); |
| + rtp.Subtract(start_rtp); |
| + rtx.Subtract(start_rtx); |
| + StreamDataCounters rtp_rtx = rtp; |
| + rtp_rtx.Add(rtx); |
| + |
| + RTC_HISTOGRAMS_COUNTS_10000( |
| + kIndex, uma_prefix_ + "BitrateSentInKbps", |
| + static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec / |
| + 1000)); |
| + RTC_HISTOGRAMS_COUNTS_10000( |
| + kIndex, uma_prefix_ + "MediaBitrateSentInKbps", |
| + static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000)); |
| + RTC_HISTOGRAMS_COUNTS_10000( |
| + kIndex, uma_prefix_ + "PaddingBitrateSentInKbps", |
| + static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec / |
| + 1000)); |
| + RTC_HISTOGRAMS_COUNTS_10000( |
| + kIndex, uma_prefix_ + "RetransmittedBitrateSentInKbps", |
| + static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 / |
| + elapsed_sec / 1000)); |
| + if (!config.rtp.rtx.ssrcs.empty()) { |
| + RTC_HISTOGRAMS_COUNTS_10000( |
| + kIndex, uma_prefix_ + "RtxBitrateSentInKbps", |
| + static_cast<int>(rtx.transmitted.TotalBytes() * 8 / elapsed_sec / |
| + 1000)); |
| + } |
| + if (config.rtp.fec.red_payload_type != -1) { |
| + RTC_HISTOGRAMS_COUNTS_10000(kIndex, |
| + uma_prefix_ + "FecBitrateSentInKbps", |
| + static_cast<int>(rtp_rtx.fec.TotalBytes() * |
| + 8 / elapsed_sec / 1000)); |
| + } |
| + } |
| + } |
| } |
| void SendStatisticsProxy::SetContentType( |
| @@ -429,6 +490,9 @@ void SendStatisticsProxy::DataCountersUpdated( |
| << "DataCountersUpdated reported for unknown ssrc: " << ssrc; |
| stats->rtp_stats = counters; |
| + if (uma_container_->first_rtp_stats_time_ms_ == -1) { |
|
pbos-webrtc
2016/02/25 14:28:29
pref no {}s
|
| + uma_container_->first_rtp_stats_time_ms_ = clock_->TimeInMilliseconds(); |
| + } |
| } |
| void SendStatisticsProxy::Notify(const BitrateStatistics& total_stats, |