Files
gortsplib/pkg/rtpreorderer/reorderer_test.go
Josh Allmann 03be509422 Add configurable buffer size to Reorderer (#760)
The default of 64 is ~3 seconds which may be too much for some apps.
2025-04-18 12:06:59 +02:00

304 lines
5.1 KiB
Go

package rtpreorderer
import (
"testing"
"github.com/pion/rtp"
"github.com/stretchr/testify/require"
)
func TestReorder(t *testing.T) {
sequence := []struct {
in *rtp.Packet
out []*rtp.Packet
}{
{
// first packet
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65530,
},
},
[]*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: 65530,
},
}},
},
{
// packet sent before first packet
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65529,
},
},
[]*rtp.Packet(nil),
},
{
// ok
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65531,
},
},
[]*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: 65531,
},
}},
},
{
// duplicated
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65531,
},
},
[]*rtp.Packet(nil),
},
{
// gap
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65535,
},
},
[]*rtp.Packet(nil),
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65533,
PayloadType: 96,
},
},
[]*rtp.Packet(nil),
},
{
// unordered + duplicated
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65533,
PayloadType: 97,
},
},
[]*rtp.Packet(nil),
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65532,
},
},
[]*rtp.Packet{
{
Header: rtp.Header{
SequenceNumber: 65532,
},
},
{
Header: rtp.Header{
SequenceNumber: 65533,
PayloadType: 96,
},
},
},
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 65534,
},
},
[]*rtp.Packet{
{
Header: rtp.Header{
SequenceNumber: 65534,
},
},
{
Header: rtp.Header{
SequenceNumber: 65535,
},
},
},
},
{
// overflow + gap
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 1,
},
},
[]*rtp.Packet(nil),
},
{
// unordered
&rtp.Packet{
Header: rtp.Header{
SequenceNumber: 0,
},
},
[]*rtp.Packet{
{
Header: rtp.Header{
SequenceNumber: 0,
},
},
{
Header: rtp.Header{
SequenceNumber: 1,
},
},
},
},
}
r := &Reorderer{}
r.Initialize()
r.absPos = 40
for _, entry := range sequence {
out, missing := r.Process(entry.in)
require.Equal(t, entry.out, out)
require.Equal(t, uint(0), missing)
}
}
func TestBufferIsFull(t *testing.T) {
r := &Reorderer{}
r.Initialize()
r.absPos = 25
sn := uint16(1564)
toMiss := uint(34)
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
require.Equal(t, []*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: sn,
},
}}, out)
require.Equal(t, uint(0), missing)
sn++
var expected []*rtp.Packet
for i := uint(0); i < 64-toMiss; i++ {
out, missing = r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
require.Equal(t, []*rtp.Packet(nil), out)
require.Equal(t, uint(0), missing)
expected = append(expected, &rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
sn++
}
out, missing = r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
require.Equal(t, toMiss, missing)
expected = append(expected, &rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn + uint16(toMiss),
},
})
require.Equal(t, expected, out)
}
func TestReset(t *testing.T) {
r := &Reorderer{}
r.Initialize()
sn := uint16(1234)
r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
sn = 0xF234
for i := 0; i < 64; i++ {
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
require.Equal(t, []*rtp.Packet(nil), out)
require.Equal(t, uint(0), missing)
sn++
}
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: sn,
},
})
require.Equal(t, []*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: sn,
},
}}, out)
require.Equal(t, uint(0), missing)
}
func TestCustomBufferSize(t *testing.T) {
customSize := 128
r := &Reorderer{
BufferSize: customSize,
}
r.Initialize()
// Set absPos to an arbitrary value.
r.absPos = 10
// Process first packet; behaves as usual.
firstSeq := uint16(50)
out, missing := r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: firstSeq,
},
})
require.Equal(t, []*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: firstSeq,
},
}}, out)
require.Equal(t, uint(0), missing)
// At this point, expectedSeqNum == firstSeq + 1 (i.e. 51).
// Now, send a packet with a gap larger than the custom buffer size.
// For BufferSize = 128, let's send a packet with SequenceNumber = 51 + 130 = 181.
nextSeq := uint16(181)
out, missing = r.Process(&rtp.Packet{
Header: rtp.Header{
SequenceNumber: nextSeq,
},
})
// Since there are no packets buffered, n remains 1.
// relPos = 181 - 51 = 130; so missing should be 130
require.Equal(t, uint(130), missing)
require.Equal(t, []*rtp.Packet{{
Header: rtp.Header{
SequenceNumber: nextSeq,
},
}}, out)
}