From f4f9df375f2feddb0e941cbe7c2ca4d8447c3cd7 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Wed, 9 Feb 2022 14:08:07 +0530 Subject: [PATCH] Ignore 0 RTT for nacker (#424) - Propagate when a track is added - Reduce scope of lock --- pkg/sfu/buffer/buffer.go | 2 +- pkg/sfu/receiver.go | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/pkg/sfu/buffer/buffer.go b/pkg/sfu/buffer/buffer.go index 43520d669..45c6f1c95 100644 --- a/pkg/sfu/buffer/buffer.go +++ b/pkg/sfu/buffer/buffer.go @@ -318,7 +318,7 @@ func (b *Buffer) SetRTT(rtt uint32) { b.stats.RTT = rtt - if b.nacker != nil { + if b.nacker != nil && rtt != 0 { b.nacker.SetRTT(rtt) } } diff --git a/pkg/sfu/receiver.go b/pkg/sfu/receiver.go index 8a6dc5103..f7c88e511 100644 --- a/pkg/sfu/receiver.go +++ b/pkg/sfu/receiver.go @@ -64,6 +64,7 @@ type WebRTCReceiver struct { bufferMu sync.RWMutex buffers [DefaultMaxLayerSpatial + 1]*buffer.Buffer + rtt uint32 upTrackMu sync.RWMutex upTracks [DefaultMaxLayerSpatial + 1]*webrtc.TrackRemote @@ -77,7 +78,6 @@ type WebRTCReceiver struct { streamTrackerManager *StreamTrackerManager - rtt uint32 connectionStats *connectionquality.ConnectionStats // update stats @@ -187,17 +187,23 @@ func (w *WebRTCReceiver) GetConnectionScore() float32 { } func (w *WebRTCReceiver) SetRTT(rtt uint32) { - w.rtt = rtt + w.bufferMu.Lock() + if w.rtt == rtt { + w.bufferMu.Unlock() + return + } - w.bufferMu.RLock() - for _, buffer := range w.buffers { + w.rtt = rtt + buffers := w.buffers + w.bufferMu.Unlock() + + for _, buffer := range buffers { if buffer == nil { continue } buffer.SetRTT(rtt) } - w.bufferMu.RUnlock() } func (w *WebRTCReceiver) SetTrackMeta(trackID livekit.TrackID, streamID string) { @@ -261,7 +267,9 @@ func (w *WebRTCReceiver) AddUpTrack(track *webrtc.TrackRemote, buff *buffer.Buff w.bufferMu.Lock() w.buffers[layer] = buff + rtt := w.rtt w.bufferMu.Unlock() + buff.SetRTT(rtt) if w.Kind() == webrtc.RTPCodecTypeVideo && w.useTrackers { w.streamTrackerManager.AddTracker(layer)