From 4fe80877df4667940ec644cb38957110fee59c9d Mon Sep 17 00:00:00 2001 From: Raja Subramanian Date: Tue, 31 Mar 2026 20:09:07 +0530 Subject: [PATCH] Log time inversion between incoming packets (#4415) * Log time inversion between incoming packets Log of timestamp inversion within a red packet did not show anything. Log across packets. Not dropping till there is more evidence of the cause. * save * comment --- pkg/sfu/redprimaryreceiver.go | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/pkg/sfu/redprimaryreceiver.go b/pkg/sfu/redprimaryreceiver.go index 0cc5bdc2c..a36312d05 100644 --- a/pkg/sfu/redprimaryreceiver.go +++ b/pkg/sfu/redprimaryreceiver.go @@ -45,6 +45,9 @@ type RedPrimaryReceiver struct { firstPktReceived bool lastSeq uint16 + lastExtSeq uint64 + lastTS uint32 + lastExtTS uint64 // bitset for upstream packet receive history [lastSeq-8, lastSeq-1], bit 1 represents packet received pktHistory byte @@ -107,10 +110,41 @@ func (r *RedPrimaryReceiver) ForwardRTP(pkt *buffer.ExtPacket, spatialLayer int3 "packetETS", pPkt.ExtTimestamp, "pktHistory", r.pktHistory, "redHeader", pkt.Packet.Payload[:10], + "payloadSize", len(pkt.Packet.Payload), ) continue // drop the packet which causes the inversion } + if r.lastTS != 0 { + if pPkt.ExtSequenceNumber > r.lastExtSeq && pPkt.ExtTimestamp < r.lastExtTS { + r.logger.Warnw( + "timestamp inversion", nil, + "numPackets", len(pkts), + "primaryIncomingSN", pkt.Packet.Header.SequenceNumber, + "primaryIncomingTS", pkt.Packet.Header.Timestamp, + "primaryExtractedSN", pkts[len(pkts)-1].SequenceNumber, + "primaryExtractedTS", pkts[len(pkts)-1].Timestamp, + "primaryESN", pkt.ExtSequenceNumber, + "primaryETS", pkt.ExtTimestamp, + "packetIndex", i, + "packetExtractedSN", pkts[i].SequenceNumber, + "packetESN", pPkt.ExtSequenceNumber, + "packetExtractedTS", pkts[i].Timestamp, + "packetETS", pPkt.ExtTimestamp, + "pktHistory", r.pktHistory, + "redHeader", pkt.Packet.Payload[:10], + "payloadSize", len(pkt.Packet.Payload), + "lastSeq", r.lastSeq, + "lastExtSeq", r.lastExtSeq, + "lastTS", r.lastTS, + "lastExtTS", r.lastExtTS, + ) + } + } + r.lastTS = pPkt.Packet.Header.Timestamp + r.lastExtTS = pPkt.ExtTimestamp + r.lastExtSeq = pPkt.ExtSequenceNumber + // not modify the ExtPacket.RawPacket here for performance since it is not used by the DownTrack, // otherwise it should be set to the correct value (marshal the primary rtp packet) r.downTrackSpreader.Broadcast(func(dt TrackSender) {