mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 07:06:58 +08:00
add option MaxPacketSize to Client and Server
This commit is contained in:
14
client.go
14
client.go
@@ -243,6 +243,10 @@ type Client struct {
|
|||||||
// It allows to queue packets before sending them.
|
// It allows to queue packets before sending them.
|
||||||
// It defaults to 256.
|
// It defaults to 256.
|
||||||
WriteBufferCount int
|
WriteBufferCount int
|
||||||
|
// maximum size of outgoing RTP / RTCP packets.
|
||||||
|
// This must be less than the UDP MTU (1472 bytes).
|
||||||
|
// It defaults to 1472.
|
||||||
|
MaxPacketSize int
|
||||||
// user agent header.
|
// user agent header.
|
||||||
// It defaults to "gortsplib"
|
// It defaults to "gortsplib"
|
||||||
UserAgent string
|
UserAgent string
|
||||||
@@ -343,10 +347,14 @@ func (c *Client) Start(scheme string, host string) error {
|
|||||||
}
|
}
|
||||||
if c.WriteBufferCount == 0 {
|
if c.WriteBufferCount == 0 {
|
||||||
c.WriteBufferCount = 256
|
c.WriteBufferCount = 256
|
||||||
}
|
} else if (c.WriteBufferCount & (c.WriteBufferCount - 1)) != 0 {
|
||||||
if (c.WriteBufferCount & (c.WriteBufferCount - 1)) != 0 {
|
|
||||||
return fmt.Errorf("WriteBufferCount must be a power of two")
|
return fmt.Errorf("WriteBufferCount must be a power of two")
|
||||||
}
|
}
|
||||||
|
if c.MaxPacketSize == 0 {
|
||||||
|
c.MaxPacketSize = udpMaxPayloadSize
|
||||||
|
} else if c.MaxPacketSize > udpMaxPayloadSize {
|
||||||
|
return fmt.Errorf("MaxPacketSize must be less than %d", udpMaxPayloadSize)
|
||||||
|
}
|
||||||
if c.UserAgent == "" {
|
if c.UserAgent == "" {
|
||||||
c.UserAgent = "gortsplib"
|
c.UserAgent = "gortsplib"
|
||||||
}
|
}
|
||||||
@@ -1650,7 +1658,7 @@ func (c *Client) WritePacketRTP(medi *media.Media, pkt *rtp.Packet) error {
|
|||||||
|
|
||||||
// WritePacketRTPWithNTP writes a RTP packet to the media stream.
|
// WritePacketRTPWithNTP writes a RTP packet to the media stream.
|
||||||
func (c *Client) WritePacketRTPWithNTP(medi *media.Media, pkt *rtp.Packet, ntp time.Time) error {
|
func (c *Client) WritePacketRTPWithNTP(medi *media.Media, pkt *rtp.Packet, ntp time.Time) error {
|
||||||
byts := make([]byte, udpMaxPayloadSize)
|
byts := make([]byte, c.MaxPacketSize)
|
||||||
n, err := pkt.MarshalTo(byts)
|
n, err := pkt.MarshalTo(byts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@@ -118,7 +118,7 @@ func (cm *clientMedia) start() {
|
|||||||
|
|
||||||
cm.tcpRTPFrame = &base.InterleavedFrame{Channel: cm.tcpChannel}
|
cm.tcpRTPFrame = &base.InterleavedFrame{Channel: cm.tcpChannel}
|
||||||
cm.tcpRTCPFrame = &base.InterleavedFrame{Channel: cm.tcpChannel + 1}
|
cm.tcpRTCPFrame = &base.InterleavedFrame{Channel: cm.tcpChannel + 1}
|
||||||
cm.tcpBuffer = make([]byte, udpMaxPayloadSize+4)
|
cm.tcpBuffer = make([]byte, cm.c.MaxPacketSize+4)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, ct := range cm.formats {
|
for _, ct := range cm.formats {
|
||||||
|
12
server.go
12
server.go
@@ -90,6 +90,10 @@ type Server struct {
|
|||||||
// It allows to queue packets before sending them.
|
// It allows to queue packets before sending them.
|
||||||
// It defaults to 256.
|
// It defaults to 256.
|
||||||
WriteBufferCount int
|
WriteBufferCount int
|
||||||
|
// maximum size of outgoing RTP / RTCP packets.
|
||||||
|
// This must be less than the UDP MTU (1472 bytes).
|
||||||
|
// It defaults to 1472.
|
||||||
|
MaxPacketSize int
|
||||||
// disable automatic RTCP sender reports.
|
// disable automatic RTCP sender reports.
|
||||||
DisableRTCPSenderReports bool
|
DisableRTCPSenderReports bool
|
||||||
|
|
||||||
@@ -154,10 +158,14 @@ func (s *Server) Start() error {
|
|||||||
}
|
}
|
||||||
if s.WriteBufferCount == 0 {
|
if s.WriteBufferCount == 0 {
|
||||||
s.WriteBufferCount = 256
|
s.WriteBufferCount = 256
|
||||||
}
|
} else if (s.WriteBufferCount & (s.WriteBufferCount - 1)) != 0 {
|
||||||
if (s.WriteBufferCount & (s.WriteBufferCount - 1)) != 0 {
|
|
||||||
return fmt.Errorf("WriteBufferCount must be a power of two")
|
return fmt.Errorf("WriteBufferCount must be a power of two")
|
||||||
}
|
}
|
||||||
|
if s.MaxPacketSize == 0 {
|
||||||
|
s.MaxPacketSize = udpMaxPayloadSize
|
||||||
|
} else if s.MaxPacketSize > udpMaxPayloadSize {
|
||||||
|
return fmt.Errorf("MaxPacketSize must be less than %d", udpMaxPayloadSize)
|
||||||
|
}
|
||||||
|
|
||||||
// system functions
|
// system functions
|
||||||
if s.Listen == nil {
|
if s.Listen == nil {
|
||||||
|
@@ -520,7 +520,7 @@ func TestServerRecord(t *testing.T) {
|
|||||||
}, nil, nil
|
}, nil, nil
|
||||||
},
|
},
|
||||||
onRecord: func(ctx *ServerHandlerOnRecordCtx) (*base.Response, error) {
|
onRecord: func(ctx *ServerHandlerOnRecordCtx) (*base.Response, error) {
|
||||||
// send RTCP packets directly to the session.
|
// queue sending of RTCP packets.
|
||||||
// these are sent after the response, only if onRecord returns StatusOK.
|
// these are sent after the response, only if onRecord returns StatusOK.
|
||||||
err := ctx.Session.WritePacketRTCP(ctx.Session.AnnouncedMedias()[0], &testRTCPPacket)
|
err := ctx.Session.WritePacketRTCP(ctx.Session.AnnouncedMedias()[0], &testRTCPPacket)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
@@ -1161,10 +1161,12 @@ func (ss *ServerSession) writePacketRTP(medi *media.Media, byts []byte) {
|
|||||||
|
|
||||||
// WritePacketRTP writes a RTP packet to the session.
|
// WritePacketRTP writes a RTP packet to the session.
|
||||||
func (ss *ServerSession) WritePacketRTP(medi *media.Media, pkt *rtp.Packet) error {
|
func (ss *ServerSession) WritePacketRTP(medi *media.Media, pkt *rtp.Packet) error {
|
||||||
byts, err := pkt.Marshal()
|
byts := make([]byte, ss.s.MaxPacketSize)
|
||||||
|
n, err := pkt.MarshalTo(byts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
byts = byts[:n]
|
||||||
|
|
||||||
ss.writePacketRTP(medi, byts)
|
ss.writePacketRTP(medi, byts)
|
||||||
return nil
|
return nil
|
||||||
|
@@ -93,7 +93,7 @@ func (sm *serverSessionMedia) start() {
|
|||||||
|
|
||||||
sm.tcpRTPFrame = &base.InterleavedFrame{Channel: sm.tcpChannel}
|
sm.tcpRTPFrame = &base.InterleavedFrame{Channel: sm.tcpChannel}
|
||||||
sm.tcpRTCPFrame = &base.InterleavedFrame{Channel: sm.tcpChannel + 1}
|
sm.tcpRTCPFrame = &base.InterleavedFrame{Channel: sm.tcpChannel + 1}
|
||||||
sm.tcpBuffer = make([]byte, udpMaxPayloadSize+4)
|
sm.tcpBuffer = make([]byte, sm.ss.s.MaxPacketSize+4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -251,7 +251,7 @@ func (st *ServerStream) WritePacketRTP(medi *media.Media, pkt *rtp.Packet) error
|
|||||||
// ntp is the absolute time of the packet, and is needed to generate RTCP sender reports
|
// ntp is the absolute time of the packet, and is needed to generate RTCP sender reports
|
||||||
// that allows the receiver to reconstruct the absolute time of the packet.
|
// that allows the receiver to reconstruct the absolute time of the packet.
|
||||||
func (st *ServerStream) WritePacketRTPWithNTP(medi *media.Media, pkt *rtp.Packet, ntp time.Time) error {
|
func (st *ServerStream) WritePacketRTPWithNTP(medi *media.Media, pkt *rtp.Packet, ntp time.Time) error {
|
||||||
byts := make([]byte, udpMaxPayloadSize)
|
byts := make([]byte, st.s.MaxPacketSize)
|
||||||
n, err := pkt.MarshalTo(byts)
|
n, err := pkt.MarshalTo(byts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
Reference in New Issue
Block a user