improve UDP performance

This commit is contained in:
aler9
2021-11-12 21:56:32 +01:00
parent b89bb8d08e
commit ed2f712db2
3 changed files with 106 additions and 110 deletions

View File

@@ -60,6 +60,7 @@ type serverUDPListener struct {
clientsMutex sync.RWMutex
clients map[clientAddr]*clientData
ringBuffer *ringbuffer.RingBuffer
processFunc func(time.Time, *clientData, []byte)
}
func newServerUDPListenerMulticastPair(s *Server) (*serverUDPListener, *serverUDPListener, error) {
@@ -157,6 +158,12 @@ func newServerUDPListener(
ringBuffer: ringbuffer.New(uint64(s.ReadBufferCount)),
}
if isRTP {
u.processFunc = u.processRTP
} else {
u.processFunc = u.processRTCP
}
u.wg.Add(1)
go u.run()
@@ -206,29 +213,7 @@ func (u *serverUDPListener) run() {
atomic.StoreInt64(clientData.ss.udpLastFrameTime, now.Unix())
}
if u.isRTP {
clientData.ss.announcedTracks[clientData.trackID].rtcpReceiver.ProcessPacketRTP(now, buf[:n])
if h, ok := u.s.Handler.(ServerHandlerOnPacketRTP); ok {
h.OnPacketRTP(&ServerHandlerOnPacketRTPCtx{
Session: clientData.ss,
TrackID: clientData.trackID,
Payload: buf[:n],
})
}
} else {
if clientData.isPublishing {
clientData.ss.announcedTracks[clientData.trackID].rtcpReceiver.ProcessPacketRTCP(now, buf[:n])
}
if h, ok := u.s.Handler.(ServerHandlerOnPacketRTCP); ok {
h.OnPacketRTCP(&ServerHandlerOnPacketRTCPCtx{
Session: clientData.ss,
TrackID: clientData.trackID,
Payload: buf[:n],
})
}
}
u.processFunc(now, clientData, buf[:n])
}()
}
}()
@@ -255,6 +240,32 @@ func (u *serverUDPListener) run() {
u.ringBuffer.Close()
}
func (u *serverUDPListener) processRTP(now time.Time, clientData *clientData, payload []byte) {
clientData.ss.announcedTracks[clientData.trackID].rtcpReceiver.ProcessPacketRTP(now, payload)
if h, ok := u.s.Handler.(ServerHandlerOnPacketRTP); ok {
h.OnPacketRTP(&ServerHandlerOnPacketRTPCtx{
Session: clientData.ss,
TrackID: clientData.trackID,
Payload: payload,
})
}
}
func (u *serverUDPListener) processRTCP(now time.Time, clientData *clientData, payload []byte) {
if clientData.isPublishing {
clientData.ss.announcedTracks[clientData.trackID].rtcpReceiver.ProcessPacketRTCP(now, payload)
}
if h, ok := u.s.Handler.(ServerHandlerOnPacketRTCP); ok {
h.OnPacketRTCP(&ServerHandlerOnPacketRTCPCtx{
Session: clientData.ss,
TrackID: clientData.trackID,
Payload: payload,
})
}
}
func (u *serverUDPListener) write(buf []byte, addr *net.UDPAddr) {
u.ringBuffer.Push(bufAddrPair{buf, addr})
}