mirror of
https://github.com/aler9/gortsplib
synced 2025-10-28 17:31:53 +08:00
rtpreorder: do not freeze in case the stream timestamp resets
This commit is contained in:
@@ -18,6 +18,7 @@ type Reorderer struct {
|
|||||||
expectedSeqNum uint16
|
expectedSeqNum uint16
|
||||||
buffer []*rtp.Packet
|
buffer []*rtp.Packet
|
||||||
absPos uint16
|
absPos uint16
|
||||||
|
negativeCount int
|
||||||
}
|
}
|
||||||
|
|
||||||
// New allocates a Reorderer.
|
// New allocates a Reorderer.
|
||||||
@@ -42,8 +43,26 @@ func (r *Reorderer) Process(pkt *rtp.Packet) ([]*rtp.Packet, int) {
|
|||||||
// before the first packet processed by Reorderer.
|
// before the first packet processed by Reorderer.
|
||||||
// discard.
|
// discard.
|
||||||
if relPos > negativeThreshold {
|
if relPos > negativeThreshold {
|
||||||
|
r.negativeCount++
|
||||||
|
|
||||||
|
// stream has been resetted, therefore reset reorderer too
|
||||||
|
if r.negativeCount > bufferSize {
|
||||||
|
r.negativeCount = 0
|
||||||
|
|
||||||
|
// clear buffer
|
||||||
|
for i := uint16(0); i < bufferSize; i++ {
|
||||||
|
p := (r.absPos + i) & (bufferSize - 1)
|
||||||
|
r.buffer[p] = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset position
|
||||||
|
r.expectedSeqNum = pkt.SequenceNumber + 1
|
||||||
|
return []*rtp.Packet{pkt}, 0
|
||||||
|
}
|
||||||
|
|
||||||
return nil, 0
|
return nil, 0
|
||||||
}
|
}
|
||||||
|
r.negativeCount = 0
|
||||||
|
|
||||||
// there's a missing packet and buffer is full.
|
// there's a missing packet and buffer is full.
|
||||||
// return entire buffer and clear it.
|
// return entire buffer and clear it.
|
||||||
|
|||||||
@@ -220,3 +220,38 @@ func TestBufferIsFull(t *testing.T) {
|
|||||||
|
|
||||||
require.Equal(t, expected, out)
|
require.Equal(t, expected, out)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReset(t *testing.T) {
|
||||||
|
r := New()
|
||||||
|
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, 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, 0, missing)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user