mirror of
https://github.com/aler9/gortsplib
synced 2025-10-04 23:02:45 +08:00
client: simplify usage of Setup()
This commit is contained in:
24
client.go
24
client.go
@@ -133,7 +133,6 @@ type announceReq struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type setupReq struct {
|
type setupReq struct {
|
||||||
forPlay bool
|
|
||||||
track Track
|
track Track
|
||||||
baseURL *url.URL
|
baseURL *url.URL
|
||||||
rtpPort int
|
rtpPort int
|
||||||
@@ -417,7 +416,7 @@ func (c *Client) StartPublishing(address string, tracks Tracks) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, track := range tracks {
|
for _, track := range tracks {
|
||||||
_, err := c.Setup(false, track, u, 0, 0)
|
_, err := c.Setup(track, u, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.Close()
|
c.Close()
|
||||||
return err
|
return err
|
||||||
@@ -482,7 +481,7 @@ func (c *Client) runInner() error {
|
|||||||
req.res <- clientRes{res: res, err: err}
|
req.res <- clientRes{res: res, err: err}
|
||||||
|
|
||||||
case req := <-c.setup:
|
case req := <-c.setup:
|
||||||
res, err := c.doSetup(req.forPlay, req.track, req.baseURL, req.rtpPort, req.rtcpPort)
|
res, err := c.doSetup(req.track, req.baseURL, req.rtpPort, req.rtcpPort)
|
||||||
req.res <- clientRes{res: res, err: err}
|
req.res <- clientRes{res: res, err: err}
|
||||||
|
|
||||||
case req := <-c.play:
|
case req := <-c.play:
|
||||||
@@ -664,7 +663,7 @@ func (c *Client) trySwitchingProtocol() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, track := range prevTracks {
|
for _, track := range prevTracks {
|
||||||
_, err := c.doSetup(true, track.track, prevBaseURL, 0, 0)
|
_, err := c.doSetup(track.track, prevBaseURL, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -1308,7 +1307,6 @@ func (c *Client) Announce(u *url.URL, tracks Tracks) (*base.Response, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) doSetup(
|
func (c *Client) doSetup(
|
||||||
forPlay bool,
|
|
||||||
track Track,
|
track Track,
|
||||||
baseURL *url.URL,
|
baseURL *url.URL,
|
||||||
rtpPort int,
|
rtpPort int,
|
||||||
@@ -1323,12 +1321,6 @@ func (c *Client) doSetup(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!forPlay && c.state != clientStatePreRecord) ||
|
|
||||||
(forPlay && c.state != clientStatePrePlay &&
|
|
||||||
c.state != clientStateInitial) {
|
|
||||||
return nil, liberrors.ErrClientCannotReadPublishAtSameTime{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.baseURL != nil && *baseURL != *c.baseURL {
|
if c.baseURL != nil && *baseURL != *c.baseURL {
|
||||||
return nil, liberrors.ErrClientCannotSetupTracksDifferentURLs{}
|
return nil, liberrors.ErrClientCannotSetupTracksDifferentURLs{}
|
||||||
}
|
}
|
||||||
@@ -1355,7 +1347,7 @@ func (c *Client) doSetup(
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
mode := headers.TransportModePlay
|
mode := headers.TransportModePlay
|
||||||
if !forPlay {
|
if c.state == clientStatePreRecord {
|
||||||
mode = headers.TransportModeRecord
|
mode = headers.TransportModeRecord
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1463,7 +1455,7 @@ func (c *Client) doSetup(
|
|||||||
v := TransportTCP
|
v := TransportTCP
|
||||||
c.effectiveTransport = &v
|
c.effectiveTransport = &v
|
||||||
|
|
||||||
return c.doSetup(forPlay, track, baseURL, 0, 0)
|
return c.doSetup(track, baseURL, 0, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, liberrors.ErrClientBadStatusCode{Code: res.StatusCode, Message: res.StatusMessage}
|
return nil, liberrors.ErrClientBadStatusCode{Code: res.StatusCode, Message: res.StatusMessage}
|
||||||
@@ -1485,7 +1477,7 @@ func (c *Client) doSetup(
|
|||||||
return nil, liberrors.ErrClientTransportHeaderInvalidDelivery{}
|
return nil, liberrors.ErrClientTransportHeaderInvalidDelivery{}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !forPlay || !c.AnyPortEnable {
|
if c.state == clientStatePreRecord || !c.AnyPortEnable {
|
||||||
if thRes.ServerPorts == nil || isAnyPort(thRes.ServerPorts[0]) || isAnyPort(thRes.ServerPorts[1]) {
|
if thRes.ServerPorts == nil || isAnyPort(thRes.ServerPorts[0]) || isAnyPort(thRes.ServerPorts[1]) {
|
||||||
ct.udpRTPListener.close()
|
ct.udpRTPListener.close()
|
||||||
ct.udpRTCPListener.close()
|
ct.udpRTCPListener.close()
|
||||||
@@ -1618,7 +1610,6 @@ func (c *Client) doSetup(
|
|||||||
// rtpPort and rtcpPort are used only if transport is UDP.
|
// rtpPort and rtcpPort are used only if transport is UDP.
|
||||||
// if rtpPort and rtcpPort are zero, they are chosen automatically.
|
// if rtpPort and rtcpPort are zero, they are chosen automatically.
|
||||||
func (c *Client) Setup(
|
func (c *Client) Setup(
|
||||||
forPlay bool,
|
|
||||||
track Track,
|
track Track,
|
||||||
baseURL *url.URL,
|
baseURL *url.URL,
|
||||||
rtpPort int,
|
rtpPort int,
|
||||||
@@ -1627,7 +1618,6 @@ func (c *Client) Setup(
|
|||||||
cres := make(chan clientRes)
|
cres := make(chan clientRes)
|
||||||
select {
|
select {
|
||||||
case c.setup <- setupReq{
|
case c.setup <- setupReq{
|
||||||
forPlay: forPlay,
|
|
||||||
track: track,
|
track: track,
|
||||||
baseURL: baseURL,
|
baseURL: baseURL,
|
||||||
rtpPort: rtpPort,
|
rtpPort: rtpPort,
|
||||||
@@ -1714,7 +1704,7 @@ func (c *Client) Play(ra *headers.Range) (*base.Response, error) {
|
|||||||
// SetupAndPlay setups and play the given tracks.
|
// SetupAndPlay setups and play the given tracks.
|
||||||
func (c *Client) SetupAndPlay(tracks Tracks, baseURL *url.URL) error {
|
func (c *Client) SetupAndPlay(tracks Tracks, baseURL *url.URL) error {
|
||||||
for _, t := range tracks {
|
for _, t := range tracks {
|
||||||
_, err := c.Setup(true, t, baseURL, 0, 0)
|
_, err := c.Setup(t, baseURL, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@@ -600,7 +600,7 @@ func TestClientReadPartial(t *testing.T) {
|
|||||||
tracks, baseURL, _, err := c.Describe(u)
|
tracks, baseURL, _, err := c.Describe(u)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = c.Setup(true, tracks[1], baseURL, 0, 0)
|
_, err = c.Setup(tracks[1], baseURL, 0, 0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
_, err = c.Play(nil)
|
_, err = c.Play(nil)
|
||||||
@@ -2423,7 +2423,7 @@ func TestClientReadSeek(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
for _, track := range tracks {
|
for _, track := range tracks {
|
||||||
_, err := c.Setup(true, track, baseURL, 0, 0)
|
_, err := c.Setup(track, baseURL, 0, 0)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -304,7 +304,7 @@ func TestClientClose(t *testing.T) {
|
|||||||
_, err = c.Announce(u, nil)
|
_, err = c.Announce(u, nil)
|
||||||
require.EqualError(t, err, "terminated")
|
require.EqualError(t, err, "terminated")
|
||||||
|
|
||||||
_, err = c.Setup(true, nil, nil, 0, 0)
|
_, err = c.Setup(nil, nil, 0, 0)
|
||||||
require.EqualError(t, err, "terminated")
|
require.EqualError(t, err, "terminated")
|
||||||
|
|
||||||
_, err = c.Play(nil)
|
_, err = c.Play(nil)
|
||||||
|
@@ -43,7 +43,7 @@ func main() {
|
|||||||
// setup only H264 tracks, skipping audio or application tracks
|
// setup only H264 tracks, skipping audio or application tracks
|
||||||
for _, t := range tracks {
|
for _, t := range tracks {
|
||||||
if _, ok := t.(*gortsplib.TrackH264); ok {
|
if _, ok := t.(*gortsplib.TrackH264); ok {
|
||||||
_, err := c.Setup(true, t, baseURL, 0, 0)
|
_, err := c.Setup(t, baseURL, 0, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
@@ -65,14 +65,6 @@ func (e ErrClientContentTypeUnsupported) Error() string {
|
|||||||
return fmt.Sprintf("unsupported Content-Type header '%v'", e.CT)
|
return fmt.Sprintf("unsupported Content-Type header '%v'", e.CT)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ErrClientCannotReadPublishAtSameTime is an error that can be returned by a client.
|
|
||||||
type ErrClientCannotReadPublishAtSameTime struct{}
|
|
||||||
|
|
||||||
// Error implements the error interface.
|
|
||||||
func (e ErrClientCannotReadPublishAtSameTime) Error() string {
|
|
||||||
return "cannot read and publish at the same time"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrClientCannotSetupTracksDifferentURLs is an error that can be returned by a client.
|
// ErrClientCannotSetupTracksDifferentURLs is an error that can be returned by a client.
|
||||||
type ErrClientCannotSetupTracksDifferentURLs struct{}
|
type ErrClientCannotSetupTracksDifferentURLs struct{}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user