mirror of
https://github.com/livekit/livekit.git
synced 2026-03-30 22:05:39 +00:00
Use signed check on rollback. (#3389)
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user