diff --git a/pkg/sfu/bwe/sendsidebwe/congestion_detector.go b/pkg/sfu/bwe/sendsidebwe/congestion_detector.go index e358c0f25..66e8e495d 100644 --- a/pkg/sfu/bwe/sendsidebwe/congestion_detector.go +++ b/pkg/sfu/bwe/sendsidebwe/congestion_detector.go @@ -627,6 +627,7 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) { // try an older group for idx := len(c.packetGroups) - 2; idx >= 0; idx-- { opg := c.packetGroups[idx] + c.params.Logger.Debugw("send side bwe: trying older group", "packetInfo", pi, "packetGroup", opg) if err := opg.Add(pi, sendDelta, recvDelta, isLost); err == nil { return } else if err == errGroupFinalized { @@ -650,6 +651,23 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) { sequenceNumber := report.BaseSequenceNumber endSequenceNumberExclusive := sequenceNumber + report.PacketStatusCount deltaIdx := 0 + processSymbol := func(symbol uint16) { + recvTime := int64(0) + isLost := false + if symbol != rtcp.TypeTCCPacketNotReceived { + recvRefTime += report.RecvDeltas[deltaIdx].Delta + deltaIdx++ + + recvTime = recvRefTime + } else { + isLost = true + } + pi, sendDelta, recvDelta := c.packetTracker.RecordPacketIndicationFromRemote(sequenceNumber, recvTime) + if pi.sendTime != 0 { + trackPacketGroup(&pi, sendDelta, recvDelta, isLost) + } + sequenceNumber++ + } for _, chunk := range report.PacketChunks { if sequenceNumber == endSequenceNumberExclusive { break @@ -662,21 +680,7 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) { break } - recvTime := int64(0) - isLost := false - if chunk.PacketStatusSymbol != rtcp.TypeTCCPacketNotReceived { - recvRefTime += report.RecvDeltas[deltaIdx].Delta - deltaIdx++ - - recvTime = recvRefTime - } else { - isLost = true - } - pi, sendDelta, recvDelta := c.packetTracker.RecordPacketIndicationFromRemote(sequenceNumber, recvTime) - if pi.sendTime != 0 { - trackPacketGroup(&pi, sendDelta, recvDelta, isLost) - } - sequenceNumber++ + processSymbol(chunk.PacketStatusSymbol) } case *rtcp.StatusVectorChunk: @@ -685,21 +689,7 @@ func (c *congestionDetector) HandleTWCCFeedback(report *rtcp.TransportLayerCC) { break } - recvTime := int64(0) - isLost := false - if symbol != rtcp.TypeTCCPacketNotReceived { - recvRefTime += report.RecvDeltas[deltaIdx].Delta - deltaIdx++ - - recvTime = recvRefTime - } else { - isLost = true - } - pi, sendDelta, recvDelta := c.packetTracker.RecordPacketIndicationFromRemote(sequenceNumber, recvTime) - if pi.sendTime != 0 { - trackPacketGroup(&pi, sendDelta, recvDelta, isLost) - } - sequenceNumber++ + processSymbol(symbol) } } } diff --git a/pkg/sfu/bwe/sendsidebwe/packet_group.go b/pkg/sfu/bwe/sendsidebwe/packet_group.go index 0c9f2d0f5..6a3fed27b 100644 --- a/pkg/sfu/bwe/sendsidebwe/packet_group.go +++ b/pkg/sfu/bwe/sendsidebwe/packet_group.go @@ -167,6 +167,13 @@ func (p *packetGroup) Add(pi *packetInfo, sendDelta, recvDelta int64, isLost boo } if p.minSequenceNumber == 0 || pi.sequenceNumber < p.minSequenceNumber { + if p.minSequenceNumber != 0 { + p.params.Logger.Debugw( + "send side bwe, out-of-order min sequence number", + "packetInfo", pi, + "packetGroup", p, + ) + } p.minSequenceNumber = pi.sequenceNumber } p.maxSequenceNumber = max(p.maxSequenceNumber, pi.sequenceNumber) @@ -184,6 +191,11 @@ func (p *packetGroup) Add(pi *packetInfo, sendDelta, recvDelta int64, isLost boo p.acked.add(int(pi.size), pi.isRTX, pi.isProbe) if p.snBitmap.IsSet(pi.sequenceNumber - p.minSequenceNumber) { // an earlier packet reported as lost has been received + p.params.Logger.Debugw( + "send side bwe, received previously lost packet", + "packetInfo", pi, + "packetGroup", p, + ) p.snBitmap.Clear(pi.sequenceNumber - p.minSequenceNumber) p.lost.remove(int(pi.size), pi.isRTX, pi.isProbe) } @@ -213,6 +225,13 @@ func (p *packetGroup) lostPacket(pi *packetInfo) error { } if p.minSequenceNumber == 0 || pi.sequenceNumber < p.minSequenceNumber { + if p.minSequenceNumber != 0 { + p.params.Logger.Debugw( + "send side bwe, out-of-order min sequence number lost", + "packetInfo", pi, + "packetGroup", p, + ) + } p.minSequenceNumber = pi.sequenceNumber } p.maxSequenceNumber = max(p.maxSequenceNumber, pi.sequenceNumber)