Reland "Refactor rate profile update."

This is a reland of b6cdfdc165d76d86a67d829e0ccec50c36106e73

Original change's description:
> Refactor rate profile update.
> 
> RateProfile::frame_num specifies frame at which this rate profile
> should be applied.
> 
> Bug: none
> Change-Id: I003ee43f44299a49d83f547558284817bfaeacc0
> Reviewed-on: https://webrtc-review.googlesource.com/c/115242
> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
> Reviewed-by: Seth Hampson <shampson@webrtc.org>
> Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#26080}

Bug: none
Change-Id: I2604878d0bbee0f2182ad74e3cc29546310b76f3
Reviewed-on: https://webrtc-review.googlesource.com/c/115401
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Seth Hampson <shampson@webrtc.org>
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26145}
diff --git a/api/test/videocodec_test_fixture.h b/api/test/videocodec_test_fixture.h
index 925c60c..67f9d02 100644
--- a/api/test/videocodec_test_fixture.h
+++ b/api/test/videocodec_test_fixture.h
@@ -22,11 +22,11 @@
 namespace webrtc {
 namespace test {
 
-// Rates for the encoder and the frame number when to change profile.
+// Rates for the encoder and the frame number when to apply profile.
 struct RateProfile {
   size_t target_kbps;
   size_t input_fps;
-  size_t frame_index_rate_update;
+  size_t frame_num;
 };
 
 struct RateControlThresholds {
diff --git a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
index e6b2f7b..c9c84ed 100644
--- a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc
@@ -422,27 +422,22 @@
 void VideoCodecTestFixtureImpl::ProcessAllFrames(
     rtc::TaskQueue* task_queue,
     const std::vector<RateProfile>& rate_profiles) {
-  // Process all frames.
-  size_t rate_update_index = 0;
-
   // Set initial rates.
-  task_queue->PostTask([this, &rate_profiles, rate_update_index] {
-    processor_->SetRates(rate_profiles[rate_update_index].target_kbps,
-                         rate_profiles[rate_update_index].input_fps);
+  auto rate_profile = rate_profiles.begin();
+  task_queue->PostTask([this, rate_profile] {
+    processor_->SetRates(rate_profile->target_kbps, rate_profile->input_fps);
   });
 
   cpu_process_time_->Start();
 
-  for (size_t frame_number = 0; frame_number < config_.num_frames;
-       ++frame_number) {
-    if (frame_number ==
-        rate_profiles[rate_update_index].frame_index_rate_update) {
-      ++rate_update_index;
-      RTC_DCHECK_GT(rate_profiles.size(), rate_update_index);
-
-      task_queue->PostTask([this, &rate_profiles, rate_update_index] {
-        processor_->SetRates(rate_profiles[rate_update_index].target_kbps,
-                             rate_profiles[rate_update_index].input_fps);
+  for (size_t frame_num = 0; frame_num < config_.num_frames; ++frame_num) {
+    auto next_rate_profile = std::next(rate_profile);
+    if (next_rate_profile != rate_profiles.end() &&
+        frame_num == next_rate_profile->frame_num) {
+      rate_profile = next_rate_profile;
+      task_queue->PostTask([this, rate_profile] {
+        processor_->SetRates(rate_profile->target_kbps,
+                             rate_profile->input_fps);
       });
     }
 
@@ -451,7 +446,7 @@
     if (RunEncodeInRealTime(config_)) {
       // Roughly pace the frames.
       const size_t frame_duration_ms =
-          rtc::kNumMillisecsPerSec / rate_profiles[rate_update_index].input_fps;
+          rtc::kNumMillisecsPerSec / rate_profile->input_fps;
       SleepMs(static_cast<int>(frame_duration_ms));
     }
   }
@@ -472,14 +467,13 @@
     const std::vector<RateControlThresholds>* rc_thresholds,
     const std::vector<QualityThresholds>* quality_thresholds,
     const BitstreamThresholds* bs_thresholds) {
-  for (size_t rate_update_idx = 0; rate_update_idx < rate_profiles.size();
-       ++rate_update_idx) {
-    const size_t first_frame_num =
-        (rate_update_idx == 0)
-            ? 0
-            : rate_profiles[rate_update_idx - 1].frame_index_rate_update;
+  for (size_t rate_profile_idx = 0; rate_profile_idx < rate_profiles.size();
+       ++rate_profile_idx) {
+    const size_t first_frame_num = rate_profiles[rate_profile_idx].frame_num;
     const size_t last_frame_num =
-        rate_profiles[rate_update_idx].frame_index_rate_update - 1;
+        rate_profile_idx + 1 < rate_profiles.size()
+            ? rate_profiles[rate_profile_idx + 1].frame_num - 1
+            : config_.num_frames - 1;
     RTC_CHECK(last_frame_num >= first_frame_num);
 
     std::vector<VideoStatistics> layer_stats =
@@ -495,14 +489,14 @@
     printf("%s\n", send_stat.ToString("send_").c_str());
 
     const RateControlThresholds* rc_threshold =
-        rc_thresholds ? &(*rc_thresholds)[rate_update_idx] : nullptr;
+        rc_thresholds ? &(*rc_thresholds)[rate_profile_idx] : nullptr;
     const QualityThresholds* quality_threshold =
-        quality_thresholds ? &(*quality_thresholds)[rate_update_idx] : nullptr;
+        quality_thresholds ? &(*quality_thresholds)[rate_profile_idx] : nullptr;
 
     VerifyVideoStatistic(send_stat, rc_threshold, quality_threshold,
                          bs_thresholds,
-                         rate_profiles[rate_update_idx].target_kbps,
-                         rate_profiles[rate_update_idx].input_fps);
+                         rate_profiles[rate_profile_idx].target_kbps,
+                         rate_profiles[rate_profile_idx].input_fps);
   }
 
   if (config_.print_frame_level_stats) {
diff --git a/modules/video_coding/codecs/test/videocodec_test_libvpx.cc b/modules/video_coding/codecs/test/videocodec_test_libvpx.cc
index 445b0c2..9665d1c 100644
--- a/modules/video_coding/codecs/test/videocodec_test_libvpx.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_libvpx.cc
@@ -100,7 +100,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort}};
+  std::vector<RateProfile> rate_profiles = {{500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 0, 1, 0.3, 0.1, 0, 1}};
@@ -119,9 +119,9 @@
   auto fixture = CreateVideoCodecTestFixture(config);
 
   std::vector<RateProfile> rate_profiles = {
-      {200, 30, 100},  // target_kbps, input_fps, frame_index_rate_update
-      {700, 30, 200},
-      {500, 30, kNumFramesLong}};
+      {200, 30, 0},  // target_kbps, input_fps, frame_num
+      {700, 30, 100},
+      {500, 30, 200}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 2, 0, 1, 0.5, 0.1, 0, 1},
@@ -143,9 +143,9 @@
   auto fixture = CreateVideoCodecTestFixture(config);
 
   std::vector<RateProfile> rate_profiles = {
-      {100, 24, 100},  // target_kbps, input_fps, frame_index_rate_update
-      {100, 15, 200},
-      {100, 10, kNumFramesLong}};
+      {100, 24, 0},  // target_kbps, input_fps, frame_num
+      {100, 15, 100},
+      {100, 10, 200}};
 
   // Framerate mismatch should be lower for lower framerate.
   std::vector<RateControlThresholds> rc_thresholds = {
@@ -169,7 +169,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort}};
+  std::vector<RateProfile> rate_profiles = {{500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 0, 1, 0.3, 0.1, 0, 1}};
@@ -187,7 +187,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{50, 30, kNumFramesLong}};
+  std::vector<RateProfile> rate_profiles = {{50, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {15, 3, 75, 1, 0.5, 0.4, 1, 1}};
@@ -211,7 +211,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort}};
+  std::vector<RateProfile> rate_profiles = {{500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 0, 1, 0.2, 0.1, 0, 1}};
@@ -248,9 +248,9 @@
   auto fixture = CreateVideoCodecTestFixture(config);
 
   std::vector<RateProfile> rate_profiles = {
-      {200, 30, 100},  // target_kbps, input_fps, frame_index_rate_update
-      {800, 30, 200},
-      {500, 30, kNumFramesLong}};
+      {200, 30, 0},  // target_kbps, input_fps, frame_num
+      {800, 30, 100},
+      {500, 30, 200}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 0, 1, 0.2, 0.1, 0, 1},
@@ -282,9 +282,9 @@
   auto fixture = CreateVideoCodecTestFixture(config);
 
   std::vector<RateProfile> rate_profiles = {
-      {80, 24, 100},  // target_kbps, input_fps, frame_index_rate_update
-      {80, 15, 200},
-      {80, 10, kNumFramesLong}};
+      {80, 24, 0},  // target_kbps, input_fps, frame_index_rate_update
+      {80, 15, 100},
+      {80, 10, 200}};
 
 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64)
   std::vector<RateControlThresholds> rc_thresholds = {
@@ -321,8 +321,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{200, 30, 150},
-                                            {400, 30, kNumFramesLong}};
+  std::vector<RateProfile> rate_profiles = {{200, 30, 0}, {400, 30, 150}};
 
 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64)
   std::vector<RateControlThresholds> rc_thresholds = {
@@ -358,7 +357,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{1500, 30, config.num_frames}};
+  std::vector<RateProfile> rate_profiles = {{1500, 30, 0}};
 #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64)
   std::vector<RateControlThresholds> rc_thresholds = {
       {3.5, 1.04, 6, 0.18, 0.14, 0.07, 0, 1}};
@@ -399,7 +398,7 @@
       CreateVideoCodecTestFixture(config, std::move(internal_decoder_factory),
                                   std::move(adapted_encoder_factory));
 
-  std::vector<RateProfile> rate_profiles = {{1500, 30, config.num_frames}};
+  std::vector<RateProfile> rate_profiles = {{1500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {20, 5, 90, 1, 0.5, 0.3, 0, 1}};
@@ -424,7 +423,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{1500, 30, config.num_frames}};
+  std::vector<RateProfile> rate_profiles = {{1500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 5, 1, 0.3, 0.1, 0, 1}};
@@ -447,8 +446,7 @@
 
   std::map<size_t, std::vector<VideoStatistics>> rd_stats;
   for (size_t bitrate_kbps : kBitrateRdPerfKbps) {
-    std::vector<RateProfile> rate_profiles = {
-        {bitrate_kbps, 30, config.num_frames}};
+    std::vector<RateProfile> rate_profiles = {{bitrate_kbps, 30, 0}};
 
     fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr);
 
@@ -474,8 +472,7 @@
 
   std::map<size_t, std::vector<VideoStatistics>> rd_stats;
   for (size_t bitrate_kbps : kBitrateRdPerfKbps) {
-    std::vector<RateProfile> rate_profiles = {
-        {bitrate_kbps, 30, config.num_frames}};
+    std::vector<RateProfile> rate_profiles = {{bitrate_kbps, 30, 0}};
 
     fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr);
 
diff --git a/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc b/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc
index edfc211..916f033 100644
--- a/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc
@@ -54,8 +54,7 @@
                           352, 288);
   auto fixture = CreateTestFixtureWithConfig(config);
 
-  std::vector<RateProfile> rate_profiles = {
-      {500, kForemanFramerateFps, kForemanNumFrames}};
+  std::vector<RateProfile> rate_profiles = {{500, kForemanFramerateFps, 0}};
 
   // The thresholds below may have to be tweaked to let even poor MediaCodec
   // implementations pass. If this test fails on the bots, disable it and
@@ -77,8 +76,7 @@
                           352, 288);
   auto fixture = CreateTestFixtureWithConfig(config);
 
-  std::vector<RateProfile> rate_profiles = {
-      {500, kForemanFramerateFps, kForemanNumFrames}};
+  std::vector<RateProfile> rate_profiles = {{500, kForemanFramerateFps, 0}};
 
   // The thresholds below may have to be tweaked to let even poor MediaCodec
   // implementations pass. If this test fails on the bots, disable it and
@@ -104,8 +102,7 @@
                           352, 288);
   auto fixture = CreateTestFixtureWithConfig(config);
 
-  std::vector<RateProfile> rate_profiles = {
-      {500, kForemanFramerateFps, kForemanNumFrames}};
+  std::vector<RateProfile> rate_profiles = {{500, kForemanFramerateFps, 0}};
 
   // The thresholds below may have to be tweaked to let even poor MediaCodec
   // implementations pass. If this test fails on the bots, disable it and
@@ -126,7 +123,7 @@
   const std::vector<std::tuple<int, int>> resolutions = {
       {128, 96}, {160, 120}, {176, 144}, {240, 136}, {320, 240}, {480, 272}};
   const std::vector<RateProfile> rate_profiles = {
-      {100, kForemanFramerateFps, kNumFrames}};
+      {100, kForemanFramerateFps, 0}};
   const std::vector<QualityThresholds> quality_thresholds = {
       {29, 26, 0.8, 0.75}};
 
diff --git a/modules/video_coding/codecs/test/videocodec_test_openh264.cc b/modules/video_coding/codecs/test/videocodec_test_openh264.cc
index bd4bb52..ed2171c 100644
--- a/modules/video_coding/codecs/test/videocodec_test_openh264.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_openh264.cc
@@ -45,7 +45,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{500, 30, kNumFrames}};
+  std::vector<RateProfile> rate_profiles = {{500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 0, 0.1, 0.2, 0.1, 0, 1}};
@@ -69,7 +69,7 @@
   config.encoded_frame_checker = frame_checker.get();
   auto fixture = CreateVideoCodecTestFixture(config);
 
-  std::vector<RateProfile> rate_profiles = {{500, 30, kNumFrames}};
+  std::vector<RateProfile> rate_profiles = {{500, 30, 0}};
 
   std::vector<RateControlThresholds> rc_thresholds = {
       {5, 1, 0, 0.1, 0.2, 0.1, 0, 1}};
diff --git a/modules/video_coding/codecs/test/videocodec_test_parameterized.cc b/modules/video_coding/codecs/test/videocodec_test_parameterized.cc
index efc80ad..d0ee265 100644
--- a/modules/video_coding/codecs/test/videocodec_test_parameterized.cc
+++ b/modules/video_coding/codecs/test/videocodec_test_parameterized.cc
@@ -67,8 +67,7 @@
                             kDenoisingOn, kFrameDropperOn, kSpatialResizeOn,
                             width, height);
 
-    std::vector<RateProfile> rate_profiles = {
-        {bitrate_, framerate, kNumFrames}};
+    std::vector<RateProfile> rate_profiles = {{bitrate_, framerate, 0}};
 
     fixture_ = CreateVideoCodecTestFixture(config);
     fixture_->RunTest(rate_profiles, nullptr, nullptr, nullptr);