Passing video codec settings to lower layers

In the CL at https://webrtc-review.googlesource.com/c/src/+/387320
I added `SimulcastStream::video_format`, but I forgot to set this value
in the upper layer.

Bug: webrtc:362277533
Change-Id: I16fa78e99c1998d3fbc7aca03a83e74fa8278d7d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/412641
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#46020}
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index fec832e..61c61fb 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -2347,6 +2347,11 @@
       encoder_config.simulcast_layers[i].num_temporal_layers =
           *rtp_parameters_.encodings[i].num_temporal_layers;
     }
+    if (rtp_parameters_.encodings[i].codec) {
+      encoder_config.simulcast_layers[i].video_format =
+          SdpVideoFormat(rtp_parameters_.encodings[i].codec->name,
+                         rtp_parameters_.encodings[i].codec->parameters);
+    }
     encoder_config.simulcast_layers[i].scale_resolution_down_to =
         rtp_parameters_.encodings[i].scale_resolution_down_to;
   }
diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc
index 653649b..c29a5f8 100644
--- a/media/engine/webrtc_video_engine_unittest.cc
+++ b/media/engine/webrtc_video_engine_unittest.cc
@@ -9101,6 +9101,77 @@
   EXPECT_EQ(config.rtp.stream_configs[2].payload_type, vp9.id);
 }
 
+// Verify that RtpEncodingParameters::codec propagates to
+// VideoEncoderConfig::video_format.
+TEST_F(WebRtcVideoChannelWithMixedCodecSimulcastTest,
+       CodecSettingsPropagatedToEncoder) {
+  FakeVideoSendStream* stream = SetUpSimulcast(true, /*with_rtx=*/false);
+
+  // Send a full size frame so all simulcast layers are used when reconfiguring.
+  FrameForwarder frame_forwarder;
+  VideoOptions options;
+  EXPECT_TRUE(
+      send_channel_->SetVideoSend(last_ssrc_, &options, &frame_forwarder));
+  send_channel_->SetSend(true);
+  frame_forwarder.IncomingCapturedFrame(frame_source_.GetFrame());
+
+  // Get and set the rtp encoding parameters.
+  RtpParameters parameters = send_channel_->GetRtpSendParameters(last_ssrc_);
+  EXPECT_EQ(kNumSimulcastStreams, parameters.encodings.size());
+
+  // Verify that the initial value is nullopt.
+  VideoEncoderConfig encoder_config = stream->GetEncoderConfig().Copy();
+  EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams);
+  EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size());
+  EXPECT_FALSE(encoder_config.simulcast_layers[0].video_format);
+  EXPECT_FALSE(encoder_config.simulcast_layers[1].video_format);
+  EXPECT_FALSE(encoder_config.simulcast_layers[2].video_format);
+
+  // Set single-codec simulcast
+  parameters.encodings[0].codec.emplace(
+      GetEngineCodec("VP8").ToCodecParameters());
+  parameters.encodings[1].codec.emplace(
+      GetEngineCodec("VP8").ToCodecParameters());
+  parameters.encodings[2].codec.emplace(
+      GetEngineCodec("VP8").ToCodecParameters());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
+
+  // Verify that the new value propagated down to the encoder.
+  stream = fake_call_->GetVideoSendStreams()[0];
+  encoder_config = stream->GetEncoderConfig().Copy();
+  EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams);
+  EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size());
+  EXPECT_TRUE(encoder_config.simulcast_layers[0].video_format);
+  EXPECT_TRUE(encoder_config.simulcast_layers[1].video_format);
+  EXPECT_TRUE(encoder_config.simulcast_layers[2].video_format);
+  EXPECT_EQ("VP8", encoder_config.simulcast_layers[0].video_format->name);
+  EXPECT_EQ("VP8", encoder_config.simulcast_layers[1].video_format->name);
+  EXPECT_EQ("VP8", encoder_config.simulcast_layers[2].video_format->name);
+
+  // Set mixed-codec simulcast
+  parameters.encodings[0].codec.emplace(
+      GetEngineCodec("VP8").ToCodecParameters());
+  parameters.encodings[1].codec.emplace(
+      GetEngineCodec("VP8").ToCodecParameters());
+  parameters.encodings[2].codec.emplace(
+      GetEngineCodec("VP9").ToCodecParameters());
+  EXPECT_TRUE(send_channel_->SetRtpSendParameters(last_ssrc_, parameters).ok());
+
+  // Verify that the new value propagated down to the encoder.
+  stream = fake_call_->GetVideoSendStreams()[0];
+  encoder_config = stream->GetEncoderConfig().Copy();
+  EXPECT_EQ(kNumSimulcastStreams, encoder_config.number_of_streams);
+  EXPECT_EQ(kNumSimulcastStreams, encoder_config.simulcast_layers.size());
+  EXPECT_TRUE(encoder_config.simulcast_layers[0].video_format);
+  EXPECT_TRUE(encoder_config.simulcast_layers[1].video_format);
+  EXPECT_TRUE(encoder_config.simulcast_layers[2].video_format);
+  EXPECT_EQ("VP8", encoder_config.simulcast_layers[0].video_format->name);
+  EXPECT_EQ("VP8", encoder_config.simulcast_layers[1].video_format->name);
+  EXPECT_EQ("VP9", encoder_config.simulcast_layers[2].video_format->name);
+
+  EXPECT_TRUE(send_channel_->SetVideoSend(last_ssrc_, nullptr, nullptr));
+}
+
 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
 TEST_F(WebRtcVideoChannelWithMixedCodecSimulcastTest,
        SetMixedCodecSimulcastWithDifferentConfigSettingsSizes) {