Videos freeze + low resolution

Hi everyone,

I’m back! :star_struck:

On our self-hosted solution we updated jicofo, videobrige and library to their latest versions few days ago. Since that update we have been having an issue with videos freezing for 2-5 seconds when a new participant joins the conference.

Our installation does not use p2p, the issue happen with every participant that joins.

We also noticed the bridge sends 180p when we specifically ask for 720p or 360p. We rarely allow 180p.

All our users have superb bandwidth lines and we suspect Chrome is sending false info on available bandwidth or BWE is miscalculating causing the bridge to send degraded stream.

Two questions:

  1. has anyone encountered this issue recently?
  2. how do fix it?

Many thanks.

Calling on @damencho @Freddie and other :star: on this.

Thank you all

Have you checked your js console for errors? Receiving 180p seems like the websocket channel to the bridge is not working.

Websockets are operational.

Here’s our bridge config

jvb.conf

videobridge {
http-servers {
public {
port = 9090
tls-port = 443
}
}
websockets {
enabled = true
domain = “.*.co:443”
server-id = ***
tls = true
}
cc {
max-time-between-calculations = 15 seconds
thumbnail-max-height-px = 360
jvb-last-n = -1
trust-bwe = true
}
speech-activity {
recent-speakers-count = 30
}
}

You won’t get 720p with this enforced. Can you check your js console for errors? As @damencho said, 180p resolution when you’re requesting higher strongly points to websocket issues.

Also, search for ReceiverVideoConstraints in the log and paste the output.

I’m just throwing darts here, but don’t you also need to set key-store-path and key-store-password for tls? E.g.

videobridge {
    http-servers {
        public {
            tls-port = 443
            key-store-path=/etc/jitsi/videobridge/ssl.store
            key-store-password=KEY_STORE_PASSWORD
        }
    }
}

I have checked JS console and also the JVB logs and there is no error shown.
What I can see from the JS console is that on the first metadata of the new user joining I get a “onmute” event for other participants then after 2-3 seconds I get “onunmute” event.

Receiver resolution and videos freezing
There is no error on JS console or JVB logs.
We removed 180 layer on lib-jitsi-meet simulcast encodings and now we send only 2 layers. Sometimes, though, we don’t get video from some participants or from any participant and the upload rate drops to 600kbps.

A week ago we had old an jvb from September 1, 2020 with same setup and we did not have this type of bandwidth issues.

I wanna understand also what are the situations that a participant video is suspended (not last-n because last-n is -1 always)

If you revert that, do you observe the problem?

Yes I do. It happens even with the 180p layer. We just removed it - cause, you know how I feel about bad quality video :).

What do you get when you search for ReceiverVideoConstraints in your console log, though?

2021-12-17T20:18:12.565Z [modules/RTC/BridgeChannel.js]
<qr.sendNewReceiverVideoConstraintsMessage>: Sending ReceiverVideoConstraints with {“lastN”:-1,“selectedEndpoints”:,“onStageEndpoints”:,“defaultConstraints”:{“maxHeight”:180},“constraints”:{“49a58d9f”:{“maxHeight”:720},“a5dfa1c0”:{“maxHeight”:720}}}

Well, this is telling. Clients appear to be constrained to 180p res by default. This is what they’re sending to the bridge.

This is conference with 3 participants.

We are setting constraints for every participant, defaultConstraints are not being used by any participants i think

But there is a default constraint as shown by your log. Compare for instance a 3-party meeting on meet.jit.si (all clients at 360p resolution):

2021-12-17T20:42:56.127Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"42b6921b":{"maxHeight":360},"0f1f359c":{"maxHeight":360}},"defaultConstraints":{"maxHeight":0},"onStageEndpoints":[],"selectedEndpoints":[]}
Logger.js:154 2021-12-17T20:42:56.153Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"42b6921b":{"maxHeight":360},"0f1f359c":{"maxHeight":360}},"defaultConstraints":{"maxHeight":0},"lastN":25,"onStageEndpoints":[],"selectedEndpoints":[]}
Logger.js:154 2021-12-17T20:42:56.321Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"42b6921b":{"maxHeight":360},"0f1f359c":{"maxHeight":360}},"defaultConstraints":{"maxHeight":0},"onStageEndpoints":[],"selectedEndpoints":[]}

Then I added a 4th participant (all tiles 360p):

2021-12-17T20:42:56.127Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"42b6921b":{"maxHeight":360},"0f1f359c":{"maxHeight":360}},"defaultConstraints":{"maxHeight":0},"onStageEndpoints":[],"selectedEndpoints":[]}
Logger.js:154 2021-12-17T20:46:48.131Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"91463740":{"maxHeight":360},"42b6921b":{"maxHeight":360},"0f1f359c":{"maxHeight":360}},"defaultConstraints":{"maxHeight":0},"lastN":25,"onStageEndpoints":[],"selectedEndpoints":[]}

And with 7 participants, the tile sizes change to 180p:

2021-12-17T21:00:16.629Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"42b6921b":{"maxHeight":180},"0f1f359c":{"maxHeight":180},"dde3f56c":{"maxHeight":180},"785e1c1e":{"maxHeight":180},"472a8cd8":{"maxHeight":180}},"defaultConstraints":{"maxHeight":0},"lastN":25,"onStageEndpoints":[],"selectedEndpoints":[]}
Logger.js:154 2021-12-17T21:00:16.846Z [modules/RTC/BridgeChannel.js] <Kr.sendNewReceiverVideoConstraintsMessage>:  Sending ReceiverVideoConstraints with {"constraints":{"42b6921b":{"maxHeight":180},"0f1f359c":{"maxHeight":180},"dde3f56c":{"maxHeight":180},"785e1c1e":{"maxHeight":180},"8c4cd2c2":{"maxHeight":180},"472a8cd8":{"maxHeight":180}},"defaultConstraints":{"maxHeight":0},"lastN":25,"onStageEndpoints":[],"selectedEndpoints":[]}

Notice that the defaultConstraints in all cases there is set to a maxHeight of 0 (no limit imposed) compared to yours that sets the default at 180.

I will try setting maxHeight to 0

OK so we changed the maxHeight to 0 and the videos keep freezing when a participants join.

Any other ideas?

Did that change the resolution? Can you send the results for ReceiverVideoConstraints in your console log again?

These are the ReceiverVideoConstraints after the third participant joins

2021-12-20T14:06:33.485Z [modules/RTC/BridgeChannel.js] <qr.sendNewReceiverVideoConstraintsMessage>: Sending ReceiverVideoConstraints with {“lastN”:-1,“selectedEndpoints”:,“onStageEndpoints”:,“defaultConstraints”:{“maxHeight”:0},“constraints”:{“7a6bc169”:{“maxHeight”:720},“282a3170”:{“maxHeight”:720}}}

Is there any thing else that I need to check? Maybe on videobridge for any particular message.

Did the resolution change on screen? Are you getting HD and SD now?

Resolution is fine now. We switched to VP9 and freezing videos when someone joins seems to be fixed except that resolution drops and restores.

Is it possible that BWE can give wrong estimation ?
Yesterday we had a user with 40/5Mbps on a 1o1 call and bridge was estimating 40kbps available bandwidth and that caused user to not get video. Any ideas on this ?