mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 23:02:45 +08:00
improve performance
This commit is contained in:
18
client.go
18
client.go
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
)
|
)
|
||||||
|
@@ -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)
|
||||||
|
@@ -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()
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user