From c6303bb15a17d2dc3e36a55f49f45fe80ac1cf5c Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Thu, 18 Jun 2026 11:58:39 +0530 Subject: [PATCH] Fix skipped packets accounting. (#4604) * Fix skipped packets accounting. No need to copy unskipped packet RTP header to skipped packet. That was causing padding bytes to be counted. Also use Header.PaddingSize as base PaddingSize is deprecated. * PaddingSize in header in utils --- pkg/sfu/buffer/buffer_base.go | 27 +++++++++++---------------- pkg/sfu/testutils/data.go | 4 ++-- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/pkg/sfu/buffer/buffer_base.go b/pkg/sfu/buffer/buffer_base.go index b94326cff..68980ea05 100644 --- a/pkg/sfu/buffer/buffer_base.go +++ b/pkg/sfu/buffer/buffer_base.go @@ -742,25 +742,20 @@ func (b *BufferBase) HandleIncomingPacketLocked( b.processAudioSsrcLevelHeaderExtension(rtpPacket, arrivalTime) if len(skippedSeqs) > 0 { - skippedRtpPkt := rtp.Packet{ - Header: rtpPacket.Header, - } - skippedRtpPkt.Marker = false // Use the current highest timestamp to prevent the case of old sequence number and newer timestamp. // It is possible that the skipped packet is older. An example sequence // - Packet 10, skipped 6, 7, 9 -> Packet 8 is unknown at this point - // - Packet 11, skipped 8 -> this would cause sequence number be older, but using timestamp from Packet 11 will make time stamp diff +ve - skippedRtpPkt.Timestamp = b.rtpStats.HighestTimestamp() + // - Packet 11, skipped 8 -> this would cause sequence number to be older, but using timestamp from Packet 11 will make time stamp diff +ve + ts := b.rtpStats.HighestTimestamp() for _, sn := range skippedSeqs { - skippedRtpPkt.SequenceNumber = sn flowState := b.rtpStats.Update( arrivalTime, - skippedRtpPkt.Header.SequenceNumber, - skippedRtpPkt.Header.Timestamp, - skippedRtpPkt.Header.Marker, - skippedRtpPkt.Header.MarshalSize(), - len(skippedRtpPkt.Payload), - int(skippedRtpPkt.PaddingSize), + sn, + ts, + false, // no marker + 0, // no header for skipped packet, so 0 size + 0, // no payload + 0, // no padding ) if flowState.UnhandledReason == rtpstats.RTPFlowUnhandledReasonNone && !flowState.IsOutOfOrder { if err := b.snRangeMap.ExcludeRange(flowState.ExtSequenceNumber, flowState.ExtSequenceNumber+1); err != nil { @@ -790,7 +785,7 @@ func (b *BufferBase) HandleIncomingPacketLocked( rtpPacket.Header.Marker, rtpPacket.Header.MarshalSize(), len(rtpPacket.Payload), - int(rtpPacket.PaddingSize), + int(rtpPacket.Header.PaddingSize), ) switch flowState.UnhandledReason { case rtpstats.RTPFlowUnhandledReasonNone: @@ -808,7 +803,7 @@ func (b *BufferBase) HandleIncomingPacketLocked( rtpPacket.Header.Marker, rtpPacket.Header.MarshalSize(), len(rtpPacket.Payload), - int(rtpPacket.PaddingSize), + int(rtpPacket.Header.PaddingSize), ) default: return 0, fmt.Errorf("unhandled reason: %s", flowState.UnhandledReason.String()) @@ -866,7 +861,7 @@ func (b *BufferBase) HandleIncomingPacketLocked( "timestamp", rtpPacket.Timestamp, "extTimestamp", flowState.ExtTimestamp, "payloadSize", len(rtpPacket.Payload), - "paddingSize", rtpPacket.PaddingSize, + "paddingSize", rtpPacket.Header.PaddingSize, "rtpStats", b.rtpStats, "rtpStatsLite", b.rtpStatsLite, "snRangeMap", b.snRangeMap, diff --git a/pkg/sfu/testutils/data.go b/pkg/sfu/testutils/data.go index 34b1fca62..9b8a1386e 100644 --- a/pkg/sfu/testutils/data.go +++ b/pkg/sfu/testutils/data.go @@ -54,9 +54,9 @@ func GetTestExtPacket(params *TestExtPacketParams) (*buffer.ExtPacket, error) { SequenceNumber: params.SequenceNumber, Timestamp: params.Timestamp, SSRC: params.SSRC, + PaddingSize: params.PaddingSize, }, - Payload: make([]byte, params.PayloadSize), - PaddingSize: params.PaddingSize, + Payload: make([]byte, params.PayloadSize), } raw, err := packet.Marshal()