From adbdcc37ba78727ebb0f7525d17fb4a1221b876c Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Fri, 26 Mar 2021 13:40:17 +0100 Subject: [PATCH] client: avoid copying client internally --- clientconn.go | 87 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/clientconn.go b/clientconn.go index 98454f0a..520065c3 100644 --- a/clientconn.go +++ b/clientconn.go @@ -122,44 +122,22 @@ func newClientConn(conf ClientConf, scheme string, host string) (*ClientConn, er conf.ListenPacket = net.ListenPacket } - if scheme != "rtsp" && scheme != "rtsps" { - return nil, fmt.Errorf("unsupported scheme '%s'", scheme) - } - - v := StreamProtocolUDP - if scheme == "rtsps" && conf.StreamProtocol == &v { - return nil, fmt.Errorf("RTSPS can't be used with UDP") - } - - if !strings.Contains(host, ":") { - host += ":554" - } - - nconn, err := conf.DialTimeout("tcp", host, conf.ReadTimeout) - if err != nil { - return nil, err - } - - conn := func() net.Conn { - if scheme == "rtsps" { - return tls.Client(nconn, conf.TLSConfig) - } - return nconn - }() - - return &ClientConn{ + c := &ClientConn{ conf: conf, - nconn: nconn, - isTLS: (scheme == "rtsps"), - br: bufio.NewReaderSize(conn, clientConnReadBufferSize), - bw: bufio.NewWriterSize(conn, clientConnWriteBufferSize), udpRTPListeners: make(map[int]*clientConnUDPListener), udpRTCPListeners: make(map[int]*clientConnUDPListener), rtcpReceivers: make(map[int]*rtcpreceiver.RTCPReceiver), tcpFrameBuffer: multibuffer.New(uint64(conf.ReadBufferCount), uint64(conf.ReadBufferSize)), rtcpSenders: make(map[int]*rtcpsender.RTCPSender), publishError: fmt.Errorf("not running"), - }, nil + } + + err := c.connOpen(scheme, host) + if err != nil { + return nil, err + } + + return c, nil } // Close closes all the ClientConn resources. @@ -183,7 +161,49 @@ func (c *ClientConn) Close() error { l.close() } + return c.connClose() +} + +func (c *ClientConn) connOpen(scheme string, host string) error { + if scheme != "rtsp" && scheme != "rtsps" { + return fmt.Errorf("unsupported scheme '%s'", scheme) + } + + v := StreamProtocolUDP + if scheme == "rtsps" && c.conf.StreamProtocol == &v { + return fmt.Errorf("RTSPS can't be used with UDP") + } + + if !strings.Contains(host, ":") { + host += ":554" + } + + nconn, err := c.conf.DialTimeout("tcp", host, c.conf.ReadTimeout) + if err != nil { + return err + } + + conn := func() net.Conn { + if scheme == "rtsps" { + return tls.Client(nconn, c.conf.TLSConfig) + } + return nconn + }() + + c.nconn = nconn + c.isTLS = (scheme == "rtsps") + c.br = bufio.NewReaderSize(conn, clientConnReadBufferSize) + c.bw = bufio.NewWriterSize(conn, clientConnWriteBufferSize) + return nil +} + +func (c *ClientConn) connClose() error { + if c.nconn == nil { + return nil + } + err := c.nconn.Close() + c.nconn = nil return err } @@ -366,18 +386,17 @@ func (c *ClientConn) Describe(u *base.URL) (Tracks, *base.Response, error) { res.StatusCode <= base.StatusUseProxy && len(res.Header["Location"]) == 1 { - c.Close() + c.connClose() u, err := base.ParseURL(res.Header["Location"][0]) if err != nil { return nil, nil, err } - nc, err := c.conf.Dial(u.Scheme, u.Host) + err = c.connOpen(u.Scheme, u.Host) if err != nil { return nil, nil, err } - *c = *nc //nolint:govet _, err = c.Options(u) if err != nil {