diff --git a/client.go b/client.go index 1e6d503c..5c8808bb 100644 --- a/client.go +++ b/client.go @@ -772,7 +772,7 @@ func (c *Client) runReader() { c.processPacketRTP(ct, &ctx) if ct.h264Decoder != nil { - if ct.h264Encoder == nil && len(payload) > udpReadBufferSize { + if ct.h264Encoder == nil && len(payload) > maxPacketSize { v1 := pkt.SSRC v2 := pkt.SequenceNumber v3 := pkt.Timestamp @@ -809,17 +809,17 @@ func (c *Client) runReader() { c.OnPacketRTP(&ctx) } } else { - if len(payload) > udpReadBufferSize { + if len(payload) > maxPacketSize { return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", - len(payload), udpReadBufferSize) + len(payload), maxPacketSize) } c.OnPacketRTP(&ctx) } } else { - if len(payload) > udpReadBufferSize { + if len(payload) > maxPacketSize { return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", - len(payload), udpReadBufferSize) + len(payload), maxPacketSize) } packets, err := rtcp.Unmarshal(payload) @@ -840,9 +840,9 @@ func (c *Client) runReader() { } else { processFunc = func(trackID int, isRTP bool, payload []byte) error { if !isRTP { - if len(payload) > udpReadBufferSize { + if len(payload) > maxPacketSize { return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", - len(payload), udpReadBufferSize) + len(payload), maxPacketSize) } packets, err := rtcp.Unmarshal(payload) @@ -1935,10 +1935,12 @@ func (c *Client) WritePacketRTP(trackID int, pkt *rtp.Packet, ptsEqualsDTS bool) } } - byts, err := pkt.Marshal() + byts := make([]byte, maxPacketSize) + n, err := pkt.MarshalTo(byts) if err != nil { return err } + byts = byts[:n] if c.tracks[trackID].rtcpSender != nil { c.tracks[trackID].rtcpSender.ProcessPacketRTP(time.Now(), pkt, ptsEqualsDTS) diff --git a/clientudpl.go b/clientudpl.go index cf6f8118..8ebd2a81 100644 --- a/clientudpl.go +++ b/clientudpl.go @@ -152,7 +152,7 @@ func (u *clientUDPListener) runReader() { defer close(u.readerDone) for { - buf := make([]byte, udpReadBufferSize) + buf := make([]byte, maxPacketSize) n, addr, err := u.pc.ReadFrom(buf) if err != nil { return diff --git a/constants.go b/constants.go index 7e33c896..21e3fd95 100644 --- a/constants.go +++ b/constants.go @@ -4,6 +4,6 @@ const ( tcpReadBufferSize = 4096 tcpMaxFramePayloadSize = 60 * 1024 * 1024 udpKernelReadBufferSize = 0x80000 // same size as GStreamer's rtspsrc - udpReadBufferSize = 1472 // 1500 (UDP MTU) - 20 (IP header) - 8 (UDP header) + maxPacketSize = 1472 // 1500 (UDP MTU) - 20 (IP header) - 8 (UDP header) multicastTTL = 16 ) diff --git a/serverconn.go b/serverconn.go index d8739af6..e2ad3bd8 100644 --- a/serverconn.go +++ b/serverconn.go @@ -224,9 +224,9 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error { if sc.session.state == ServerSessionStatePlay { processFunc = func(trackID int, isRTP bool, payload []byte) error { if !isRTP { - if len(payload) > udpReadBufferSize { + if len(payload) > maxPacketSize { return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", - len(payload), udpReadBufferSize) + len(payload), maxPacketSize) } packets, err := rtcp.Unmarshal(payload) @@ -267,7 +267,7 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error { sc.session.processPacketRTP(at, &ctx) if at.h264Decoder != nil { - if at.h264Encoder == nil && len(payload) > udpReadBufferSize { + if at.h264Encoder == nil && len(payload) > maxPacketSize { v1 := pkt.SSRC v2 := pkt.SequenceNumber v3 := pkt.Timestamp @@ -311,9 +311,9 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error { } } } else { - if len(payload) > udpReadBufferSize { + if len(payload) > maxPacketSize { return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", - len(payload), udpReadBufferSize) + len(payload), maxPacketSize) } if h, ok := sc.s.Handler.(ServerHandlerOnPacketRTP); ok { @@ -321,9 +321,9 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error { } } } else { - if len(payload) > udpReadBufferSize { + if len(payload) > maxPacketSize { return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", - len(payload), udpReadBufferSize) + len(payload), maxPacketSize) } packets, err := rtcp.Unmarshal(payload) diff --git a/serverstream.go b/serverstream.go index 62fbcf9f..ac67a6ed 100644 --- a/serverstream.go +++ b/serverstream.go @@ -218,10 +218,12 @@ func (st *ServerStream) readerSetInactive(ss *ServerSession) { // WritePacketRTP writes a RTP packet to all the readers of the stream. func (st *ServerStream) WritePacketRTP(trackID int, pkt *rtp.Packet, ptsEqualsDTS bool) { - byts, err := pkt.Marshal() + byts := make([]byte, maxPacketSize) + n, err := pkt.MarshalTo(byts) if err != nil { return } + byts = byts[:n] track := st.stTracks[trackID] now := time.Now() diff --git a/serverudpl.go b/serverudpl.go index 499b5a4b..b4a38ff5 100644 --- a/serverudpl.go +++ b/serverudpl.go @@ -171,7 +171,7 @@ func (u *serverUDPListener) runReader() { defer close(u.readerDone) for { - buf := make([]byte, udpReadBufferSize) + buf := make([]byte, maxPacketSize) n, addr, err := u.pc.ReadFromUDP(buf) if err != nil { break