that happens when there's a UDP->TCP switch and Content-Base contains
an absolute URL
This commit is contained in:
aler9
2022-05-02 18:57:34 +02:00
parent 19f57e4939
commit bdbce3c370

View File

@@ -222,7 +222,7 @@ type Client struct {
optionsSent bool optionsSent bool
useGetParameter bool useGetParameter bool
lastDescribeURL *base.URL lastDescribeURL *base.URL
streamBaseURL *base.URL baseURL *base.URL
effectiveTransport *Transport effectiveTransport *Transport
tracks []*clientTrack tracks []*clientTrack
tcpTracksByChannel map[int]int tcpTracksByChannel map[int]int
@@ -541,7 +541,7 @@ func (c *Client) runInner() error {
return base.Options return base.Options
}(), }(),
// use the stream base URL, otherwise some cameras do not reply // use the stream base URL, otherwise some cameras do not reply
URL: c.streamBaseURL, URL: c.baseURL,
}, true, false) }, true, false)
if err != nil { if err != nil {
return err return err
@@ -565,7 +565,7 @@ func (c *Client) doClose() {
c.do(&base.Request{ c.do(&base.Request{
Method: base.Teardown, Method: base.Teardown,
URL: c.streamBaseURL, URL: c.baseURL,
}, true, false) }, true, false)
c.conn.Close() c.conn.Close()
@@ -593,7 +593,7 @@ func (c *Client) reset() {
c.cseq = 0 c.cseq = 0
c.optionsSent = false c.optionsSent = false
c.useGetParameter = false c.useGetParameter = false
c.streamBaseURL = nil c.baseURL = nil
c.effectiveTransport = nil c.effectiveTransport = nil
c.tracks = nil c.tracks = nil
c.tcpTracksByChannel = nil c.tcpTracksByChannel = nil
@@ -615,7 +615,9 @@ func (c *Client) checkState(allowed map[clientState]struct{}) error {
} }
func (c *Client) trySwitchingProtocol() error { func (c *Client) trySwitchingProtocol() error {
prevBaseURL := c.streamBaseURL prevScheme := c.scheme
prevHost := c.host
prevBaseURL := c.baseURL
oldUseGetParameter := c.useGetParameter oldUseGetParameter := c.useGetParameter
prevTracks := c.tracks prevTracks := c.tracks
@@ -624,8 +626,8 @@ func (c *Client) trySwitchingProtocol() error {
v := TransportTCP v := TransportTCP
c.effectiveTransport = &v c.effectiveTransport = &v
c.useGetParameter = oldUseGetParameter c.useGetParameter = oldUseGetParameter
c.scheme = prevBaseURL.Scheme c.scheme = prevScheme
c.host = prevBaseURL.Host c.host = prevHost
// some Hikvision cameras require a describe before a setup // some Hikvision cameras require a describe before a setup
_, _, _, err := c.doDescribe(c.lastDescribeURL) _, _, _, err := c.doDescribe(c.lastDescribeURL)
@@ -1313,7 +1315,7 @@ func (c *Client) doAnnounce(u *base.URL, tracks Tracks) (*base.Response, error)
} }
} }
c.streamBaseURL = u.Clone() c.baseURL = u.Clone()
c.state = clientStatePreRecord c.state = clientStatePreRecord
return res, nil return res, nil
@@ -1354,7 +1356,7 @@ func (c *Client) doSetup(
return nil, liberrors.ErrClientCannotReadPublishAtSameTime{} return nil, liberrors.ErrClientCannotReadPublishAtSameTime{}
} }
if c.streamBaseURL != nil && *baseURL != *c.streamBaseURL { if c.baseURL != nil && *baseURL != *c.baseURL {
return nil, liberrors.ErrClientCannotSetupTracksDifferentURLs{} return nil, liberrors.ErrClientCannotSetupTracksDifferentURLs{}
} }
@@ -1564,7 +1566,7 @@ func (c *Client) doSetup(
c.state = clientStatePreRecord c.state = clientStatePreRecord
} }
c.streamBaseURL = baseURL c.baseURL = baseURL
c.effectiveTransport = &transport c.effectiveTransport = &transport
switch transport { switch transport {
@@ -1700,7 +1702,7 @@ func (c *Client) doPlay(ra *headers.Range, isSwitchingProtocol bool) (*base.Resp
res, err := c.do(&base.Request{ res, err := c.do(&base.Request{
Method: base.Play, Method: base.Play,
URL: c.streamBaseURL, URL: c.baseURL,
Header: base.Header{ Header: base.Header{
"Range": ra.Write(), "Range": ra.Write(),
}, },
@@ -1759,7 +1761,7 @@ func (c *Client) doRecord() (*base.Response, error) {
res, err := c.do(&base.Request{ res, err := c.do(&base.Request{
Method: base.Record, Method: base.Record,
URL: c.streamBaseURL, URL: c.baseURL,
}, false, false) }, false, false)
if err != nil { if err != nil {
return nil, err return nil, err
@@ -1812,7 +1814,7 @@ func (c *Client) doPause() (*base.Response, error) {
res, err := c.do(&base.Request{ res, err := c.do(&base.Request{
Method: base.Pause, Method: base.Pause,
URL: c.streamBaseURL, URL: c.baseURL,
}, false, *c.effectiveTransport == TransportTCP) }, false, *c.effectiveTransport == TransportTCP)
if err != nil { if err != nil {
return nil, err return nil, err