From e357fdffb77a084a308e0284c31004e531fa4046 Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Wed, 14 Oct 2026 17:44:12 +0530 Subject: [PATCH] rtpstats: take mono nanoseconds in GetExpectedRTPTimestamp (#5008) Callers passed mono.Now() as a time.Time, which made it easy to pass time.Now() by mistake and mix clocks. Take mono nanoseconds instead. Co-authored-by: Claude Opus 5.5 --- pkg/sfu/forwarder.go | 4 ++-- pkg/sfu/rtpstats/rtpstats_sender.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/sfu/forwarder.go b/pkg/sfu/forwarder.go index 7e378ad20..8e2786c08 100644 --- a/pkg/sfu/forwarder.go +++ b/pkg/sfu/forwarder.go @@ -2014,7 +2014,7 @@ func (f *Forwarder) processSourceSwitch(extPkt *buffer.ExtPacket, layer int32) ( } if f.rtpStats != nil { - tsExt, err := f.rtpStats.GetExpectedRTPTimestamp(switchingAt) + tsExt, err := f.rtpStats.GetExpectedRTPTimestamp(switchingAt.UnixNano()) if err == nil { extExpectedTS = tsExt if f.lastReferencePayloadType == -1 { @@ -2453,7 +2453,7 @@ func (f *Forwarder) GetSnTsForBlankFrames(frameRate uint32, numPackets int) ([]S extLastTS := f.rtpMunger.GetExtLastTimestamp() extExpectedTS := extLastTS if f.rtpStats != nil { - tsExt, err := f.rtpStats.GetExpectedRTPTimestamp(mono.Now()) + tsExt, err := f.rtpStats.GetExpectedRTPTimestamp(mono.UnixNano()) if err == nil { extExpectedTS = tsExt } diff --git a/pkg/sfu/rtpstats/rtpstats_sender.go b/pkg/sfu/rtpstats/rtpstats_sender.go index eafa7bc7b..578a4a067 100644 --- a/pkg/sfu/rtpstats/rtpstats_sender.go +++ b/pkg/sfu/rtpstats/rtpstats_sender.go @@ -901,7 +901,7 @@ func (r *RTPStatsSender) MaybeAdjustFirstPacketTime(publisherSRData *livekit.RTC } } -func (r *RTPStatsSender) GetExpectedRTPTimestamp(at time.Time) (expectedTSExt uint64, err error) { +func (r *RTPStatsSender) GetExpectedRTPTimestamp(atNano int64) (expectedTSExt uint64, err error) { r.lock.RLock() defer r.lock.RUnlock() @@ -910,7 +910,7 @@ func (r *RTPStatsSender) GetExpectedRTPTimestamp(at time.Time) (expectedTSExt ui return } - timeDiff := at.Sub(time.Unix(0, r.firstTime)) + timeDiff := time.Duration(atNano - r.firstTime) expectedTSExt = r.extStartTS + r.rtpConverter.ToRTPExt(timeDiff) return }