diff --git a/pkg/sfu/twcc/twcc.go b/pkg/sfu/twcc/twcc.go index ef85a06e6..4344c6b9f 100644 --- a/pkg/sfu/twcc/twcc.go +++ b/pkg/sfu/twcc/twcc.go @@ -96,7 +96,9 @@ func (t *Responder) buildTransportCCPacket() rtcp.RawPacket { sort.Slice(t.extInfo, func(i, j int) bool { return t.extInfo[i].ExtTSN < t.extInfo[j].ExtTSN }) - tccPkts := make([]rtpExtInfo, 0, int(float64(len(t.extInfo))*1.2)) + maxTccPktsLen := int(float64(len(t.extInfo)) * 1.2) + tccPkts := make([]rtpExtInfo, 0, maxTccPktsLen) + var consumedExtInfo int for _, tccExtInfo := range t.extInfo { if tccExtInfo.ExtTSN < t.lastExtSN { continue @@ -108,8 +110,16 @@ func (t *Responder) buildTransportCCPacket() rtcp.RawPacket { } t.lastExtSN = tccExtInfo.ExtTSN tccPkts = append(tccPkts, tccExtInfo) + consumedExtInfo++ + if len(tccPkts) >= maxTccPktsLen { + break + } + } + if consumedExtInfo == len(t.extInfo) { + t.extInfo = t.extInfo[:0] + } else { + t.extInfo = t.extInfo[consumedExtInfo:] } - t.extInfo = t.extInfo[:0] firstRecv := false same := true diff --git a/pkg/sfu/twcc/twcc_test.go b/pkg/sfu/twcc/twcc_test.go index 2a1a47f1c..9ad09649e 100644 --- a/pkg/sfu/twcc/twcc_test.go +++ b/pkg/sfu/twcc/twcc_test.go @@ -344,3 +344,15 @@ func BenchmarkBuildPacket(b *testing.B) { _ = twcc.buildTransportCCPacket() } } + +func TestTccWithPacketLost(t *testing.T) { + twcc := NewTransportWideCCResponder(123) + var fbreceived int + twcc.OnFeedback(func(p rtcp.RawPacket) { fbreceived++ }) + + for i := 0; i < 200; i++ { + twcc.Push(10000+uint16(i*70), time.Now().UnixNano()+int64(i)*1e6, false) + } + + assert.Greater(t, fbreceived, 0) +}