mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 23:02:45 +08:00
407 lines
9.2 KiB
Go
407 lines
9.2 KiB
Go
package rtcpreceiver
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/pion/rtcp"
|
|
"github.com/pion/rtp"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRTCPReceiverBase(t *testing.T) {
|
|
now = func() time.Time {
|
|
return time.Date(2008, 0o5, 20, 22, 15, 22, 0, time.UTC)
|
|
}
|
|
done := make(chan struct{})
|
|
v := uint32(0x65f83afb)
|
|
|
|
rr := New(500*time.Millisecond, &v, 90000,
|
|
func(pkt rtcp.Packet) {
|
|
require.Equal(t, &rtcp.ReceiverReport{
|
|
SSRC: 0x65f83afb,
|
|
Reports: []rtcp.ReceptionReport{
|
|
{
|
|
SSRC: 0xba9da416,
|
|
LastSequenceNumber: 947,
|
|
LastSenderReport: 0x887a17ce,
|
|
Delay: 2 * 65536,
|
|
},
|
|
},
|
|
}, pkt)
|
|
close(done)
|
|
})
|
|
defer rr.Close()
|
|
|
|
srPkt := rtcp.SenderReport{
|
|
SSRC: 0xba9da416,
|
|
NTPTime: 0xe363887a17ced916,
|
|
RTPTime: 0xafb45733,
|
|
PacketCount: 714,
|
|
OctetCount: 859127,
|
|
}
|
|
ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTCP(ts, &srPkt)
|
|
|
|
rtpPkt := rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 946,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
rtpPkt = rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 947,
|
|
Timestamp: 0xafb45733 + 90000,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
<-done
|
|
}
|
|
|
|
func TestRTCPReceiverOverflow(t *testing.T) {
|
|
done := make(chan struct{})
|
|
now = func() time.Time {
|
|
return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
|
|
}
|
|
v := uint32(0x65f83afb)
|
|
|
|
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
|
require.Equal(t, &rtcp.ReceiverReport{
|
|
SSRC: 0x65f83afb,
|
|
Reports: []rtcp.ReceptionReport{
|
|
{
|
|
SSRC: 0xba9da416,
|
|
LastSequenceNumber: 1<<16 | 0x0000,
|
|
LastSenderReport: 0x887a17ce,
|
|
Delay: 1 * 65536,
|
|
},
|
|
},
|
|
}, pkt)
|
|
close(done)
|
|
})
|
|
defer rr.Close()
|
|
|
|
srPkt := rtcp.SenderReport{
|
|
SSRC: 0xba9da416,
|
|
NTPTime: 0xe363887a17ced916,
|
|
RTPTime: 1287981738,
|
|
PacketCount: 714,
|
|
OctetCount: 859127,
|
|
}
|
|
ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTCP(ts, &srPkt)
|
|
|
|
rtpPkt := rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0xffff,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
rtpPkt = rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0x0000,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
<-done
|
|
}
|
|
|
|
func TestRTCPReceiverPacketLost(t *testing.T) {
|
|
done := make(chan struct{})
|
|
now = func() time.Time {
|
|
return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
|
|
}
|
|
v := uint32(0x65f83afb)
|
|
|
|
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
|
require.Equal(t, &rtcp.ReceiverReport{
|
|
SSRC: 0x65f83afb,
|
|
Reports: []rtcp.ReceptionReport{
|
|
{
|
|
SSRC: 0xba9da416,
|
|
LastSequenceNumber: 0x0122,
|
|
LastSenderReport: 0x887a17ce,
|
|
FractionLost: func() uint8 {
|
|
v := float64(1) / 3
|
|
return uint8(v * 256)
|
|
}(),
|
|
TotalLost: 1,
|
|
Delay: 1 * 65536,
|
|
},
|
|
},
|
|
}, pkt)
|
|
close(done)
|
|
})
|
|
defer rr.Close()
|
|
|
|
srPkt := rtcp.SenderReport{
|
|
SSRC: 0xba9da416,
|
|
NTPTime: 0xe363887a17ced916,
|
|
RTPTime: 1287981738,
|
|
PacketCount: 714,
|
|
OctetCount: 859127,
|
|
}
|
|
ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTCP(ts, &srPkt)
|
|
|
|
rtpPkt := rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0x0120,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
rtpPkt = rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0x0122,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
<-done
|
|
}
|
|
|
|
func TestRTCPReceiverOverflowPacketLost(t *testing.T) {
|
|
done := make(chan struct{})
|
|
now = func() time.Time {
|
|
return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
|
|
}
|
|
v := uint32(0x65f83afb)
|
|
|
|
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
|
require.Equal(t, &rtcp.ReceiverReport{
|
|
SSRC: 0x65f83afb,
|
|
Reports: []rtcp.ReceptionReport{
|
|
{
|
|
SSRC: 0xba9da416,
|
|
LastSequenceNumber: 1<<16 | 0x0002,
|
|
LastSenderReport: 0x887a17ce,
|
|
FractionLost: func() uint8 {
|
|
v := float64(2) / 4
|
|
return uint8(v * 256)
|
|
}(),
|
|
TotalLost: 2,
|
|
Delay: 1 * 65536,
|
|
},
|
|
},
|
|
}, pkt)
|
|
close(done)
|
|
})
|
|
defer rr.Close()
|
|
|
|
srPkt := rtcp.SenderReport{
|
|
SSRC: 0xba9da416,
|
|
NTPTime: 0xe363887a17ced916,
|
|
RTPTime: 1287981738,
|
|
PacketCount: 714,
|
|
OctetCount: 859127,
|
|
}
|
|
ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTCP(ts, &srPkt)
|
|
|
|
rtpPkt := rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0xffff,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
rtpPkt = rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0x0002,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
<-done
|
|
}
|
|
|
|
func TestRTCPReceiverReorderedPackets(t *testing.T) {
|
|
done := make(chan struct{})
|
|
now = func() time.Time {
|
|
return time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
|
|
}
|
|
v := uint32(0x65f83afb)
|
|
|
|
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
|
require.Equal(t, &rtcp.ReceiverReport{
|
|
SSRC: 0x65f83afb,
|
|
Reports: []rtcp.ReceptionReport{
|
|
{
|
|
SSRC: 0xba9da416,
|
|
LastSequenceNumber: 0x43a7,
|
|
LastSenderReport: 0x887a17ce,
|
|
Delay: 1 * 65536,
|
|
},
|
|
},
|
|
}, pkt)
|
|
close(done)
|
|
})
|
|
defer rr.Close()
|
|
|
|
srPkt := rtcp.SenderReport{
|
|
SSRC: 0xba9da416,
|
|
NTPTime: 0xe363887a17ced916,
|
|
RTPTime: 1287981738,
|
|
PacketCount: 714,
|
|
OctetCount: 859127,
|
|
}
|
|
ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTCP(ts, &srPkt)
|
|
|
|
rtpPkt := rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0x43a7,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
rtpPkt = rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 0x43a6,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
<-done
|
|
}
|
|
|
|
func TestRTCPReceiverJitter(t *testing.T) {
|
|
done := make(chan struct{})
|
|
now = func() time.Time {
|
|
return time.Date(2008, 0o5, 20, 22, 15, 22, 0, time.UTC)
|
|
}
|
|
v := uint32(0x65f83afb)
|
|
|
|
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
|
require.Equal(t, &rtcp.ReceiverReport{
|
|
SSRC: 0x65f83afb,
|
|
Reports: []rtcp.ReceptionReport{
|
|
{
|
|
SSRC: 0xba9da416,
|
|
LastSequenceNumber: 947,
|
|
LastSenderReport: 0x887a17ce,
|
|
Delay: 2 * 65536,
|
|
Jitter: 45000 / 16,
|
|
},
|
|
},
|
|
}, pkt)
|
|
close(done)
|
|
})
|
|
defer rr.Close()
|
|
|
|
srPkt := rtcp.SenderReport{
|
|
SSRC: 0xba9da416,
|
|
NTPTime: 0xe363887a17ced916,
|
|
RTPTime: 0xafb45733,
|
|
PacketCount: 714,
|
|
OctetCount: 859127,
|
|
}
|
|
ts := time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTCP(ts, &srPkt)
|
|
|
|
rtpPkt := rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 946,
|
|
Timestamp: 0xafb45733,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 20, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
rtpPkt = rtp.Packet{
|
|
Header: rtp.Header{
|
|
Version: 2,
|
|
Marker: true,
|
|
PayloadType: 96,
|
|
SequenceNumber: 947,
|
|
Timestamp: 0xafb45733 + 45000,
|
|
SSRC: 0xba9da416,
|
|
},
|
|
Payload: []byte("\x00\x00"),
|
|
}
|
|
ts = time.Date(2008, 0o5, 20, 22, 15, 21, 0, time.UTC)
|
|
rr.ProcessPacketRTP(ts, &rtpPkt)
|
|
|
|
<-done
|
|
}
|