client: decode and encode RTP/RTCP packets

This commit is contained in:
aler9
2021-12-04 21:23:34 +01:00
committed by Alessandro Ros
parent 9a0eed07b3
commit b7df36d4ad
26 changed files with 422 additions and 332 deletions

View File

@@ -18,6 +18,39 @@ import (
"github.com/aler9/gortsplib/pkg/rtcpreceiver"
)
var testRTPPacket = rtp.Packet{
Header: rtp.Header{
Version: 2,
PayloadType: 97,
CSRC: []uint32{},
},
Payload: []byte{0x01, 0x02, 0x03, 0x04},
}
var testRTPPacketMarshaled = func() []byte {
byts, _ := testRTPPacket.Marshal()
return byts
}()
var testRTCPPacket = rtcp.SourceDescription{
Chunks: []rtcp.SourceDescriptionChunk{
{
Source: 1234,
Items: []rtcp.SourceDescriptionItem{
{
Type: rtcp.SDESCNAME,
Text: "myname",
},
},
},
},
}
var testRTCPPacketMarshaled = func() []byte {
byts, _ := testRTCPPacket.Marshal()
return byts
}()
func TestClientPublishSerial(t *testing.T) {
for _, transport := range []string{
"udp",
@@ -138,31 +171,37 @@ func TestClientPublishSerial(t *testing.T) {
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
// client -> server
// client -> server (RTP)
if transport == "udp" {
buf := make([]byte, 2048)
n, _, err := l1.ReadFrom(buf)
require.NoError(t, err)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, buf[:n])
var pkt rtp.Packet
err = pkt.Unmarshal(buf[:n])
require.NoError(t, err)
require.Equal(t, testRTPPacket, pkt)
} else {
var f base.InterleavedFrame
f.Payload = make([]byte, 2048)
err = f.Read(br)
require.NoError(t, err)
require.Equal(t, 0, f.Channel)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, f.Payload)
var pkt rtp.Packet
err = pkt.Unmarshal(f.Payload)
require.NoError(t, err)
require.Equal(t, testRTPPacket, pkt)
}
// server -> client (RTCP)
if transport == "udp" {
l2.WriteTo([]byte{0x05, 0x06, 0x07, 0x08}, &net.UDPAddr{
l2.WriteTo(testRTCPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[1],
})
} else {
base.InterleavedFrame{
Channel: 1,
Payload: []byte{0x05, 0x06, 0x07, 0x08},
Payload: testRTCPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -194,9 +233,9 @@ func TestClientPublishSerial(t *testing.T) {
v := TransportTCP
return &v
}(),
OnPacketRTCP: func(trackID int, payload []byte) {
OnPacketRTCP: func(trackID int, pkt rtcp.Packet) {
require.Equal(t, 0, trackID)
require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, payload)
require.Equal(t, &testRTCPPacket, pkt)
close(recvDone)
},
}
@@ -214,16 +253,14 @@ func TestClientPublishSerial(t *testing.T) {
c.Wait()
}()
err = c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err = c.WritePacketRTP(0, &testRTPPacket)
require.NoError(t, err)
<-recvDone
c.Close()
<-done
err = c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err = c.WritePacketRTP(0, &testRTPPacket)
require.Error(t, err)
})
}
@@ -376,8 +413,7 @@ func TestClientPublishParallel(t *testing.T) {
defer t.Stop()
for range t.C {
err := c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err := c.WritePacketRTP(0, &testRTPPacket)
if err != nil {
return
}
@@ -531,8 +567,7 @@ func TestClientPublishPauseSerial(t *testing.T) {
require.NoError(t, err)
defer c.Close()
err = c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err = c.WritePacketRTP(0, &testRTPPacket)
require.NoError(t, err)
_, err = c.Pause()
@@ -541,8 +576,7 @@ func TestClientPublishPauseSerial(t *testing.T) {
_, err = c.Record()
require.NoError(t, err)
err = c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err = c.WritePacketRTP(0, &testRTPPacket)
require.NoError(t, err)
})
}
@@ -677,8 +711,7 @@ func TestClientPublishPauseParallel(t *testing.T) {
defer t.Stop()
for range t.C {
err := c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err := c.WritePacketRTP(0, &testRTPPacket)
if err != nil {
return
}
@@ -794,7 +827,10 @@ func TestClientPublishAutomaticProtocol(t *testing.T) {
err = f.Read(br)
require.NoError(t, err)
require.Equal(t, 0, f.Channel)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, f.Payload)
var pkt rtp.Packet
err = pkt.Unmarshal(f.Payload)
require.NoError(t, err)
require.Equal(t, testRTPPacket, pkt)
req, err = readRequest(br)
require.NoError(t, err)
@@ -817,8 +853,7 @@ func TestClientPublishAutomaticProtocol(t *testing.T) {
require.NoError(t, err)
defer c.Close()
err = c.WritePacketRTP(0,
[]byte{0x01, 0x02, 0x03, 0x04})
err = c.WritePacketRTP(0, &testRTPPacket)
require.NoError(t, err)
}
@@ -915,14 +950,17 @@ func TestClientPublishRTCPReport(t *testing.T) {
buf := make([]byte, 2048)
n, _, err := l1.ReadFrom(buf)
require.NoError(t, err)
rr.ProcessPacketRTP(time.Now(), buf[:n])
var pkt rtp.Packet
err = pkt.Unmarshal(buf[:n])
require.NoError(t, err)
rr.ProcessPacketRTP(time.Now(), &pkt)
buf = make([]byte, 2048)
n, _, err = l2.ReadFrom(buf)
require.NoError(t, err)
pkt, err := rtcp.Unmarshal(buf[:n])
packets, err := rtcp.Unmarshal(buf[:n])
require.NoError(t, err)
sr, ok := pkt[0].(*rtcp.SenderReport)
sr, ok := packets[0].(*rtcp.SenderReport)
require.True(t, ok)
require.Equal(t, &rtcp.SenderReport{
SSRC: 753621,
@@ -931,7 +969,7 @@ func TestClientPublishRTCPReport(t *testing.T) {
PacketCount: 1,
OctetCount: 4,
}, sr)
rr.ProcessPacketRTCP(time.Now(), buf[:n])
rr.ProcessPacketRTCP(time.Now(), packets[0])
close(reportReceived)
@@ -958,7 +996,7 @@ func TestClientPublishRTCPReport(t *testing.T) {
require.NoError(t, err)
defer c.Close()
byts, _ := (&rtp.Packet{
err = c.WritePacketRTP(0, &rtp.Packet{
Header: rtp.Header{
Version: 2,
Marker: true,
@@ -968,8 +1006,7 @@ func TestClientPublishRTCPReport(t *testing.T) {
SSRC: 753621,
},
Payload: []byte{0x01, 0x02, 0x03, 0x04},
}).Marshal()
err = c.WritePacketRTP(0, byts)
})
require.NoError(t, err)
<-reportReceived
@@ -1056,14 +1093,14 @@ func TestClientPublishIgnoreTCPRTPPackets(t *testing.T) {
base.InterleavedFrame{
Channel: 0,
Payload: []byte{0x01, 0x02, 0x03, 0x04},
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
base.InterleavedFrame{
Channel: 1,
Payload: []byte{0x05, 0x06, 0x07, 0x08},
Payload: testRTCPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -1086,10 +1123,10 @@ func TestClientPublishIgnoreTCPRTPPackets(t *testing.T) {
v := TransportTCP
return &v
}(),
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
t.Errorf("should not happen")
},
OnPacketRTCP: func(trackID int, payload []byte) {
OnPacketRTCP: func(trackID int, pkt rtcp.Packet) {
close(rtcpReceived)
},
}