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

@@ -317,18 +317,18 @@ func TestClientRead(t *testing.T) {
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
// server -> client
// server -> client (RTP)
switch transport {
case "udp":
time.Sleep(1 * time.Second)
l1.WriteTo([]byte{0x01, 0x02, 0x03, 0x04}, &net.UDPAddr{
l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[0],
})
case "multicast":
time.Sleep(1 * time.Second)
l1.WriteTo([]byte{0x01, 0x02, 0x03, 0x04}, &net.UDPAddr{
l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("224.1.0.1"),
Port: 25000,
})
@@ -336,7 +336,7 @@ func TestClientRead(t *testing.T) {
case "tcp", "tls":
base.InterleavedFrame{
Channel: 0,
Payload: []byte{0x01, 0x02, 0x03, 0x04},
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -353,7 +353,9 @@ func TestClientRead(t *testing.T) {
buf = make([]byte, 2048)
n, _, err := l2.ReadFrom(buf)
require.NoError(t, err)
require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, buf[:n])
packets, err := rtcp.Unmarshal(buf[:n])
require.NoError(t, err)
require.Equal(t, &testRTCPPacket, packets[0])
close(packetRecv)
case "tcp", "tls":
@@ -362,7 +364,9 @@ func TestClientRead(t *testing.T) {
err := f.Read(br)
require.NoError(t, err)
require.Equal(t, 1, f.Channel)
require.Equal(t, []byte{0x05, 0x06, 0x07, 0x08}, f.Payload)
packets, err := rtcp.Unmarshal(f.Payload)
require.NoError(t, err)
require.Equal(t, &testRTCPPacket, packets[0])
close(packetRecv)
}
@@ -401,7 +405,7 @@ func TestClientRead(t *testing.T) {
}(),
}
c.OnPacketRTP = func(trackID int, payload []byte) {
c.OnPacketRTP = func(trackID int, pkt *rtp.Packet) {
// ignore multicast loopback
if transport == "multicast" {
counter++
@@ -411,9 +415,9 @@ func TestClientRead(t *testing.T) {
}
require.Equal(t, 0, trackID)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, payload)
require.Equal(t, &testRTPPacket, pkt)
err := c.WritePacketRTCP(0, []byte{0x05, 0x06, 0x07, 0x08})
err := c.WritePacketRTCP(0, &testRTCPPacket)
require.NoError(t, err)
}
@@ -427,7 +431,14 @@ func TestClientRead(t *testing.T) {
}
func TestClientReadNonStandardFrameSize(t *testing.T) {
refPayload := bytes.Repeat([]byte{0x01, 0x02, 0x03, 0x04, 0x05}, 4096/5)
refRTPPacket := rtp.Packet{
Header: rtp.Header{
Version: 2,
PayloadType: 96,
CSRC: []uint32{},
},
Payload: bytes.Repeat([]byte{0x01, 0x02, 0x03, 0x04, 0x05}, 4096/5),
}
l, err := net.Listen("tcp", "localhost:8554")
require.NoError(t, err)
@@ -519,9 +530,10 @@ func TestClientReadNonStandardFrameSize(t *testing.T) {
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
byts, _ := refRTPPacket.Marshal()
base.InterleavedFrame{
Channel: 0,
Payload: refPayload,
Payload: byts,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -530,14 +542,14 @@ func TestClientReadNonStandardFrameSize(t *testing.T) {
packetRecv := make(chan struct{})
c := &Client{
ReadBufferSize: 4500,
ReadBufferSize: 4500 + 4,
Transport: func() *Transport {
v := TransportTCP
return &v
}(),
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
require.Equal(t, 0, trackID)
require.Equal(t, refPayload, payload)
require.Equal(t, &refRTPPacket, pkt)
close(packetRecv)
},
}
@@ -632,7 +644,7 @@ func TestClientReadPartial(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)
@@ -656,9 +668,9 @@ func TestClientReadPartial(t *testing.T) {
v := TransportTCP
return &v
}(),
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
require.Equal(t, 0, trackID)
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, payload)
require.Equal(t, &testRTPPacket, pkt)
close(packetRecv)
},
}
@@ -916,11 +928,12 @@ func TestClientReadAnyPort(t *testing.T) {
time.Sleep(500 * time.Millisecond)
l1a.WriteTo([]byte{0x01, 0x02, 0x03, 0x04}, &net.UDPAddr{
l1a.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[0],
})
// read RTCP
if ca == "random" {
// skip firewall opening
buf := make([]byte, 2048)
@@ -930,7 +943,9 @@ func TestClientReadAnyPort(t *testing.T) {
buf = make([]byte, 2048)
n, _, err := l1b.ReadFrom(buf)
require.NoError(t, err)
require.Equal(t, buf[:n], []byte{0x05, 0x06, 0x07, 0x08})
packets, err := rtcp.Unmarshal(buf[:n])
require.NoError(t, err)
require.Equal(t, &testRTCPPacket, packets[0])
close(serverRecv)
}
}()
@@ -939,8 +954,8 @@ func TestClientReadAnyPort(t *testing.T) {
c := &Client{
AnyPortEnable: true,
OnPacketRTP: func(trackID int, payload []byte) {
require.Equal(t, payload, []byte{0x01, 0x02, 0x03, 0x04})
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
require.Equal(t, &testRTPPacket, pkt)
close(packetRecv)
},
}
@@ -952,7 +967,7 @@ func TestClientReadAnyPort(t *testing.T) {
<-packetRecv
if ca == "random" {
c.WritePacketRTCP(0, []byte{0x05, 0x06, 0x07, 0x08})
c.WritePacketRTCP(0, &testRTCPPacket)
<-serverRecv
}
})
@@ -1061,7 +1076,7 @@ func TestClientReadAutomaticProtocol(t *testing.T) {
base.InterleavedFrame{
Channel: 0,
Payload: []byte("\x00\x00\x00\x00"),
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -1070,7 +1085,7 @@ func TestClientReadAutomaticProtocol(t *testing.T) {
packetRecv := make(chan struct{})
c := Client{
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
close(packetRecv)
},
}
@@ -1279,7 +1294,7 @@ func TestClientReadAutomaticProtocol(t *testing.T) {
base.InterleavedFrame{
Channel: 0,
Payload: []byte("\x00\x00\x00\x00"),
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -1301,7 +1316,7 @@ func TestClientReadAutomaticProtocol(t *testing.T) {
c := &Client{
ReadTimeout: 1 * time.Second,
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
close(packetRecv)
},
}
@@ -1409,7 +1424,7 @@ func TestClientReadDifferentInterleavedIDs(t *testing.T) {
base.InterleavedFrame{
Channel: 2,
Payload: []byte{0x01, 0x02, 0x03, 0x04},
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -1433,7 +1448,7 @@ func TestClientReadDifferentInterleavedIDs(t *testing.T) {
v := TransportTCP
return &v
}(),
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
require.Equal(t, 0, trackID)
close(packetRecv)
},
@@ -1577,7 +1592,7 @@ func TestClientReadRedirect(t *testing.T) {
require.NoError(t, err)
defer l1.Close()
l1.WriteTo([]byte("\x00\x00\x00\x00"), &net.UDPAddr{
l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[0],
})
@@ -1586,7 +1601,7 @@ func TestClientReadRedirect(t *testing.T) {
packetRecv := make(chan struct{})
c := Client{
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
close(packetRecv)
},
}
@@ -1622,14 +1637,14 @@ func TestClientReadPause(t *testing.T) {
select {
case <-t.C:
if inTH.Protocol == headers.TransportProtocolUDP {
l1.WriteTo([]byte("\x00\x00\x00\x00"), &net.UDPAddr{
l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: inTH.ClientPorts[0],
})
} else {
base.InterleavedFrame{
Channel: 0,
Payload: []byte("\x00\x00\x00\x00"),
Payload: testRTPPacketMarshaled,
}.Write(&bb)
conn.Write(bb.Bytes())
}
@@ -1797,7 +1812,7 @@ func TestClientReadPause(t *testing.T) {
v := TransportTCP
return &v
}(),
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
if atomic.SwapInt32(&firstFrame, 1) == 0 {
close(packetRecv)
}
@@ -1930,7 +1945,7 @@ func TestClientReadRTCPReport(t *testing.T) {
rs := rtcpsender.New(90000)
byts, _ := (&rtp.Packet{
pkt := rtp.Packet{
Header: rtp.Header{
Version: 2,
Marker: true,
@@ -1940,15 +1955,18 @@ func TestClientReadRTCPReport(t *testing.T) {
SSRC: 753621,
},
Payload: []byte{0x01, 0x02, 0x03, 0x04},
}).Marshal()
}
byts, _ := pkt.Marshal()
_, err = l1.WriteTo(byts, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: inTH.ClientPorts[0],
})
require.NoError(t, err)
rs.ProcessPacketRTP(time.Now(), byts)
rs.ProcessPacketRTP(time.Now(), &pkt)
_, err = l2.WriteTo(rs.Report(time.Now()), &net.UDPAddr{
sr := rs.Report(time.Now())
byts, _ = sr.Marshal()
_, err = l2.WriteTo(byts, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: inTH.ClientPorts[1],
})
@@ -1957,9 +1975,9 @@ func TestClientReadRTCPReport(t *testing.T) {
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)
rr, ok := pkt[0].(*rtcp.ReceiverReport)
rr, ok := packets[0].(*rtcp.ReceiverReport)
require.True(t, ok)
require.Equal(t, &rtcp.ReceiverReport{
SSRC: rr.SSRC,
@@ -2109,7 +2127,7 @@ func TestClientReadErrorTimeout(t *testing.T) {
if transport == "udp" || transport == "auto" {
// write a packet to skip the protocol autodetection feature
l1.WriteTo([]byte("\x01\x02\x03\x04"), &net.UDPAddr{
l1.WriteTo(testRTPPacketMarshaled, &net.UDPAddr{
IP: net.ParseIP("127.0.0.1"),
Port: th.ClientPorts[0],
})
@@ -2251,14 +2269,14 @@ func TestClientReadIgnoreTCPInvalidTrack(t *testing.T) {
base.InterleavedFrame{
Channel: 6,
Payload: []byte{0x01, 0x02, 0x03, 0x04},
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
base.InterleavedFrame{
Channel: 0,
Payload: []byte{0x05, 0x06, 0x07, 0x08},
Payload: testRTPPacketMarshaled,
}.Write(&bb)
_, err = conn.Write(bb.Bytes())
require.NoError(t, err)
@@ -2281,7 +2299,7 @@ func TestClientReadIgnoreTCPInvalidTrack(t *testing.T) {
v := TransportTCP
return &v
}(),
OnPacketRTP: func(trackID int, payload []byte) {
OnPacketRTP: func(trackID int, pkt *rtp.Packet) {
close(recv)
},
}