save RAM by allocating interleaved frames only when needed

This commit is contained in:
aler9
2022-02-18 22:46:23 +01:00
parent 82b03f368f
commit fc2dcf1cfe
2 changed files with 26 additions and 30 deletions

View File

@@ -58,8 +58,6 @@ type clientTrack struct {
udpRTPListener *clientUDPListener udpRTPListener *clientUDPListener
udpRTCPListener *clientUDPListener udpRTCPListener *clientUDPListener
tcpChannel int tcpChannel int
tcpRTPFrame *base.InterleavedFrame
tcpRTCPFrame *base.InterleavedFrame
rtcpReceiver *rtcpreceiver.RTCPReceiver rtcpReceiver *rtcpreceiver.RTCPReceiver
rtcpSender *rtcpsender.RTCPSender rtcpSender *rtcpsender.RTCPSender
} }
@@ -1543,14 +1541,6 @@ func (c *Client) doSetup(
c.tracksByChannel[thRes.InterleavedIDs[0]] = trackID c.tracksByChannel[thRes.InterleavedIDs[0]] = trackID
cct.tcpChannel = thRes.InterleavedIDs[0] cct.tcpChannel = thRes.InterleavedIDs[0]
cct.tcpRTPFrame = &base.InterleavedFrame{
Channel: cct.tcpChannel,
}
cct.tcpRTCPFrame = &base.InterleavedFrame{
Channel: cct.tcpChannel + 1,
}
} }
if c.tracks == nil { if c.tracks == nil {
@@ -1834,18 +1824,26 @@ func (c *Client) runWriter() {
} }
default: // TCP default: // TCP
rtpFrames := make(map[int]*base.InterleavedFrame, len(c.tracks))
rtcpFrames := make(map[int]*base.InterleavedFrame, len(c.tracks))
for trackID, cct := range c.tracks {
rtpFrames[trackID] = &base.InterleavedFrame{Channel: cct.tcpChannel}
rtcpFrames[trackID] = &base.InterleavedFrame{Channel: cct.tcpChannel + 1}
}
var buf bytes.Buffer var buf bytes.Buffer
writeFunc = func(trackID int, isRTP bool, payload []byte) { writeFunc = func(trackID int, isRTP bool, payload []byte) {
if isRTP { if isRTP {
f := c.tracks[trackID].tcpRTPFrame f := rtpFrames[trackID]
f.Payload = payload f.Payload = payload
f.Write(&buf) f.Write(&buf)
c.conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)) c.conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout))
c.conn.Write(buf.Bytes()) c.conn.Write(buf.Bytes())
} else { } else {
f := c.tracks[trackID].tcpRTCPFrame f := rtcpFrames[trackID]
f.Payload = payload f.Payload = payload
f.Write(&buf) f.Write(&buf)

View File

@@ -141,13 +141,11 @@ func (s ServerSessionState) String() string {
// ServerSessionSetuppedTrack is a setupped track of a ServerSession. // ServerSessionSetuppedTrack is a setupped track of a ServerSession.
type ServerSessionSetuppedTrack struct { type ServerSessionSetuppedTrack struct {
tcpChannel int tcpChannel int
udpRTPPort int udpRTPPort int
udpRTCPPort int udpRTCPPort int
udpRTPAddr *net.UDPAddr udpRTPAddr *net.UDPAddr
udpRTCPAddr *net.UDPAddr udpRTCPAddr *net.UDPAddr
tcpRTPFrame *base.InterleavedFrame
tcpRTCPFrame *base.InterleavedFrame
} }
// ServerSessionAnnouncedTrack is an announced track of a ServerSession. // ServerSessionAnnouncedTrack is an announced track of a ServerSession.
@@ -770,14 +768,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base
default: // TCP default: // TCP
sst.tcpChannel = inTH.InterleavedIDs[0] sst.tcpChannel = inTH.InterleavedIDs[0]
sst.tcpRTPFrame = &base.InterleavedFrame{
Channel: sst.tcpChannel,
}
sst.tcpRTCPFrame = &base.InterleavedFrame{
Channel: sst.tcpChannel + 1,
}
if ss.tcpTracksByChannel == nil { if ss.tcpTracksByChannel == nil {
ss.tcpTracksByChannel = make(map[int]int) ss.tcpTracksByChannel = make(map[int]int)
} }
@@ -1164,19 +1154,27 @@ func (ss *ServerSession) runWriter() {
ss.s.udpRTCPListener.write(payload, ss.setuppedTracks[trackID].udpRTCPAddr) ss.s.udpRTCPListener.write(payload, ss.setuppedTracks[trackID].udpRTCPAddr)
} }
} }
} else { } else { // TCP
rtpFrames := make(map[int]*base.InterleavedFrame, len(ss.setuppedTracks))
rtcpFrames := make(map[int]*base.InterleavedFrame, len(ss.setuppedTracks))
for trackID, sst := range ss.setuppedTracks {
rtpFrames[trackID] = &base.InterleavedFrame{Channel: sst.tcpChannel}
rtcpFrames[trackID] = &base.InterleavedFrame{Channel: sst.tcpChannel + 1}
}
var buf bytes.Buffer var buf bytes.Buffer
writeFunc = func(trackID int, isRTP bool, payload []byte) { writeFunc = func(trackID int, isRTP bool, payload []byte) {
if isRTP { if isRTP {
f := ss.setuppedTracks[trackID].tcpRTPFrame f := rtpFrames[trackID]
f.Payload = payload f.Payload = payload
f.Write(&buf) f.Write(&buf)
ss.tcpConn.conn.SetWriteDeadline(time.Now().Add(ss.s.WriteTimeout)) ss.tcpConn.conn.SetWriteDeadline(time.Now().Add(ss.s.WriteTimeout))
ss.tcpConn.conn.Write(buf.Bytes()) ss.tcpConn.conn.Write(buf.Bytes())
} else { } else {
f := ss.setuppedTracks[trackID].tcpRTCPFrame f := rtcpFrames[trackID]
f.Payload = payload f.Payload = payload
f.Write(&buf) f.Write(&buf)