From 42fa50401495bc930f2d32f908159fa8e5bc2fed Mon Sep 17 00:00:00 2001 From: aler9 <46489434+aler9@users.noreply.github.com> Date: Sun, 1 Nov 2020 22:25:50 +0100 Subject: [PATCH] support proxing servers that redirect to other urls --- go.mod | 2 +- go.sum | 4 +-- sourcertsp/source.go | 84 +++++++++----------------------------------- 3 files changed, 19 insertions(+), 71 deletions(-) diff --git a/go.mod b/go.mod index 2b98d479..8d104dee 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.15 require ( github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect - github.com/aler9/gortsplib v0.0.0-20201101183936-812545b7765e + github.com/aler9/gortsplib v0.0.0-20201101211017-ece3dd7077f8 github.com/davecgh/go-spew v1.1.1 // indirect github.com/fsnotify/fsnotify v1.4.9 github.com/notedit/rtmp v0.0.2 diff --git a/go.sum b/go.sum index 802a332c..c4ddad29 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafo github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/aler9/gortsplib v0.0.0-20201101183936-812545b7765e h1:miz7AbbS9DzhPnOt6EeoK3xqDh99nkZrfvQr/8pN3+k= -github.com/aler9/gortsplib v0.0.0-20201101183936-812545b7765e/go.mod h1:8mpBfMEJIZn2C5fMM6vRYHgGH49WX0EH8gP1SDxv0Uw= +github.com/aler9/gortsplib v0.0.0-20201101211017-ece3dd7077f8 h1:YpHqqbw/0gxh/l4QWA13kALiHBf7wyAqtHBsOt4AcrM= +github.com/aler9/gortsplib v0.0.0-20201101211017-ece3dd7077f8/go.mod h1:8mpBfMEJIZn2C5fMM6vRYHgGH49WX0EH8gP1SDxv0Uw= github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625 h1:A3upkpYzceQTuBPvVleu1zd6R8jInhg5ifimSO7ku/o= github.com/aler9/sdp-dirty/v3 v3.0.0-20200919115950-f1abc664f625/go.mod h1:5bO/aUQr9m3OasDatNNcVqKAgs7r5hgGXmszWHaC6mI= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= diff --git a/sourcertsp/source.go b/sourcertsp/source.go index 4d7cd3bf..c2f1c693 100644 --- a/sourcertsp/source.go +++ b/sourcertsp/source.go @@ -6,7 +6,6 @@ import ( "time" "github.com/aler9/gortsplib" - "github.com/aler9/gortsplib/base" "github.com/aler9/rtsp-simple-server/stats" ) @@ -103,19 +102,16 @@ func (s *Source) run() { func (s *Source) runInner() bool { s.parent.Log("connecting to rtsp source") - u, _ := base.ParseURL(s.ur) - var conn *gortsplib.ConnClient var err error dialDone := make(chan struct{}, 1) go func() { defer close(dialDone) - conn, err = gortsplib.NewConnClient(gortsplib.ConnClientConf{ - Host: u.Host(), + conn, err = gortsplib.Dialer{ ReadTimeout: s.readTimeout, WriteTimeout: s.writeTimeout, ReadBufferCount: 2, - }) + }.DialRead(s.ur, s.proto) }() select { @@ -129,47 +125,23 @@ func (s *Source) runInner() bool { return true } - _, err = conn.Options(u) - if err != nil { - conn.Close() - s.parent.Log("rtsp source ERR: %s", err) - return true - } - - tracks, _, err := conn.Describe(u) - if err != nil { - conn.Close() - s.parent.Log("rtsp source ERR: %s", err) - return true - } - - if s.proto == gortsplib.StreamProtocolUDP { - return s.runUDP(u, conn, tracks) - } else { - return s.runTCP(u, conn, tracks) - } -} - -func (s *Source) runUDP(u *base.URL, conn *gortsplib.ConnClient, tracks gortsplib.Tracks) bool { - for _, track := range tracks { - _, err := conn.SetupUDP(u, gortsplib.TransportModePlay, track, 0, 0) - if err != nil { - conn.Close() - s.parent.Log("rtsp source ERR: %s", err) - return true - } - } - - _, err := conn.Play(u) - if err != nil { - conn.Close() - s.parent.Log("rtsp source ERR: %s", err) - return true - } + tracks := conn.Tracks() s.parent.Log("rtsp source ready") s.parent.OnSourceSetReady(tracks) + var ret bool + if s.proto == gortsplib.StreamProtocolUDP { + ret = s.runUDP(conn, tracks) + } else { + ret = s.runTCP(conn, tracks) + } + + s.parent.OnSourceSetNotReady() + return ret +} + +func (s *Source) runUDP(conn *gortsplib.ConnClient, tracks gortsplib.Tracks) bool { var wg sync.WaitGroup // receive RTP packets @@ -231,32 +203,10 @@ outer: } wg.Wait() - - s.parent.OnSourceSetNotReady() - return ret } -func (s *Source) runTCP(u *base.URL, conn *gortsplib.ConnClient, tracks gortsplib.Tracks) bool { - for _, track := range tracks { - _, err := conn.SetupTCP(u, gortsplib.TransportModePlay, track) - if err != nil { - conn.Close() - s.parent.Log("rtsp source ERR: %s", err) - return true - } - } - - _, err := conn.Play(u) - if err != nil { - conn.Close() - s.parent.Log("rtsp source ERR: %s", err) - return true - } - - s.parent.Log("rtsp source ready") - s.parent.OnSourceSetReady(tracks) - +func (s *Source) runTCP(conn *gortsplib.ConnClient, tracks gortsplib.Tracks) bool { tcpConnDone := make(chan error) go func() { for { @@ -289,7 +239,5 @@ outer: } } - s.parent.OnSourceSetNotReady() - return ret }