From dd62eb0072fc9a9cacf154a1dbd56076be017bad Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Tue, 14 Oct 2025 10:05:33 +0530 Subject: [PATCH] Resort to full search for requested quality is not available. (#4000) When doing code changes for dynamic rid, inadventently relied on ordering of quality in track info layers to pick the highest layer if the requested quality is higher than available qualities. @cnderrauber addressed it in https://github.com/livekit/livekit/pull/3998. Just adding some more robustness behind that by doing a full search when requested quality is not available. Tested using JS SDK demo app and picking different qualities from subscriber side with adaptive streaming turned off. --- pkg/rtc/participant.go | 8 +++++--- pkg/sfu/buffer/videolayerutils.go | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/rtc/participant.go b/pkg/rtc/participant.go index 36ad8281d..c77c3b8a5 100644 --- a/pkg/rtc/participant.go +++ b/pkg/rtc/participant.go @@ -3574,7 +3574,7 @@ func (p *ParticipantImpl) getPendingTrackPrimaryBySdpCid(sdpCid string) *pending func (p *ParticipantImpl) setTrackID(cid string, info *livekit.TrackInfo) { var trackID string // if already pending, use the same SID - // should not happen as this means multiple `AddTrack` requests have been called, but check anyway + // it is possible to have multiple AddTrackRequests for the same track if pti := p.pendingTracks[cid]; pti != nil { trackID = pti.trackInfos[0].Sid } @@ -3582,11 +3582,13 @@ func (p *ParticipantImpl) setTrackID(cid string, info *livekit.TrackInfo) { // otherwise generate if trackID == "" { trackPrefix := utils.TrackPrefix - if info.Type == livekit.TrackType_VIDEO { + switch info.Type { + case livekit.TrackType_VIDEO: trackPrefix += "V" - } else if info.Type == livekit.TrackType_AUDIO { + case livekit.TrackType_AUDIO: trackPrefix += "A" } + switch info.Source { case livekit.TrackSource_CAMERA: trackPrefix += "C" diff --git a/pkg/sfu/buffer/videolayerutils.go b/pkg/sfu/buffer/videolayerutils.go index 5045c6d08..2754b59a8 100644 --- a/pkg/sfu/buffer/videolayerutils.go +++ b/pkg/sfu/buffer/videolayerutils.go @@ -439,6 +439,7 @@ func GetSpatialLayerForRid(mimeType mime.MimeType, rid string, ti *livekit.Track "invalid layer for rid, returning default", "trackID", ti.Sid, "rid", rid, + "mimeType", mimeType, "trackInfo", logger.Proto(ti), ) return 0 @@ -462,7 +463,7 @@ func GetSpatialLayerForVideoQuality(mimeType mime.MimeType, quality livekit.Vide } // requested quality is higher than available layers, return the highest available layer - return layers[len(layers)-1].SpatialLayer + return VideoQualityToSpatialLayer(mimeType, quality, ti) } func GetVideoQualityForSpatialLayer(mimeType mime.MimeType, spatialLayer int32, ti *livekit.TrackInfo) livekit.VideoQuality {