mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 07:06:58 +08:00
emit a decode error in case of packets with wrong SSRC
This commit is contained in:
@@ -865,7 +865,7 @@ func TestServerRecordRTCPReport(t *testing.T) {
|
||||
|
||||
doRecord(t, conn, "rtsp://localhost:8554/teststream", session)
|
||||
|
||||
byts, _ := (&rtp.Packet{
|
||||
_, err = l1.WriteTo(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
Version: 2,
|
||||
Marker: true,
|
||||
@@ -875,8 +875,7 @@ func TestServerRecordRTCPReport(t *testing.T) {
|
||||
SSRC: 753621,
|
||||
},
|
||||
Payload: []byte{1, 2, 3, 4},
|
||||
}).Marshal()
|
||||
_, err = l1.WriteTo(byts, &net.UDPAddr{
|
||||
}), &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: th.ServerPorts[0],
|
||||
})
|
||||
@@ -885,14 +884,13 @@ func TestServerRecordRTCPReport(t *testing.T) {
|
||||
// wait for the packet's SSRC to be saved
|
||||
time.Sleep(200 * time.Millisecond)
|
||||
|
||||
byts, _ = (&rtcp.SenderReport{
|
||||
_, err = l2.WriteTo(mustMarshalPacketRTCP(&rtcp.SenderReport{
|
||||
SSRC: 753621,
|
||||
NTPTime: ntpTimeGoToRTCP(time.Date(2018, 2, 20, 19, 0, 0, 0, time.UTC)),
|
||||
RTPTime: 54352,
|
||||
PacketCount: 1,
|
||||
OctetCount: 4,
|
||||
}).Marshal()
|
||||
_, err = l2.WriteTo(byts, &net.UDPAddr{
|
||||
}), &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: th.ServerPorts[1],
|
||||
})
|
||||
@@ -1198,12 +1196,15 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
||||
{"udp", "rtp invalid"},
|
||||
{"udp", "rtcp invalid"},
|
||||
{"udp", "rtp packets lost"},
|
||||
{"udp", "rtp too big"},
|
||||
{"udp", "rtcp too big"},
|
||||
{"udp", "rtp unknown format"},
|
||||
{"udp", "wrong ssrc"},
|
||||
{"udp", "rtcp too big"},
|
||||
{"udp", "rtp too big"},
|
||||
{"tcp", "rtcp invalid"},
|
||||
{"tcp", "rtcp too big"},
|
||||
{"tcp", "rtp packets lost"},
|
||||
{"tcp", "rtp unknown format"},
|
||||
{"tcp", "wrong ssrc"},
|
||||
{"tcp", "rtcp too big"},
|
||||
} {
|
||||
t.Run(ca.proto+" "+ca.name, func(t *testing.T) {
|
||||
errorRecv := make(chan struct{})
|
||||
@@ -1226,21 +1227,22 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
||||
}, nil
|
||||
},
|
||||
onPacketLost: func(ctx *ServerHandlerOnPacketLostCtx) {
|
||||
if ca.proto == "udp" && ca.name == "rtp packets lost" {
|
||||
require.EqualError(t, ctx.Error, "69 RTP packets lost")
|
||||
}
|
||||
require.EqualError(t, ctx.Error, "69 RTP packets lost")
|
||||
close(errorRecv)
|
||||
},
|
||||
onDecodeError: func(ctx *ServerHandlerOnDecodeErrorCtx) {
|
||||
switch {
|
||||
case ca.proto == "udp" && ca.name == "rtp invalid":
|
||||
case ca.name == "rtp invalid":
|
||||
require.EqualError(t, ctx.Error, "RTP header size insufficient: 2 < 4")
|
||||
|
||||
case ca.name == "rtcp invalid":
|
||||
require.EqualError(t, ctx.Error, "rtcp: packet too short")
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtp too big":
|
||||
require.EqualError(t, ctx.Error, "RTP packet is too big to be read with UDP")
|
||||
case ca.name == "rtp unknown format":
|
||||
require.EqualError(t, ctx.Error, "received RTP packet with unknown format: 111")
|
||||
|
||||
case ca.name == "wrong ssrc":
|
||||
require.EqualError(t, ctx.Error, "received packet with wrong SSRC 456, expected 123")
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtcp too big":
|
||||
require.EqualError(t, ctx.Error, "RTCP packet is too big to be read with UDP")
|
||||
@@ -1248,8 +1250,11 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
||||
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
||||
require.EqualError(t, ctx.Error, "RTCP packet size (2000) is greater than maximum allowed (1472)")
|
||||
|
||||
case ca.name == "rtp unknown format":
|
||||
require.EqualError(t, ctx.Error, "received RTP packet with unknown format: 111")
|
||||
case ca.proto == "udp" && ca.name == "rtp too big":
|
||||
require.EqualError(t, ctx.Error, "RTP packet is too big to be read with UDP")
|
||||
|
||||
default:
|
||||
t.Errorf("unexpected")
|
||||
}
|
||||
close(errorRecv)
|
||||
},
|
||||
@@ -1317,47 +1322,91 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
||||
|
||||
doRecord(t, conn, "rtsp://localhost:8554/teststream", session)
|
||||
|
||||
var writeRTP func(buf []byte)
|
||||
var writeRTCP func(byts []byte)
|
||||
|
||||
if ca.proto == "udp" { //nolint:dupl
|
||||
writeRTP = func(byts []byte) {
|
||||
_, err = l1.WriteTo(byts, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[0],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
writeRTCP = func(byts []byte) {
|
||||
_, err = l2.WriteTo(byts, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[1],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
} else {
|
||||
writeRTP = func(byts []byte) {
|
||||
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||
Channel: 0,
|
||||
Payload: byts,
|
||||
}, make([]byte, 2048))
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
writeRTCP = func(byts []byte) {
|
||||
err = conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||
Channel: 1,
|
||||
Payload: byts,
|
||||
}, make([]byte, 2048))
|
||||
require.NoError(t, err)
|
||||
}
|
||||
}
|
||||
|
||||
switch { //nolint:dupl
|
||||
case ca.proto == "udp" && ca.name == "rtp invalid":
|
||||
_, err := l1.WriteTo([]byte{0x01, 0x02}, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[0],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
case ca.name == "rtp invalid":
|
||||
writeRTP([]byte{0x01, 0x02})
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtcp invalid":
|
||||
_, err := l2.WriteTo([]byte{0x01, 0x02}, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[1],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
case ca.name == "rtcp invalid":
|
||||
writeRTCP([]byte{0x01, 0x02})
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtp packets lost":
|
||||
byts, _ := rtp.Packet{
|
||||
case ca.name == "rtcp too big":
|
||||
writeRTCP(bytes.Repeat([]byte{0x01, 0x02}, 2000/2))
|
||||
|
||||
case ca.name == "rtp packets lost":
|
||||
writeRTP(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 97,
|
||||
SequenceNumber: 30,
|
||||
},
|
||||
}.Marshal()
|
||||
}))
|
||||
|
||||
_, err := l1.WriteTo(byts, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[0],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
byts, _ = rtp.Packet{
|
||||
writeRTP(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 97,
|
||||
SequenceNumber: 100,
|
||||
},
|
||||
}.Marshal()
|
||||
}))
|
||||
|
||||
_, err = l1.WriteTo(byts, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[0],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
case ca.name == "rtp unknown format":
|
||||
writeRTP(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 111,
|
||||
},
|
||||
}))
|
||||
|
||||
case ca.name == "wrong ssrc":
|
||||
writeRTP(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 97,
|
||||
SequenceNumber: 1,
|
||||
SSRC: 123,
|
||||
},
|
||||
}))
|
||||
|
||||
writeRTP(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 97,
|
||||
SequenceNumber: 2,
|
||||
SSRC: 456,
|
||||
},
|
||||
}))
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtp too big":
|
||||
_, err := l1.WriteTo(bytes.Repeat([]byte{0x01, 0x02}, 2000/2), &net.UDPAddr{
|
||||
@@ -1365,53 +1414,6 @@ func TestServerRecordDecodeErrors(t *testing.T) {
|
||||
Port: resTH.ServerPorts[0],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtcp too big":
|
||||
_, err := l2.WriteTo(bytes.Repeat([]byte{0x01, 0x02}, 2000/2), &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[1],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
case ca.proto == "udp" && ca.name == "rtp unknown format":
|
||||
byts, _ := rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 111,
|
||||
},
|
||||
}.Marshal()
|
||||
|
||||
_, err := l1.WriteTo(byts, &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: resTH.ServerPorts[0],
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
case ca.proto == "tcp" && ca.name == "rtcp invalid":
|
||||
err := conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||
Channel: 1,
|
||||
Payload: []byte{0x01, 0x02},
|
||||
}, make([]byte, 2048))
|
||||
require.NoError(t, err)
|
||||
|
||||
case ca.proto == "tcp" && ca.name == "rtcp too big":
|
||||
err := conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||
Channel: 1,
|
||||
Payload: bytes.Repeat([]byte{0x01, 0x02}, 2000/2),
|
||||
}, make([]byte, 2048))
|
||||
require.NoError(t, err)
|
||||
|
||||
case ca.proto == "tcp" && ca.name == "rtp unknown format":
|
||||
byts, _ := rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
PayloadType: 111,
|
||||
},
|
||||
}.Marshal()
|
||||
|
||||
err := conn.WriteInterleavedFrame(&base.InterleavedFrame{
|
||||
Channel: 0,
|
||||
Payload: byts,
|
||||
}, make([]byte, 2048))
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
<-errorRecv
|
||||
@@ -1498,7 +1500,7 @@ func TestServerRecordPacketNTP(t *testing.T) {
|
||||
|
||||
doRecord(t, conn, "rtsp://localhost:8554/teststream", session)
|
||||
|
||||
byts, _ := (&rtp.Packet{
|
||||
_, err = l1.WriteTo(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
Version: 2,
|
||||
Marker: true,
|
||||
@@ -1508,8 +1510,7 @@ func TestServerRecordPacketNTP(t *testing.T) {
|
||||
SSRC: 753621,
|
||||
},
|
||||
Payload: []byte{1, 2, 3, 4},
|
||||
}).Marshal()
|
||||
_, err = l1.WriteTo(byts, &net.UDPAddr{
|
||||
}), &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: th.ServerPorts[0],
|
||||
})
|
||||
@@ -1518,14 +1519,13 @@ func TestServerRecordPacketNTP(t *testing.T) {
|
||||
// wait for the packet's SSRC to be saved
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
||||
byts, _ = (&rtcp.SenderReport{
|
||||
_, err = l2.WriteTo(mustMarshalPacketRTCP(&rtcp.SenderReport{
|
||||
SSRC: 753621,
|
||||
NTPTime: ntpTimeGoToRTCP(time.Date(2018, 2, 20, 19, 0, 0, 0, time.UTC)),
|
||||
RTPTime: 54352,
|
||||
PacketCount: 1,
|
||||
OctetCount: 4,
|
||||
}).Marshal()
|
||||
_, err = l2.WriteTo(byts, &net.UDPAddr{
|
||||
}), &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: th.ServerPorts[1],
|
||||
})
|
||||
@@ -1533,7 +1533,7 @@ func TestServerRecordPacketNTP(t *testing.T) {
|
||||
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
||||
byts, _ = (&rtp.Packet{
|
||||
_, err = l1.WriteTo(mustMarshalPacketRTP(&rtp.Packet{
|
||||
Header: rtp.Header{
|
||||
Version: 2,
|
||||
Marker: true,
|
||||
@@ -1543,8 +1543,7 @@ func TestServerRecordPacketNTP(t *testing.T) {
|
||||
SSRC: 753621,
|
||||
},
|
||||
Payload: []byte{1, 2, 3, 4},
|
||||
}).Marshal()
|
||||
_, err = l1.WriteTo(byts, &net.UDPAddr{
|
||||
}), &net.UDPAddr{
|
||||
IP: net.ParseIP("127.0.0.1"),
|
||||
Port: th.ServerPorts[0],
|
||||
})
|
||||
|
Reference in New Issue
Block a user