From 84cc49aa9c4f996a1d37635e9933cafae4ef6686 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 9 Apr 2026 16:07:31 +0200 Subject: [PATCH] fix(webrtc): Calculate maxBitrates based on HPBs maxstreambits Signed-off-by: Joas Schilling --- src/utils/signaling.js | 8 +++++ src/utils/webrtc/simplewebrtc/simplewebrtc.js | 30 +++++++++++++++---- src/utils/webrtc/simplewebrtc/webrtc.js | 1 + 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/utils/signaling.js b/src/utils/signaling.js index 31526c985d8..c4a190c20ce 100644 --- a/src/utils/signaling.js +++ b/src/utils/signaling.js @@ -71,6 +71,7 @@ function Base(settings) { this.signalingConnectionTimeout = null this.signalingConnectionWarning = null this.signalingConnectionError = null + this.maxStreamBits = 1048576 } Signaling.Base = Base @@ -1281,6 +1282,13 @@ Signaling.Standalone.prototype.joinCall = function(token, flags, silent, recordi Signaling.Standalone.prototype.joinResponseReceived = function(data, token) { console.debug('Joined', data, token) + if (data.room?.bandwidth?.maxstreambitrate) { + const totalBps = data.room.bandwidth.maxstreambitrate + if (typeof totalBps === 'number' && totalBps > 0) { + this.maxStreamBits = data.room.bandwidth.maxstreambitrate + } + } + this.signalingRoomJoined = token if (this.pendingJoinCall && token === this.pendingJoinCall.token) { const pendingJoinCallResolve = this.pendingJoinCall.resolve diff --git a/src/utils/webrtc/simplewebrtc/simplewebrtc.js b/src/utils/webrtc/simplewebrtc/simplewebrtc.js index 9af8778cdf6..7bab20793db 100644 --- a/src/utils/webrtc/simplewebrtc/simplewebrtc.js +++ b/src/utils/webrtc/simplewebrtc/simplewebrtc.js @@ -8,6 +8,30 @@ import webrtcSupport from 'webrtcsupport' import WildEmitter from 'wildemitter' import WebRTC from './webrtc.js' +/** + * Split totalBps into integer low/medium/high parts with ratio 1:4:16 (total 21 parts). + * Returned values are integers. Any remainder from integer division is omitted. + * + * @param {number} totalBps - Total bandwidth in bps (non-negative number). + * @returns {{ low: number, medium: number, high: number }} + */ +function splitBandwidthIntegersOmitRemainder(totalBps = 1048576) { + if (typeof totalBps !== 'number' || totalBps < 0) { + totalBps = 1048576 + } + + // Divide into 21 parts and distribute them in 2^2 way across the quality levels + // Additionally we divide and multiple with 100 but round down in between + // to create some safety bits + const partValue = Math.floor(totalBps / 21 / 100) * 100 + + return { + low: partValue, + medium: partValue * 4, + high: partValue * 16, + } +} + /** * @param {object} opts the options object. */ @@ -19,11 +43,7 @@ export default function SimpleWebRTC(opts) { debug: false, enableDataChannels: true, enableSimulcast: false, - maxBitrates: { - high: 900000, - medium: 300000, - low: 100000, - }, + maxBitrates: splitBandwidthIntegersOmitRemainder(opts.connection?.maxStreamBits), autoRequestMedia: false, receiveMedia: { offerToReceiveAudio: 1, diff --git a/src/utils/webrtc/simplewebrtc/webrtc.js b/src/utils/webrtc/simplewebrtc/webrtc.js index 3b443fc33d1..bb6a8fd3938 100644 --- a/src/utils/webrtc/simplewebrtc/webrtc.js +++ b/src/utils/webrtc/simplewebrtc/webrtc.js @@ -27,6 +27,7 @@ export default function WebRTC(opts) { }, enableDataChannels: true, enableSimulcast: false, + // Overwritten by simplewebrtc.js maxBitrates: { high: 900000, medium: 300000,