tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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:
Mdom/media/webrtc/libwebrtcglue/VideoConduit.cpp | 11+++++++++++
Mmedia/webrtc/signaling/gtest/videoconduit_unittests.cpp | 37+++++++++++++++++++++++++++++++++++--
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 =