mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
client: decode and encode RTP/RTCP packets
This commit is contained in:
@@ -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)
|
||||
},
|
||||
}
|
||||
|
Reference in New Issue
Block a user