commit 4ac7d1d31ca99ce850eb4af548864a3997a5371d
parent 8410c12bb1b6e4b62bc61dc0a514def1afe605c7
Author: Andreas Pehrson <apehrson@mozilla.com>
Date: Wed, 3 Dec 2025 19:40:20 +0000
Bug 1995481 - Set simulcast layer max bitrate as constrained by JS. r=bwc
Differential Revision: https://phabricator.services.mozilla.com/D274919
Diffstat:
2 files changed, 46 insertions(+), 2 deletions(-)
diff --git a/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp b/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp
@@ -799,6 +799,17 @@ void WebrtcVideoConduit::OnControlConfigChange() {
.valueOr(-1);
})());
+ // Set each layer's max-bitrate explicitly or libwebrtc may ignore all
+ // stream-specific max-bitrate settings later on, as provided by the
+ // VideoStreamFactory. Default to our max of 10Mbps, overriden by
+ // SDP/JS.
+ int maxBps = KBPS(10000);
+ maxBps = MinIgnoreZero(maxBps, mPrefMaxBitrate);
+ maxBps = MinIgnoreZero(maxBps, mNegotiatedMaxBitrate);
+ maxBps = MinIgnoreZero(maxBps,
+ static_cast<int>(encodingConstraints.maxBr));
+ video_stream.max_bitrate_bps = maxBps;
+
// At this time, other values are not used until after
// CreateEncoderStreams(). We fill these in directly from the codec
// config in VideoStreamFactory.
diff --git a/media/webrtc/signaling/gtest/videoconduit_unittests.cpp b/media/webrtc/signaling/gtest/videoconduit_unittests.cpp
@@ -438,6 +438,9 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodec) {
ASSERT_EQ(Call()->mVideoSendEncoderConfig->min_transmit_bitrate_bps, 0);
ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, KBPS(10000));
ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ ASSERT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ KBPS(10000));
// empty codec name
mControl.Update([&](auto& aControl) {
@@ -552,9 +555,13 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecTias) {
aControl.mVideoSendRtpRtcpConfig =
Some(RtpRtcpConfig(webrtc::RtcpMode::kCompound, true));
});
- ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 2000000);
{
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 2000000);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ ASSERT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 2000000);
SendVideoFrame(1280, 720, 1);
const std::vector<webrtc::VideoStream> videoStreams =
Call()->CreateEncoderStreams(1280, 720);
@@ -571,9 +578,13 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecTias) {
codecConfigTiasLow.mTias = 1000;
aControl.mVideoSendCodec = Some(codecConfigTiasLow);
});
- ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 1000);
{
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 1000);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ ASSERT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 1000);
SendVideoFrame(1280, 720, 2);
const std::vector<webrtc::VideoStream> videoStreams =
Call()->CreateEncoderStreams(1280, 720);
@@ -595,6 +606,11 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecMaxBr) {
Some(RtpRtcpConfig(webrtc::RtcpMode::kCompound, true));
});
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 50000);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ ASSERT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 50000);
SendVideoFrame(1280, 720, 1);
const std::vector<webrtc::VideoStream> videoStreams =
Call()->CreateEncoderStreams(1280, 720);
@@ -1261,6 +1277,10 @@ TEST_P(VideoConduitCodecModeTest, TestReconfigureSendMediaCodec) {
});
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
EXPECT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 2000000);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ EXPECT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 2000000);
SendVideoFrame(1280, 720, 1);
{
@@ -1285,6 +1305,11 @@ TEST_P(VideoConduitCodecModeTest, TestReconfigureSendMediaCodec) {
aControl.mVideoSendCodec = Some(codecConfig);
});
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
+ EXPECT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 50000);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ EXPECT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 50000);
SendVideoFrame(1280, 720, 2);
{
const std::vector<webrtc::VideoStream> videoStreams =
@@ -1382,6 +1407,10 @@ TEST_P(VideoConduitCodecModeTest,
});
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
ASSERT_EQ(Call()->mVideoSendEncoderConfig->max_bitrate_bps, 2000000);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ EXPECT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 2000000);
SendVideoFrame(1280, 720, 1);
{
@@ -1403,6 +1432,10 @@ TEST_P(VideoConduitCodecModeTest,
aControl.mVideoSendCodec = Some(codecConfig);
});
ASSERT_TRUE(Call()->mVideoSendEncoderConfig);
+ ASSERT_EQ(Call()->mVideoSendEncoderConfig->number_of_streams, 1U);
+ EXPECT_EQ(
+ Call()->mVideoSendEncoderConfig->simulcast_layers[0].max_bitrate_bps,
+ 50000);
SendVideoFrame(1280, 720, 2);
{
const std::vector<webrtc::VideoStream> videoStreams =