Cleanup of scenario test video stream setup.

Removing simulcast stream support as it was broken.

Bug: webrtc:9510
Change-Id: I42ba285bbea81e6ffd5b1d1a1aec4e5eb0990b1e
Reviewed-on: https://webrtc-review.googlesource.com/c/123040
Commit-Queue: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26684}
diff --git a/test/scenario/scenario_config.h b/test/scenario/scenario_config.h
index fb6e40e..7e42631 100644
--- a/test/scenario/scenario_config.h
+++ b/test/scenario/scenario_config.h
@@ -83,10 +83,6 @@
 struct VideoStreamConfig {
   bool autostart = true;
   struct Source {
-    enum class ContentType {
-      kVideo,
-      kScreen,
-    } content_type = ContentType::kVideo;
     enum Capture {
       kGenerator,
       kVideoFile,
@@ -96,18 +92,25 @@
     struct Generator {
       using PixelFormat = FrameGenerator::OutputType;
       PixelFormat pixel_format = PixelFormat::I420;
+      int width = 320;
+      int height = 180;
     } generator;
     struct VideoFile {
       std::string name;
+      // Must be set to width and height of the source video file.
+      int width = 0;
+      int height = 0;
     } video_file;
-    int width = 320;
-    int height = 180;
     int framerate = 30;
   } source;
   struct Encoder {
     Encoder();
     Encoder(const Encoder&);
     ~Encoder();
+    enum class ContentType {
+      kVideo,
+      kScreen,
+    } content_type = ContentType::kVideo;
     enum Implementation { kFake, kSoftware, kHardware } implementation = kFake;
     struct Fake {
       DataRate max_rate = DataRate::Infinity();
@@ -115,12 +118,15 @@
 
     using Codec = VideoCodecType;
     Codec codec = Codec::kVideoCodecGeneric;
-    bool denoising = true;
-    absl::optional<int> key_frame_interval = 3000;
-
     absl::optional<DataRate> max_data_rate;
     absl::optional<int> max_framerate;
-    size_t num_simulcast_streams = 1;
+    // Counted in frame count.
+    absl::optional<int> key_frame_interval = 3000;
+    bool frame_dropping = true;
+    struct SingleLayer {
+      bool denoising = true;
+      bool automatic_scaling = true;
+    } single;
     using DegradationPreference = DegradationPreference;
     DegradationPreference degradation_preference =
         DegradationPreference::MAINTAIN_FRAMERATE;
diff --git a/test/scenario/video_stream.cc b/test/scenario/video_stream.cc
index 0e39a0e..e46440b 100644
--- a/test/scenario/video_stream.cc
+++ b/test/scenario/video_stream.cc
@@ -59,6 +59,16 @@
   }
   return {};
 }
+VideoEncoderConfig::ContentType ConvertContentType(
+    VideoStreamConfig::Encoder::ContentType content_type) {
+  switch (content_type) {
+    case VideoStreamConfig::Encoder::ContentType::kVideo:
+      return VideoEncoderConfig::ContentType::kRealtimeVideo;
+      break;
+    case VideoStreamConfig::Encoder::ContentType::kScreen:
+      return VideoEncoderConfig::ContentType::kScreen;
+  }
+}
 std::vector<RtpExtension> GetVideoRtpExtensions(
     const VideoStreamConfig config) {
   return {RtpExtension(RtpExtension::kTransportSequenceNumberUri,
@@ -92,58 +102,64 @@
   return send_config;
 }
 rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
+CreateVp9SpecificSettings(VideoStreamConfig config) {
+  VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
+  vp9_settings.frameDroppingOn = config.encoder.frame_dropping;
+  vp9_settings.keyFrameInterval = config.encoder.key_frame_interval.value_or(0);
+  vp9_settings.automaticResizeOn = config.encoder.single.automatic_scaling;
+  vp9_settings.denoisingOn = config.encoder.single.denoising;
+  return new rtc::RefCountedObject<
+      VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
+}
+
+rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
+CreateVp8SpecificSettings(VideoStreamConfig config) {
+  VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
+  vp8_settings.frameDroppingOn = config.encoder.frame_dropping;
+  vp8_settings.keyFrameInterval = config.encoder.key_frame_interval.value_or(0);
+  vp8_settings.automaticResizeOn = config.encoder.single.automatic_scaling;
+  vp8_settings.denoisingOn = config.encoder.single.denoising;
+  return new rtc::RefCountedObject<
+      VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
+}
+
+rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
+CreateH264SpecificSettings(VideoStreamConfig config) {
+  VideoCodecH264 h264_settings = VideoEncoder::GetDefaultH264Settings();
+  h264_settings.frameDroppingOn = config.encoder.frame_dropping;
+  h264_settings.keyFrameInterval =
+      config.encoder.key_frame_interval.value_or(0);
+  return new rtc::RefCountedObject<
+      VideoEncoderConfig::H264EncoderSpecificSettings>(h264_settings);
+}
+
+rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
 CreateEncoderSpecificSettings(VideoStreamConfig config) {
   using Codec = VideoStreamConfig::Encoder::Codec;
   switch (config.encoder.codec) {
-    case Codec::kVideoCodecH264: {
-      VideoCodecH264 h264_settings = VideoEncoder::GetDefaultH264Settings();
-      h264_settings.frameDroppingOn = true;
-      h264_settings.keyFrameInterval =
-          config.encoder.key_frame_interval.value_or(0);
-      return new rtc::RefCountedObject<
-          VideoEncoderConfig::H264EncoderSpecificSettings>(h264_settings);
-    }
-    case Codec::kVideoCodecVP8: {
-      VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
-      vp8_settings.frameDroppingOn = true;
-      vp8_settings.keyFrameInterval =
-          config.encoder.key_frame_interval.value_or(0);
-      vp8_settings.automaticResizeOn = true;
-      vp8_settings.denoisingOn = config.encoder.denoising;
-      return new rtc::RefCountedObject<
-          VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
-    }
-    case Codec::kVideoCodecVP9: {
-      VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
-      vp9_settings.frameDroppingOn = true;
-      vp9_settings.keyFrameInterval =
-          config.encoder.key_frame_interval.value_or(0);
-      vp9_settings.automaticResizeOn = true;
-      vp9_settings.denoisingOn = config.encoder.denoising;
-      vp9_settings.interLayerPred = InterLayerPredMode::kOnKeyPic;
-      return new rtc::RefCountedObject<
-          VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
-    }
-    default:
+    case Codec::kVideoCodecH264:
+      return CreateH264SpecificSettings(config);
+    case Codec::kVideoCodecVP8:
+      return CreateVp8SpecificSettings(config);
+    case Codec::kVideoCodecVP9:
+      return CreateVp9SpecificSettings(config);
+    case Codec::kVideoCodecGeneric:
+      return nullptr;
+    case Codec::kVideoCodecMultiplex:
+      RTC_NOTREACHED();
       return nullptr;
   }
 }
 
 VideoEncoderConfig CreateVideoEncoderConfig(VideoStreamConfig config) {
-  size_t num_streams = config.encoder.num_simulcast_streams;
   VideoEncoderConfig encoder_config;
   encoder_config.codec_type = config.encoder.codec;
-  switch (config.source.content_type) {
-    case VideoStreamConfig::Source::ContentType::kVideo:
-      encoder_config.content_type =
-          VideoEncoderConfig::ContentType::kRealtimeVideo;
-      break;
-    case VideoStreamConfig::Source::ContentType::kScreen:
-      encoder_config.content_type = VideoEncoderConfig::ContentType::kScreen;
-      break;
-  }
+  encoder_config.content_type = ConvertContentType(config.encoder.content_type);
   encoder_config.video_format =
       SdpVideoFormat(CodecTypeToPayloadString(config.encoder.codec), {});
+
+  // TODO(srte): Replace with actual value when supported.
+  size_t num_streams = 1;
   encoder_config.number_of_streams = num_streams;
   encoder_config.simulcast_layers = std::vector<VideoStream>(num_streams);
   encoder_config.min_transmit_bitrate_bps = config.stream.pad_to_rate.bps();
@@ -157,11 +173,11 @@
     encoder_config.video_stream_factory =
         new rtc::RefCountedObject<DefaultVideoStreamFactory>();
   }
-  if (config.encoder.max_data_rate) {
-    encoder_config.max_bitrate_bps = config.encoder.max_data_rate->bps();
-  } else {
-    encoder_config.max_bitrate_bps = 10000000;  // 10 mbit
-  }
+
+  // TODO(srte): Base this on encoder capabilities.
+  encoder_config.max_bitrate_bps =
+      config.encoder.max_data_rate.value_or(DataRate::kbps(10000)).bps();
+
   encoder_config.encoder_specific_settings =
       CreateEncoderSpecificSettings(config);
   if (config.encoder.max_framerate) {
@@ -172,6 +188,24 @@
 
   return encoder_config;
 }
+
+std::unique_ptr<FrameGenerator> CreateFrameGenerator(
+    Clock* clock,
+    VideoStreamConfig::Source source) {
+  using Capture = VideoStreamConfig::Source::Capture;
+  switch (source.capture) {
+    case Capture::kGenerator:
+      return FrameGenerator::CreateSquareGenerator(
+          source.generator.width, source.generator.height,
+          source.generator.pixel_format, /*num_squares*/ absl::nullopt);
+    case Capture::kVideoFile:
+      RTC_CHECK(source.video_file.width && source.video_file.height);
+      return FrameGenerator::CreateFromYuvFile(
+          {source.video_file.name}, source.video_file.width,
+          source.video_file.height, /*frame_repeat_count*/ 1);
+  }
+}
+
 }  // namespace
 
 SendVideoStream::SendVideoStream(CallClient* sender,
@@ -179,31 +213,10 @@
                                  Transport* send_transport,
                                  VideoQualityAnalyzer* analyzer)
     : sender_(sender), config_(config) {
-  for (size_t i = 0; i < config.encoder.num_simulcast_streams; ++i) {
-    ssrcs_.push_back(sender->GetNextVideoSsrc());
-    rtx_ssrcs_.push_back(sender->GetNextRtxSsrc());
-  }
-
-  using Capture = VideoStreamConfig::Source::Capture;
-  switch (config.source.capture) {
-    case Capture::kGenerator:
-      frame_generator_ = test::FrameGeneratorCapturer::Create(
-          config.source.width, config.source.height,
-          config.source.generator.pixel_format, absl::nullopt,
-          config.source.framerate, sender_->clock_);
-      video_capturer_.reset(frame_generator_);
-      break;
-    case Capture::kVideoFile:
-      frame_generator_ = test::FrameGeneratorCapturer::CreateFromYuvFile(
-          test::ResourcePath(config.source.video_file.name, "yuv"),
-          config.source.width, config.source.height, config.source.framerate,
-          sender_->clock_);
-      RTC_CHECK(frame_generator_)
-          << "Could not create capturer for " << config.source.video_file.name
-          << ".yuv. Is this resource file present?";
-      video_capturer_.reset(frame_generator_);
-      break;
-  }
+  video_capturer_ = absl::make_unique<FrameGeneratorCapturer>(
+      sender_->clock_, CreateFrameGenerator(sender_->clock_, config.source),
+      config.source.framerate);
+  video_capturer_->Init();
 
   using Encoder = VideoStreamConfig::Encoder;
   using Codec = VideoStreamConfig::Encoder::Codec;
@@ -236,14 +249,17 @@
   bitrate_allocator_factory_ = CreateBuiltinVideoBitrateAllocatorFactory();
   RTC_CHECK(bitrate_allocator_factory_);
 
+  VideoEncoderConfig encoder_config = CreateVideoEncoderConfig(config);
+  for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
+    ssrcs_.push_back(sender->GetNextVideoSsrc());
+    rtx_ssrcs_.push_back(sender->GetNextRtxSsrc());
+  }
   VideoSendStream::Config send_config =
       CreateVideoSendStreamConfig(config, ssrcs_, send_transport);
   send_config.encoder_settings.encoder_factory = encoder_factory_.get();
   send_config.encoder_settings.bitrate_allocator_factory =
       bitrate_allocator_factory_.get();
 
-  VideoEncoderConfig encoder_config = CreateVideoEncoderConfig(config);
-
   send_stream_ = sender_->call_->CreateVideoSendStream(
       std::move(send_config), std::move(encoder_config));
   std::vector<std::function<void(const VideoFrameQualityInfo&)> >
@@ -296,9 +312,7 @@
 }
 
 void SendVideoStream::SetCaptureFramerate(int framerate) {
-  RTC_CHECK(frame_generator_)
-      << "Framerate change only implemented for generators";
-  frame_generator_->ChangeFramerate(framerate);
+  video_capturer_->ChangeFramerate(framerate);
 }
 
 VideoSendStream::Stats SendVideoStream::GetStats() const {
@@ -370,7 +384,6 @@
   recv_config.decoders.push_back(decoder);
 
   if (config.stream.use_flexfec) {
-    RTC_CHECK_EQ(config.encoder.num_simulcast_streams, 1);
     FlexfecReceiveStream::Config flexfec_config(feedback_transport);
     flexfec_config.payload_type = CallTest::kFlexfecPayloadType;
     flexfec_config.remote_ssrc = CallTest::kFlexfecSendSsrc;
diff --git a/test/scenario/video_stream.h b/test/scenario/video_stream.h
index aeb1e98..3591ecb 100644
--- a/test/scenario/video_stream.h
+++ b/test/scenario/video_stream.h
@@ -58,9 +58,8 @@
   std::unique_ptr<VideoEncoderFactory> encoder_factory_;
   std::vector<test::FakeEncoder*> fake_encoders_ RTC_GUARDED_BY(crit_);
   std::unique_ptr<VideoBitrateAllocatorFactory> bitrate_allocator_factory_;
-  std::unique_ptr<TestVideoCapturer> video_capturer_;
+  std::unique_ptr<FrameGeneratorCapturer> video_capturer_;
   std::unique_ptr<ForwardingCapturedFrameTap> frame_tap_;
-  FrameGeneratorCapturer* frame_generator_ = nullptr;
   int next_local_network_id_ = 0;
   int next_remote_network_id_ = 0;
 };