Index: webrtc/video/send_statistics_proxy_unittest.cc |
diff --git a/webrtc/video/send_statistics_proxy_unittest.cc b/webrtc/video/send_statistics_proxy_unittest.cc |
index 7b44dde4697a09ad4cf421efe78ae2b8694ace3a..b3aa50667d78546ad1fdd766c920f7bcdae7f4e7 100644 |
--- a/webrtc/video/send_statistics_proxy_unittest.cc |
+++ b/webrtc/video/send_statistics_proxy_unittest.cc |
@@ -369,10 +369,12 @@ TEST_F(SendStatisticsProxyTest, OnSendEncodedImageWithoutQpQpSumWontExist) { |
TEST_F(SendStatisticsProxyTest, SetCpuScalingUpdatesStats) { |
EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution); |
- statistics_proxy_->SetCpuScalingStats(true); |
- EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution); |
- statistics_proxy_->SetCpuScalingStats(false); |
+ statistics_proxy_->SetCpuScalingStats(-1); |
+ EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution); |
+ statistics_proxy_->SetCpuScalingStats(0); |
EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution); |
+ statistics_proxy_->SetCpuScalingStats(1); |
+ EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution); |
} |
TEST_F(SendStatisticsProxyTest, SetQualityScalingUpdatesStats) { |
@@ -419,6 +421,191 @@ TEST_F(SendStatisticsProxyTest, GetStatsReportsQualityResolutionChanges) { |
EXPECT_EQ(4, statistics_proxy_->GetStats().number_of_quality_adapt_changes); |
} |
+TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_ScalingNotEnabled) { |
+ // Min runtime has passed. |
+ fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000); |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(0, |
+ metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality")); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_MinRuntimeNotPassed) { |
+ // Enable scaling. |
+ statistics_proxy_->SetQualityScalingStats(0); |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ // Min runtime has not passed. |
+ fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1); |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(0, |
+ metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality")); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, ZeroCpuAdaptChangesReported) { |
+ // Enable scaling. |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ // Min runtime has passed. |
+ fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000); |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 0)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, ZeroQualityAdaptChangesReported) { |
+ // Enable scaling. |
+ statistics_proxy_->SetQualityScalingStats(0); |
+ // Min runtime has passed. |
+ fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000); |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, |
+ metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality")); |
+ EXPECT_EQ( |
+ 1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 0)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, CpuAdaptChangesReported) { |
+ // Enable scaling. |
+ // Adapt changes: 1, elapsed time: 10 ms => 6 per minute. |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 6)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, AdaptChangesStatsExcludesDisabledTime) { |
+ // Disable scaling. |
+ statistics_proxy_->SetQualityScalingStats(-1); |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ |
+ // Enable scaling. |
+ // Adapt changes: 2, elapsed time: 20 ms. |
+ statistics_proxy_->SetQualityScalingStats(0); |
+ fake_clock_.AdvanceTimeMilliseconds(5000); |
+ statistics_proxy_->SetQualityScalingStats(1); |
+ fake_clock_.AdvanceTimeMilliseconds(9000); |
+ statistics_proxy_->OnQualityRestrictedResolutionChanged(1); |
+ fake_clock_.AdvanceTimeMilliseconds(6000); |
+ statistics_proxy_->OnQualityRestrictedResolutionChanged(2); |
+ |
+ // Disable scaling. |
+ statistics_proxy_->SetQualityScalingStats(-1); |
+ fake_clock_.AdvanceTimeMilliseconds(30000); |
+ |
+ // Enable scaling. |
+ // Adapt changes: 1, elapsed time: 10 ms. |
+ statistics_proxy_->SetQualityScalingStats(0); |
+ statistics_proxy_->OnQualityRestrictedResolutionChanged(1); |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ |
+ // Disable scaling. |
+ statistics_proxy_->SetQualityScalingStats(-1); |
+ fake_clock_.AdvanceTimeMilliseconds(5000); |
+ statistics_proxy_->SetQualityScalingStats(-1); |
+ fake_clock_.AdvanceTimeMilliseconds(20000); |
+ |
+ // Adapt changes: 3, elapsed time: 30 ms => 6 per minute. |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, |
+ metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality")); |
+ EXPECT_EQ( |
+ 1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 6)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, AdaptChangesStatsRestartsOnFirstSentPacket) { |
+ StreamDataCounters counters; |
+ StreamDataCountersCallback* proxy = |
+ static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); |
+ |
+ // Send first packet, scaling enabled. |
+ // Elapsed time before first packet is sent should be excluded. |
+ statistics_proxy_->SetQualityScalingStats(0); |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ proxy->DataCountersUpdated(counters, kFirstSsrc); |
+ |
+ // Adapt changes: 1, elapsed time: 10 ms. |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ statistics_proxy_->OnQualityRestrictedResolutionChanged(1); |
+ proxy->DataCountersUpdated(counters, kFirstSsrc); |
+ |
+ // Adapt changes: 1, elapsed time: 10 ms => 6 per minute. |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, |
+ metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality")); |
+ EXPECT_EQ( |
+ 1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 6)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, AdaptChangesStatsStartedAfterFirstSentPacket) { |
+ StreamDataCounters counters; |
+ StreamDataCountersCallback* proxy = |
+ static_cast<StreamDataCountersCallback*>(statistics_proxy_.get()); |
+ |
+ // Enable and disable scaling. |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ fake_clock_.AdvanceTimeMilliseconds(60000); |
+ statistics_proxy_->SetCpuScalingStats(-1); |
+ |
+ // Send first packet, scaling disabled. |
+ // Elapsed time before first packet is sent should be excluded. |
+ proxy->DataCountersUpdated(counters, kFirstSsrc); |
+ fake_clock_.AdvanceTimeMilliseconds(60000); |
+ |
+ // Enable scaling. |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ proxy->DataCountersUpdated(counters, kFirstSsrc); |
+ |
+ // Adapt changes: 1, elapsed time: 20 ms. |
+ fake_clock_.AdvanceTimeMilliseconds(10000); |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ |
+ // Adapt changes: 1, elapsed time: 20 ms => 3 per minute. |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 3)); |
+} |
+ |
+TEST_F(SendStatisticsProxyTest, AdaptChangesReportedAfterContentSwitch) { |
+ // Enable scaling. |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ |
+ // Adapt changes: 2, elapsed time: 15 ms => 8 per minute. |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ fake_clock_.AdvanceTimeMilliseconds(6000); |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ fake_clock_.AdvanceTimeMilliseconds(9000); |
+ |
+ // Switch content type, real-time stats should be updated. |
+ VideoEncoderConfig config; |
+ config.content_type = VideoEncoderConfig::ContentType::kScreen; |
+ statistics_proxy_->OnEncoderReconfigured(config, 50); |
+ EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 8)); |
+ EXPECT_EQ(0, |
+ metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality")); |
+ |
+ // Enable scaling. |
+ statistics_proxy_->SetCpuScalingStats(0); |
+ |
+ // Adapt changes: 4, elapsed time: 120 ms => 2 per minute. |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ statistics_proxy_->OnCpuRestrictedResolutionChanged(true); |
+ fake_clock_.AdvanceTimeMilliseconds(120000); |
+ |
+ statistics_proxy_.reset(); |
+ EXPECT_EQ(1, metrics::NumSamples( |
+ "WebRTC.Video.Screenshare.AdaptChangesPerMinute.Cpu")); |
+ EXPECT_EQ(1, metrics::NumEvents( |
+ "WebRTC.Video.Screenshare.AdaptChangesPerMinute.Cpu", 2)); |
+ EXPECT_EQ(0, metrics::NumSamples( |
+ "WebRTC.Video.Screenshare.AdaptChangesPerMinute.Quality")); |
+} |
+ |
TEST_F(SendStatisticsProxyTest, SwitchContentTypeUpdatesHistograms) { |
for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) |
statistics_proxy_->OnIncomingFrame(kWidth, kHeight); |