Fix out-of-order check after move to 64-bit extended sequence number. (#2004)

Also, clean up the RTCP RR handling a bit by removing redundant check.
This commit is contained in:
Raja Subramanian
2023-08-28 07:38:44 +05:30
committed by GitHub
parent a48660fa77
commit 73b87f04df
2 changed files with 13 additions and 10 deletions

View File

@@ -560,7 +560,7 @@ func (r *RTPStats) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt uint32
r.lock.Lock()
defer r.lock.Unlock()
if !r.initialized || !r.endTime.IsZero() || !r.params.IsReceiverReportDriven || uint64(rr.LastSequenceNumber) < r.sequenceNumber.GetExtendedHighest() {
if !r.initialized || !r.endTime.IsZero() || !r.params.IsReceiverReportDriven {
// 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
@@ -575,6 +575,8 @@ func (r *RTPStats) UpdateFromReceiverReport(rr rtcp.ReceptionReport) (rtt uint32
if extHighestSNOverridden < r.sequenceNumber.GetExtendedHighest() {
// 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.
r.lastRRTime = time.Now()
r.lastRR = rr
return
}

View File

@@ -138,8 +138,16 @@ func (r *RTPMunger) PacketDropped(extPkt *buffer.ExtPacket) {
}
func (r *RTPMunger) UpdateAndGetSnTs(extPkt *buffer.ExtPacket) (*TranslationParamsRTP, error) {
diff := extPkt.ExtSequenceNumber - r.extHighestIncomingSN
if diff > (1 << 31) {
diff := int64(extPkt.ExtSequenceNumber - r.extHighestIncomingSN)
// can get duplicate packet due to FEC
if diff == 0 {
return &TranslationParamsRTP{
snOrdering: SequenceNumberOrderingDuplicate,
}, ErrDuplicatePacket
}
if diff < 0 {
// out-of-order, look up sequence number offset cache
snOffset, err := r.snRangeMap.GetValue(extPkt.ExtSequenceNumber)
if err != nil {
@@ -155,13 +163,6 @@ func (r *RTPMunger) UpdateAndGetSnTs(extPkt *buffer.ExtPacket) (*TranslationPara
}, nil
}
// can get duplicate packet due to FEC
if diff == 0 {
return &TranslationParamsRTP{
snOrdering: SequenceNumberOrderingDuplicate,
}, ErrDuplicatePacket
}
ordering := SequenceNumberOrderingContiguous
if diff > 1 {
ordering = SequenceNumberOrderingGap