Browse Source

fix freeze when proxying streams with tcp

pull/169/head
aler9 5 years ago
parent
commit
ac74c7ed95
  1. 2
      go.mod
  2. 4
      go.sum
  3. 14
      internal/sourcertmp/source.go
  4. 22
      internal/sourcertsp/source.go

2
go.mod

@ -5,7 +5,7 @@ go 1.15
require ( require (
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
github.com/aler9/gortsplib v0.0.0-20201116080759-cf6f734972f3 github.com/aler9/gortsplib v0.0.0-20201119110120-5019561d3fae
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fsnotify/fsnotify v1.4.9 github.com/fsnotify/fsnotify v1.4.9
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51

4
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/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 h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
github.com/aler9/gortsplib v0.0.0-20201116080759-cf6f734972f3 h1:qgWLtuOANssYR0tuvA9Ty+T4lYPmNe2l6AJWhEIA6D0= github.com/aler9/gortsplib v0.0.0-20201119110120-5019561d3fae h1:FF6+/D0sjbx90ayB6kR3OqFTrynC/2eLIOdY0jB5/io=
github.com/aler9/gortsplib v0.0.0-20201116080759-cf6f734972f3/go.mod h1:6yKsTNIrCapRz90WHQtyFV/rKK0TT+QapxUXNqSJi9M= github.com/aler9/gortsplib v0.0.0-20201119110120-5019561d3fae/go.mod h1:6yKsTNIrCapRz90WHQtyFV/rKK0TT+QapxUXNqSJi9M=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=

14
internal/sourcertmp/source.go

@ -228,6 +228,7 @@ func (s *Source) runInner() bool {
s.parent.Log("rtmp source ready") s.parent.Log("rtmp source ready")
s.parent.OnSourceSetReady(tracks) s.parent.OnSourceSetReady(tracks)
defer s.parent.OnSourceSetNotReady()
readerDone := make(chan error) readerDone := make(chan error)
go func() { go func() {
@ -286,26 +287,17 @@ func (s *Source) runInner() bool {
} }
}() }()
var ret bool
outer:
for { for {
select { select {
case <-s.terminate: case <-s.terminate:
nconn.Close() nconn.Close()
<-readerDone <-readerDone
ret = false return false
break outer
case err := <-readerDone: case err := <-readerDone:
nconn.Close() nconn.Close()
s.parent.Log("rtmp source ERR: %s", err) s.parent.Log("rtmp source ERR: %s", err)
ret = true return true
break outer
} }
} }
s.parent.OnSourceSetNotReady()
return ret
} }

22
internal/sourcertsp/source.go

@ -138,37 +138,23 @@ func (s *Source) runInner() bool {
s.parent.Log("rtsp source ready") s.parent.Log("rtsp source ready")
s.parent.OnSourceSetReady(tracks) s.parent.OnSourceSetReady(tracks)
defer s.parent.OnSourceSetNotReady()
readerDone := make(chan error, 1) readerDone := conn.OnFrame(func(trackId int, streamType gortsplib.StreamType, content []byte) {
conn.OnFrame(func(trackId int, streamType gortsplib.StreamType, content []byte, err error) {
if err != nil {
readerDone <- err
return
}
s.parent.OnFrame(trackId, streamType, content) s.parent.OnFrame(trackId, streamType, content)
}) })
var ret bool
outer:
for { for {
select { select {
case <-s.terminate: case <-s.terminate:
conn.Close() conn.Close()
<-readerDone <-readerDone
ret = false return false
break outer
case err := <-readerDone: case err := <-readerDone:
conn.Close() conn.Close()
s.parent.Log("rtsp source ERR: %s", err) s.parent.Log("rtsp source ERR: %s", err)
ret = true return true
break outer
} }
} }
s.parent.OnSourceSetNotReady()
return ret
} }

Loading…
Cancel
Save