Skip to content

Commit 98352fd

Browse files
authored
Prevent race in determining BWE type. (livekit#3891)
1 parent f7291fd commit 98352fd

1 file changed

Lines changed: 23 additions & 21 deletions

File tree

pkg/sfu/downtrack.go

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -489,15 +489,7 @@ func (d *DownTrack) Bind(t webrtc.TrackLocalContext) (webrtc.RTPCodecParameters,
489489
}
490490

491491
// Bind is called under RTPSender.mu lock, call the RTPSender.GetParameters in goroutine to avoid deadlock
492-
go func() {
493-
if tr := d.transceiver.Load(); tr != nil {
494-
if sender := tr.Sender(); sender != nil {
495-
extensions := sender.GetParameters().HeaderExtensions
496-
d.params.Logger.Debugw("negotiated downtrack extensions", "extensions", extensions)
497-
d.SetRTPHeaderExtensions(extensions)
498-
}
499-
}
500-
}()
492+
go d.setRTPHeaderExtensions()
501493

502494
doBind := func() {
503495
d.bindLock.Lock()
@@ -714,12 +706,9 @@ func (d *DownTrack) SetStreamAllocatorListener(listener DownTrackStreamAllocator
714706
d.streamAllocatorListener = listener
715707
d.streamAllocatorLock.Unlock()
716708

717-
if listener != nil {
718-
if !listener.IsBWEEnabled(d) {
719-
d.absSendTimeExtID = 0
720-
d.transportWideExtID = 0
721-
}
709+
d.setRTPHeaderExtensions()
722710

711+
if listener != nil {
723712
// kick off a gratuitous allocation
724713
listener.OnSubscriptionChanged(d)
725714
}
@@ -795,14 +784,27 @@ func (d *DownTrack) SetReceiver(r TrackReceiver) {
795784
}
796785

797786
// Sets RTP header extensions for this track
798-
func (d *DownTrack) SetRTPHeaderExtensions(rtpHeaderExtensions []webrtc.RTPHeaderExtensionParameter) {
799-
isBWEEnabled := true
800-
bweType := bwe.BWETypeNone
801-
if sal := d.getStreamAllocatorListener(); sal != nil {
802-
isBWEEnabled = sal.IsBWEEnabled(d)
803-
bweType = sal.BWEType()
787+
func (d *DownTrack) setRTPHeaderExtensions() {
788+
d.bindLock.Lock()
789+
defer d.bindLock.Unlock()
790+
791+
sal := d.getStreamAllocatorListener()
792+
if sal == nil {
793+
return
794+
}
795+
796+
var extensions []webrtc.RTPHeaderExtensionParameter
797+
if tr := d.transceiver.Load(); tr != nil {
798+
if sender := tr.Sender(); sender != nil {
799+
extensions = sender.GetParameters().HeaderExtensions
800+
d.params.Logger.Debugw("negotiated downtrack extensions", "extensions", extensions)
801+
}
804802
}
805-
for _, ext := range rtpHeaderExtensions {
803+
804+
isBWEEnabled := sal.IsBWEEnabled(d)
805+
bweType := sal.BWEType()
806+
807+
for _, ext := range extensions {
806808
switch ext.URI {
807809
case sdp.ABSSendTimeURI:
808810
if isBWEEnabled && bweType == bwe.BWETypeRemote {

0 commit comments

Comments
 (0)