srt: close sources immediately when path is closed (#6038)
This commit is contained in:
@@ -107,3 +107,5 @@ require (
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
replace github.com/datarhei/gosrt => github.com/aler9/gosrt v0.0.0-20260804162707-b6afcc8add8f
|
||||
|
||||
@@ -23,6 +23,8 @@ github.com/alecthomas/kong v1.16.0 h1:g92/kUxBcdcTPOM79yE63viJgtcp5dNyrB3/O2cjYT
|
||||
github.com/alecthomas/kong v1.16.0/go.mod h1:wrlbXem1CWqUV5Vbmss5ISYhsVPkBb1Yo7YKJghju2I=
|
||||
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
|
||||
github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
|
||||
github.com/aler9/gosrt v0.0.0-20260804162707-b6afcc8add8f h1:wGCt98qRB2SOKMK5tdWM10sjyQa6WtrfsBrx0pRFLLI=
|
||||
github.com/aler9/gosrt v0.0.0-20260804162707-b6afcc8add8f/go.mod h1:Jc34G/QwMzPMJdHNcaxc9ddbx95h2FumO2h/rgV/eRA=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
|
||||
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||
@@ -54,8 +56,6 @@ github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gE
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE=
|
||||
github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc=
|
||||
github.com/datarhei/gosrt v0.11.0 h1:g3dGowSxrD1Oxr0Us6/w7x9bqzHHjBYu+EA3tNrhDeg=
|
||||
github.com/datarhei/gosrt v0.11.0/go.mod h1:F5B25N3CFf68K4igNLQ1iARcKDbkv8riymjT8l5cbLg=
|
||||
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
||||
@@ -104,12 +104,12 @@ func (d *Dest) Run(ctx context.Context) error {
|
||||
|
||||
err = conn.Initialize(ctx)
|
||||
if err != nil {
|
||||
return fmt.Errorf("connect RTMP destination: %w", err)
|
||||
return err
|
||||
}
|
||||
|
||||
terminate := make(chan struct{})
|
||||
|
||||
errChan := make(chan error, 1)
|
||||
errChan := make(chan error)
|
||||
go func() {
|
||||
errChan <- d.runInner(conn, terminate)
|
||||
}()
|
||||
|
||||
@@ -77,7 +77,7 @@ func (d *Dest) Run(ctx context.Context) error {
|
||||
|
||||
terminate := make(chan struct{})
|
||||
|
||||
errChan := make(chan error, 1)
|
||||
errChan := make(chan error)
|
||||
go func() {
|
||||
errChan <- d.runInner(client, desc, terminate)
|
||||
}()
|
||||
|
||||
@@ -69,43 +69,29 @@ func (d *Dest) Run(ctx context.Context) error {
|
||||
|
||||
terminate := make(chan struct{})
|
||||
|
||||
type runResult struct {
|
||||
err error
|
||||
}
|
||||
|
||||
errChan := make(chan runResult, 1)
|
||||
errChan := make(chan error)
|
||||
go func() {
|
||||
errChan <- runResult{err: d.runInner(ctx, address, srtConf, terminate)}
|
||||
errChan <- d.runInner(ctx, address, srtConf, terminate)
|
||||
}()
|
||||
|
||||
select {
|
||||
case res := <-errChan:
|
||||
return res.err
|
||||
case err = <-errChan:
|
||||
return err
|
||||
|
||||
case <-ctx.Done():
|
||||
close(terminate)
|
||||
<-errChan
|
||||
return fmt.Errorf("terminated")
|
||||
}
|
||||
}
|
||||
|
||||
func (d *Dest) runInner(ctx context.Context, address string, srtConf srtlib.Config, terminate <-chan struct{}) error {
|
||||
conn, err := srtlib.Dial("srt", address, srtConf)
|
||||
conn, err := srtlib.DialWithContext(ctx, "srt", address, srtConf)
|
||||
if err != nil {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return nil
|
||||
default:
|
||||
}
|
||||
return err
|
||||
}
|
||||
defer conn.Close()
|
||||
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return nil
|
||||
default:
|
||||
}
|
||||
|
||||
d.mutex.Lock()
|
||||
d.outboundBytesFunc = func() uint64 {
|
||||
var stats srtlib.Statistics
|
||||
|
||||
@@ -47,7 +47,7 @@ func (s *Source) Run(params defs.StaticSourceRunParams) error {
|
||||
return err
|
||||
}
|
||||
|
||||
sconn, err := srt.Dial("srt", address, conf)
|
||||
sconn, err := srt.DialWithContext(params.Context, "srt", address, conf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user