diff --git a/client.go b/client.go index 304ab9c1..c63beb9b 100644 --- a/client.go +++ b/client.go @@ -58,8 +58,6 @@ type clientTrack struct { udpRTPListener *clientUDPListener udpRTCPListener *clientUDPListener tcpChannel int - tcpRTPFrame *base.InterleavedFrame - tcpRTCPFrame *base.InterleavedFrame rtcpReceiver *rtcpreceiver.RTCPReceiver rtcpSender *rtcpsender.RTCPSender } @@ -1543,14 +1541,6 @@ func (c *Client) doSetup( c.tracksByChannel[thRes.InterleavedIDs[0]] = trackID cct.tcpChannel = thRes.InterleavedIDs[0] - - cct.tcpRTPFrame = &base.InterleavedFrame{ - Channel: cct.tcpChannel, - } - - cct.tcpRTCPFrame = &base.InterleavedFrame{ - Channel: cct.tcpChannel + 1, - } } if c.tracks == nil { @@ -1834,18 +1824,26 @@ func (c *Client) runWriter() { } 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 writeFunc = func(trackID int, isRTP bool, payload []byte) { if isRTP { - f := c.tracks[trackID].tcpRTPFrame + f := rtpFrames[trackID] f.Payload = payload f.Write(&buf) c.conn.SetWriteDeadline(time.Now().Add(c.WriteTimeout)) c.conn.Write(buf.Bytes()) } else { - f := c.tracks[trackID].tcpRTCPFrame + f := rtcpFrames[trackID] f.Payload = payload f.Write(&buf) diff --git a/serversession.go b/serversession.go index d4b2ca58..75d972e4 100644 --- a/serversession.go +++ b/serversession.go @@ -141,13 +141,11 @@ func (s ServerSessionState) String() string { // ServerSessionSetuppedTrack is a setupped track of a ServerSession. type ServerSessionSetuppedTrack struct { - tcpChannel int - udpRTPPort int - udpRTCPPort int - udpRTPAddr *net.UDPAddr - udpRTCPAddr *net.UDPAddr - tcpRTPFrame *base.InterleavedFrame - tcpRTCPFrame *base.InterleavedFrame + tcpChannel int + udpRTPPort int + udpRTCPPort int + udpRTPAddr *net.UDPAddr + udpRTCPAddr *net.UDPAddr } // ServerSessionAnnouncedTrack is an announced track of a ServerSession. @@ -770,14 +768,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base default: // TCP sst.tcpChannel = inTH.InterleavedIDs[0] - sst.tcpRTPFrame = &base.InterleavedFrame{ - Channel: sst.tcpChannel, - } - - sst.tcpRTCPFrame = &base.InterleavedFrame{ - Channel: sst.tcpChannel + 1, - } - if ss.tcpTracksByChannel == nil { ss.tcpTracksByChannel = make(map[int]int) } @@ -1164,19 +1154,27 @@ func (ss *ServerSession) runWriter() { 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 writeFunc = func(trackID int, isRTP bool, payload []byte) { if isRTP { - f := ss.setuppedTracks[trackID].tcpRTPFrame + f := rtpFrames[trackID] f.Payload = payload f.Write(&buf) ss.tcpConn.conn.SetWriteDeadline(time.Now().Add(ss.s.WriteTimeout)) ss.tcpConn.conn.Write(buf.Bytes()) } else { - f := ss.setuppedTracks[trackID].tcpRTCPFrame + f := rtcpFrames[trackID] f.Payload = payload f.Write(&buf)