mediamtx/internal/hls/client_timesync_mpegts.go
aler9 7981522bf6 hls client: skip packets received before the 1st packet of the leading
track; make sure that the initial DTS is zero
2022-10-26 17:39:32 +02:00

47 lines
937 B
Go

package hls
import (
"context"
"fmt"
"sync"
"time"
"github.com/aler9/rtsp-simple-server/internal/hls/mpegtstimedec"
)
type clientTimeSyncMPEGTS struct {
startRTC time.Time
td *mpegtstimedec.Decoder
mutex sync.Mutex
}
func newClientTimeSyncMPEGTS(startDTS int64) *clientTimeSyncMPEGTS {
return &clientTimeSyncMPEGTS{
startRTC: time.Now(),
td: mpegtstimedec.New(startDTS),
}
}
func (ts *clientTimeSyncMPEGTS) convertAndSync(ctx context.Context, rawDTS int64, rawPTS int64) (time.Duration, error) {
ts.mutex.Lock()
dts := ts.td.Decode(rawDTS)
pts := ts.td.Decode(rawPTS)
ts.mutex.Unlock()
elapsed := time.Since(ts.startRTC)
if dts > elapsed {
diff := dts - elapsed
if diff > clientMaxDTSRTCDiff {
return 0, fmt.Errorf("difference between DTS and RTC is too big")
}
select {
case <-time.After(diff):
case <-ctx.Done():
return 0, fmt.Errorf("terminated")
}
}
return pts, nil
}