Index: webrtc/video/receive_statistics_proxy.cc |
diff --git a/webrtc/video/receive_statistics_proxy.cc b/webrtc/video/receive_statistics_proxy.cc |
index 649ea0cd6e0523ccb7a4ba9df512608a805ff482..d42721ba2aafe29c628563d446e8509e02f2a7c8 100644 |
--- a/webrtc/video/receive_statistics_proxy.cc |
+++ b/webrtc/video/receive_statistics_proxy.cc |
@@ -19,14 +19,19 @@ |
namespace webrtc { |
-ReceiveStatisticsProxy::ReceiveStatisticsProxy(uint32_t ssrc, Clock* clock) |
+ReceiveStatisticsProxy::ReceiveStatisticsProxy( |
+ const VideoReceiveStream::Config& config, |
+ Clock* clock) |
: clock_(clock), |
+ config_(config), |
// 1000ms window, scale 1000 for ms to s. |
decode_fps_estimator_(1000, 1000), |
renders_fps_estimator_(1000, 1000), |
render_fps_tracker_(100u, 10u), |
render_pixel_tracker_(100u, 10u) { |
- stats_.ssrc = ssrc; |
+ stats_.ssrc = config.rtp.remote_ssrc; |
+ for (auto it : config.rtp.rtx) |
+ rtx_stats_[it.second.ssrc] = StreamDataCounters(); |
} |
ReceiveStatisticsProxy::~ReceiveStatisticsProxy() { |
@@ -68,6 +73,42 @@ void ReceiveStatisticsProxy::UpdateHistograms() { |
int delay_ms = delay_counter_.Avg(kMinRequiredDecodeSamples); |
if (delay_ms != -1) |
RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.OnewayDelayInMs", delay_ms); |
+ |
+ StreamDataCounters rtp = stats_.rtp_stats; |
+ StreamDataCounters rtx; |
+ for (auto it : rtx_stats_) |
+ rtx.Add(it.second); |
+ StreamDataCounters rtp_rtx = rtp; |
+ rtp_rtx.Add(rtx); |
+ int64_t elapsed_sec = |
+ rtp_rtx.TimeSinceFirstPacketInMs(clock_->TimeInMilliseconds()) / 1000; |
+ if (elapsed_sec > metrics::kMinRunTimeInSeconds) { |
+ RTC_HISTOGRAM_COUNTS_10000( |
+ "WebRTC.Video.BitrateReceivedInKbps", |
+ static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec / |
+ 1000)); |
+ RTC_HISTOGRAM_COUNTS_10000( |
+ "WebRTC.Video.MediaBitrateReceivedInKbps", |
+ static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000)); |
+ RTC_HISTOGRAM_COUNTS_10000( |
+ "WebRTC.Video.PaddingBitrateReceivedInKbps", |
+ static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec / |
+ 1000)); |
+ RTC_HISTOGRAM_COUNTS_10000( |
+ "WebRTC.Video.RetransmittedBitrateReceivedInKbps", |
+ static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 / elapsed_sec / |
+ 1000)); |
+ if (!rtx_stats_.empty()) { |
+ RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.RtxBitrateReceivedInKbps", |
+ static_cast<int>(rtx.transmitted.TotalBytes() * |
+ 8 / elapsed_sec / 1000)); |
+ } |
+ if (config_.rtp.fec.ulpfec_payload_type != -1) { |
+ RTC_HISTOGRAM_COUNTS_10000( |
+ "WebRTC.Video.FecBitrateReceivedInKbps", |
+ static_cast<int>(rtp_rtx.fec.TotalBytes() * 8 / elapsed_sec / 1000)); |
+ } |
+ } |
} |
VideoReceiveStream::Stats ReceiveStatisticsProxy::GetStats() const { |
@@ -148,9 +189,16 @@ void ReceiveStatisticsProxy::DataCountersUpdated( |
const webrtc::StreamDataCounters& counters, |
uint32_t ssrc) { |
rtc::CritScope lock(&crit_); |
- if (stats_.ssrc != ssrc) |
- return; |
- stats_.rtp_stats = counters; |
+ if (ssrc == stats_.ssrc) { |
+ stats_.rtp_stats = counters; |
+ } else { |
+ auto it = rtx_stats_.find(ssrc); |
+ if (it != rtx_stats_.end()) { |
+ it->second = counters; |
+ } else { |
+ RTC_NOTREACHED() << "Unexpected stream ssrc: " << ssrc; |
+ } |
+ } |
} |
void ReceiveStatisticsProxy::OnDecodedFrame() { |