From 061eb8b4e8df1cce0a2414239dd3c0870834af13 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 27 Oct 2025 20:14:33 +0530 Subject: [PATCH] AddDownTrack to regressed codec after restarting forwarder. (#4037) Without that the new codec was skipping through with old selector and not working correctly. --- pkg/sfu/downtrack.go | 11 ++++++++--- pkg/sfu/forwarder.go | 8 +------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index 4736c233b..79a559ca0 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -710,7 +710,8 @@ func (d *DownTrack) handleUpstreamCodecChange(mimeType string) { ) receiver := d.Receiver() - d.forwarder.Restart(codec.RTPCodecCapability, receiver.HeaderExtensions(), receiver.VideoLayerMode()) + d.forwarder.Restart() + d.forwarder.DetermineCodec(codec.RTPCodecCapability, receiver.HeaderExtensions(), receiver.VideoLayerMode()) d.connectionStats.UpdateCodec(d.Mime(), isFECEnabled) } @@ -794,13 +795,17 @@ func (d *DownTrack) SetReceiver(r TrackReceiver) { d.receiverLock.Unlock() old.DeleteDownTrack(d.SubscriberID()) + d.bindLock.Unlock() + + r.AddOnReady(d.handleReceiverReady) + d.handleUpstreamCodecChange(r.Codec().MimeType) + + d.bindLock.Lock() if err := r.AddDownTrack(d); err != nil { d.params.Logger.Warnw("failed to add downtrack to receiver", err) } d.bindLock.Unlock() - r.AddOnReady(d.handleReceiverReady) - d.handleUpstreamCodecChange(r.Codec().MimeType) if sal := d.getStreamAllocatorListener(); sal != nil { sal.OnSubscribedLayerChanged(d, d.forwarder.MaxLayer()) } diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 04439a597..8c59db68c 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -310,10 +310,6 @@ func (f *Forwarder) DetermineCodec(codec webrtc.RTPCodecCapability, extensions [ f.lock.Lock() defer f.lock.Unlock() - f.determineCodecLocked(codec, extensions, videoLayerMode) -} - -func (f *Forwarder) determineCodecLocked(codec webrtc.RTPCodecCapability, extensions []webrtc.RTPHeaderExtensionParameter, videoLayerMode livekit.VideoLayer_Mode) { if videoLayerMode == livekit.VideoLayer_ONE_SPATIAL_LAYER_PER_STREAM_INCOMPLETE_RTCP_SR { f.skipReferenceTS = true } @@ -1634,7 +1630,7 @@ func (f *Forwarder) CheckSync() (bool, int32) { return f.vls.CheckSync() } -func (f *Forwarder) Restart(codec webrtc.RTPCodecCapability, extensions []webrtc.RTPHeaderExtensionParameter, videoLayerMode livekit.VideoLayer_Mode) { +func (f *Forwarder) Restart() { f.lock.Lock() defer f.lock.Unlock() @@ -1648,8 +1644,6 @@ func (f *Forwarder) Restart(codec webrtc.RTPCodecCapability, extensions []webrtc } f.lastSwitchExtIncomingTS = 0 f.refVideoLayerMode = livekit.VideoLayer_MODE_UNUSED - - f.determineCodecLocked(codec, extensions, videoLayerMode) } func (f *Forwarder) FilterRTX(nacks []uint16) (filtered []uint16, disallowedLayers [buffer.DefaultMaxLayerSpatial + 1]bool) {