Skip to content

Commit 645dd64

Browse files
committed
Fix nack buffer RTX issue
1 parent 9251977 commit 645dd64

File tree

2 files changed

+13
-9
lines changed

2 files changed

+13
-9
lines changed

internal/rtpbuffer/rtpbuffer.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ const (
1717

1818
// RTPBuffer stores RTP packets and allows custom logic around the lifetime of them via the PacketFactory
1919
type RTPBuffer struct {
20-
packets []*RetainablePacket
21-
size uint16
22-
lastAdded uint16
23-
started bool
20+
packets []*RetainablePacket
21+
size uint16
22+
highestAdded uint16
23+
started bool
2424
}
2525

2626
// NewRTPBuffer constructs a new RTPBuffer
@@ -50,23 +50,24 @@ func (r *RTPBuffer) Add(packet *RetainablePacket) {
5050
seq := packet.sequenceNumber
5151
if !r.started {
5252
r.packets[seq%r.size] = packet
53-
r.lastAdded = seq
53+
r.highestAdded = seq
5454
r.started = true
5555
return
5656
}
5757

58-
diff := seq - r.lastAdded
58+
diff := seq - r.highestAdded
5959
if diff == 0 {
6060
return
6161
} else if diff < Uint16SizeHalf {
62-
for i := r.lastAdded + 1; i != seq; i++ {
62+
for i := r.highestAdded + 1; i != seq; i++ {
6363
idx := i % r.size
6464
prevPacket := r.packets[idx]
6565
if prevPacket != nil {
6666
prevPacket.Release()
6767
}
6868
r.packets[idx] = nil
6969
}
70+
r.highestAdded = seq
7071
}
7172

7273
idx := seq % r.size
@@ -75,12 +76,11 @@ func (r *RTPBuffer) Add(packet *RetainablePacket) {
7576
prevPacket.Release()
7677
}
7778
r.packets[idx] = packet
78-
r.lastAdded = seq
7979
}
8080

8181
// Get returns the RetainablePacket for the requested sequence number
8282
func (r *RTPBuffer) Get(seq uint16) *RetainablePacket {
83-
diff := r.lastAdded - seq
83+
diff := r.highestAdded - seq
8484
if diff >= Uint16SizeHalf {
8585
return nil
8686
}

internal/rtpbuffer/rtpbuffer_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ func TestRTPBuffer_WithRTX(t *testing.T) {
124124
assertGet(10)
125125
assertNOTGet(1, 2, 9)
126126

127+
// A late packet coming in (such as due to RTX) shouldn't invalidate other packets.
128+
add(9)
129+
assertGet(3, 4, 5, 6, 7, 8, 9, 10)
130+
127131
add(22)
128132
assertGet(22)
129133
assertNOTGet(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21)

0 commit comments

Comments
 (0)