Browse Source

add serverUdpListener.close()

pull/31/head
aler9 5 years ago
parent
commit
83608a2fdd
  1. 6
      main.go
  2. 8
      server-client.go
  3. 29
      server-udpl.go

6
main.go

@ -167,7 +167,7 @@ func (p *program) forwardTrack(path string, id int, flow trackFlow, frame []byte
if c.path == path && c.state == _CLIENT_STATE_PLAY { if c.path == path && c.state == _CLIENT_STATE_PLAY {
if c.streamProtocol == _STREAM_PROTOCOL_UDP { if c.streamProtocol == _STREAM_PROTOCOL_UDP {
if flow == _TRACK_FLOW_RTP { if flow == _TRACK_FLOW_RTP {
p.rtpl.chanWrite <- &udpWrite{ p.rtpl.write <- &udpWrite{
addr: &net.UDPAddr{ addr: &net.UDPAddr{
IP: c.ip(), IP: c.ip(),
Zone: c.zone(), Zone: c.zone(),
@ -176,7 +176,7 @@ func (p *program) forwardTrack(path string, id int, flow trackFlow, frame []byte
buf: frame, buf: frame,
} }
} else { } else {
p.rtcpl.chanWrite <- &udpWrite{ p.rtcpl.write <- &udpWrite{
addr: &net.UDPAddr{ addr: &net.UDPAddr{
IP: c.ip(), IP: c.ip(),
Zone: c.zone(), Zone: c.zone(),
@ -187,7 +187,7 @@ func (p *program) forwardTrack(path string, id int, flow trackFlow, frame []byte
} }
} else { } else {
c.chanWrite <- &gortsplib.InterleavedFrame{ c.write <- &gortsplib.InterleavedFrame{
Channel: trackToInterleavedChannel(id, flow), Channel: trackToInterleavedChannel(id, flow),
Content: frame, Content: frame,
} }

8
server-client.go

@ -113,7 +113,7 @@ type serverClient struct {
streamSdpParsed *sdp.Message // filled only if publisher streamSdpParsed *sdp.Message // filled only if publisher
streamProtocol streamProtocol streamProtocol streamProtocol
streamTracks []*track streamTracks []*track
chanWrite chan *gortsplib.InterleavedFrame write chan *gortsplib.InterleavedFrame
} }
func newServerClient(p *program, nconn net.Conn) *serverClient { func newServerClient(p *program, nconn net.Conn) *serverClient {
@ -125,7 +125,7 @@ func newServerClient(p *program, nconn net.Conn) *serverClient {
WriteTimeout: _WRITE_TIMEOUT, WriteTimeout: _WRITE_TIMEOUT,
}), }),
state: _CLIENT_STATE_STARTING, state: _CLIENT_STATE_STARTING,
chanWrite: make(chan *gortsplib.InterleavedFrame), write: make(chan *gortsplib.InterleavedFrame),
} }
c.p.mutex.Lock() c.p.mutex.Lock()
@ -143,7 +143,7 @@ func (c *serverClient) close() error {
delete(c.p.clients, c) delete(c.p.clients, c)
c.conn.NetConn().Close() c.conn.NetConn().Close()
close(c.chanWrite) close(c.write)
if c.path != "" { if c.path != "" {
if pub, ok := c.p.publishers[c.path]; ok && pub == c { if pub, ok := c.p.publishers[c.path]; ok && pub == c {
@ -755,7 +755,7 @@ func (c *serverClient) handleRequest(req *gortsplib.Request) bool {
if c.streamProtocol == _STREAM_PROTOCOL_TCP { if c.streamProtocol == _STREAM_PROTOCOL_TCP {
// write RTP frames sequentially // write RTP frames sequentially
go func() { go func() {
for frame := range c.chanWrite { for frame := range c.write {
c.conn.WriteInterleavedFrame(frame) c.conn.WriteInterleavedFrame(frame)
} }
}() }()

29
server-udpl.go

@ -15,7 +15,8 @@ type serverUdpListener struct {
p *program p *program
nconn *net.UDPConn nconn *net.UDPConn
flow trackFlow flow trackFlow
chanWrite chan *udpWrite write chan *udpWrite
done chan struct{}
} }
func newServerUdpListener(p *program, port int, flow trackFlow) (*serverUdpListener, error) { func newServerUdpListener(p *program, port int, flow trackFlow) (*serverUdpListener, error) {
@ -30,7 +31,8 @@ func newServerUdpListener(p *program, port int, flow trackFlow) (*serverUdpListe
p: p, p: p,
nconn: nconn, nconn: nconn,
flow: flow, flow: flow,
chanWrite: make(chan *udpWrite), write: make(chan *udpWrite),
done: make(chan struct{}),
} }
l.log("opened on :%d", port) l.log("opened on :%d", port)
@ -49,6 +51,12 @@ func (l *serverUdpListener) log(format string, args ...interface{}) {
func (l *serverUdpListener) run() { func (l *serverUdpListener) run() {
go func() { go func() {
for w := range l.write {
l.nconn.SetWriteDeadline(time.Now().Add(_WRITE_TIMEOUT))
l.nconn.WriteTo(w.buf, w.addr)
}
}()
for { for {
// create a buffer for each read. // create a buffer for each read.
// this is necessary since the buffer is propagated with channels // this is necessary since the buffer is propagated with channels
@ -56,7 +64,6 @@ func (l *serverUdpListener) run() {
buf := make([]byte, 2048) // UDP MTU is 1400 buf := make([]byte, 2048) // UDP MTU is 1400
n, addr, err := l.nconn.ReadFromUDP(buf) n, addr, err := l.nconn.ReadFromUDP(buf)
if err != nil { if err != nil {
l.log("ERR: %s", err)
break break
} }
@ -92,13 +99,13 @@ func (l *serverUdpListener) run() {
l.p.forwardTrack(path, trackId, l.flow, buf[:n]) l.p.forwardTrack(path, trackId, l.flow, buf[:n])
}() }()
} }
}()
go func() { close(l.write)
for {
w := <-l.chanWrite l.done <- struct{}{}
l.nconn.SetWriteDeadline(time.Now().Add(_WRITE_TIMEOUT)) }
l.nconn.WriteTo(w.buf, w.addr)
} func (l *serverUdpListener) close() {
}() l.nconn.Close()
<-l.done
} }

Loading…
Cancel
Save