From dbe2af38868759fe5ac5318ffdc0e0e5dd102a36 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Sat, 2 Mar 2024 23:12:20 +0530 Subject: [PATCH] Remove subscriber if track closed while adding subscriber. (#2537) * Remove subscriber if track closed while adding subscriber. It is possible that the track is closed when subscriber add is processed. That subscriber would have been dangling off a closed track. Check again after adding subscriber if track is closed. If it is, remove the subscriber and return error so that subscription manager re-resolves. * oops, wrong unlock --- pkg/rtc/mediatrackreceiver.go | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/rtc/mediatrackreceiver.go b/pkg/rtc/mediatrackreceiver.go index b0bb43ed5..0283488a0 100644 --- a/pkg/rtc/mediatrackreceiver.go +++ b/pkg/rtc/mediatrackreceiver.go @@ -102,6 +102,7 @@ type MediaTrackReceiver struct { trackInfo *livekit.TrackInfo potentialCodecs []webrtc.RTPCodecParameters state mediaTrackReceiverState + willBeResumed bool onSetupReceiver func(mime string) onMediaLossFeedback func(dt *sfu.DownTrack, report *rtcp.ReceiverReport) @@ -275,6 +276,8 @@ func (t *MediaTrackReceiver) ClearAllReceivers(willBeResumed bool) { t.lock.Lock() receivers := t.receivers t.receivers = nil + + t.willBeResumed = willBeResumed t.lock.Unlock() for _, r := range receivers { @@ -482,7 +485,24 @@ func (t *MediaTrackReceiver) AddSubscriber(sub types.LocalParticipant) (types.Su Logger: tLogger, DisableRed: t.trackInfo.GetDisableRed() || !t.params.AudioConfig.ActiveREDEncoding, }) - return t.MediaTrackSubscriptions.AddSubscriber(sub, wr) + subTrack, err := t.MediaTrackSubscriptions.AddSubscriber(sub, wr) + + // media track could have been closed while adding subscription + remove := false + willBeResumed := false + t.lock.RLock() + if t.state != mediaTrackReceiverStateOpen { + willBeResumed = t.willBeResumed + remove = true + } + t.lock.RUnlock() + + if remove { + _ = t.MediaTrackSubscriptions.RemoveSubscriber(sub.ID(), willBeResumed) + return nil, ErrNotOpen + } + + return subTrack, err } // RemoveSubscriber removes participant from subscription