From bea18cacc119e18b3c275108121fbd19aa2e91c7 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Tue, 2 Oct 2018 16:22:46 +0200 Subject: [PATCH] Add number of freezes per minute metric. Calculate number of freezes per minute for a received video stream and report this metric to UMA. Bug: webrtc:9803 Change-Id: I6d72a2daf58b2f734a576fff469c1fead6cc69b3 Reviewed-on: https://webrtc-review.googlesource.com/c/103180 Commit-Queue: Sergey Silkin Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Karl Wiberg Cr-Commit-Position: refs/heads/master@{#24944} --- rtc_base/numerics/sample_counter.cc | 4 ++++ rtc_base/numerics/sample_counter.h | 1 + video/receive_statistics_proxy_unittest.cc | 8 ++++++++ video/video_quality_observer.cc | 20 +++++++++++++++----- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/rtc_base/numerics/sample_counter.cc b/rtc_base/numerics/sample_counter.cc index 47d9eafa9e..bab47f165a 100644 --- a/rtc_base/numerics/sample_counter.cc +++ b/rtc_base/numerics/sample_counter.cc @@ -57,6 +57,10 @@ absl::optional SampleCounter::Max() const { return max_; } +int64_t SampleCounter::NumSamples() const { + return num_samples_; +} + void SampleCounter::Reset() { *this = {}; } diff --git a/rtc_base/numerics/sample_counter.h b/rtc_base/numerics/sample_counter.h index 0a212bc5e2..4fe71d1942 100644 --- a/rtc_base/numerics/sample_counter.h +++ b/rtc_base/numerics/sample_counter.h @@ -24,6 +24,7 @@ class SampleCounter { void Add(int sample); absl::optional Avg(int64_t min_required_samples) const; absl::optional Max() const; + int64_t NumSamples() const; void Reset(); // Adds all the samples from the |other| SampleCounter as if they were all // individually added using |Add(int)| method. diff --git a/video/receive_statistics_proxy_unittest.cc b/video/receive_statistics_proxy_unittest.cc index e419c93b21..b8a96b2f5e 100644 --- a/video/receive_statistics_proxy_unittest.cc +++ b/video/receive_statistics_proxy_unittest.cc @@ -1055,6 +1055,8 @@ TEST_P(ReceiveStatisticsProxyTest, FreezesAreReported) { const VideoContentType content_type = GetParam(); const int kInterFrameDelayMs = 33; const int kFreezeDelayMs = 200; + const int kCallDurationMs = + kMinRequiredSamples * kInterFrameDelayMs + kFreezeDelayMs; for (int i = 0; i < kMinRequiredSamples; ++i) { statistics_proxy_->OnDecodedFrame(absl::nullopt, kWidth, kHeight, content_type); @@ -1068,6 +1070,7 @@ TEST_P(ReceiveStatisticsProxyTest, FreezesAreReported) { statistics_proxy_.reset(); const int kExpectedTimeBetweenFreezes = kInterFrameDelayMs * (kMinRequiredSamples - 1); + const int kExpectedNumberFreezesPerMinute = 60 * 1000 / kCallDurationMs; if (videocontenttypehelpers::IsScreenshare(content_type)) { EXPECT_EQ( kFreezeDelayMs + kInterFrameDelayMs, @@ -1075,11 +1078,16 @@ TEST_P(ReceiveStatisticsProxyTest, FreezesAreReported) { EXPECT_EQ(kExpectedTimeBetweenFreezes, metrics::MinSample( "WebRTC.Video.Screenshare.MeanTimeBetweenFreezesMs")); + EXPECT_EQ( + kExpectedNumberFreezesPerMinute, + metrics::MinSample("WebRTC.Video.Screenshare.NumberFreezesPerMinute")); } else { EXPECT_EQ(kFreezeDelayMs + kInterFrameDelayMs, metrics::MinSample("WebRTC.Video.MeanFreezeDurationMs")); EXPECT_EQ(kExpectedTimeBetweenFreezes, metrics::MinSample("WebRTC.Video.MeanTimeBetweenFreezesMs")); + EXPECT_EQ(kExpectedNumberFreezesPerMinute, + metrics::MinSample("WebRTC.Video.NumberFreezesPerMinute")); } } diff --git a/video/video_quality_observer.cc b/video/video_quality_observer.cc index b35a8c8164..b05c3535e0 100644 --- a/video/video_quality_observer.cc +++ b/video/video_quality_observer.cc @@ -89,22 +89,32 @@ void VideoQualityObserver::UpdateHistograms() { if (call_duration_ms >= kMinCallDurationMs) { int time_spent_in_hd_percentage = static_cast( time_in_resolution_ms_[Resolution::High] * 100 / call_duration_ms); - int time_with_blocky_video_percentage = - static_cast(time_in_blocky_video_ms_ * 100 / call_duration_ms); - RTC_HISTOGRAM_COUNTS_SPARSE_100(uma_prefix + ".TimeInHdPercentage", time_spent_in_hd_percentage); log_stream << uma_prefix << ".TimeInHdPercentage " << time_spent_in_hd_percentage << "\n"; + + int time_with_blocky_video_percentage = + static_cast(time_in_blocky_video_ms_ * 100 / call_duration_ms); RTC_HISTOGRAM_COUNTS_SPARSE_100(uma_prefix + ".TimeInBlockyVideoPercentage", time_with_blocky_video_percentage); log_stream << uma_prefix << ".TimeInBlockyVideoPercentage " << time_with_blocky_video_percentage << "\n"; + + int num_resolution_downgrades_per_minute = + num_resolution_downgrades_ * 60000 / call_duration_ms; RTC_HISTOGRAM_COUNTS_SPARSE_100( uma_prefix + ".NumberResolutionDownswitchesPerMinute", - num_resolution_downgrades_ * 60000 / call_duration_ms); + num_resolution_downgrades_per_minute); log_stream << uma_prefix << ".NumberResolutionDownswitchesPerMinute " - << num_resolution_downgrades_ * 60000 / call_duration_ms << "\n"; + << num_resolution_downgrades_per_minute << "\n"; + + int num_freezes_per_minute = + freezes_durations_.NumSamples() * 60000 / call_duration_ms; + RTC_HISTOGRAM_COUNTS_SPARSE_100(uma_prefix + ".NumberFreezesPerMinute", + num_freezes_per_minute); + log_stream << uma_prefix << ".NumberFreezesPerMinute " + << num_freezes_per_minute << "\n"; } RTC_LOG(LS_INFO) << log_stream.str(); }