mediamtx/internal/hls/client_routine_pool.go
Alessandro Ros e5ab731d14
Improve HLS client (#1179)
* hls source: support fMP4s video streams

* hls source: start reading live streams from (end of playlist - starting point)

* hls client: wait processing of current fMP4 segment before downloading another one

* hls client: support fmp4 trun boxes with default sample duration, flags and size

* hls client: merge fmp4 init file reader and writer

* hls client: merge fmp4 part reader and writer

* hls client: improve precision of go <-> mp4 time conversion

* hls client: fix esds generation in go-mp4

* hls client: support audio in separate playlist

* hls client: support an arbitrary number of tracks in fmp4 init files

* hls client: support EXT-X-BYTERANGE

* hls client: support fmp4 segments with multiple parts at once

* hls client: support an arbitrary number of mpeg-ts tracks

* hls client: synchronize tracks around a primary track

* update go-mp4

* hls: synchronize track reproduction around a leading one

* hls client: reset stream if playback is too late

* hls client: add limit on DTS-RTC difference

* hls client: support again streams that don't provide codecs in master playlist
2022-10-23 14:04:33 +02:00

52 lines
832 B
Go

package hls
import (
"context"
"sync"
)
type clientRoutinePoolRunnable interface {
run(context.Context) error
}
type clientRoutinePool struct {
ctx context.Context
ctxCancel func()
wg sync.WaitGroup
err chan error
}
func newClientRoutinePool() *clientRoutinePool {
ctx, ctxCancel := context.WithCancel(context.Background())
return &clientRoutinePool{
ctx: ctx,
ctxCancel: ctxCancel,
err: make(chan error),
}
}
func (rp *clientRoutinePool) close() {
rp.ctxCancel()
rp.wg.Wait()
}
func (rp *clientRoutinePool) errorChan() chan error {
return rp.err
}
func (rp *clientRoutinePool) add(r clientRoutinePoolRunnable) {
rp.wg.Add(1)
go func() {
defer rp.wg.Done()
err := r.run(rp.ctx)
if err != nil {
select {
case rp.err <- err:
case <-rp.ctx.Done():
}
}
}()
}