mirror of
https://github.com/bluenviron/mediamtx.git
synced 2025-12-27 21:42:01 -08:00
* 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
52 lines
832 B
Go
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():
|
|
}
|
|
}
|
|
}()
|
|
}
|