ConnClient: forbid calling Options, Describe, Setup, Play when playing

This commit is contained in:
aler9
2020-09-20 11:49:18 +02:00
parent 04d55bc6c8
commit d3faf86a2f

View File

@@ -246,6 +246,10 @@ func (c *ConnClient) writeFrame(frame *InterleavedFrame) error {
// the methods allowed by the server. Since this method is not implemented by // the methods allowed by the server. Since this method is not implemented by
// every RTSP server, the function does not fail if the returned code is StatusNotFound. // every RTSP server, the function does not fail if the returned code is StatusNotFound.
func (c *ConnClient) Options(u *url.URL) (*Response, error) { func (c *ConnClient) Options(u *url.URL) (*Response, error) {
if c.playing {
return nil, fmt.Errorf("can't be called when playing")
}
res, err := c.Do(&Request{ res, err := c.Do(&Request{
Method: OPTIONS, Method: OPTIONS,
// strip path // strip path
@@ -271,6 +275,10 @@ func (c *ConnClient) Options(u *url.URL) (*Response, error) {
// document that describes the tracks available in the given URL. It then // document that describes the tracks available in the given URL. It then
// reads a Response. // reads a Response.
func (c *ConnClient) Describe(u *url.URL) (Tracks, *Response, error) { func (c *ConnClient) Describe(u *url.URL) (Tracks, *Response, error) {
if c.playing {
return nil, nil, fmt.Errorf("can't be called when playing")
}
res, err := c.Do(&Request{ res, err := c.Do(&Request{
Method: DESCRIBE, Method: DESCRIBE,
Url: u, Url: u,
@@ -386,6 +394,10 @@ type UDPReadFunc func([]byte) (int, error)
// If rtpPort and rtcpPort are zero, they will be chosen automatically. // If rtpPort and rtcpPort are zero, they will be chosen automatically.
func (c *ConnClient) SetupUDP(u *url.URL, track *Track, rtpPort int, func (c *ConnClient) SetupUDP(u *url.URL, track *Track, rtpPort int,
rtcpPort int) (UDPReadFunc, UDPReadFunc, *Response, error) { rtcpPort int) (UDPReadFunc, UDPReadFunc, *Response, error) {
if c.playing {
return nil, nil, nil, fmt.Errorf("can't be called when playing")
}
if c.streamUrl != nil && *u != *c.streamUrl { if c.streamUrl != nil && *u != *c.streamUrl {
fmt.Errorf("setup has already begun with another url") fmt.Errorf("setup has already begun with another url")
} }
@@ -497,6 +509,10 @@ func (c *ConnClient) SetupUDP(u *url.URL, track *Track, rtpPort int,
// SetupTCP writes a SETUP request, that means that we want to read // SetupTCP writes a SETUP request, that means that we want to read
// a given track with the TCP transport. It then reads a Response. // a given track with the TCP transport. It then reads a Response.
func (c *ConnClient) SetupTCP(u *url.URL, track *Track) (*Response, error) { func (c *ConnClient) SetupTCP(u *url.URL, track *Track) (*Response, error) {
if c.playing {
return nil, fmt.Errorf("can't be called when playing")
}
if c.streamUrl != nil && *u != *c.streamUrl { if c.streamUrl != nil && *u != *c.streamUrl {
fmt.Errorf("setup has already begun with another url") fmt.Errorf("setup has already begun with another url")
} }
@@ -545,12 +561,16 @@ func (c *ConnClient) SetupTCP(u *url.URL, track *Track) (*Response, error) {
// It then reads a Response. This function can be called only after SetupUDP() // It then reads a Response. This function can be called only after SetupUDP()
// or SetupTCP(). // or SetupTCP().
func (c *ConnClient) Play(u *url.URL) (*Response, error) { func (c *ConnClient) Play(u *url.URL) (*Response, error) {
if c.playing {
return nil, fmt.Errorf("can't be called when playing")
}
if c.streamUrl == nil { if c.streamUrl == nil {
return nil, fmt.Errorf("Play() can be called only after a successful SetupUDP() or SetupTCP()") return nil, fmt.Errorf("can be called only after a successful SetupUDP() or SetupTCP()")
} }
if *u != *c.streamUrl { if *u != *c.streamUrl {
fmt.Errorf("Play() must be called with the same url used for SetupUDP() or SetupTCP()") fmt.Errorf("must be called with the same url used for SetupUDP() or SetupTCP()")
} }
res, err := func() (*Response, error) { res, err := func() (*Response, error) {