mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 23:02:45 +08:00
return an error in case the random number generator fails
This commit is contained in:
@@ -61,12 +61,16 @@ func (ct *clientFormat) start() {
|
||||
if ct.cm.c.state == clientStatePlay {
|
||||
if ct.cm.udpRTPListener != nil {
|
||||
ct.udpReorderer = rtpreorderer.New()
|
||||
ct.udpRTCPReceiver = rtcpreceiver.New(
|
||||
var err error
|
||||
ct.udpRTCPReceiver, err = rtcpreceiver.New(
|
||||
ct.cm.c.udpReceiverReportPeriod,
|
||||
nil,
|
||||
ct.format.ClockRate(), func(pkt rtcp.Packet) {
|
||||
ct.cm.writePacketRTCP(pkt)
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
} else {
|
||||
ct.tcpLossDetector = rtplossdetector.New()
|
||||
}
|
||||
|
@@ -70,12 +70,13 @@ func (cm *clientMedia) allocateUDPListeners(multicast bool, rtpAddress string, r
|
||||
return nil
|
||||
}
|
||||
|
||||
cm.udpRTPListener, cm.udpRTCPListener = newClientUDPListenerPair(
|
||||
var err error
|
||||
cm.udpRTPListener, cm.udpRTCPListener, err = newClientUDPListenerPair(
|
||||
cm.c.ListenPacket,
|
||||
cm.c.AnyPortEnable,
|
||||
cm.c.WriteTimeout,
|
||||
)
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
|
||||
func (cm *clientMedia) setMedia(medi *media.Media) {
|
||||
|
@@ -1286,7 +1286,8 @@ func TestClientPlayAutomaticProtocol(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, base.Describe, req.Method)
|
||||
|
||||
nonce := auth.GenerateNonce()
|
||||
nonce, err := auth.GenerateNonce()
|
||||
require.NoError(t, err)
|
||||
|
||||
err = conn.WriteResponse(&base.Response{
|
||||
StatusCode: base.StatusUnauthorized,
|
||||
@@ -1399,7 +1400,8 @@ func TestClientPlayAutomaticProtocol(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, base.Setup, req.Method)
|
||||
|
||||
nonce := auth.GenerateNonce()
|
||||
nonce, err := auth.GenerateNonce()
|
||||
require.NoError(t, err)
|
||||
|
||||
err = conn.WriteResponse(&base.Response{
|
||||
StatusCode: base.StatusUnauthorized,
|
||||
|
@@ -194,7 +194,8 @@ func TestClientAuth(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, base.Describe, req.Method)
|
||||
|
||||
nonce := auth.GenerateNonce()
|
||||
nonce, err := auth.GenerateNonce()
|
||||
require.NoError(t, err)
|
||||
|
||||
err = conn.WriteResponse(&base.Response{
|
||||
StatusCode: base.StatusUnauthorized,
|
||||
|
@@ -15,10 +15,13 @@ func int64Ptr(v int64) *int64 {
|
||||
return &v
|
||||
}
|
||||
|
||||
func randInRange(max int) int {
|
||||
func randInRange(max int) (int, error) {
|
||||
b := big.NewInt(int64(max + 1))
|
||||
n, _ := rand.Int(rand.Reader, b)
|
||||
return int(n.Int64())
|
||||
n, err := rand.Int(rand.Reader, b)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return int(n.Int64()), nil
|
||||
}
|
||||
|
||||
type clientUDPListener struct {
|
||||
@@ -41,11 +44,16 @@ func newClientUDPListenerPair(
|
||||
listenPacket func(network, address string) (net.PacketConn, error),
|
||||
anyPortEnable bool,
|
||||
writeTimeout time.Duration,
|
||||
) (*clientUDPListener, *clientUDPListener) {
|
||||
) (*clientUDPListener, *clientUDPListener, error) {
|
||||
// choose two consecutive ports in range 65535-10000
|
||||
// RTP port must be even and RTCP port odd
|
||||
for {
|
||||
rtpPort := randInRange((65535-10000)/2)*2 + 10000
|
||||
v, err := randInRange((65535 - 10000) / 2)
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
rtpPort := v*2 + 10000
|
||||
rtpListener, err := newClientUDPListener(
|
||||
listenPacket,
|
||||
anyPortEnable,
|
||||
@@ -70,7 +78,7 @@ func newClientUDPListenerPair(
|
||||
continue
|
||||
}
|
||||
|
||||
return rtpListener, rtcpListener
|
||||
return rtpListener, rtcpListener, nil
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -47,7 +47,8 @@ func TestAuth(t *testing.T) {
|
||||
}
|
||||
|
||||
t.Run(c1.name+"_"+conf, func(t *testing.T) {
|
||||
nonce := GenerateNonce()
|
||||
nonce, err := GenerateNonce()
|
||||
require.NoError(t, err)
|
||||
|
||||
se, err := NewSender(
|
||||
GenerateWWWAuthenticate(c1.methods, "IPCAM", nonce),
|
||||
@@ -104,7 +105,8 @@ func TestAuthVLC(t *testing.T) {
|
||||
"rtsp://myhost/mypath/test?testing/trackID=0",
|
||||
},
|
||||
} {
|
||||
nonce := GenerateNonce()
|
||||
nonce, err := GenerateNonce()
|
||||
require.NoError(t, err)
|
||||
|
||||
se, err := NewSender(
|
||||
GenerateWWWAuthenticate(nil, "IPCAM", nonce),
|
||||
|
@@ -11,10 +11,14 @@ import (
|
||||
)
|
||||
|
||||
// GenerateNonce generates a nonce that can be used in Validate().
|
||||
func GenerateNonce() string {
|
||||
func GenerateNonce() (string, error) {
|
||||
byts := make([]byte, 16)
|
||||
rand.Read(byts)
|
||||
return hex.EncodeToString(byts)
|
||||
_, err := rand.Read(byts)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return hex.EncodeToString(byts), nil
|
||||
}
|
||||
|
||||
// GenerateWWWAuthenticate generates a WWW-Authenticate header.
|
||||
|
@@ -2,7 +2,6 @@ package auth
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"encoding/hex"
|
||||
@@ -65,9 +64,10 @@ func NewValidator(user string, pass string, methods []headers.AuthMethod) *Valid
|
||||
methods = []headers.AuthMethod{headers.AuthBasic}
|
||||
}
|
||||
|
||||
nonceByts := make([]byte, 16)
|
||||
rand.Read(nonceByts)
|
||||
nonce := hex.EncodeToString(nonceByts)
|
||||
nonce, err := GenerateNonce()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return &Validator{
|
||||
user: user,
|
||||
|
@@ -14,10 +14,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/AV1 encoder.
|
||||
@@ -49,15 +52,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -15,10 +15,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/H264 encoder.
|
||||
@@ -56,15 +59,25 @@ func (e *Encoder) Init() error {
|
||||
}
|
||||
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -14,10 +14,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/H265 encoder.
|
||||
@@ -56,15 +59,25 @@ func (e *Encoder) Init() error {
|
||||
}
|
||||
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -14,10 +14,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/LPCM encoder.
|
||||
@@ -55,15 +58,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -17,10 +17,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/M-JPEG encoder.
|
||||
@@ -49,15 +52,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -14,10 +14,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
func lenAggregated(frames [][]byte, frame []byte) int {
|
||||
@@ -54,15 +57,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -15,10 +15,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/MPEG4-audio encoder.
|
||||
@@ -62,15 +65,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -15,10 +15,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/MPEG4-audio encoder.
|
||||
@@ -57,15 +60,25 @@ func (e *Encoder) Init() error {
|
||||
}
|
||||
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -13,10 +13,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/MPEG-4 Video encoder.
|
||||
@@ -48,15 +51,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -14,10 +14,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/simple audio encoder.
|
||||
@@ -50,15 +53,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -15,10 +15,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/VP8 encoder.
|
||||
@@ -51,15 +54,25 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
|
@@ -15,10 +15,13 @@ const (
|
||||
rtpVersion = 2
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
// Encoder is a RTP/VP9 encoder.
|
||||
@@ -55,23 +58,37 @@ type Encoder struct {
|
||||
// Init initializes the encoder.
|
||||
func (e *Encoder) Init() error {
|
||||
if e.SSRC == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.SSRC = &v
|
||||
}
|
||||
if e.InitialSequenceNumber == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialSequenceNumber = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialSequenceNumber = &v2
|
||||
}
|
||||
if e.InitialTimestamp == nil {
|
||||
v := randUint32()
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
e.InitialTimestamp = &v
|
||||
}
|
||||
if e.PayloadMaxSize == 0 {
|
||||
e.PayloadMaxSize = 1460 // 1500 (UDP MTU) - 20 (IP header) - 8 (UDP header) - 12 (RTP header)
|
||||
}
|
||||
if e.InitialPictureID == nil {
|
||||
v := uint16(randUint32())
|
||||
e.InitialPictureID = &v
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
v2 := uint16(v)
|
||||
e.InitialPictureID = &v2
|
||||
}
|
||||
|
||||
e.sequenceNumber = *e.InitialSequenceNumber
|
||||
|
@@ -10,10 +10,13 @@ import (
|
||||
"github.com/pion/rtp"
|
||||
)
|
||||
|
||||
func randUint32() uint32 {
|
||||
func randUint32() (uint32, error) {
|
||||
var b [4]byte
|
||||
rand.Read(b[:])
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3])
|
||||
_, err := rand.Read(b[:])
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
|
||||
}
|
||||
|
||||
var now = time.Now
|
||||
@@ -54,15 +57,18 @@ func New(
|
||||
receiverSSRC *uint32,
|
||||
clockRate int,
|
||||
writePacketRTCP func(rtcp.Packet),
|
||||
) *RTCPReceiver {
|
||||
) (*RTCPReceiver, error) {
|
||||
if receiverSSRC == nil {
|
||||
v, err := randUint32()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
receiverSSRC = &v
|
||||
}
|
||||
|
||||
rr := &RTCPReceiver{
|
||||
period: period,
|
||||
receiverSSRC: func() uint32 {
|
||||
if receiverSSRC == nil {
|
||||
return randUint32()
|
||||
}
|
||||
return *receiverSSRC
|
||||
}(),
|
||||
receiverSSRC: *receiverSSRC,
|
||||
clockRate: float64(clockRate),
|
||||
writePacketRTCP: writePacketRTCP,
|
||||
terminate: make(chan struct{}),
|
||||
@@ -71,7 +77,7 @@ func New(
|
||||
|
||||
go rr.run()
|
||||
|
||||
return rr
|
||||
return rr, nil
|
||||
}
|
||||
|
||||
// Close closes the RTCPReceiver.
|
||||
|
@@ -16,7 +16,7 @@ func TestRTCPReceiverBase(t *testing.T) {
|
||||
done := make(chan struct{})
|
||||
v := uint32(0x65f83afb)
|
||||
|
||||
rr := New(500*time.Millisecond, &v, 90000,
|
||||
rr, err := New(500*time.Millisecond, &v, 90000,
|
||||
func(pkt rtcp.Packet) {
|
||||
require.Equal(t, &rtcp.ReceiverReport{
|
||||
SSRC: 0x65f83afb,
|
||||
@@ -31,6 +31,7 @@ func TestRTCPReceiverBase(t *testing.T) {
|
||||
}, pkt)
|
||||
close(done)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer rr.Close()
|
||||
|
||||
srPkt := rtcp.SenderReport{
|
||||
@@ -81,7 +82,7 @@ func TestRTCPReceiverOverflow(t *testing.T) {
|
||||
}
|
||||
v := uint32(0x65f83afb)
|
||||
|
||||
rr := New(250*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
rr, err := New(250*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
require.Equal(t, &rtcp.ReceiverReport{
|
||||
SSRC: 0x65f83afb,
|
||||
Reports: []rtcp.ReceptionReport{
|
||||
@@ -95,6 +96,7 @@ func TestRTCPReceiverOverflow(t *testing.T) {
|
||||
}, pkt)
|
||||
close(done)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer rr.Close()
|
||||
|
||||
time.Sleep(400 * time.Millisecond)
|
||||
@@ -147,7 +149,7 @@ func TestRTCPReceiverPacketLost(t *testing.T) {
|
||||
}
|
||||
v := uint32(0x65f83afb)
|
||||
|
||||
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
rr, err := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
require.Equal(t, &rtcp.ReceiverReport{
|
||||
SSRC: 0x65f83afb,
|
||||
Reports: []rtcp.ReceptionReport{
|
||||
@@ -166,6 +168,7 @@ func TestRTCPReceiverPacketLost(t *testing.T) {
|
||||
}, pkt)
|
||||
close(done)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer rr.Close()
|
||||
|
||||
srPkt := rtcp.SenderReport{
|
||||
@@ -216,7 +219,7 @@ func TestRTCPReceiverOverflowPacketLost(t *testing.T) {
|
||||
}
|
||||
v := uint32(0x65f83afb)
|
||||
|
||||
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
rr, err := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
require.Equal(t, &rtcp.ReceiverReport{
|
||||
SSRC: 0x65f83afb,
|
||||
Reports: []rtcp.ReceptionReport{
|
||||
@@ -235,6 +238,7 @@ func TestRTCPReceiverOverflowPacketLost(t *testing.T) {
|
||||
}, pkt)
|
||||
close(done)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer rr.Close()
|
||||
|
||||
srPkt := rtcp.SenderReport{
|
||||
@@ -285,7 +289,7 @@ func TestRTCPReceiverJitter(t *testing.T) {
|
||||
}
|
||||
v := uint32(0x65f83afb)
|
||||
|
||||
rr := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
rr, err := New(500*time.Millisecond, &v, 90000, func(pkt rtcp.Packet) {
|
||||
require.Equal(t, &rtcp.ReceiverReport{
|
||||
SSRC: 0x65f83afb,
|
||||
Reports: []rtcp.ReceptionReport{
|
||||
@@ -300,6 +304,7 @@ func TestRTCPReceiverJitter(t *testing.T) {
|
||||
}, pkt)
|
||||
close(done)
|
||||
})
|
||||
require.NoError(t, err)
|
||||
defer rr.Close()
|
||||
|
||||
srPkt := rtcp.SenderReport{
|
||||
|
@@ -34,13 +34,17 @@ func (sf *serverSessionFormat) start() {
|
||||
if sf.sm.ss.state != ServerSessionStatePlay {
|
||||
if *sf.sm.ss.setuppedTransport == TransportUDP || *sf.sm.ss.setuppedTransport == TransportUDPMulticast {
|
||||
sf.udpReorderer = rtpreorderer.New()
|
||||
sf.udpRTCPReceiver = rtcpreceiver.New(
|
||||
var err error
|
||||
sf.udpRTCPReceiver, err = rtcpreceiver.New(
|
||||
sf.sm.ss.s.udpReceiverReportPeriod,
|
||||
nil,
|
||||
sf.format.ClockRate(),
|
||||
func(pkt rtcp.Packet) {
|
||||
sf.sm.ss.WritePacketRTCP(sf.sm.media, pkt)
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
} else {
|
||||
sf.tcpLossDetector = rtplossdetector.New()
|
||||
}
|
||||
|
@@ -1045,7 +1045,8 @@ func TestServerSessionTeardown(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestServerAuth(t *testing.T) {
|
||||
nonce := auth.GenerateNonce()
|
||||
nonce, err := auth.GenerateNonce()
|
||||
require.NoError(t, err)
|
||||
|
||||
s := &Server{
|
||||
Handler: &testServerHandler{
|
||||
@@ -1068,7 +1069,7 @@ func TestServerAuth(t *testing.T) {
|
||||
RTSPAddress: "localhost:8554",
|
||||
}
|
||||
|
||||
err := s.Start()
|
||||
err = s.Start()
|
||||
require.NoError(t, err)
|
||||
defer s.Close()
|
||||
|
||||
|
Reference in New Issue
Block a user