server: simplify tcp handling

This commit is contained in:
aler9
2021-12-07 22:08:48 +01:00
parent 066ddd4423
commit 289c272469
2 changed files with 29 additions and 45 deletions

View File

@@ -38,10 +38,8 @@ type ServerConn struct {
br *bufio.Reader
bw *bufio.Writer
sessions map[string]*ServerSession
tcpFrameSetEnabled bool
tcpFrameEnabled bool
tcpSession *ServerSession
tcpFrameIsRecording bool
tcpFrameTimeout bool
tcpReadBuffer *multibuffer.MultiBuffer
tcpProcessFunc func(int, bool, []byte)
@@ -485,31 +483,6 @@ func (sc *ServerConn) handleRequestOuter(req *base.Request) error {
sc.tcpWriteMutex.Unlock()
if sc.tcpFrameSetEnabled != sc.tcpFrameEnabled {
sc.tcpFrameEnabled = sc.tcpFrameSetEnabled
if sc.tcpFrameEnabled {
if sc.tcpFrameIsRecording {
sc.tcpFrameTimeout = true
sc.tcpReadBuffer = multibuffer.New(uint64(sc.s.ReadBufferCount), uint64(sc.s.ReadBufferSize))
sc.tcpProcessFunc = sc.tcpProcessRecord
} else {
// when playing, tcpReadBuffer is only used to receive RTCP receiver reports,
// that are much smaller than RTP packets and are sent at a fixed interval.
// decrease RAM consumption by allocating less buffers.
sc.tcpReadBuffer = multibuffer.New(8, uint64(sc.s.ReadBufferSize))
sc.tcpProcessFunc = sc.tcpProcessPlay
}
} else {
if sc.tcpFrameIsRecording {
sc.tcpFrameTimeout = false
sc.nconn.SetReadDeadline(time.Time{})
}
sc.tcpReadBuffer = nil
}
}
return err
}

View File

@@ -13,6 +13,7 @@ import (
"github.com/aler9/gortsplib/pkg/base"
"github.com/aler9/gortsplib/pkg/headers"
"github.com/aler9/gortsplib/pkg/liberrors"
"github.com/aler9/gortsplib/pkg/multibuffer"
"github.com/aler9/gortsplib/pkg/ringbuffer"
"github.com/aler9/gortsplib/pkg/rtcpreceiver"
)
@@ -843,8 +844,13 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
default: // TCP
ss.tcpConn = sc
ss.tcpConn.tcpSession = ss
ss.tcpConn.tcpFrameIsRecording = false
ss.tcpConn.tcpFrameSetEnabled = true
ss.tcpConn.tcpFrameEnabled = true
ss.tcpConn.tcpFrameTimeout = false
// when playing, tcpReadBuffer is only used to receive RTCP receiver reports,
// that are much smaller than RTP packets and are sent at a fixed interval.
// decrease RAM consumption by allocating less buffers.
ss.tcpConn.tcpReadBuffer = multibuffer.New(8, uint64(sc.s.ReadBufferSize))
ss.tcpConn.tcpProcessFunc = sc.tcpProcessPlay
ss.writerRunning = true
ss.writerDone = make(chan struct{})
@@ -972,8 +978,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
default: // TCP
ss.tcpConn = sc
ss.tcpConn.tcpSession = ss
ss.tcpConn.tcpFrameIsRecording = true
ss.tcpConn.tcpFrameSetEnabled = true
ss.tcpConn.tcpFrameEnabled = true
ss.tcpConn.tcpFrameTimeout = true
ss.tcpConn.tcpReadBuffer = multibuffer.New(uint64(sc.s.ReadBufferCount), uint64(sc.s.ReadBufferSize))
ss.tcpConn.tcpProcessFunc = sc.tcpProcessRecord
ss.writerRunning = true
ss.writerDone = make(chan struct{})
@@ -1040,7 +1048,8 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
default: // TCP
ss.tcpConn.tcpSession = nil
ss.tcpConn.tcpFrameSetEnabled = false
ss.tcpConn.tcpFrameEnabled = false
ss.tcpConn.tcpReadBuffer = nil
ss.tcpConn = nil
}
@@ -1058,7 +1067,9 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
default: // TCP
ss.tcpConn.tcpSession = nil
ss.tcpConn.tcpFrameSetEnabled = false
ss.tcpConn.tcpFrameEnabled = false
ss.tcpConn.tcpReadBuffer = nil
ss.tcpConn.nconn.SetReadDeadline(time.Time{})
ss.tcpConn = nil
}
}