VP9 simulcast config to cap bitrates or to make best use of low bandwidth clients conference

I am sorry if these VP9 related config or thinking question seems stupid. I am new to VP9 support for jitsi topic and these questions came to my mind:

  1. Why do I need to enable the simulcast/suspension layer while using VP9? shouldn’t it be just sending 1 special stream always with multiple layers and the server should forward the resolution/framerate suitable for the asking client?

  2. Even if I need to use simulcast can I put a cap for max bitrates on every layer and should it be just like VP8 or other like I did put a cap for 270p stream at 350kbps, 1200kbps for 540p? how many layers even are here,3 like before ?

  3. If I set the resolution to 540p, then for VP8 it was trying to acquire 3 resolutions (540p,270p,135p) and now for VP9, if in one client is seeing video in 120p (9 * 16 user in one page of 1080p monitor) or 60p (18 * 32 user in 1080p monitor or we can say I set 108p as lowest for gallery view otherwise scroll) of other clients in gallery view then will it automatically adjust and get 120p or 60p video from video bridge (to not make waste of bandwidth) or it will just get 135p like before and server 60p or 120p needed by scaling?

Thanx in advance for any answer or logical input :heart:

You need to enable simulcast for VP9 SVC to work. That is the crazy implementation that Chrome has come up with it since they haven’t implemented a proper SVC API. Based on how the simulcast streams are configured (like which ones are enabled or disabled), browser modifies the SVC stream that gets sent out. For example, if you have only LD, SD streams enabled (which is done through layer suspension), the outgoing stream will have only 2 SVC layers. If you do not care about uplink, you can disable layer suspension and 1 stream will all 3 SVC layers will be sent always even if there are no receivers viewing this particular user in HD.

Again, because of how it’s implemented, there is no way to control the bitrates of the individual SVC layers. Right now we can control the total outgoing bitrate using b=AS line in the SDP. So the client will apply whatever is the maxBitratesVideo.high value for outgoing video. It is up to the browser to allocate that bitrate across all available SVC layers.

The bridge does not downscale the stream based on what the receiver is requesting, it just picks the stream closest in resolution (if enough b/w is available) to send. So the resolutions of VP9 SVC layers will continue to be same as they were in simulcast VP8 case.

3 Likes

are you sure of that ? I don’t know VP9, I just looked at the glossy pictures when it was fist sold, so I did a quick search and stumbled on this that seems to say that a VP9 encoder beside having fearsome complexity - keeps the different spatial layers at simple relation (2 or 1.5), so it’s not possible to decide the resolution of the different layers in an arbitrary way. If it was possible, it would mean that encoder calculations would involve floating points operations, that seems an absolute no-no for a real time system.
So my hunch would be that it’s not a Google problem that’s it not possible to manipulate independently the different layers resolutions, it’s a fundamental limitation.

Thanks for taking the time for the detailed answer, very informative!

The question from the OP was about manipulating the bitrates of the individual SVC layers like how we do it for the simulcast stream in VP8, not the resolution of the individual layers.

So the resolution for each layer can be set ? if so then how. and how many layers ?

can you give me an idea how much should be the target bitrate for vp9 for resolutions like in vp8, for 360p, 500kbps was good. so for vp9?
is there a way tos et total target bitrate (cap) from config.js yet?

No the application cannot set the resolution for each SVC layer.

For VP9 however, only the high value is applicable. The total target bitrate is capped to that value because VP9 doesn’t let us specify values for individual streams. It is confusing that we still let users specify the other two low and standard values, those will be used when the browsers eventually fix the SVC API and provide an API for the applications to control those bitrates.
If you plan to set your video resolution to 360 always, you can start with 300 Kbps and adjust it based on your experience. Note that this has to be specified as the high value in your settings.

1 Like

so, I will be able to cap the total bitrate by

maxBitratesVideo.VP9.high

as you set this as 1200000 (1200kb/s) so it was meant to cap the total bitrate at 1.2 Mbit/s which will be responsible to serve 720p , 360p, 180p or whatever videos are needed/requested by other participants, right? so that also meant you allocated somewhere between (1200-300-100) or 800 kbit/s for 720p stream I think.
If yes thats really a great save of bandwidth :heart: where you needed total 1.5+0.5+0.2 = 2.2 Mbit/s for VP8 and now the highest total is 1.2 Mbit/s which is able to serve the same as before with VP9.
Thanx a lot for the info :heart: