Being able to select remote participants for high res and participants for setLastN separately

We have a custom UI where we use lib-jitsi-meet. With the aim of limiting the bandwidth used, to reduce server costs, we have the following requirements:

(I) A stage of one or more participants for which we want to receive good quality (either 720p or 360p).
(II) A display of the rest of the participants in a small vertical scrollable list of thumbnails for which we want to receive low quality (180p).
(III) Detect the visible participants so that we don’t get video for unseen ones (like the ones hidden in the scrollable list).

We have achieved these requirements by doing this:

(1) The participants that are not in this stage, call:

conference.setSenderVideoConstraint('180');

(2) The participants that are in this stage, call:

conference.setSenderVideoConstraint('720');

(3) In all cases we max the receiver video resolution to 720p in order to get that for remote staged participants:

conference.setReceiverVideoConstraint('720');

(4) In order to achieve the requirement (3), we are detecting the visible participants (either in stage or not) so we do:

conference.selectParticipants(visibleParticipantIds);
conference.setLastN(visibleParticipantIds.length);

The problems that we have with this implementation are the following:

(a) For participants not in stage (step 1) we always get “Poor” connection quality (between 6 and 9%), probably because we are sending low quality video even with good bandwidth (to reduce data transfer costs). Packet loss is low in these cases, between 0 and 1%. We don’t know if this is a bug or if this is expected.

(b) To solve (a), we tried calling this for all participants to send 720p (to send their three simulcast layers 720p, 360p and 180p so that video bridge decides which to send to each remote participant):

conference.setSenderVideoConstraint('720');

However this results in others getting 720p video for the small thumbnails not on stage. This happens because: For setLastN to show all visible participants (even if muted), we have to call selectParticipants to tell the Video Bridge which are the ones we want to get… however that makes them all receive high resolution if they have good bandwidth. So we were thinking if it would be possible to separate selectParticipants in two calls, for example something like this (pseudocode):

conference.selectHighResParticipants(stagedParticipantIds)
conference.selectLastNParticipants(visibleParticipantIds)

And then we can still use:

conference.setLastN(visibleParticipantIds.length)

We are willing to help with pull requests for either fix (a) if it is a bug, or implement (b) if you consider this would be possible and helpful for the community. Or maybe you have another ideas that can help us.

By the way I watched this video it was super helpful https://www.youtube.com/watch?v=SAaa8jYdtx4 for understanding how simulcast works. Also we have studied the following documentation:



Thank you very much for the good documentation, the good support and for the amazing Jitsi suite. We appreciate any help you could give us for this scenario.

3 Likes

Hey,
Did you ever solve the issue with the unselected participants’ quality stream?

Hey @rn1984, not yet. I found this open lib-jitsi-meet issue https://github.com/jitsi/lib-jitsi-meet/issues/1175 , as far as I know there were some additions done to the video bridge that could help with this need, but lib-jitsi-meet does not yet expose methods to set the qualities per endpoint.

1 Like

Is there any news on this? This would be very useful!

@rn1984 @aljen I added the following PR in lib-jitsi-meet:

But it will also require a fix in Videobridge. I opened an issue for that:

1 Like