From 49fd332e91208555d2d1cfe47725353975cf7775 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Mon, 12 Feb 2024 12:14:25 +0530 Subject: [PATCH] Store first SR also as it can get reset (#2472) --- pkg/sfu/buffer/rtpstats_sender.go | 12 ++++++------ pkg/sfu/downtrack.go | 24 ++++++++++++++++++++---- pkg/sfu/receiver.go | 2 +- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/pkg/sfu/buffer/rtpstats_sender.go b/pkg/sfu/buffer/rtpstats_sender.go index 98b25744a..ca4415140 100644 --- a/pkg/sfu/buffer/rtpstats_sender.go +++ b/pkg/sfu/buffer/rtpstats_sender.go @@ -583,15 +583,15 @@ func (r *RTPStatsSender) LastReceiverReportTime() time.Time { return r.lastRRTime } -func (r *RTPStatsSender) MaybeAdjustFirstPacketTime(srData *RTCPSenderReportData, ts uint32) { +func (r *RTPStatsSender) MaybeAdjustFirstPacketTime(srFirst *RTCPSenderReportData, srNewest *RTCPSenderReportData, ts uint32) { r.lock.Lock() defer r.lock.Unlock() - srDataCopy := *srData - if r.srFeedFirst == nil { - r.srFeedFirst = &srDataCopy - } - r.srFeedNewest = &srDataCopy + srFirstCopy := *srFirst + r.srFeedFirst = &srFirstCopy + + srNewestCopy := *srNewest + r.srFeedNewest = &srNewestCopy r.maybeAdjustFirstPacketTime(ts, uint32(r.extStartTS)) } diff --git a/pkg/sfu/downtrack.go b/pkg/sfu/downtrack.go index 54a948f7a..c4deac566 100644 --- a/pkg/sfu/downtrack.go +++ b/pkg/sfu/downtrack.go @@ -55,7 +55,13 @@ type TrackSender interface { ID() string SubscriberID() livekit.ParticipantID TrackInfoAvailable() - HandleRTCPSenderReportData(payloadType webrtc.PayloadType, isSVC bool, layer int32, srData *buffer.RTCPSenderReportData) error + HandleRTCPSenderReportData( + payloadType webrtc.PayloadType, + isSVC bool, + layer int32, + srFirst *buffer.RTCPSenderReportData, + srNewest *buffer.RTCPSenderReportData, + ) error } // ------------------------------------------------------------------- @@ -1913,9 +1919,19 @@ func (d *DownTrack) sendSilentFrameOnMuteForOpus() { } } -func (d *DownTrack) HandleRTCPSenderReportData(_payloadType webrtc.PayloadType, isSVC bool, layer int32, srData *buffer.RTCPSenderReportData) error { - if (layer == d.forwarder.GetReferenceLayerSpatial() || (layer == 0 && isSVC)) && srData != nil { - d.rtpStats.MaybeAdjustFirstPacketTime(srData, srData.RTPTimestamp+uint32(d.forwarder.GetReferenceTimestampOffset())) +func (d *DownTrack) HandleRTCPSenderReportData( + _payloadType webrtc.PayloadType, + isSVC bool, + layer int32, + srFirst *buffer.RTCPSenderReportData, + srNewest *buffer.RTCPSenderReportData, +) error { + if (layer == d.forwarder.GetReferenceLayerSpatial() || (layer == 0 && isSVC)) && srNewest != nil { + d.rtpStats.MaybeAdjustFirstPacketTime( + srFirst, + srNewest, + srNewest.RTPTimestamp+uint32(d.forwarder.GetReferenceTimestampOffset()), + ) } return nil } diff --git a/pkg/sfu/receiver.go b/pkg/sfu/receiver.go index 0eba7f48d..e33f06eb4 100644 --- a/pkg/sfu/receiver.go +++ b/pkg/sfu/receiver.go @@ -353,7 +353,7 @@ func (w *WebRTCReceiver) AddUpTrack(track *webrtc.TrackRemote, buff *buffer.Buff w.streamTrackerManager.SetRTCPSenderReportData(layer, srFirst, srNewest) w.downTrackSpreader.Broadcast(func(dt TrackSender) { - _ = dt.HandleRTCPSenderReportData(w.codec.PayloadType, w.isSVC, layer, srNewest) + _ = dt.HandleRTCPSenderReportData(w.codec.PayloadType, w.isSVC, layer, srFirst, srNewest) }) })