From 20b400faef5739e4e9a3fe460611daad8c68d4cf Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Sat, 1 Feb 2025 14:16:53 +0530 Subject: [PATCH] Use signed check on rollback. (#3389) --- pkg/sfu/rtpstats/rtpstats_sender.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pkg/sfu/rtpstats/rtpstats_sender.go b/pkg/sfu/rtpstats/rtpstats_sender.go index 87cf0edb8..5eb66b533 100644 --- a/pkg/sfu/rtpstats/rtpstats_sender.go +++ b/pkg/sfu/rtpstats/rtpstats_sender.go @@ -542,6 +542,18 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt return } + extHighestSNFromRR := r.extHighestSNFromRR&0xFFFF_FFFF_0000_0000 + uint64(rr.LastSequenceNumber) + r.extHighestSNFromRRMisalignment + if r.lastRRTime != 0 { + if (rr.LastSequenceNumber-r.lastRR.LastSequenceNumber) < (1<<31) && rr.LastSequenceNumber < r.lastRR.LastSequenceNumber { + extHighestSNFromRR += (1 << 32) + } + } + if (extHighestSNFromRR + (r.extStartSN & 0xFFFF_FFFF_FFFF_0000)) < r.extStartSN { + // it is possible that the `LastSequenceNumber` in the receiver report is before the starting + // sequence number when dummy packets are used to trigger Pion's OnTrack path. + return + } + nowNano := mono.UnixNano() defer func() { r.lastRRTime = nowNano @@ -555,18 +567,6 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt return time.Duration(nowNano - r.startTime) } - extHighestSNFromRR := r.extHighestSNFromRR&0xFFFF_FFFF_0000_0000 + uint64(rr.LastSequenceNumber) + r.extHighestSNFromRRMisalignment - if r.lastRRTime != 0 { - if (rr.LastSequenceNumber-r.lastRR.LastSequenceNumber) < (1<<31) && rr.LastSequenceNumber < r.lastRR.LastSequenceNumber { - extHighestSNFromRR += (1 << 32) - } - } - if (extHighestSNFromRR + (r.extStartSN & 0xFFFF_FFFF_FFFF_0000)) < r.extStartSN { - // it is possible that the `LastSequenceNumber` in the receiver report is before the starting - // sequence number when dummy packets are used to trigger Pion's OnTrack path. - return - } - if r.extHighestSNFromRR > extHighestSNFromRR { // there are cases where remote does not send RTCP Receiver Report for extended periods of time, // some times several minutes, in that interval the sequence number rolls over, @@ -603,7 +603,7 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt } } else { // if remote adjusts somehow, roll back alignment - if (extHighestSNFromRR - r.extHighestSNFromRR) > (1 << 15) { + if r.lastRRTime != 0 && (extHighestSNFromRR-r.extHighestSNFromRR) > (1<<15) { r.logger.Infow( "receiver report caught up rollover, adjusting", "timeSinceLastRR", timeSinceLastRR(), @@ -611,7 +611,7 @@ func (r *RTPStatsSender) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt "extHighestSNFromRR", extHighestSNFromRR, "rtpStats", lockedRTPStatsSenderLogEncoder{r}, ) - for (extHighestSNFromRR - r.extHighestSNFromRR) > (1 << 15) { + for int64(extHighestSNFromRR-r.extHighestSNFromRR) > (1 << 15) { extHighestSNFromRR -= (1 << 16) r.extHighestSNFromRRMisalignment -= (1 << 16) }