diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index 8822022103..560fb4c16a 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -1990,31 +1990,42 @@ void WebRtcVideoSendChannel::WebRtcVideoSendStream::SetCodec( parameters_.codec_settings = codec_settings; - // Settings for mixed-codec simulcast + // Settings for mixed-codec simulcast. if (!codec_settings_list.empty()) { - RTC_DCHECK_EQ(parameters_.config.rtp.ssrcs.size(), - codec_settings_list.size()); - parameters_.config.rtp.stream_configs.resize( - parameters_.config.rtp.ssrcs.size()); - for (size_t i = 0; i < codec_settings_list.size(); i++) { - auto& stream_config = parameters_.config.rtp.stream_configs[i]; - const auto& cs = codec_settings_list[i]; - stream_config.ssrc = parameters_.config.rtp.ssrcs[i]; - if (i < parameters_.config.rtp.rids.size()) { - stream_config.rid = parameters_.config.rtp.rids[i]; - } - stream_config.payload_name = cs.codec.name; - stream_config.payload_type = cs.codec.id; - stream_config.raw_payload = - cs.codec.packetization == kPacketizationParamRaw; - if (i < parameters_.config.rtp.rtx.ssrcs.size()) { - auto& rtx = stream_config.rtx.emplace( - decltype(stream_config.rtx)::value_type()); - rtx.ssrc = parameters_.config.rtp.rtx.ssrcs[i]; - rtx.payload_type = cs.rtx_payload_type; + if (parameters_.config.rtp.ssrcs.size() == codec_settings_list.size()) { + parameters_.config.rtp.stream_configs.resize( + parameters_.config.rtp.ssrcs.size()); + for (size_t i = 0; i < codec_settings_list.size(); i++) { + auto& stream_config = parameters_.config.rtp.stream_configs[i]; + const auto& cs = codec_settings_list[i]; + stream_config.ssrc = parameters_.config.rtp.ssrcs[i]; + if (i < parameters_.config.rtp.rids.size()) { + stream_config.rid = parameters_.config.rtp.rids[i]; + } + stream_config.payload_name = cs.codec.name; + stream_config.payload_type = cs.codec.id; + stream_config.raw_payload = + cs.codec.packetization == kPacketizationParamRaw; + if (i < parameters_.config.rtp.rtx.ssrcs.size()) { + auto& rtx = stream_config.rtx.emplace( + decltype(stream_config.rtx)::value_type()); + rtx.ssrc = parameters_.config.rtp.rtx.ssrcs[i]; + rtx.payload_type = cs.rtx_payload_type; + } } + } else { + // TODO(crbug.com/378724147): We need to investigate when it + // has mismatched sizes. + RTC_DCHECK_EQ(parameters_.config.rtp.ssrcs.size(), + codec_settings_list.size()); + + RTC_LOG(LS_ERROR) << "Mismatched sizes between codec_settings_list:" + << codec_settings_list.size() + << ", parameters_.config.rtp.ssrcs:" + << parameters_.config.rtp.ssrcs.size(); } } + parameters_.codec_settings_list = codec_settings_list; // TODO(bugs.webrtc.org/8830): Avoid recreation, it should be enough to call diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc index 91249da4bd..a76b209dd2 100644 --- a/media/engine/webrtc_video_engine_unittest.cc +++ b/media/engine/webrtc_video_engine_unittest.cc @@ -9225,6 +9225,33 @@ TEST_F(WebRtcVideoChannelTest, SetMixedCodecSimulcastStreamConfig) { EXPECT_EQ(config.rtp.stream_configs[2].payload_type, vp9.id); } +#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) +TEST_F(WebRtcVideoChannelTest, + SetMixedCodecSimulcastWithDifferentConfigSettingsSizes) { + webrtc::test::ScopedKeyValueConfig field_trials( + field_trials_, "WebRTC-MixedCodecSimulcast/Enabled/"); + AddSendStream(); + + cricket::VideoSenderParameters parameters; + cricket::Codec vp8 = GetEngineCodec("VP8"); + parameters.codecs.push_back(vp8); + + // `codec_settings_list.size()` is 1 after this in the + EXPECT_TRUE(send_channel_->SetSenderParameters(parameters)); + + // It sets 2 sizes of config ssrc. + StreamParams sp = CreateSimStreamParams("cname", {123, 456}); + std::vector rid_descriptions2; + rid_descriptions2.emplace_back("f", cricket::RidDirection::kSend); + rid_descriptions2.emplace_back("h", cricket::RidDirection::kSend); + sp.set_rids(rid_descriptions2); + + // `WebRtcVideoSendStream::SetCodec` test for different sizes + // between parameters_.config.rtp.ssrcs.size() and codec_settings_list.size(). + EXPECT_DEATH(send_channel_->AddSendStream(sp), ""); +} +#endif + // Test that min and max bitrate values set via RtpParameters are correctly // propagated to the underlying encoder for a single stream. TEST_F(WebRtcVideoChannelTest, MinAndMaxBitratePropagatedToEncoder) {