improve performance

This commit is contained in:
aler9
2022-04-10 15:10:30 +02:00
parent 3123346397
commit ff34f5ac1d
6 changed files with 23 additions and 19 deletions

View File

@@ -772,7 +772,7 @@ func (c *Client) runReader() {
c.processPacketRTP(ct, &ctx) c.processPacketRTP(ct, &ctx)
if ct.h264Decoder != nil { if ct.h264Decoder != nil {
if ct.h264Encoder == nil && len(payload) > udpReadBufferSize { if ct.h264Encoder == nil && len(payload) > maxPacketSize {
v1 := pkt.SSRC v1 := pkt.SSRC
v2 := pkt.SequenceNumber v2 := pkt.SequenceNumber
v3 := pkt.Timestamp v3 := pkt.Timestamp
@@ -809,17 +809,17 @@ func (c *Client) runReader() {
c.OnPacketRTP(&ctx) c.OnPacketRTP(&ctx)
} }
} else { } else {
if len(payload) > udpReadBufferSize { if len(payload) > maxPacketSize {
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)",
len(payload), udpReadBufferSize) len(payload), maxPacketSize)
} }
c.OnPacketRTP(&ctx) c.OnPacketRTP(&ctx)
} }
} else { } else {
if len(payload) > udpReadBufferSize { if len(payload) > maxPacketSize {
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)",
len(payload), udpReadBufferSize) len(payload), maxPacketSize)
} }
packets, err := rtcp.Unmarshal(payload) packets, err := rtcp.Unmarshal(payload)
@@ -840,9 +840,9 @@ func (c *Client) runReader() {
} else { } else {
processFunc = func(trackID int, isRTP bool, payload []byte) error { processFunc = func(trackID int, isRTP bool, payload []byte) error {
if !isRTP { if !isRTP {
if len(payload) > udpReadBufferSize { if len(payload) > maxPacketSize {
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)",
len(payload), udpReadBufferSize) len(payload), maxPacketSize)
} }
packets, err := rtcp.Unmarshal(payload) 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 { if err != nil {
return err return err
} }
byts = byts[:n]
if c.tracks[trackID].rtcpSender != nil { if c.tracks[trackID].rtcpSender != nil {
c.tracks[trackID].rtcpSender.ProcessPacketRTP(time.Now(), pkt, ptsEqualsDTS) c.tracks[trackID].rtcpSender.ProcessPacketRTP(time.Now(), pkt, ptsEqualsDTS)

View File

@@ -152,7 +152,7 @@ func (u *clientUDPListener) runReader() {
defer close(u.readerDone) defer close(u.readerDone)
for { for {
buf := make([]byte, udpReadBufferSize) buf := make([]byte, maxPacketSize)
n, addr, err := u.pc.ReadFrom(buf) n, addr, err := u.pc.ReadFrom(buf)
if err != nil { if err != nil {
return return

View File

@@ -4,6 +4,6 @@ const (
tcpReadBufferSize = 4096 tcpReadBufferSize = 4096
tcpMaxFramePayloadSize = 60 * 1024 * 1024 tcpMaxFramePayloadSize = 60 * 1024 * 1024
udpKernelReadBufferSize = 0x80000 // same size as GStreamer's rtspsrc 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 multicastTTL = 16
) )

View File

@@ -224,9 +224,9 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error {
if sc.session.state == ServerSessionStatePlay { if sc.session.state == ServerSessionStatePlay {
processFunc = func(trackID int, isRTP bool, payload []byte) error { processFunc = func(trackID int, isRTP bool, payload []byte) error {
if !isRTP { if !isRTP {
if len(payload) > udpReadBufferSize { if len(payload) > maxPacketSize {
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)",
len(payload), udpReadBufferSize) len(payload), maxPacketSize)
} }
packets, err := rtcp.Unmarshal(payload) packets, err := rtcp.Unmarshal(payload)
@@ -267,7 +267,7 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error {
sc.session.processPacketRTP(at, &ctx) sc.session.processPacketRTP(at, &ctx)
if at.h264Decoder != nil { if at.h264Decoder != nil {
if at.h264Encoder == nil && len(payload) > udpReadBufferSize { if at.h264Encoder == nil && len(payload) > maxPacketSize {
v1 := pkt.SSRC v1 := pkt.SSRC
v2 := pkt.SequenceNumber v2 := pkt.SequenceNumber
v3 := pkt.Timestamp v3 := pkt.Timestamp
@@ -311,9 +311,9 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error {
} }
} }
} else { } else {
if len(payload) > udpReadBufferSize { if len(payload) > maxPacketSize {
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", 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 { if h, ok := sc.s.Handler.(ServerHandlerOnPacketRTP); ok {
@@ -321,9 +321,9 @@ func (sc *ServerConn) readFuncTCP(readRequest chan readReq) error {
} }
} }
} else { } else {
if len(payload) > udpReadBufferSize { if len(payload) > maxPacketSize {
return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)", return fmt.Errorf("payload size (%d) greater than maximum allowed (%d)",
len(payload), udpReadBufferSize) len(payload), maxPacketSize)
} }
packets, err := rtcp.Unmarshal(payload) packets, err := rtcp.Unmarshal(payload)

View File

@@ -218,10 +218,12 @@ func (st *ServerStream) readerSetInactive(ss *ServerSession) {
// WritePacketRTP writes a RTP packet to all the readers of the stream. // WritePacketRTP writes a RTP packet to all the readers of the stream.
func (st *ServerStream) WritePacketRTP(trackID int, pkt *rtp.Packet, ptsEqualsDTS bool) { 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 { if err != nil {
return return
} }
byts = byts[:n]
track := st.stTracks[trackID] track := st.stTracks[trackID]
now := time.Now() now := time.Now()

View File

@@ -171,7 +171,7 @@ func (u *serverUDPListener) runReader() {
defer close(u.readerDone) defer close(u.readerDone)
for { for {
buf := make([]byte, udpReadBufferSize) buf := make([]byte, maxPacketSize)
n, addr, err := u.pc.ReadFromUDP(buf) n, addr, err := u.pc.ReadFromUDP(buf)
if err != nil { if err != nil {
break break