From 4257ab2e0281f248d25726b4917f8aa47b01547c Mon Sep 17 00:00:00 2001 From: ilnik Date: Mon, 3 Jul 2017 01:15:58 -0700 Subject: [PATCH] Add received interframe delay UMA metrics BUG=webrtc:7420 Review-Url: https://codereview.webrtc.org/2966733002 Cr-Commit-Position: refs/heads/master@{#18875} --- webrtc/video/end_to_end_tests.cc | 11 ++++++ webrtc/video/receive_statistics_proxy.cc | 48 ++++++++++++++++++++++++ webrtc/video/receive_statistics_proxy.h | 5 +++ 3 files changed, 64 insertions(+) diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc index 0d7662d50a..f51f483f05 100644 --- a/webrtc/video/end_to_end_tests.cc +++ b/webrtc/video/end_to_end_tests.cc @@ -2703,6 +2703,9 @@ void EndToEndTest::VerifyHistogramStats(bool use_rtx, EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EndToEndDelayInMs")); EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EndToEndDelayMaxInMs")); + EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InterframeDelayInMs")); + EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InterframeDelayMaxInMs")); + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RenderSqrtPixelsPerSecond")); EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EncodeTimeInMs")); @@ -2861,6 +2864,14 @@ TEST_F(EndToEndTest, MAYBE_ContentTypeSwitches) { EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs")); EXPECT_EQ( 1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs")); + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs")); + EXPECT_EQ(1, + metrics::NumSamples( + "WebRTC.Video.Screenshare.InterframeDelayInMs")); + EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs")); + EXPECT_EQ(1, + metrics::NumSamples( + "WebRTC.Video.Screenshare.InterframeDelayMaxInMs")); } TEST_F(EndToEndTest, VerifyHistogramStatsWithRtx) { diff --git a/webrtc/video/receive_statistics_proxy.cc b/webrtc/video/receive_statistics_proxy.cc index 61b2ad1398..2af19125c2 100644 --- a/webrtc/video/receive_statistics_proxy.cc +++ b/webrtc/video/receive_statistics_proxy.cc @@ -77,6 +77,8 @@ ReceiveStatisticsProxy::ReceiveStatisticsProxy( total_byte_tracker_(100, 10u), // bucket_interval_ms, bucket_count e2e_delay_max_ms_video_(-1), e2e_delay_max_ms_screenshare_(-1), + interframe_delay_max_ms_video_(-1), + interframe_delay_max_ms_screenshare_(-1), freq_offset_counter_(clock, nullptr, kFreqOffsetProcessIntervalMs), first_report_block_time_ms_(-1), avg_rtt_ms_(0), @@ -210,6 +212,36 @@ void ReceiveStatisticsProxy::UpdateHistograms() { e2e_delay_max_ms_screenshare); } + int interframe_delay_ms_screenshare = + interframe_delay_counter_screenshare_.Avg(kMinRequiredSamples); + if (interframe_delay_ms_screenshare != -1) { + RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.Screenshare.InterframeDelayInMs", + interframe_delay_ms_screenshare); + } + + int interframe_delay_ms_video = + interframe_delay_counter_video_.Avg(kMinRequiredSamples); + if (interframe_delay_ms_video != -1) { + RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.InterframeDelayInMs", + interframe_delay_ms_video); + } + + int interframe_delay_max_ms_screenshare = + interframe_delay_max_ms_screenshare_; + if (interframe_delay_max_ms_screenshare != -1) { + RTC_HISTOGRAM_COUNTS_10000( + "WebRTC.Video.Screenshare.InterframeDelayMaxInMs", + interframe_delay_ms_screenshare); + } + + int interframe_delay_max_ms_video = interframe_delay_max_ms_video_; + if (interframe_delay_max_ms_video != -1) { + RTC_HISTOGRAM_COUNTS_10000( + "WebRTC.Video.InterframeDelayMaxInMs", + interframe_delay_ms_video); + } + + StreamDataCounters rtp = stats_.rtp_stats; StreamDataCounters rtx; for (auto it : rtx_stats_) @@ -516,6 +548,22 @@ void ReceiveStatisticsProxy::OnDecodedFrame(rtc::Optional qp, } last_content_type_ = content_type; decode_fps_estimator_.Update(1, now); + if (last_decoded_frame_time_ms_) { + int64_t interframe_delay_ms = now - *last_decoded_frame_time_ms_; + RTC_DCHECK_GE(interframe_delay_ms, 0); + if (last_content_type_ == VideoContentType::SCREENSHARE) { + interframe_delay_counter_screenshare_.Add(interframe_delay_ms); + if (interframe_delay_max_ms_screenshare_ < interframe_delay_ms) { + interframe_delay_max_ms_screenshare_ = interframe_delay_ms; + } + } else { + interframe_delay_counter_video_.Add(interframe_delay_ms); + if (interframe_delay_max_ms_video_ < interframe_delay_ms) { + interframe_delay_max_ms_video_ = interframe_delay_ms; + } + } + } + last_decoded_frame_time_ms_.emplace(now); } void ReceiveStatisticsProxy::OnRenderedFrame(const VideoFrame& frame) { diff --git a/webrtc/video/receive_statistics_proxy.h b/webrtc/video/receive_statistics_proxy.h index e1d097152e..626b56dcea 100644 --- a/webrtc/video/receive_statistics_proxy.h +++ b/webrtc/video/receive_statistics_proxy.h @@ -142,8 +142,12 @@ class ReceiveStatisticsProxy : public VCMReceiveStatisticsCallback, SampleCounter delay_counter_ GUARDED_BY(crit_); SampleCounter e2e_delay_counter_video_ GUARDED_BY(crit_); SampleCounter e2e_delay_counter_screenshare_ GUARDED_BY(crit_); + SampleCounter interframe_delay_counter_video_ GUARDED_BY(crit_); + SampleCounter interframe_delay_counter_screenshare_ GUARDED_BY(crit_); int64_t e2e_delay_max_ms_video_ GUARDED_BY(crit_); int64_t e2e_delay_max_ms_screenshare_ GUARDED_BY(crit_); + int64_t interframe_delay_max_ms_video_ GUARDED_BY(crit_); + int64_t interframe_delay_max_ms_screenshare_ GUARDED_BY(crit_); MaxCounter freq_offset_counter_ GUARDED_BY(crit_); int64_t first_report_block_time_ms_ GUARDED_BY(crit_); ReportBlockStats report_block_stats_ GUARDED_BY(crit_); @@ -152,6 +156,7 @@ class ReceiveStatisticsProxy : public VCMReceiveStatisticsCallback, int64_t avg_rtt_ms_ GUARDED_BY(crit_); mutable std::map frame_window_ GUARDED_BY(&crit_); VideoContentType last_content_type_ GUARDED_BY(&crit_); + rtc::Optional last_decoded_frame_time_ms_; }; } // namespace webrtc