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. 27
      server-udpl.go

6
main.go

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

8
server-client.go

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

27
server-udpl.go

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

Loading…
Cancel
Save