mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
save RAM by allocating interleaved frames only when needed
This commit is contained in:
22
client.go
22
client.go
@@ -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)
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user