Make rate control and quality thresholds optional in VideoProcessorIntegrationTest.

This CL is split out from https://codereview.webrtc.org/2997283002/.

BUG=webrtc:6634

Review-Url: https://codereview.webrtc.org/3008543002
Cr-Original-Commit-Position: refs/heads/master@{#19513}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: 87f5c5a4d366da90ca8239b54e25d4d9ec6c1364
diff --git a/modules/video_coding/codecs/test/plot_videoprocessor_integrationtest.cc b/modules/video_coding/codecs/test/plot_videoprocessor_integrationtest.cc
index 4aeed56..198bb8a 100644
--- a/modules/video_coding/codecs/test/plot_videoprocessor_integrationtest.cc
+++ b/modules/video_coding/codecs/test/plot_videoprocessor_integrationtest.cc
@@ -58,7 +58,12 @@
                int height,
                int framerate,
                const std::string& filename) {
-    // Bitrate and frame rate profile.
+    SetTestConfig(&config_, hw_codec_, kUseSingleCore, kPacketLoss, filename,
+                  kVerboseLogging, kBatchMode);
+    SetCodecSettings(&config_, codec_type_, kNumTemporalLayers,
+                     kErrorConcealmentOn, kDenoisingOn, kFrameDropperOn,
+                     kSpatialResizeOn, kResilienceOn, width, height);
+
     RateProfile rate_profile;
     SetRateProfile(&rate_profile,
                    0,  // update_index
@@ -67,34 +72,8 @@
     rate_profile.frame_index_rate_update[1] = kNumFrames + 1;
     rate_profile.num_frames = kNumFrames;
 
-    // Codec/network settings.
-    SetTestConfig(&config_, hw_codec_, kUseSingleCore, kPacketLoss, filename,
-                  kVerboseLogging, kBatchMode);
-    SetCodecSettings(&config_, codec_type_, kNumTemporalLayers,
-                     kErrorConcealmentOn, kDenoisingOn, kFrameDropperOn,
-                     kSpatialResizeOn, kResilienceOn, width, height);
-
-    // Use default thresholds for quality (PSNR and SSIM).
-    QualityThresholds quality_thresholds;
-
-    // Use very loose thresholds for rate control, so even poor HW codecs will
-    // pass the requirements.
-    RateControlThresholds rc_thresholds[1];
-    // clang-format off
-    SetRateControlThresholds(
-      rc_thresholds,
-      0,               // update_index
-      kNumFrames + 1,  // max_num_dropped_frames
-      10000,           // max_key_frame_size_mismatch
-      10000,           // max_delta_frame_size_mismatch
-      10000,           // max_encoding_rate_mismatch
-      kNumFrames + 1,  // max_time_hit_target
-      0,               // num_spatial_resizes
-      1);              // num_key_frames
-    // clang-format on
-
-    ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                           &kVisualizationParams);
+    ProcessFramesAndMaybeVerify(rate_profile, nullptr, nullptr,
+                                &kVisualizationParams);
   }
 
   const int bitrate_;
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
index 2dab008..d188d34 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
@@ -10,6 +10,8 @@
 
 #include "webrtc/modules/video_coding/codecs/test/videoprocessor_integrationtest.h"
 
+#include <vector>
+
 namespace webrtc {
 namespace test {
 
@@ -34,6 +36,8 @@
 #endif
 const int kNumFramesLong = 299;
 
+const std::nullptr_t kNoVisualizationParams = nullptr;
+
 }  // namespace
 
 #if defined(WEBRTC_USE_H264)
@@ -44,23 +48,23 @@
 // with H264. Therefore ProcessXPercentPacketLossH264, X != 0, unittests have
 // not been added.
 TEST_F(VideoProcessorIntegrationTest, Process0PercentPacketLossH264) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecH264, 1, false, false, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(2, 60, 20, 10, 20, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(35.0, 25.0, 0.93, 0.70);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 2, 60, 20, 10, 20, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 #endif  // defined(WEBRTC_USE_H264)
@@ -72,45 +76,45 @@
 // VP9: Run with no packet loss and fixed bitrate. Quality should be very high.
 // One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTest, Process0PercentPacketLossVP9) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(37.0, 36.0, 0.93, 0.92);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 20, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP9: Run with 5% packet loss and fixed bitrate. Quality should be a bit
 // lower. One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTest, Process5PercentPacketLossVP9) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.05f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(17.0, 14.0, 0.45, 0.36);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 20, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP9: Run with no packet loss, with varying bitrate (3 rate updates):
@@ -118,27 +122,27 @@
 // target rate/per-frame bandwidth (for each rate update) is within limits.
 // One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTest, ProcessNoLossChangeBitRateVP9) {
-  // Bit rate and frame rate profile.
+  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
+                kVerboseLogging, kBatchMode);
+  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
+                   kResilienceOn, kCifWidth, kCifHeight);
+
   RateProfile rate_profile;
   SetRateProfile(&rate_profile, 0, 200, 30, 0);
   SetRateProfile(&rate_profile, 1, 700, 30, 100);
   SetRateProfile(&rate_profile, 2, 500, 30, 200);
   rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
   rate_profile.num_frames = kNumFramesLong;
-  // Codec/network settings.
-  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
-                kVerboseLogging, kBatchMode);
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 30, 20, 20, 35, 0, 1, &rc_thresholds);
+  AddRateControlThresholds(2, 0, 20, 20, 60, 0, 0, &rc_thresholds);
+  AddRateControlThresholds(0, 0, 25, 20, 40, 0, 0, &rc_thresholds);
+
   QualityThresholds quality_thresholds(35.5, 30.0, 0.90, 0.85);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[3];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 30, 20, 20, 35, 0, 1);
-  SetRateControlThresholds(rc_thresholds, 1, 2, 0, 20, 20, 60, 0, 0);
-  SetRateControlThresholds(rc_thresholds, 2, 0, 0, 25, 20, 40, 0, 0);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP9: Run with no packet loss, with an update (decrease) in frame rate.
@@ -150,48 +154,48 @@
 // metrics averaged over whole sequence run.
 TEST_F(VideoProcessorIntegrationTest,
        ProcessNoLossChangeFrameRateFrameDropVP9) {
-  // Bit rate and frame rate profile.
+  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
+                kVerboseLogging, kBatchMode);
+  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
+                   kResilienceOn, kCifWidth, kCifHeight);
+
   RateProfile rate_profile;
   SetRateProfile(&rate_profile, 0, 100, 24, 0);
   SetRateProfile(&rate_profile, 1, 100, 15, 100);
   SetRateProfile(&rate_profile, 2, 100, 10, 200);
   rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
   rate_profile.num_frames = kNumFramesLong;
-  // Codec/network settings.
-  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
-                kVerboseLogging, kBatchMode);
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(45, 50, 95, 15, 45, 0, 1, &rc_thresholds);
+  AddRateControlThresholds(20, 0, 50, 10, 30, 0, 0, &rc_thresholds);
+  AddRateControlThresholds(5, 0, 30, 5, 25, 0, 0, &rc_thresholds);
+
   QualityThresholds quality_thresholds(31.5, 18.0, 0.80, 0.43);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[3];
-  SetRateControlThresholds(rc_thresholds, 0, 45, 50, 95, 15, 45, 0, 1);
-  SetRateControlThresholds(rc_thresholds, 1, 20, 0, 50, 10, 30, 0, 0);
-  SetRateControlThresholds(rc_thresholds, 2, 5, 0, 30, 5, 25, 0, 0);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP9: Run with no packet loss and denoiser on. One key frame (first frame).
 TEST_F(VideoProcessorIntegrationTest, ProcessNoLossDenoiserOnVP9) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP9, 1, false, true, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(36.8, 35.8, 0.92, 0.91);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 20, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // Run with no packet loss, at low bitrate.
@@ -199,23 +203,23 @@
 // Resize happens on delta frame. Expect only one key frame (first frame).
 TEST_F(VideoProcessorIntegrationTest,
        DISABLED_ProcessNoLossSpatialResizeFrameDropVP9) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 50, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, true,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 50, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesLong + 1;
+  rate_profile.num_frames = kNumFramesLong;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(228, 70, 160, 15, 80, 1, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(24.0, 13.0, 0.65, 0.37);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 228, 70, 160, 15, 80, 1, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // TODO(marpan): Add temporal layer test for VP9, once changes are in
@@ -227,67 +231,67 @@
 // One key frame (first frame only) in sequence. Setting |key_frame_interval|
 // to -1 below means no periodic key frames in test.
 TEST_F(VideoProcessorIntegrationTest, ProcessZeroPacketLoss) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(34.95, 33.0, 0.90, 0.89);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 15, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP8: Run with 5% packet loss and fixed bitrate. Quality should be a bit
 // lower. One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTest, Process5PercentPacketLoss) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.05f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(20.0, 16.0, 0.60, 0.40);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 15, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP8: Run with 10% packet loss and fixed bitrate. Quality should be lower.
 // One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTest, Process10PercentPacketLoss) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.1f, kForemanCif,
                 kVerboseLogging, kBatchMode);
   SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(19.0, 16.0, 0.50, 0.35);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 15, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // This test is identical to VideoProcessorIntegrationTest.ProcessZeroPacketLoss
@@ -295,23 +299,23 @@
 // that the reported stats are not wildly varying between batch mode and the
 // regular online mode.
 TEST_F(VideoProcessorIntegrationTest, ProcessInBatchMode) {
-  // Bit rate and frame rate profile.
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-  // Codec/network settings.
   SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
                 kVerboseLogging, true /* batch_mode */);
   SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
                    kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  RateProfile rate_profile;
+  SetRateProfile(&rate_profile, 0, 500, 30, 0);
+  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
+  rate_profile.num_frames = kNumFramesShort;
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
+
   QualityThresholds quality_thresholds(34.95, 33.0, 0.90, 0.89);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[1];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 40, 20, 10, 15, 0, 1);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 #endif  // !defined(WEBRTC_IOS)
@@ -337,27 +341,27 @@
 #define MAYBE_ProcessNoLossChangeBitRateVP8 ProcessNoLossChangeBitRateVP8
 #endif
 TEST_F(VideoProcessorIntegrationTest, MAYBE_ProcessNoLossChangeBitRateVP8) {
-  // Bit rate and frame rate profile.
+  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
+                kVerboseLogging, kBatchMode);
+  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
+                   kResilienceOn, kCifWidth, kCifHeight);
+
   RateProfile rate_profile;
   SetRateProfile(&rate_profile, 0, 200, 30, 0);
   SetRateProfile(&rate_profile, 1, 800, 30, 100);
   SetRateProfile(&rate_profile, 2, 500, 30, 200);
   rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
   rate_profile.num_frames = kNumFramesLong;
-  // Codec/network settings.
-  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
-                kVerboseLogging, kBatchMode);
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 45, 20, 10, 15, 0, 1, &rc_thresholds);
+  AddRateControlThresholds(0, 0, 25, 20, 10, 0, 0, &rc_thresholds);
+  AddRateControlThresholds(0, 0, 25, 15, 10, 0, 0, &rc_thresholds);
+
   QualityThresholds quality_thresholds(34.0, 32.0, 0.85, 0.80);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[3];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 45, 20, 10, 15, 0, 1);
-  SetRateControlThresholds(rc_thresholds, 1, 0, 0, 25, 20, 10, 0, 0);
-  SetRateControlThresholds(rc_thresholds, 2, 0, 0, 25, 15, 10, 0, 0);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP8: Run with no packet loss, with an update (decrease) in frame rate.
@@ -377,27 +381,27 @@
 #endif
 TEST_F(VideoProcessorIntegrationTest,
        MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8) {
-  // Bit rate and frame rate profile.
+  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
+                kVerboseLogging, kBatchMode);
+  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
+                   kResilienceOn, kCifWidth, kCifHeight);
+
   RateProfile rate_profile;
   SetRateProfile(&rate_profile, 0, 80, 24, 0);
   SetRateProfile(&rate_profile, 1, 80, 15, 100);
   SetRateProfile(&rate_profile, 2, 80, 10, 200);
   rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
   rate_profile.num_frames = kNumFramesLong;
-  // Codec/network settings.
-  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
-                kVerboseLogging, kBatchMode);
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(40, 20, 75, 15, 60, 0, 1, &rc_thresholds);
+  AddRateControlThresholds(10, 0, 25, 10, 35, 0, 0, &rc_thresholds);
+  AddRateControlThresholds(0, 0, 20, 10, 15, 0, 0, &rc_thresholds);
+
   QualityThresholds quality_thresholds(31.0, 22.0, 0.80, 0.65);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[3];
-  SetRateControlThresholds(rc_thresholds, 0, 40, 20, 75, 15, 60, 0, 1);
-  SetRateControlThresholds(rc_thresholds, 1, 10, 0, 25, 10, 35, 0, 0);
-  SetRateControlThresholds(rc_thresholds, 2, 0, 0, 20, 10, 15, 0, 0);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 
 // VP8: Run with no packet loss, with 3 temporal layers, with a rate update in
@@ -413,25 +417,25 @@
 #define MAYBE_ProcessNoLossTemporalLayersVP8 ProcessNoLossTemporalLayersVP8
 #endif
 TEST_F(VideoProcessorIntegrationTest, MAYBE_ProcessNoLossTemporalLayersVP8) {
-  // Bit rate and frame rate profile.
+  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
+                kVerboseLogging, kBatchMode);
+  SetCodecSettings(&config_, kVideoCodecVP8, 3, false, true, true, false,
+                   kResilienceOn, kCifWidth, kCifHeight);
+
   RateProfile rate_profile;
   SetRateProfile(&rate_profile, 0, 200, 30, 0);
   SetRateProfile(&rate_profile, 1, 400, 30, 150);
   rate_profile.frame_index_rate_update[2] = kNumFramesLong + 1;
   rate_profile.num_frames = kNumFramesLong;
-  // Codec/network settings.
-  SetTestConfig(&config_, kHwCodec, kUseSingleCore, 0.0f, kForemanCif,
-                kVerboseLogging, kBatchMode);
-  SetCodecSettings(&config_, kVideoCodecVP8, 3, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-  // Thresholds for expected quality.
+
+  std::vector<RateControlThresholds> rc_thresholds;
+  AddRateControlThresholds(0, 20, 30, 10, 10, 0, 1, &rc_thresholds);
+  AddRateControlThresholds(0, 0, 30, 15, 10, 0, 0, &rc_thresholds);
+
   QualityThresholds quality_thresholds(32.5, 30.0, 0.85, 0.80);
-  // Thresholds for rate control.
-  RateControlThresholds rc_thresholds[2];
-  SetRateControlThresholds(rc_thresholds, 0, 0, 20, 30, 10, 10, 0, 1);
-  SetRateControlThresholds(rc_thresholds, 1, 0, 0, 30, 15, 10, 0, 0);
-  ProcessFramesAndVerify(quality_thresholds, rate_profile, rc_thresholds,
-                         nullptr /* visualization_params */);
+
+  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
+                              kNoVisualizationParams);
 }
 }  // namespace test
 }  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
index e47df37..3d43d64 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
@@ -17,6 +17,7 @@
 #include <memory>
 #include <string>
 #include <utility>
+#include <vector>
 
 #if defined(WEBRTC_ANDROID)
 #include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h"
@@ -65,7 +66,6 @@
 
 // Thresholds for the quality metrics. Defaults are maximally minimal.
 struct QualityThresholds {
-  QualityThresholds() {}
   QualityThresholds(double min_avg_psnr,
                     double min_min_psnr,
                     double min_avg_ssim,
@@ -74,10 +74,10 @@
         min_min_psnr(min_min_psnr),
         min_avg_ssim(min_avg_ssim),
         min_min_ssim(min_min_ssim) {}
-  double min_avg_psnr = std::numeric_limits<double>::min();
-  double min_min_psnr = std::numeric_limits<double>::min();
-  double min_avg_ssim = 0.0;
-  double min_min_ssim = 0.0;
+  double min_avg_psnr;
+  double min_min_psnr;
+  double min_avg_ssim;
+  double min_min_ssim;
 };
 
 // The sequence of bit rate and frame rate changes for the encoder, the frame
@@ -101,8 +101,8 @@
   int max_delta_frame_size_mismatch;
   int max_encoding_rate_mismatch;
   int max_time_hit_target;
-  int num_spatial_resizes;  // Set to -1 to disable check.
-  int num_key_frames;       // Set to -1 to disable check.
+  int num_spatial_resizes;
+  int num_key_frames;
 };
 
 // Should video files be saved persistently to disk for post-run visualization?
@@ -306,8 +306,9 @@
   }
 
   // Verify expected behavior of rate control and print out data.
-  void VerifyRateControlMetrics(int rate_update_index,
-                                const RateControlThresholds& rc_expected) {
+  void PrintAndMaybeVerifyRateControlMetrics(
+      int rate_update_index,
+      const std::vector<RateControlThresholds>* rc_thresholds) {
     int num_dropped_frames = processor_->NumberDroppedFrames();
     int num_resize_actions = processor_->NumberSpatialResizes();
     printf(
@@ -324,8 +325,13 @@
         num_frames_total_, num_frames_to_hit_target_, num_dropped_frames,
         num_resize_actions);
 
-    EXPECT_LE(perc_encoding_rate_mismatch_,
-              rc_expected.max_encoding_rate_mismatch);
+    const RateControlThresholds* rc_threshold = nullptr;
+    if (rc_thresholds) {
+      rc_threshold = &(*rc_thresholds)[rate_update_index];
+
+      EXPECT_LE(perc_encoding_rate_mismatch_,
+                rc_threshold->max_encoding_rate_mismatch);
+    }
     if (num_key_frames_ > 0) {
       int perc_key_frame_size_mismatch =
           100 * sum_key_frame_size_mismatch_ / num_key_frames_;
@@ -333,8 +339,10 @@
           " # key frames           : %d\n"
           " Key frame rate mismatch: %d\n",
           num_key_frames_, perc_key_frame_size_mismatch);
-      EXPECT_LE(perc_key_frame_size_mismatch,
-                rc_expected.max_key_frame_size_mismatch);
+      if (rc_threshold) {
+        EXPECT_LE(perc_key_frame_size_mismatch,
+                  rc_threshold->max_key_frame_size_mismatch);
+      }
     }
 
     const int num_temporal_layers =
@@ -357,20 +365,20 @@
           i, bitrate_layer_[i], framerate_layer_[i], per_frame_bandwidth_[i],
           encoding_bitrate_[i], perc_frame_size_mismatch,
           perc_encoding_rate_mismatch, num_frames_per_update_[i]);
-      EXPECT_LE(perc_frame_size_mismatch,
-                rc_expected.max_delta_frame_size_mismatch);
-      EXPECT_LE(perc_encoding_rate_mismatch,
-                rc_expected.max_encoding_rate_mismatch);
+      if (rc_threshold) {
+        EXPECT_LE(perc_frame_size_mismatch,
+                  rc_threshold->max_delta_frame_size_mismatch);
+        EXPECT_LE(perc_encoding_rate_mismatch,
+                  rc_threshold->max_encoding_rate_mismatch);
+      }
     }
     printf("\n");
 
-    EXPECT_LE(num_frames_to_hit_target_, rc_expected.max_time_hit_target);
-    EXPECT_LE(num_dropped_frames, rc_expected.max_num_dropped_frames);
-    if (rc_expected.num_spatial_resizes >= 0) {
-      EXPECT_EQ(rc_expected.num_spatial_resizes, num_resize_actions);
-    }
-    if (rc_expected.num_key_frames >= 0) {
-      EXPECT_EQ(rc_expected.num_key_frames, num_key_frames_);
+    if (rc_threshold) {
+      EXPECT_LE(num_frames_to_hit_target_, rc_threshold->max_time_hit_target);
+      EXPECT_LE(num_dropped_frames, rc_threshold->max_num_dropped_frames);
+      EXPECT_EQ(rc_threshold->num_spatial_resizes, num_resize_actions);
+      EXPECT_EQ(rc_threshold->num_key_frames, num_key_frames_);
     }
   }
 
@@ -459,14 +467,11 @@
   }
 
   // Processes all frames in the clip and verifies the result.
-  // TODO(brandtr): Change the second last argument to be a
-  // const std::vector<RateControlThresholds>&, so we can ensure that the user
-  // does not expect us to do mid-clip rate updates when we are not able to,
-  // e.g., when we are operating in batch mode.
-  void ProcessFramesAndVerify(const QualityThresholds& quality_thresholds,
-                              const RateProfile& rate_profile,
-                              RateControlThresholds* rc_thresholds,
-                              const VisualizationParams* visualization_params) {
+  void ProcessFramesAndMaybeVerify(
+      const RateProfile& rate_profile,
+      const std::vector<RateControlThresholds>* rc_thresholds,
+      const QualityThresholds* quality_thresholds,
+      const VisualizationParams* visualization_params) {
     config_.codec_settings.startBitrate = rate_profile.target_bit_rate[0];
     SetUpObjects(visualization_params, rate_profile.target_bit_rate[0],
                  rate_profile.input_frame_rate[0]);
@@ -526,7 +531,7 @@
         // update layers and codec with new rates.
         if (frame_number ==
             rate_profile.frame_index_rate_update[update_index + 1]) {
-          VerifyRateControlMetrics(update_index, rc_thresholds[update_index]);
+          PrintAndMaybeVerifyRateControlMetrics(update_index, rc_thresholds);
 
           // Update layer rates and the codec with new rates.
           ++update_index;
@@ -545,7 +550,7 @@
 
     // Verify rate control metrics for all frames (if in batch mode), or for all
     // frames since the last rate update (if not in batch mode).
-    VerifyRateControlMetrics(update_index, rc_thresholds[update_index]);
+    PrintAndMaybeVerifyRateControlMetrics(update_index, rc_thresholds);
     EXPECT_EQ(num_frames, frame_number);
     EXPECT_EQ(num_frames + 1, static_cast<int>(stats_.stats_.size()));
 
@@ -572,7 +577,9 @@
                                       config_.codec_settings.width,
                                       config_.codec_settings.height,
                                       &psnr_result, &ssim_result));
-    VerifyQuality(psnr_result, ssim_result, quality_thresholds);
+    if (quality_thresholds) {
+      VerifyQuality(psnr_result, ssim_result, *quality_thresholds);
+    }
     stats_.PrintSummary();
     printf("PSNR avg: %f, min: %f\nSSIM avg: %f, min: %f\n",
            psnr_result.average, psnr_result.min, ssim_result.average,
@@ -662,25 +669,26 @@
         frame_index_rate_update;
   }
 
-  static void SetRateControlThresholds(RateControlThresholds* rc_thresholds,
-                                       int update_index,
-                                       int max_num_dropped_frames,
-                                       int max_key_frame_size_mismatch,
-                                       int max_delta_frame_size_mismatch,
-                                       int max_encoding_rate_mismatch,
-                                       int max_time_hit_target,
-                                       int num_spatial_resizes,
-                                       int num_key_frames) {
-    rc_thresholds[update_index].max_num_dropped_frames = max_num_dropped_frames;
-    rc_thresholds[update_index].max_key_frame_size_mismatch =
-        max_key_frame_size_mismatch;
-    rc_thresholds[update_index].max_delta_frame_size_mismatch =
-        max_delta_frame_size_mismatch;
-    rc_thresholds[update_index].max_encoding_rate_mismatch =
-        max_encoding_rate_mismatch;
-    rc_thresholds[update_index].max_time_hit_target = max_time_hit_target;
-    rc_thresholds[update_index].num_spatial_resizes = num_spatial_resizes;
-    rc_thresholds[update_index].num_key_frames = num_key_frames;
+  static void AddRateControlThresholds(
+      int max_num_dropped_frames,
+      int max_key_frame_size_mismatch,
+      int max_delta_frame_size_mismatch,
+      int max_encoding_rate_mismatch,
+      int max_time_hit_target,
+      int num_spatial_resizes,
+      int num_key_frames,
+      std::vector<RateControlThresholds>* rc_thresholds) {
+    RTC_DCHECK(rc_thresholds);
+
+    rc_thresholds->emplace_back();
+    RateControlThresholds* rc_threshold = &rc_thresholds->back();
+    rc_threshold->max_num_dropped_frames = max_num_dropped_frames;
+    rc_threshold->max_key_frame_size_mismatch = max_key_frame_size_mismatch;
+    rc_threshold->max_delta_frame_size_mismatch = max_delta_frame_size_mismatch;
+    rc_threshold->max_encoding_rate_mismatch = max_encoding_rate_mismatch;
+    rc_threshold->max_time_hit_target = max_time_hit_target;
+    rc_threshold->num_spatial_resizes = num_spatial_resizes;
+    rc_threshold->num_key_frames = num_key_frames;
   }
 
   // Config.