Files
mediamtx/internal/stream/offline_sub_stream.go

69 lines
1.3 KiB
Go

package stream
import (
"context"
"sync"
"time"
)
func multiplyAndDivide2(v, m, d time.Duration) time.Duration {
secs := v / d
dec := v % d
return (secs*m + dec*m/d)
}
type offlineSubStream struct {
stream *Stream
subStream *SubStream
ctx context.Context
ctxCancel func()
wg sync.WaitGroup
tracks []*offlineSubStreamTrack
}
func (o *offlineSubStream) initialize() error {
o.subStream = &SubStream{
Stream: o.stream,
InDesc: o.stream.offlineDesc,
UseRTPPackets: false,
}
err := o.subStream.Initialize()
if err != nil {
return err
}
o.ctx, o.ctxCancel = context.WithCancel(context.Background())
pos := 0
o.tracks = make([]*offlineSubStreamTrack, len(o.subStream.InDesc.Medias))
for _, media := range o.subStream.InDesc.Medias {
for _, forma := range media.Formats {
t := &offlineSubStreamTrack{
wg: &o.wg,
file: o.stream.AlwaysAvailableFile,
pos: pos,
ctx: o.ctx,
subStream: o.subStream,
media: media,
format: forma,
}
t.initialize()
o.tracks[pos] = t
pos++
}
}
return nil
}
func (o *offlineSubStream) close(waitLastSample bool) {
for _, track := range o.tracks {
track.waitLastSample = waitLastSample
}
o.ctxCancel()
o.wg.Wait()
}