diff --git a/webrtc/video/receive_statistics_proxy.cc b/webrtc/video/receive_statistics_proxy.cc index b6063a80af..534428b7ee 100644 --- a/webrtc/video/receive_statistics_proxy.cc +++ b/webrtc/video/receive_statistics_proxy.cc @@ -53,6 +53,10 @@ void ReceiveStatisticsProxy::UpdateHistograms() { int decode_ms = decode_time_counter_.Avg(kMinRequiredDecodeSamples); if (decode_ms != -1) RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.DecodeTimeInMs", decode_ms); + + int delay_ms = delay_counter_.Avg(kMinRequiredDecodeSamples); + if (delay_ms != -1) + RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.OnewayDelayInMs", delay_ms); } VideoReceiveStream::Stats ReceiveStatisticsProxy::GetStats() const { @@ -78,7 +82,8 @@ void ReceiveStatisticsProxy::OnDecoderTiming(int decode_ms, int target_delay_ms, int jitter_buffer_ms, int min_playout_delay_ms, - int render_delay_ms) { + int render_delay_ms, + int64_t rtt_ms) { rtc::CritScope lock(&crit_); stats_.decode_ms = decode_ms; stats_.max_decode_ms = max_decode_ms; @@ -88,6 +93,9 @@ void ReceiveStatisticsProxy::OnDecoderTiming(int decode_ms, stats_.min_playout_delay_ms = min_playout_delay_ms; stats_.render_delay_ms = render_delay_ms; decode_time_counter_.Add(decode_ms); + // Network delay (rtt/2) + target_delay_ms (jitter delay + decode time + + // render delay). + delay_counter_.Add(target_delay_ms + rtt_ms / 2); } void ReceiveStatisticsProxy::RtcpPacketTypesCounterUpdated( diff --git a/webrtc/video/receive_statistics_proxy.h b/webrtc/video/receive_statistics_proxy.h index 4f2550ad7e..7bfa6d61f0 100644 --- a/webrtc/video/receive_statistics_proxy.h +++ b/webrtc/video/receive_statistics_proxy.h @@ -51,7 +51,8 @@ class ReceiveStatisticsProxy : public VCMReceiveStatisticsCallback, int target_delay_ms, int jitter_buffer_ms, int min_playout_delay_ms, - int render_delay_ms); + int render_delay_ms, + int64_t rtt_ms); // Overrides VCMReceiveStatisticsCallback. void OnReceiveRatesUpdated(uint32_t bitRate, uint32_t frameRate) override; @@ -94,6 +95,7 @@ class ReceiveStatisticsProxy : public VCMReceiveStatisticsCallback, SampleCounter render_width_counter_ GUARDED_BY(crit_); SampleCounter render_height_counter_ GUARDED_BY(crit_); SampleCounter decode_time_counter_ GUARDED_BY(crit_); + SampleCounter delay_counter_ GUARDED_BY(crit_); ReportBlockStats report_block_stats_ GUARDED_BY(crit_); }; diff --git a/webrtc/video_engine/vie_channel.cc b/webrtc/video_engine/vie_channel.cc index 7664fb9421..264964dcbe 100644 --- a/webrtc/video_engine/vie_channel.cc +++ b/webrtc/video_engine/vie_channel.cc @@ -115,6 +115,7 @@ ViEChannel::ViEChannel(uint32_t number_of_cores, report_block_stats_sender_(new ReportBlockStats()), time_of_first_rtt_ms_(-1), rtt_sum_ms_(0), + last_rtt_ms_(0), num_rtts_(0), rtp_rtcp_modules_( CreateRtpRtcpModules(!sender, @@ -1068,7 +1069,7 @@ void ViEChannel::OnDecoderTiming(int decode_ms, return; receive_stats_callback_->OnDecoderTiming( decode_ms, max_decode_ms, current_delay_ms, target_delay_ms, - jitter_buffer_ms, min_playout_delay_ms, render_delay_ms); + jitter_buffer_ms, min_playout_delay_ms, render_delay_ms, last_rtt_ms_); } int32_t ViEChannel::RequestKeyFrame() { @@ -1102,6 +1103,7 @@ void ViEChannel::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { if (time_of_first_rtt_ms_ == -1) time_of_first_rtt_ms_ = Clock::GetRealTimeClock()->TimeInMilliseconds(); rtt_sum_ms_ += avg_rtt_ms; + last_rtt_ms_ = avg_rtt_ms; ++num_rtts_; } diff --git a/webrtc/video_engine/vie_channel.h b/webrtc/video_engine/vie_channel.h index 14e227204f..cc61080772 100644 --- a/webrtc/video_engine/vie_channel.h +++ b/webrtc/video_engine/vie_channel.h @@ -443,6 +443,7 @@ class ViEChannel : public VCMFrameTypeCallback, int64_t time_of_first_rtt_ms_ GUARDED_BY(crit_); int64_t rtt_sum_ms_ GUARDED_BY(crit_); + int64_t last_rtt_ms_ GUARDED_BY(crit_); size_t num_rtts_ GUARDED_BY(crit_); // RtpRtcp modules, declared last as they use other members on construction.