| 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 edb756433bff5d00e166a863e6bbb8fd51cac683..4f09e48bd4408ab67134bbd9eb3a79e3c637cf45 100644
 | 
| --- a/webrtc/video/send_statistics_proxy_unittest.cc
 | 
| +++ b/webrtc/video/send_statistics_proxy_unittest.cc
 | 
| @@ -367,61 +367,99 @@ TEST_F(SendStatisticsProxyTest, OnSendEncodedImageWithoutQpQpSumWontExist) {
 | 
|    EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
 | 
|  }
 | 
|  
 | 
| -TEST_F(SendStatisticsProxyTest, SetCpuScalingUpdatesStats) {
 | 
| +TEST_F(SendStatisticsProxyTest, GetCpuAdaptationStats) {
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
|    EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| -  statistics_proxy_->SetCpuScalingStats(-1);
 | 
| +  cpu_counts.fps = 1;
 | 
| +  cpu_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
|    EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| -  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| -  statistics_proxy_->SetCpuScalingStats(1);
 | 
| +  cpu_counts.fps = 0;
 | 
| +  cpu_counts.resolution = 1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
|    EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| +  cpu_counts.fps = 1;
 | 
| +  cpu_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| +  cpu_counts.fps = -1;
 | 
| +  cpu_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
|  }
 | 
|  
 | 
| -TEST_F(SendStatisticsProxyTest, SetQualityScalingUpdatesStats) {
 | 
| -  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| -  statistics_proxy_->SetQualityScalingStats(-1);
 | 
| +TEST_F(SendStatisticsProxyTest, GetQualityAdaptationStats) {
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
|    EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| -  statistics_proxy_->SetQualityScalingStats(0);
 | 
| +  quality_counts.fps = 1;
 | 
| +  quality_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
|    EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| -  statistics_proxy_->SetQualityScalingStats(1);
 | 
| +  quality_counts.fps = 0;
 | 
| +  quality_counts.resolution = 1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
|    EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| +  quality_counts.fps = 1;
 | 
| +  quality_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| +  quality_counts.fps = -1;
 | 
| +  quality_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
|  }
 | 
|  
 | 
| -TEST_F(SendStatisticsProxyTest, GetStatsReportsCpuResolutionChanges) {
 | 
| -  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| +TEST_F(SendStatisticsProxyTest, GetStatsReportsCpuAdaptChanges) {
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
|    EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
 | 
|  
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  cpu_counts.resolution = 1;
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
|    EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
|    EXPECT_EQ(1, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
 | 
|  
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(false);
 | 
| -  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
| +  cpu_counts.resolution = 2;
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
 | 
| +  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution);
 | 
|    EXPECT_EQ(2, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
 | 
| +  EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
|  }
 | 
|  
 | 
| -TEST_F(SendStatisticsProxyTest, GetStatsReportsQualityResolutionChanges) {
 | 
| -  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| +TEST_F(SendStatisticsProxyTest, GetStatsReportsQualityAdaptChanges) {
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
|    EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
|  
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| -  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| +  quality_counts.fps = 1;
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
|    EXPECT_EQ(1, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
|  
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(2);
 | 
| -  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| -  EXPECT_EQ(2, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
| -
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| -  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| -  EXPECT_EQ(3, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
| -
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(0);
 | 
| +  quality_counts.fps = 0;
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
 | 
|    EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
| -  EXPECT_EQ(4, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
| +  EXPECT_EQ(2, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
 | 
| +  EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
 | 
|  }
 | 
|  
 | 
| -TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_ScalingNotEnabled) {
 | 
| +TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_AdaptationNotEnabled) {
 | 
|    // First RTP packet sent.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|    // Min runtime has passed.
 | 
| @@ -435,9 +473,10 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_ScalingNotEnabled) {
 | 
|  TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_MinRuntimeNotPassed) {
 | 
|    // First RTP packet sent.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
| -  // Enable scaling.
 | 
| -  statistics_proxy_->SetQualityScalingStats(0);
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  // Enable adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    // Min runtime has not passed.
 | 
|    fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
 | 
|    statistics_proxy_.reset();
 | 
| @@ -446,26 +485,18 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_MinRuntimeNotPassed) {
 | 
|              metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
 | 
|  }
 | 
|  
 | 
| -TEST_F(SendStatisticsProxyTest, ZeroCpuAdaptChangesReported) {
 | 
| +TEST_F(SendStatisticsProxyTest, ZeroAdaptChangesReported) {
 | 
|    // First RTP packet sent.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
| -  // Enable scaling.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  // Enable adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    // 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) {
 | 
| -  // First RTP packet sent.
 | 
| -  UpdateDataCounters(kFirstSsrc);
 | 
| -  // 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(
 | 
| @@ -475,10 +506,12 @@ TEST_F(SendStatisticsProxyTest, ZeroQualityAdaptChangesReported) {
 | 
|  TEST_F(SendStatisticsProxyTest, CpuAdaptChangesReported) {
 | 
|    // First RTP packet sent.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
| -  // Enable scaling.
 | 
| +  // Enable adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    // Adapt changes: 1, elapsed time: 10 sec => 6 per minute.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|    statistics_proxy_.reset();
 | 
|    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
 | 
| @@ -489,34 +522,42 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesStatsExcludesDisabledTime) {
 | 
|    // First RTP packet sent.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|  
 | 
| -  // Disable scaling.
 | 
| -  statistics_proxy_->SetQualityScalingStats(-1);
 | 
| +  // Disable quality adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  quality_counts.fps = -1;
 | 
| +  quality_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|  
 | 
| -  // Enable scaling.
 | 
| +  // Enable quality adaptation.
 | 
|    // Adapt changes: 2, elapsed time: 20 sec.
 | 
| -  statistics_proxy_->SetQualityScalingStats(0);
 | 
| +  quality_counts.fps = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(5000);
 | 
| -  statistics_proxy_->SetQualityScalingStats(1);
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(9000);
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(6000);
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(2);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
| -  // Disable scaling.
 | 
| -  statistics_proxy_->SetQualityScalingStats(-1);
 | 
| +  // Disable quality adaptation.
 | 
| +  quality_counts.fps = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(30000);
 | 
|  
 | 
| -  // Enable scaling.
 | 
| +  // Enable quality adaptation.
 | 
|    // Adapt changes: 1, elapsed time: 10 sec.
 | 
| -  statistics_proxy_->SetQualityScalingStats(0);
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| +  quality_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|  
 | 
| -  // Disable scaling.
 | 
| -  statistics_proxy_->SetQualityScalingStats(-1);
 | 
| +  // Disable quality adaptation.
 | 
| +  quality_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(5000);
 | 
| -  statistics_proxy_->SetQualityScalingStats(-1);
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(20000);
 | 
|  
 | 
|    // Adapt changes: 3, elapsed time: 30 sec => 6 per minute.
 | 
| @@ -549,12 +590,14 @@ TEST_F(SendStatisticsProxyTest, QualityAdaptChangesStatsExcludesSuspendedTime) {
 | 
|    // First RTP packet sent.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|  
 | 
| -  // Enable scaling.
 | 
| +  // Enable adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
|    // Adapt changes: 2, elapsed time: 20 sec.
 | 
| -  statistics_proxy_->SetQualityScalingStats(0);
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(20000);
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(2);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Suspend and resume video.
 | 
|    statistics_proxy_->OnSuspendChange(true);
 | 
| @@ -562,7 +605,7 @@ TEST_F(SendStatisticsProxyTest, QualityAdaptChangesStatsExcludesSuspendedTime) {
 | 
|    statistics_proxy_->OnSuspendChange(false);
 | 
|  
 | 
|    // Adapt changes: 1, elapsed time: 10 sec.
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(3);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|  
 | 
|    // Adapt changes: 3, elapsed time: 30 sec => 6 per minute.
 | 
| @@ -581,18 +624,22 @@ TEST_F(SendStatisticsProxyTest, CpuAdaptChangesStatsExcludesSuspendedTime) {
 | 
|    statistics_proxy_->OnSuspendChange(false);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(30000);
 | 
|  
 | 
| -  // Enable scaling.
 | 
| +  // Enable adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
|    // Adapt changes: 1, elapsed time: 20 sec.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Video not suspended, stats time already started.
 | 
|    statistics_proxy_->OnSuspendChange(false);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|  
 | 
| -  // Disable scaling.
 | 
| -  statistics_proxy_->SetCpuScalingStats(-1);
 | 
| +  // Disable adaptation.
 | 
| +  cpu_counts.fps = -1;
 | 
| +  cpu_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(30000);
 | 
|  
 | 
|    // Suspend and resume video, stats time not started when scaling not enabled.
 | 
| @@ -601,11 +648,13 @@ TEST_F(SendStatisticsProxyTest, CpuAdaptChangesStatsExcludesSuspendedTime) {
 | 
|    statistics_proxy_->OnSuspendChange(false);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(30000);
 | 
|  
 | 
| -  // Enable scaling.
 | 
| +  // Enable adaptation.
 | 
|    // Adapt changes: 1, elapsed time: 10 sec.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  cpu_counts.fps = 0;
 | 
| +  cpu_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Adapt changes: 2, elapsed time: 30 sec => 4 per minute.
 | 
|    statistics_proxy_.reset();
 | 
| @@ -620,15 +669,17 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesStatsNotStartedIfVideoSuspended) {
 | 
|    // Video suspended.
 | 
|    statistics_proxy_->OnSuspendChange(true);
 | 
|  
 | 
| -  // Enable scaling, stats time not started when suspended.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  // Enable adaptation, stats time not started when suspended.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|  
 | 
|    // Resume video, stats time started.
 | 
|    // Adapt changes: 1, elapsed time: 10 sec.
 | 
|    statistics_proxy_->OnSuspendChange(false);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Adapt changes: 1, elapsed time: 10 sec => 6 per minute.
 | 
|    statistics_proxy_.reset();
 | 
| @@ -637,15 +688,17 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesStatsNotStartedIfVideoSuspended) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest, AdaptChangesStatsRestartsOnFirstSentPacket) {
 | 
| -  // Send first packet, scaling enabled.
 | 
| +  // Send first packet, adaptation enabled.
 | 
|    // Elapsed time before first packet is sent should be excluded.
 | 
| -  statistics_proxy_->SetQualityScalingStats(0);
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|  
 | 
|    // Adapt changes: 1, elapsed time: 10 sec.
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|  
 | 
|    // Adapt changes: 1, elapsed time: 10 sec => 6 per minute.
 | 
| @@ -657,24 +710,29 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesStatsRestartsOnFirstSentPacket) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest, AdaptChangesStatsStartedAfterFirstSentPacket) {
 | 
| -  // Enable and disable scaling.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  // Enable and disable adaptation.
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(60000);
 | 
| -  statistics_proxy_->SetCpuScalingStats(-1);
 | 
| +  cpu_counts.fps = -1;
 | 
| +  cpu_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Send first packet, scaling disabled.
 | 
|    // Elapsed time before first packet is sent should be excluded.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(60000);
 | 
|  
 | 
| -  // Enable scaling.
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  // Enable adaptation.
 | 
| +  cpu_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
|  
 | 
|    // Adapt changes: 1, elapsed time: 20 sec.
 | 
|    fake_clock_.AdvanceTimeMilliseconds(10000);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Adapt changes: 1, elapsed time: 20 sec => 3 per minute.
 | 
|    statistics_proxy_.reset();
 | 
| @@ -683,14 +741,18 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesStatsStartedAfterFirstSentPacket) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest, AdaptChangesReportedAfterContentSwitch) {
 | 
| -  // First RTP packet sent, scaling enabled.
 | 
| +  // First RTP packet sent, cpu adaptation enabled.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  quality_counts.fps = -1;
 | 
| +  quality_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Adapt changes: 2, elapsed time: 15 sec => 8 per minute.
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(6000);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(9000);
 | 
|  
 | 
|    // Switch content type, real-time stats should be updated.
 | 
| @@ -704,13 +766,13 @@ TEST_F(SendStatisticsProxyTest, AdaptChangesReportedAfterContentSwitch) {
 | 
|  
 | 
|    // First RTP packet sent, scaling enabled.
 | 
|    UpdateDataCounters(kFirstSsrc);
 | 
| -  statistics_proxy_->SetCpuScalingStats(0);
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|  
 | 
|    // Adapt changes: 4, elapsed time: 120 sec => 2 per minute.
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|    fake_clock_.AdvanceTimeMilliseconds(120000);
 | 
|  
 | 
|    statistics_proxy_.reset();
 | 
| @@ -842,8 +904,10 @@ TEST_F(SendStatisticsProxyTest, SentFpsHistogramExcludesSuspendedTime) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest, CpuLimitedHistogramNotUpdatedWhenDisabled) {
 | 
| -  const int kNumDownscales = -1;
 | 
| -  statistics_proxy_->SetQualityScalingStats(kNumDownscales);
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  cpu_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|  
 | 
|    for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
 | 
|      statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
 | 
| @@ -854,13 +918,16 @@ TEST_F(SendStatisticsProxyTest, CpuLimitedHistogramNotUpdatedWhenDisabled) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest, CpuLimitedHistogramUpdated) {
 | 
| -  const int kNumDownscales = 0;
 | 
| -  statistics_proxy_->SetCpuScalingStats(kNumDownscales);
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  cpu_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|  
 | 
|    for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
 | 
|      statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
 | 
|  
 | 
| -  statistics_proxy_->OnCpuRestrictedResolutionChanged(true);
 | 
| +  cpu_counts.resolution = 1;
 | 
| +  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
 | 
|  
 | 
|    for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
 | 
|      statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
 | 
| @@ -1149,9 +1216,11 @@ TEST_F(SendStatisticsProxyTest,
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest,
 | 
|         QualityLimitedHistogramsNotUpdatedWhenDisabled) {
 | 
| -  const int kNumDownscales = -1;
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  quality_counts.resolution = -1;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    EncodedImage encoded_image;
 | 
| -  statistics_proxy_->SetQualityScalingStats(kNumDownscales);
 | 
|    for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
 | 
|      statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
 | 
|  
 | 
| @@ -1165,9 +1234,11 @@ TEST_F(SendStatisticsProxyTest,
 | 
|  
 | 
|  TEST_F(SendStatisticsProxyTest,
 | 
|         QualityLimitedHistogramsUpdatedWhenEnabled_NoResolutionDownscale) {
 | 
| -  const int kNumDownscales = 0;
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  quality_counts.resolution = 0;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    EncodedImage encoded_image;
 | 
| -  statistics_proxy_->SetQualityScalingStats(kNumDownscales);
 | 
|    for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
 | 
|      statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
 | 
|  
 | 
| @@ -1185,8 +1256,11 @@ TEST_F(SendStatisticsProxyTest,
 | 
|  TEST_F(SendStatisticsProxyTest,
 | 
|         QualityLimitedHistogramsUpdatedWhenEnabled_TwoResolutionDownscales) {
 | 
|    const int kDownscales = 2;
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  quality_counts.resolution = kDownscales;
 | 
| +  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
 | 
|    EncodedImage encoded_image;
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(kDownscales);
 | 
|    for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
 | 
|      statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
 | 
|    // Histograms are updated when the statistics_proxy_ is deleted.
 | 
| @@ -1221,7 +1295,10 @@ TEST_F(SendStatisticsProxyTest, GetStatsReportsBandwidthLimitedResolution) {
 | 
|    EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
|  
 | 
|    // Resolution scaled due to quality.
 | 
| -  statistics_proxy_->OnQualityRestrictedResolutionChanged(1);
 | 
| +  ViEEncoder::AdaptCounts cpu_counts;
 | 
| +  ViEEncoder::AdaptCounts quality_counts;
 | 
| +  quality_counts.resolution = 1;
 | 
| +  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
 | 
|    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
 | 
|    EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
 | 
|  }
 | 
| 
 |