Move TestConfig to separate file.

Move functions Set/PrintCodecSettings, NumberOfTemporalLayers to TestConfig.
Add function NumberOfCores.

Bug: none
Change-Id: Ic33d79681d59d62bf34d9c9ff056a751ed3f8da8
Reviewed-on: https://webrtc-review.googlesource.com/13120
Commit-Queue: Åsa Persson <asapersson@webrtc.org>
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20358}
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index d6547d8..9aaf700 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -367,6 +367,8 @@
       "codecs/test/predictive_packet_manipulator.h",
       "codecs/test/stats.cc",
       "codecs/test/stats.h",
+      "codecs/test/test_config.cc",
+      "codecs/test/test_config.h",
       "codecs/test/video_codec_test.cc",
       "codecs/test/video_codec_test.h",
       "codecs/test/videoprocessor.cc",
@@ -501,6 +503,7 @@
     sources = [
       "codecs/test/packet_manipulator_unittest.cc",
       "codecs/test/stats_unittest.cc",
+      "codecs/test/test_config_unittest.cc",
       "codecs/test/videoprocessor_unittest.cc",
       "codecs/vp8/default_temporal_layers_unittest.cc",
       "codecs/vp8/screenshare_layers_unittest.cc",
diff --git a/modules/video_coding/codecs/test/stats.cc b/modules/video_coding/codecs/test/stats.cc
index 490d2d5..7024764 100644
--- a/modules/video_coding/codecs/test/stats.cc
+++ b/modules/video_coding/codecs/test/stats.cc
@@ -74,6 +74,7 @@
   size_t total_encoded_delta_frame_size_bytes = 0;
   size_t num_key_frames = 0;
   size_t num_delta_frames = 0;
+  int num_encode_failures = 0;
 
   for (const FrameStatistic& stat : stats_) {
     total_encoding_time_us += stat.encode_time_us;
@@ -86,9 +87,13 @@
       total_encoded_delta_frame_size_bytes += stat.encoded_frame_size_bytes;
       ++num_delta_frames;
     }
+    if (stat.encode_return_code != 0) {
+      ++num_encode_failures;
+    }
   }
 
   // Encoding stats.
+  printf("# Encoded frame failures: %d\n", num_encode_failures);
   printf("Encoding time:\n");
   auto frame_it =
       std::min_element(stats_.begin(), stats_.end(), LessForEncodeTime);
diff --git a/modules/video_coding/codecs/test/test_config.cc b/modules/video_coding/codecs/test/test_config.cc
new file mode 100644
index 0000000..042c2b6
--- /dev/null
+++ b/modules/video_coding/codecs/test/test_config.cc
@@ -0,0 +1,140 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "modules/video_coding/codecs/test/test_config.h"
+
+#include <string.h>
+
+#include "modules/video_coding/include/video_codec_interface.h"
+#include "rtc_base/checks.h"
+#include "system_wrappers/include/cpu_info.h"
+#include "test/video_codec_settings.h"
+
+namespace webrtc {
+namespace test {
+
+namespace {
+const int kBaseKeyFrameInterval = 3000;
+}  // namespace
+
+void TestConfig::SetCodecSettings(VideoCodecType codec_type,
+                                  int num_temporal_layers,
+                                  bool error_concealment_on,
+                                  bool denoising_on,
+                                  bool frame_dropper_on,
+                                  bool spatial_resize_on,
+                                  bool resilience_on,
+                                  int width,
+                                  int height) {
+  webrtc::test::CodecSettings(codec_type, &codec_settings);
+
+  // TODO(brandtr): Move the setting of |width| and |height| to the tests, and
+  // DCHECK that they are set before initializing the codec instead.
+  codec_settings.width = width;
+  codec_settings.height = height;
+
+  switch (codec_settings.codecType) {
+    case kVideoCodecVP8:
+      codec_settings.VP8()->resilience =
+          resilience_on ? kResilientStream : kResilienceOff;
+      codec_settings.VP8()->numberOfTemporalLayers = num_temporal_layers;
+      codec_settings.VP8()->denoisingOn = denoising_on;
+      codec_settings.VP8()->errorConcealmentOn = error_concealment_on;
+      codec_settings.VP8()->automaticResizeOn = spatial_resize_on;
+      codec_settings.VP8()->frameDroppingOn = frame_dropper_on;
+      codec_settings.VP8()->keyFrameInterval = kBaseKeyFrameInterval;
+      break;
+    case kVideoCodecVP9:
+      codec_settings.VP9()->resilienceOn = resilience_on;
+      codec_settings.VP9()->numberOfTemporalLayers = num_temporal_layers;
+      codec_settings.VP9()->denoisingOn = denoising_on;
+      codec_settings.VP9()->frameDroppingOn = frame_dropper_on;
+      codec_settings.VP9()->keyFrameInterval = kBaseKeyFrameInterval;
+      codec_settings.VP9()->automaticResizeOn = spatial_resize_on;
+      break;
+    case kVideoCodecH264:
+      codec_settings.H264()->frameDroppingOn = frame_dropper_on;
+      codec_settings.H264()->keyFrameInterval = kBaseKeyFrameInterval;
+      break;
+    default:
+      RTC_NOTREACHED();
+      break;
+  }
+}
+
+int TestConfig::NumberOfCores() const {
+  return use_single_core ? 1 : CpuInfo::DetectNumberOfCores();
+}
+
+int TestConfig::NumberOfTemporalLayers() const {
+  if (codec_settings.codecType == kVideoCodecVP8) {
+    return codec_settings.VP8().numberOfTemporalLayers;
+  } else if (codec_settings.codecType == kVideoCodecVP9) {
+    return codec_settings.VP9().numberOfTemporalLayers;
+  } else {
+    return 1;
+  }
+}
+
+void TestConfig::Print() const {
+  printf("Video config:\n");
+  printf(" Filename         : %s\n", filename.c_str());
+  printf(" # CPU cores used : %u\n", NumberOfCores());
+  PrintCodecSettings();
+  printf("\n");
+}
+
+void TestConfig::PrintCodecSettings() const {
+  printf(" Codec settings:\n");
+  printf("  Codec type        : %s\n",
+         CodecTypeToPayloadString(codec_settings.codecType));
+  printf("  Start bitrate     : %d kbps\n", codec_settings.startBitrate);
+  printf("  Max bitrate       : %d kbps\n", codec_settings.maxBitrate);
+  printf("  Min bitrate       : %d kbps\n", codec_settings.minBitrate);
+  printf("  Width             : %d\n", codec_settings.width);
+  printf("  Height            : %d\n", codec_settings.height);
+  printf("  Max frame rate    : %d\n", codec_settings.maxFramerate);
+  printf("  QPmax             : %d\n", codec_settings.qpMax);
+  if (codec_settings.codecType == kVideoCodecVP8) {
+    printf("  Complexity        : %d\n", codec_settings.VP8().complexity);
+    printf("  Resilience        : %d\n", codec_settings.VP8().resilience);
+    printf("  # temporal layers : %d\n",
+           codec_settings.VP8().numberOfTemporalLayers);
+    printf("  Denoising         : %d\n", codec_settings.VP8().denoisingOn);
+    printf("  Error concealment : %d\n",
+           codec_settings.VP8().errorConcealmentOn);
+    printf("  Automatic resize  : %d\n",
+           codec_settings.VP8().automaticResizeOn);
+    printf("  Frame dropping    : %d\n", codec_settings.VP8().frameDroppingOn);
+    printf("  Key frame interval: %d\n", codec_settings.VP8().keyFrameInterval);
+  } else if (codec_settings.codecType == kVideoCodecVP9) {
+    printf("  Complexity        : %d\n", codec_settings.VP9().complexity);
+    printf("  Resilience        : %d\n", codec_settings.VP9().resilienceOn);
+    printf("  # temporal layers : %d\n",
+           codec_settings.VP9().numberOfTemporalLayers);
+    printf("  Denoising         : %d\n", codec_settings.VP9().denoisingOn);
+    printf("  Frame dropping    : %d\n", codec_settings.VP9().frameDroppingOn);
+    printf("  Key frame interval: %d\n", codec_settings.VP9().keyFrameInterval);
+    printf("  Adaptive QP mode  : %d\n", codec_settings.VP9().adaptiveQpMode);
+    printf("  Automatic resize  : %d\n",
+           codec_settings.VP9().automaticResizeOn);
+    printf("  # spatial layers  : %d\n",
+           codec_settings.VP9().numberOfSpatialLayers);
+    printf("  Flexible mode     : %d\n", codec_settings.VP9().flexibleMode);
+  } else if (codec_settings.codecType == kVideoCodecH264) {
+    printf("  Frame dropping    : %d\n", codec_settings.H264().frameDroppingOn);
+    printf("  Key frame interval: %d\n",
+           codec_settings.H264().keyFrameInterval);
+    printf("  Profile           : %d\n", codec_settings.H264().profile);
+  }
+}
+
+}  // namespace test
+}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/test_config.h b/modules/video_coding/codecs/test/test_config.h
new file mode 100644
index 0000000..06aa08c
--- /dev/null
+++ b/modules/video_coding/codecs/test/test_config.h
@@ -0,0 +1,111 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef MODULES_VIDEO_CODING_CODECS_TEST_TEST_CONFIG_H_
+#define MODULES_VIDEO_CODING_CODECS_TEST_TEST_CONFIG_H_
+
+#include <string>
+
+#include "common_types.h"  // NOLINT(build/include)
+#include "modules/video_coding/codecs/h264/include/h264_globals.h"
+#include "modules/video_coding/codecs/test/packet_manipulator.h"
+
+namespace webrtc {
+namespace test {
+
+// Defines which frame types shall be excluded from packet loss and when.
+enum ExcludeFrameTypes {
+  // Will exclude the first keyframe in the video sequence from packet loss.
+  // Following keyframes will be targeted for packet loss.
+  kExcludeOnlyFirstKeyFrame,
+  // Exclude all keyframes from packet loss, no matter where in the video
+  // sequence they occur.
+  kExcludeAllKeyFrames
+};
+
+// Test configuration for a test run.
+struct TestConfig {
+  void SetCodecSettings(VideoCodecType codec_type,
+                        int num_temporal_layers,
+                        bool error_concealment_on,
+                        bool denoising_on,
+                        bool frame_dropper_on,
+                        bool spatial_resize_on,
+                        bool resilience_on,
+                        int width,
+                        int height);
+
+  int NumberOfCores() const;
+  int NumberOfTemporalLayers() const;
+  void Print() const;
+  void PrintCodecSettings() const;
+
+  // Plain name of YUV file to process without file extension.
+  std::string filename;
+
+  // File to process. This must be a video file in the YUV format.
+  std::string input_filename;
+
+  // File to write to during processing for the test. Will be a video file in
+  // the YUV format.
+  std::string output_filename;
+
+  // Number of frames to process.
+  int num_frames = 0;
+
+  // Configurations related to networking.
+  NetworkingConfig networking_config;
+
+  // Decides how the packet loss simulations shall exclude certain frames from
+  // packet loss.
+  ExcludeFrameTypes exclude_frame_types = kExcludeOnlyFirstKeyFrame;
+
+  // Force the encoder and decoder to use a single core for processing.
+  // Using a single core is necessary to get a deterministic behavior for the
+  // encoded frames - using multiple cores will produce different encoded frames
+  // since multiple cores are competing to consume the byte budget for each
+  // frame in parallel.
+  // If set to false, the maximum number of available cores will be used.
+  bool use_single_core = false;
+
+  // Should cpu usage be measured?
+  // If set to true, the encoding will run in real-time.
+  bool measure_cpu = false;
+
+  // If > 0: forces the encoder to create a keyframe every Nth frame.
+  // Note that the encoder may create a keyframe in other locations in addition
+  // to this setting. Forcing key frames may also affect encoder planning
+  // optimizations in a negative way, since it will suddenly be forced to
+  // produce an expensive key frame.
+  int keyframe_interval = 0;
+
+  // Codec settings to use.
+  webrtc::VideoCodec codec_settings;
+
+  // If printing of information to stdout shall be performed during processing.
+  bool verbose = true;
+
+  // Should hardware accelerated codecs be used?
+  bool hw_encoder = false;
+  bool hw_decoder = false;
+
+  // Should the hardware codecs be wrapped in software fallbacks?
+  bool sw_fallback_encoder = false;
+  bool sw_fallback_decoder = false;
+
+  // RTP H264 packetization mode.
+  H264PacketizationMode packetization_mode =
+      webrtc::H264PacketizationMode::NonInterleaved;
+};
+
+}  // namespace test
+}  // namespace webrtc
+
+#endif  // MODULES_VIDEO_CODING_CODECS_TEST_TEST_CONFIG_H_
diff --git a/modules/video_coding/codecs/test/test_config_unittest.cc b/modules/video_coding/codecs/test/test_config_unittest.cc
new file mode 100644
index 0000000..0ec784c
--- /dev/null
+++ b/modules/video_coding/codecs/test/test_config_unittest.cc
@@ -0,0 +1,55 @@
+/*
+ *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "modules/video_coding/codecs/test/test_config.h"
+#include "test/gtest.h"
+#include "test/video_codec_settings.h"
+
+namespace webrtc {
+namespace test {
+
+namespace {
+const int kNumTemporalLayers = 2;
+}  // namespace
+
+TEST(TestConfig, NumberOfCoresWithUseSingleCore) {
+  TestConfig config;
+  config.use_single_core = true;
+  EXPECT_EQ(1, config.NumberOfCores());
+}
+
+TEST(TestConfig, NumberOfCoresWithoutUseSingleCore) {
+  TestConfig config;
+  config.use_single_core = false;
+  EXPECT_GE(config.NumberOfCores(), 1);
+}
+
+TEST(TestConfig, NumberOfTemporalLayersIsOne) {
+  TestConfig config;
+  webrtc::test::CodecSettings(kVideoCodecH264, &config.codec_settings);
+  EXPECT_EQ(1, config.NumberOfTemporalLayers());
+}
+
+TEST(TestConfig, NumberOfTemporalLayers_Vp8) {
+  TestConfig config;
+  webrtc::test::CodecSettings(kVideoCodecVP8, &config.codec_settings);
+  config.codec_settings.VP8()->numberOfTemporalLayers = kNumTemporalLayers;
+  EXPECT_EQ(kNumTemporalLayers, config.NumberOfTemporalLayers());
+}
+
+TEST(TestConfig, NumberOfTemporalLayers_Vp9) {
+  TestConfig config;
+  webrtc::test::CodecSettings(kVideoCodecVP9, &config.codec_settings);
+  config.codec_settings.VP9()->numberOfTemporalLayers = kNumTemporalLayers;
+  EXPECT_EQ(kNumTemporalLayers, config.NumberOfTemporalLayers());
+}
+
+}  // namespace test
+}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor.cc b/modules/video_coding/codecs/test/videoprocessor.cc
index 9553dd7..60e7c4a 100644
--- a/modules/video_coding/codecs/test/videoprocessor.cc
+++ b/modules/video_coding/codecs/test/videoprocessor.cc
@@ -10,8 +10,6 @@
 
 #include "modules/video_coding/codecs/test/videoprocessor.h"
 
-#include <string.h>
-
 #include <algorithm>
 #include <limits>
 #include <utility>
@@ -23,9 +21,7 @@
 #include "modules/video_coding/include/video_codec_initializer.h"
 #include "modules/video_coding/utility/default_video_bitrate_allocator.h"
 #include "rtc_base/checks.h"
-#include "rtc_base/logging.h"
 #include "rtc_base/timeutils.h"
-#include "system_wrappers/include/cpu_info.h"
 #include "test/gtest.h"
 
 namespace webrtc {
@@ -47,51 +43,6 @@
                                                     std::move(tl_factory)));
 }
 
-void PrintCodecSettings(const VideoCodec& codec_settings) {
-  printf(" Codec settings:\n");
-  printf("  Codec type        : %s\n",
-         CodecTypeToPayloadString(codec_settings.codecType));
-  printf("  Start bitrate     : %d kbps\n", codec_settings.startBitrate);
-  printf("  Max bitrate       : %d kbps\n", codec_settings.maxBitrate);
-  printf("  Min bitrate       : %d kbps\n", codec_settings.minBitrate);
-  printf("  Width             : %d\n", codec_settings.width);
-  printf("  Height            : %d\n", codec_settings.height);
-  printf("  Max frame rate    : %d\n", codec_settings.maxFramerate);
-  printf("  QPmax             : %d\n", codec_settings.qpMax);
-  if (codec_settings.codecType == kVideoCodecVP8) {
-    printf("  Complexity        : %d\n", codec_settings.VP8().complexity);
-    printf("  Resilience        : %d\n", codec_settings.VP8().resilience);
-    printf("  # temporal layers : %d\n",
-           codec_settings.VP8().numberOfTemporalLayers);
-    printf("  Denoising         : %d\n", codec_settings.VP8().denoisingOn);
-    printf("  Error concealment : %d\n",
-           codec_settings.VP8().errorConcealmentOn);
-    printf("  Automatic resize  : %d\n",
-           codec_settings.VP8().automaticResizeOn);
-    printf("  Frame dropping    : %d\n", codec_settings.VP8().frameDroppingOn);
-    printf("  Key frame interval: %d\n", codec_settings.VP8().keyFrameInterval);
-  } else if (codec_settings.codecType == kVideoCodecVP9) {
-    printf("  Complexity        : %d\n", codec_settings.VP9().complexity);
-    printf("  Resilience        : %d\n", codec_settings.VP9().resilienceOn);
-    printf("  # temporal layers : %d\n",
-           codec_settings.VP9().numberOfTemporalLayers);
-    printf("  Denoising         : %d\n", codec_settings.VP9().denoisingOn);
-    printf("  Frame dropping    : %d\n", codec_settings.VP9().frameDroppingOn);
-    printf("  Key frame interval: %d\n", codec_settings.VP9().keyFrameInterval);
-    printf("  Adaptive QP mode  : %d\n", codec_settings.VP9().adaptiveQpMode);
-    printf("  Automatic resize  : %d\n",
-           codec_settings.VP9().automaticResizeOn);
-    printf("  # spatial layers  : %d\n",
-           codec_settings.VP9().numberOfSpatialLayers);
-    printf("  Flexible mode     : %d\n", codec_settings.VP9().flexibleMode);
-  } else if (codec_settings.codecType == kVideoCodecH264) {
-    printf("  Frame dropping    : %d\n", codec_settings.H264().frameDroppingOn);
-    printf("  Key frame interval: %d\n",
-           codec_settings.H264().keyFrameInterval);
-    printf("  Profile           : %d\n", codec_settings.H264().profile);
-  }
-}
-
 void VerifyQpParser(const EncodedImage& encoded_frame,
                     const TestConfig& config) {
   if (config.hw_encoder)
@@ -135,10 +86,6 @@
 
 }  // namespace
 
-int TestConfig::NumberOfCores() const {
-  return use_single_core ? 1 : CpuInfo::DetectNumberOfCores();
-}
-
 VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder,
                                webrtc::VideoDecoder* decoder,
                                FrameReader* analysis_frame_reader,
@@ -191,35 +138,16 @@
       << "Failed to register decode complete callback";
 
   // Initialize the encoder and decoder.
-  int num_cores = config_.NumberOfCores();
   RTC_CHECK_EQ(
-      encoder_->InitEncode(&config_.codec_settings, num_cores,
+      encoder_->InitEncode(&config_.codec_settings, config_.NumberOfCores(),
                            config_.networking_config.max_payload_size_in_bytes),
       WEBRTC_VIDEO_CODEC_OK)
       << "Failed to initialize VideoEncoder";
 
-  RTC_CHECK_EQ(decoder_->InitDecode(&config_.codec_settings, num_cores),
-               WEBRTC_VIDEO_CODEC_OK)
+  RTC_CHECK_EQ(
+      decoder_->InitDecode(&config_.codec_settings, config_.NumberOfCores()),
+      WEBRTC_VIDEO_CODEC_OK)
       << "Failed to initialize VideoDecoder";
-
-  if (config_.verbose) {
-    printf("Video Processor:\n");
-    printf(" Filename         : %s\n", config_.filename.c_str());
-    printf(" Total # of frames: %d\n",
-           analysis_frame_reader_->NumberOfFrames());
-    printf(" # CPU cores used : %d\n", num_cores);
-    const char* encoder_name = encoder_->ImplementationName();
-    printf(" Encoder implementation name: %s\n", encoder_name);
-    const char* decoder_name = decoder_->ImplementationName();
-    printf(" Decoder implementation name: %s\n", decoder_name);
-    if (strcmp(encoder_name, decoder_name) == 0) {
-      printf(" Codec implementation name  : %s_%s\n",
-             CodecTypeToPayloadString(config_.codec_settings.codecType),
-             encoder_->ImplementationName());
-    }
-    PrintCodecSettings(config_.codec_settings);
-    printf("\n");
-  }
 }
 
 void VideoProcessor::Release() {
@@ -269,12 +197,6 @@
   frame_stat->encode_start_ns = rtc::TimeNanos();
   frame_stat->encode_return_code =
       encoder_->Encode(source_frame, nullptr, &frame_types);
-
-  if (frame_stat->encode_return_code != WEBRTC_VIDEO_CODEC_OK) {
-    LOG(LS_WARNING) << "Failed to encode frame " << last_inputed_frame_num_
-                    << ", return code: " << frame_stat->encode_return_code
-                    << ".";
-  }
 }
 
 void VideoProcessor::SetRates(int bitrate_kbps, int framerate_fps) {
@@ -457,9 +379,8 @@
   RTC_CHECK_GT(frame_number, last_decoded_frame_num_);
   last_decoded_frame_num_ = frame_number;
 
-  // Check if frame size is different from the original size, and if so,
-  // scale back to original size. This is needed for the PSNR and SSIM
-  // calculations.
+  // Check if frame size is different from the original size, and if so, scale
+  // back to original size. This is needed for the PSNR and SSIM calculations.
   size_t extracted_length;
   rtc::Buffer extracted_buffer;
   if (image.width() != config_.codec_settings.width ||
diff --git a/modules/video_coding/codecs/test/videoprocessor.h b/modules/video_coding/codecs/test/videoprocessor.h
index af7a33a..d82ae9a 100644
--- a/modules/video_coding/codecs/test/videoprocessor.h
+++ b/modules/video_coding/codecs/test/videoprocessor.h
@@ -21,6 +21,7 @@
 #include "modules/video_coding/codecs/h264/include/h264_globals.h"
 #include "modules/video_coding/codecs/test/packet_manipulator.h"
 #include "modules/video_coding/codecs/test/stats.h"
+#include "modules/video_coding/codecs/test/test_config.h"
 #include "modules/video_coding/include/video_codec_interface.h"
 #include "modules/video_coding/utility/ivf_file_writer.h"
 #include "modules/video_coding/utility/vp8_header_parser.h"
@@ -39,79 +40,6 @@
 
 namespace test {
 
-// Defines which frame types shall be excluded from packet loss and when.
-enum ExcludeFrameTypes {
-  // Will exclude the first keyframe in the video sequence from packet loss.
-  // Following keyframes will be targeted for packet loss.
-  kExcludeOnlyFirstKeyFrame,
-  // Exclude all keyframes from packet loss, no matter where in the video
-  // sequence they occur.
-  kExcludeAllKeyFrames
-};
-
-// Test configuration for a test run.
-struct TestConfig {
-  // Returns the number of cores to use.
-  int NumberOfCores() const;
-
-  // Plain name of YUV file to process without file extension.
-  std::string filename;
-
-  // File to process. This must be a video file in the YUV format.
-  std::string input_filename;
-
-  // File to write to during processing for the test. Will be a video file
-  // in the YUV format.
-  std::string output_filename;
-
-  // Number of frames to process.
-  int num_frames = 0;
-
-  // Configurations related to networking.
-  NetworkingConfig networking_config;
-
-  // Decides how the packet loss simulations shall exclude certain frames
-  // from packet loss.
-  ExcludeFrameTypes exclude_frame_types = kExcludeOnlyFirstKeyFrame;
-
-  // Force the encoder and decoder to use a single core for processing.
-  // Using a single core is necessary to get a deterministic behavior for the
-  // encoded frames - using multiple cores will produce different encoded frames
-  // since multiple cores are competing to consume the byte budget for each
-  // frame in parallel.
-  // If set to false, the maximum number of available cores will be used.
-  bool use_single_core = false;
-
-  // Should cpu usage be measured?
-  // If set to true, the encoding will run in real-time.
-  bool measure_cpu = false;
-
-  // If > 0: forces the encoder to create a keyframe every Nth frame.
-  // Note that the encoder may create a keyframe in other locations in addition
-  // to this setting. Forcing key frames may also affect encoder planning
-  // optimizations in a negative way, since it will suddenly be forced to
-  // produce an expensive key frame.
-  int keyframe_interval = 0;
-
-  // Codec settings to use.
-  webrtc::VideoCodec codec_settings;
-
-  // If printing of information to stdout shall be performed during processing.
-  bool verbose = true;
-
-  // Should hardware accelerated codecs be used?
-  bool hw_encoder = false;
-  bool hw_decoder = false;
-
-  // Should the hardware codecs be wrapped in software fallbacks?
-  bool sw_fallback_encoder = false;
-  bool sw_fallback_decoder = false;
-
-  // RTP H264 packetization mode.
-  H264PacketizationMode packetization_mode =
-      H264PacketizationMode::NonInterleaved;
-};
-
 // Handles encoding/decoding of video using the VideoEncoder/VideoDecoder
 // interfaces. This is done in a sequential manner in order to be able to
 // measure times properly.
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
index f54302a..05c9c60 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
@@ -32,12 +32,10 @@
 #include "rtc_base/cpu_time.h"
 #include "rtc_base/event.h"
 #include "rtc_base/file.h"
-#include "rtc_base/logging.h"
 #include "rtc_base/ptr_util.h"
 #include "system_wrappers/include/sleep.h"
 #include "test/testsupport/fileutils.h"
 #include "test/testsupport/metrics/video_metrics.h"
-#include "test/video_codec_settings.h"
 
 namespace webrtc {
 namespace test {
@@ -45,7 +43,6 @@
 namespace {
 
 const int kMaxBitrateMismatchPercent = 20;
-const int kBaseKeyFrameInterval = 3000;
 
 // Parameters from VP8 wrapper, which control target size of key frames.
 const float kInitialBufferSize = 0.5f;
@@ -68,16 +65,6 @@
   printf("\n");
 }
 
-int NumberOfTemporalLayers(const VideoCodec& codec_settings) {
-  if (codec_settings.codecType == kVideoCodecVP8) {
-    return codec_settings.VP8().numberOfTemporalLayers;
-  } else if (codec_settings.codecType == kVideoCodecVP9) {
-    return codec_settings.VP9().numberOfTemporalLayers;
-  } else {
-    return 1;
-  }
-}
-
 bool RunEncodeInRealTime(const TestConfig& config) {
   if (config.measure_cpu) {
     return true;
@@ -132,54 +119,6 @@
 
 VideoProcessorIntegrationTest::~VideoProcessorIntegrationTest() = default;
 
-void VideoProcessorIntegrationTest::SetCodecSettings(TestConfig* config,
-                                                     VideoCodecType codec_type,
-                                                     int num_temporal_layers,
-                                                     bool error_concealment_on,
-                                                     bool denoising_on,
-                                                     bool frame_dropper_on,
-                                                     bool spatial_resize_on,
-                                                     bool resilience_on,
-                                                     int width,
-                                                     int height) {
-  webrtc::test::CodecSettings(codec_type, &config->codec_settings);
-
-  // TODO(brandtr): Move the setting of |width| and |height| to the tests, and
-  // DCHECK that they are set before initializing the codec instead.
-  config->codec_settings.width = width;
-  config->codec_settings.height = height;
-
-  switch (config->codec_settings.codecType) {
-    case kVideoCodecVP8:
-      config->codec_settings.VP8()->resilience =
-          resilience_on ? kResilientStream : kResilienceOff;
-      config->codec_settings.VP8()->numberOfTemporalLayers =
-          num_temporal_layers;
-      config->codec_settings.VP8()->denoisingOn = denoising_on;
-      config->codec_settings.VP8()->errorConcealmentOn = error_concealment_on;
-      config->codec_settings.VP8()->automaticResizeOn = spatial_resize_on;
-      config->codec_settings.VP8()->frameDroppingOn = frame_dropper_on;
-      config->codec_settings.VP8()->keyFrameInterval = kBaseKeyFrameInterval;
-      break;
-    case kVideoCodecVP9:
-      config->codec_settings.VP9()->resilienceOn = resilience_on;
-      config->codec_settings.VP9()->numberOfTemporalLayers =
-          num_temporal_layers;
-      config->codec_settings.VP9()->denoisingOn = denoising_on;
-      config->codec_settings.VP9()->frameDroppingOn = frame_dropper_on;
-      config->codec_settings.VP9()->keyFrameInterval = kBaseKeyFrameInterval;
-      config->codec_settings.VP9()->automaticResizeOn = spatial_resize_on;
-      break;
-    case kVideoCodecH264:
-      config->codec_settings.H264()->frameDroppingOn = frame_dropper_on;
-      config->codec_settings.H264()->keyFrameInterval = kBaseKeyFrameInterval;
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
 // Processes all frames in the clip and verifies the result.
 void VideoProcessorIntegrationTest::ProcessFramesAndMaybeVerify(
     const std::vector<RateProfile>& rate_profiles,
@@ -195,6 +134,7 @@
 
   SetUpAndInitObjects(&task_queue, rate_profiles[0].target_kbps,
                       rate_profiles[0].input_fps, visualization_params);
+  MaybePrintSettings();
 
   // Set initial rates.
   int rate_update_index = 0;
@@ -540,8 +480,7 @@
   EXPECT_LE(actual_.BitrateMismatchPercent(target_.kbps),
             rc_threshold.max_bitrate_mismatch_percent);
 
-  const int num_temporal_layers =
-      NumberOfTemporalLayers(config_.codec_settings);
+  const int num_temporal_layers = config_.NumberOfTemporalLayers();
   for (int i = 0; i < num_temporal_layers; ++i) {
     EXPECT_LE(actual_.DeltaFrameSizeMismatchPercent(i),
               rc_threshold.max_delta_framesize_mismatch_percent);
@@ -568,8 +507,7 @@
   printf(" Key frame rate mismatch: %d\n",
          actual_.KeyFrameSizeMismatchPercent());
 
-  const int num_temporal_layers =
-      NumberOfTemporalLayers(config_.codec_settings);
+  const int num_temporal_layers = config_.NumberOfTemporalLayers();
   for (int i = 0; i < num_temporal_layers; ++i) {
     printf(" Temporal layer #%d:\n", i);
     printf("  Layer target bitrate        : %f\n", target_.kbps_layer[i]);
@@ -586,6 +524,24 @@
   printf("\n");
 }
 
+void VideoProcessorIntegrationTest::MaybePrintSettings() const {
+  if (!config_.verbose)
+    return;
+
+  config_.Print();
+  printf(" Total # of frames: %d\n", analysis_frame_reader_->NumberOfFrames());
+  const char* encoder_name = encoder_->ImplementationName();
+  const char* decoder_name = decoder_->ImplementationName();
+  printf(" Encoder implementation name: %s\n", encoder_name);
+  printf(" Decoder implementation name: %s\n", decoder_name);
+  if (strcmp(encoder_name, decoder_name) == 0) {
+    printf(" Codec implementation name  : %s_%s\n",
+           CodecTypeToPayloadString(config_.codec_settings.codecType),
+           encoder_name);
+  }
+  printf("\n");
+}
+
 void VideoProcessorIntegrationTest::VerifyBitstream(
     int frame_number,
     const BitstreamThresholds& bs_thresholds) {
@@ -598,7 +554,7 @@
 int VideoProcessorIntegrationTest::TemporalLayerIndexForFrame(
     int frame_number) const {
   int tl_idx = -1;
-  switch (NumberOfTemporalLayers(config_.codec_settings)) {
+  switch (config_.NumberOfTemporalLayers()) {
     case 1:
       tl_idx = 0;
       break;
@@ -659,8 +615,7 @@
 }
 
 void VideoProcessorIntegrationTest::SetRatesPerTemporalLayer() {
-  const int num_temporal_layers =
-      NumberOfTemporalLayers(config_.codec_settings);
+  const int num_temporal_layers = config_.NumberOfTemporalLayers();
   RTC_DCHECK_LE(num_temporal_layers, kMaxNumTemporalLayers);
 
   for (int i = 0; i < num_temporal_layers; ++i) {
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
index 827edc1..6b0d33d 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
@@ -20,6 +20,7 @@
 #include "media/engine/webrtcvideoencoderfactory.h"
 #include "modules/video_coding/codecs/test/packet_manipulator.h"
 #include "modules/video_coding/codecs/test/stats.h"
+#include "modules/video_coding/codecs/test/test_config.h"
 #include "modules/video_coding/codecs/test/videoprocessor.h"
 #include "modules/video_coding/utility/ivf_file_writer.h"
 #include "test/gtest.h"
@@ -93,17 +94,6 @@
   VideoProcessorIntegrationTest();
   ~VideoProcessorIntegrationTest() override;
 
-  static void SetCodecSettings(TestConfig* config,
-                               VideoCodecType codec_type,
-                               int num_temporal_layers,
-                               bool error_concealment_on,
-                               bool denoising_on,
-                               bool frame_dropper_on,
-                               bool spatial_resize_on,
-                               bool resilience_on,
-                               int width,
-                               int height);
-
   void ProcessFramesAndMaybeVerify(
       const std::vector<RateProfile>& rate_profiles,
       const std::vector<RateControlThresholds>* rc_thresholds,
@@ -183,6 +173,8 @@
   void VerifyBitstream(int frame_number,
                        const BitstreamThresholds& bs_thresholds);
 
+  void MaybePrintSettings() const;
+
   // Codecs.
   std::unique_ptr<VideoEncoder> encoder_;
   std::unique_ptr<VideoDecoder> decoder_;
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc
index 7ba146e..f6f9b45a 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc
@@ -57,8 +57,8 @@
 // VP9: Run with no packet loss and fixed bitrate. Quality should be very high.
 // One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTestLibvpx, Process0PercentPacketLossVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP9, 1, false, false, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
   config_.num_frames = kNumFramesShort;
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort + 1}};
@@ -78,8 +78,8 @@
 TEST_F(VideoProcessorIntegrationTestLibvpx, Process5PercentPacketLossVP9) {
   config_.networking_config.packet_loss_probability = 0.05f;
   config_.num_frames = kNumFramesShort;
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP9, 1, false, false, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort + 1}};
 
@@ -98,8 +98,8 @@
 // target rate/per-frame bandwidth (for each rate update) is within limits.
 // One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessNoLossChangeBitRateVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP9, 1, false, false, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {
       {200, 30, 100},  // target_kbps, input_fps, frame_index_rate_update
@@ -126,8 +126,8 @@
 // metrics averaged over whole sequence run.
 TEST_F(VideoProcessorIntegrationTestLibvpx,
        ProcessNoLossChangeFrameRateFrameDropVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP9, 1, false, false, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {
       {100, 24, 100},  // target_kbps, input_fps, frame_index_rate_update
@@ -148,8 +148,8 @@
 
 // VP9: Run with no packet loss and denoiser on. One key frame (first frame).
 TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessNoLossDenoiserOnVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP9, 1, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
   config_.num_frames = kNumFramesShort;
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort + 1}};
@@ -169,8 +169,8 @@
 // Resize happens on delta frame. Expect only one key frame (first frame).
 TEST_F(VideoProcessorIntegrationTestLibvpx,
        DISABLED_ProcessNoLossSpatialResizeFrameDropVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, true,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP9, 1, false, false, true, true,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {{50, 30, kNumFramesLong + 1}};
 
@@ -193,8 +193,8 @@
 // One key frame (first frame only) in sequence. Setting |key_frame_interval|
 // to -1 below means no periodic key frames in test.
 TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessZeroPacketLoss) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
   config_.num_frames = kNumFramesShort;
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort + 1}};
@@ -213,8 +213,8 @@
 // lower. One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTestLibvpx, Process5PercentPacketLoss) {
   config_.networking_config.packet_loss_probability = 0.05f;
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
   config_.num_frames = kNumFramesShort;
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort + 1}};
@@ -233,8 +233,8 @@
 // One key frame (first frame only) in sequence.
 TEST_F(VideoProcessorIntegrationTestLibvpx, Process10PercentPacketLoss) {
   config_.networking_config.packet_loss_probability = 0.1f;
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
   config_.num_frames = kNumFramesShort;
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFramesShort + 1}};
@@ -273,8 +273,8 @@
 #endif
 TEST_F(VideoProcessorIntegrationTestLibvpx,
        MAYBE_ProcessNoLossChangeBitRateVP8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {
       {200, 30, 100},  // target_kbps, input_fps, frame_index_rate_update
@@ -309,8 +309,8 @@
 #endif
 TEST_F(VideoProcessorIntegrationTestLibvpx,
        MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {
       {80, 24, 100},  // target_kbps, input_fps, frame_index_rate_update
@@ -343,8 +343,8 @@
 #endif
 TEST_F(VideoProcessorIntegrationTestLibvpx,
        MAYBE_ProcessNoLossTemporalLayersVP8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 3, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecVP8, 3, false, true, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {{200, 30, 150},
                                             {400, 30, kNumFramesLong + 1}};
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc
index 9f03308..8ad02b3 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc
@@ -41,8 +41,8 @@
 };
 
 TEST_F(VideoProcessorIntegrationTestMediaCodec, ForemanCif500kbpsVp8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, false, false, false,
-                   false, 352, 288);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, false, false, false, false,
+                           352, 288);
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kForemanNumFrames + 1}};
 
@@ -67,8 +67,8 @@
   config_.filename = "foreman_320x240";
   config_.input_filename = ResourcePath(config_.filename, "yuv");
   config_.sw_fallback_encoder = true;
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, false, false, false,
-                   false, 320, 240);
+  config_.SetCodecSettings(kVideoCodecVP8, 1, false, false, false, false, false,
+                           320, 240);
 
   std::vector<RateProfile> rate_profiles = {
       {100, 10, 80},                      // Start below |low_kbps|.
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
index d4c42ff..400d4b2 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
@@ -55,8 +55,8 @@
 // with H264. Therefore ProcessXPercentPacketLossH264, X != 0, unittests have
 // not been added.
 TEST_F(VideoProcessorIntegrationTestOpenH264, Process0PercentPacketLoss) {
-  SetCodecSettings(&config_, kVideoCodecH264, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecH264, 1, false, false, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFrames + 1}};
 
@@ -75,8 +75,8 @@
 TEST_F(VideoProcessorIntegrationTestOpenH264, ProcessNoLossSingleNalUnit) {
   config_.packetization_mode = H264PacketizationMode::SingleNalUnit;
   config_.networking_config.max_payload_size_in_bytes = 500;
-  SetCodecSettings(&config_, kVideoCodecH264, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
+  config_.SetCodecSettings(kVideoCodecH264, 1, false, false, true, false,
+                           kResilienceOn, kCifWidth, kCifHeight);
 
   std::vector<RateProfile> rate_profiles = {{500, 30, kNumFrames + 1}};
 
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc
index 613ef60..a4c3cbc 100644
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc
+++ b/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc
@@ -68,9 +68,9 @@
     config_.hw_encoder = hw_codec_;
     config_.hw_decoder = hw_codec_;
     config_.num_frames = kNumFrames;
-    SetCodecSettings(&config_, codec_type_, kNumTemporalLayers,
-                     kErrorConcealmentOn, kDenoisingOn, kFrameDropperOn,
-                     kSpatialResizeOn, kResilienceOn, width, height);
+    config_.SetCodecSettings(codec_type_, kNumTemporalLayers,
+                             kErrorConcealmentOn, kDenoisingOn, kFrameDropperOn,
+                             kSpatialResizeOn, kResilienceOn, width, height);
 
     std::vector<RateProfile> rate_profiles = {
         {bitrate_, framerate, kNumFrames + 1}};