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..6407cdc62ea8e2257994ef90291f60c81ec42294 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,8 @@ void SendStatisticsProxy::DataCountersUpdated( |
<< "DataCountersUpdated reported for unknown ssrc: " << ssrc; |
stats->rtp_stats = counters; |
+ if (uma_container_->first_rtp_stats_time_ms_ == -1) |
+ uma_container_->first_rtp_stats_time_ms_ = clock_->TimeInMilliseconds(); |
} |
void SendStatisticsProxy::Notify(const BitrateStatistics& total_stats, |