Prevent race in determining BWE type. (#3891)

This commit is contained in:
Raja Subramanian
2025-08-30 21:56:11 +05:30
committed by GitHub
parent f7291fdaa8
commit 98352fd0f9

View File

@@ -489,15 +489,7 @@ func (d *DownTrack) Bind(t webrtc.TrackLocalContext) (webrtc.RTPCodecParameters,
}
// Bind is called under RTPSender.mu lock, call the RTPSender.GetParameters in goroutine to avoid deadlock
go func() {
if tr := d.transceiver.Load(); tr != nil {
if sender := tr.Sender(); sender != nil {
extensions := sender.GetParameters().HeaderExtensions
d.params.Logger.Debugw("negotiated downtrack extensions", "extensions", extensions)
d.SetRTPHeaderExtensions(extensions)
}
}
}()
go d.setRTPHeaderExtensions()
doBind := func() {
d.bindLock.Lock()
@@ -714,12 +706,9 @@ func (d *DownTrack) SetStreamAllocatorListener(listener DownTrackStreamAllocator
d.streamAllocatorListener = listener
d.streamAllocatorLock.Unlock()
if listener != nil {
if !listener.IsBWEEnabled(d) {
d.absSendTimeExtID = 0
d.transportWideExtID = 0
}
d.setRTPHeaderExtensions()
if listener != nil {
// kick off a gratuitous allocation
listener.OnSubscriptionChanged(d)
}
@@ -795,14 +784,27 @@ func (d *DownTrack) SetReceiver(r TrackReceiver) {
}
// Sets RTP header extensions for this track
func (d *DownTrack) SetRTPHeaderExtensions(rtpHeaderExtensions []webrtc.RTPHeaderExtensionParameter) {
isBWEEnabled := true
bweType := bwe.BWETypeNone
if sal := d.getStreamAllocatorListener(); sal != nil {
isBWEEnabled = sal.IsBWEEnabled(d)
bweType = sal.BWEType()
func (d *DownTrack) setRTPHeaderExtensions() {
d.bindLock.Lock()
defer d.bindLock.Unlock()
sal := d.getStreamAllocatorListener()
if sal == nil {
return
}
for _, ext := range rtpHeaderExtensions {
var extensions []webrtc.RTPHeaderExtensionParameter
if tr := d.transceiver.Load(); tr != nil {
if sender := tr.Sender(); sender != nil {
extensions = sender.GetParameters().HeaderExtensions
d.params.Logger.Debugw("negotiated downtrack extensions", "extensions", extensions)
}
}
isBWEEnabled := sal.IsBWEEnabled(d)
bweType := sal.BWEType()
for _, ext := range extensions {
switch ext.URI {
case sdp.ABSSendTimeURI:
if isBWEEnabled && bweType == bwe.BWETypeRemote {