Add datarate test to change speed on the fly.

Change-Id: Ic1532c5c8040e1722aad099c7dda779ffe50f1c9
diff --git a/test/datarate_test.cc b/test/datarate_test.cc
index eff777d..d6c8c00 100644
--- a/test/datarate_test.cc
+++ b/test/datarate_test.cc
@@ -237,6 +237,55 @@
 
 class DatarateTestFrameDropRealtime : public DatarateTestFrameDropLarge {};
 
+// Params: aq mode.
+class DatarateTestSpeedChangeRealtime
+    : public ::libaom_test::CodecTestWith2Params<libaom_test::TestMode,
+                                                 unsigned int>,
+      public DatarateTest {
+ public:
+  DatarateTestSpeedChangeRealtime() : DatarateTest(GET_PARAM(0)) {
+    aq_mode_ = GET_PARAM(1);
+    speed_change_test_ = true;
+  }
+
+ protected:
+  virtual ~DatarateTestSpeedChangeRealtime() {}
+
+  virtual void SetUp() {
+    InitializeConfig();
+    SetMode(GET_PARAM(1));
+    ResetModel();
+  }
+
+  virtual void ChangingSpeedTest() {
+    cfg_.rc_buf_initial_sz = 500;
+    cfg_.rc_buf_optimal_sz = 500;
+    cfg_.rc_buf_sz = 1000;
+    cfg_.rc_undershoot_pct = 20;
+    cfg_.rc_undershoot_pct = 20;
+    cfg_.rc_dropframe_thresh = 10;
+    cfg_.rc_min_quantizer = 0;
+    cfg_.rc_max_quantizer = 50;
+    cfg_.rc_end_usage = AOM_CBR;
+    cfg_.rc_target_bitrate = 200;
+    cfg_.g_lag_in_frames = 0;
+    cfg_.g_error_resilient = 1;
+    // TODO(marpan): Investigate datarate target failures with a smaller
+    // keyframe interval (128).
+    cfg_.kf_max_dist = 9999;
+    cfg_.rc_dropframe_thresh = 0;
+    ::libaom_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352,
+                                         288, 30, 1, 0, 100);
+
+    ResetModel();
+    ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
+    ASSERT_GE(effective_datarate_, cfg_.rc_target_bitrate * 0.85)
+        << " The datarate for the file is lower than target by too much!";
+    ASSERT_LE(effective_datarate_, cfg_.rc_target_bitrate * 1.16)
+        << " The datarate for the file is greater than target by too much!";
+  }
+};
+
 // Check basic rate targeting for VBR mode.
 TEST_P(DatarateTestRealtime, BasicRateTargetingVBR) {
   BasicRateTargetingVBRTest();
@@ -260,6 +309,10 @@
   ChangingDropFrameThreshTest();
 }
 
+TEST_P(DatarateTestSpeedChangeRealtime, ChangingSpeedTest) {
+  ChangingSpeedTest();
+}
+
 AV1_INSTANTIATE_TEST_CASE(DatarateTestLarge,
                           ::testing::Values(::libaom_test::kRealTime),
                           ::testing::Range(5, 7), ::testing::Values(0, 3),
@@ -278,5 +331,9 @@
                           ::testing::Values(::libaom_test::kRealTime),
                           ::testing::Range(7, 9), ::testing::Values(0, 3));
 
+AV1_INSTANTIATE_TEST_CASE(DatarateTestSpeedChangeRealtime,
+                          ::testing::Values(::libaom_test::kRealTime),
+                          ::testing::Values(0, 3));
+
 }  // namespace
 }  // namespace datarate_test
diff --git a/test/datarate_test.h b/test/datarate_test.h
index 388915f..3c15731 100644
--- a/test/datarate_test.h
+++ b/test/datarate_test.h
@@ -24,7 +24,8 @@
 class DatarateTest : public ::libaom_test::EncoderTest {
  public:
   explicit DatarateTest(const ::libaom_test::CodecFactory *codec)
-      : EncoderTest(codec) {}
+      : EncoderTest(codec), set_cpu_used_(0), aq_mode_(0),
+        speed_change_test_(false) {}
 
  protected:
   virtual ~DatarateTest() {}
@@ -64,6 +65,21 @@
       }
     }
 
+    if (speed_change_test_) {
+      if (video->frame() == 0) {
+        encoder->Control(AOME_SET_CPUUSED, 8);
+      }
+      if (video->frame() == 30) {
+        encoder->Control(AOME_SET_CPUUSED, 7);
+      }
+      if (video->frame() == 60) {
+        encoder->Control(AOME_SET_CPUUSED, 6);
+      }
+      if (video->frame() == 90) {
+        encoder->Control(AOME_SET_CPUUSED, 7);
+      }
+    }
+
     if (denoiser_offon_test_) {
       ASSERT_GT(denoiser_offon_period_, 0)
           << "denoiser_offon_period_ is not positive.";
@@ -134,6 +150,7 @@
   int denoiser_offon_test_;
   int denoiser_offon_period_;
   unsigned int aq_mode_;
+  bool speed_change_test_;
 };
 
 }  // namespace