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) {