mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 23:26:54 +08:00
client: avoid copying client internally
This commit is contained in:
@@ -122,44 +122,22 @@ func newClientConn(conf ClientConf, scheme string, host string) (*ClientConn, er
|
|||||||
conf.ListenPacket = net.ListenPacket
|
conf.ListenPacket = net.ListenPacket
|
||||||
}
|
}
|
||||||
|
|
||||||
if scheme != "rtsp" && scheme != "rtsps" {
|
c := &ClientConn{
|
||||||
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{
|
|
||||||
conf: conf,
|
conf: conf,
|
||||||
nconn: nconn,
|
|
||||||
isTLS: (scheme == "rtsps"),
|
|
||||||
br: bufio.NewReaderSize(conn, clientConnReadBufferSize),
|
|
||||||
bw: bufio.NewWriterSize(conn, clientConnWriteBufferSize),
|
|
||||||
udpRTPListeners: make(map[int]*clientConnUDPListener),
|
udpRTPListeners: make(map[int]*clientConnUDPListener),
|
||||||
udpRTCPListeners: make(map[int]*clientConnUDPListener),
|
udpRTCPListeners: make(map[int]*clientConnUDPListener),
|
||||||
rtcpReceivers: make(map[int]*rtcpreceiver.RTCPReceiver),
|
rtcpReceivers: make(map[int]*rtcpreceiver.RTCPReceiver),
|
||||||
tcpFrameBuffer: multibuffer.New(uint64(conf.ReadBufferCount), uint64(conf.ReadBufferSize)),
|
tcpFrameBuffer: multibuffer.New(uint64(conf.ReadBufferCount), uint64(conf.ReadBufferSize)),
|
||||||
rtcpSenders: make(map[int]*rtcpsender.RTCPSender),
|
rtcpSenders: make(map[int]*rtcpsender.RTCPSender),
|
||||||
publishError: fmt.Errorf("not running"),
|
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.
|
// Close closes all the ClientConn resources.
|
||||||
@@ -183,7 +161,49 @@ func (c *ClientConn) Close() error {
|
|||||||
l.close()
|
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()
|
err := c.nconn.Close()
|
||||||
|
c.nconn = nil
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,18 +386,17 @@ func (c *ClientConn) Describe(u *base.URL) (Tracks, *base.Response, error) {
|
|||||||
res.StatusCode <= base.StatusUseProxy &&
|
res.StatusCode <= base.StatusUseProxy &&
|
||||||
len(res.Header["Location"]) == 1 {
|
len(res.Header["Location"]) == 1 {
|
||||||
|
|
||||||
c.Close()
|
c.connClose()
|
||||||
|
|
||||||
u, err := base.ParseURL(res.Header["Location"][0])
|
u, err := base.ParseURL(res.Header["Location"][0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
nc, err := c.conf.Dial(u.Scheme, u.Host)
|
err = c.connOpen(u.Scheme, u.Host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
*c = *nc //nolint:govet
|
|
||||||
|
|
||||||
_, err = c.Options(u)
|
_, err = c.Options(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Reference in New Issue
Block a user