golanggohlsrtmpwebrtcmedia-serverobs-studiortcprtmp-proxyrtmp-serverrtprtsprtsp-proxyrtsp-relayrtsp-serversrtstreamingwebrtc-proxy
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
991 B
47 lines
991 B
package hls |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"time" |
|
|
|
"github.com/aler9/rtsp-simple-server/internal/hls/mpegts" |
|
) |
|
|
|
type clientTimeSyncMPEGTS struct { |
|
startRTC time.Time |
|
startDTS int64 |
|
td *mpegts.TimeDecoder |
|
} |
|
|
|
func newClientTimeSyncMPEGTS(startDTS int64) *clientTimeSyncMPEGTS { |
|
return &clientTimeSyncMPEGTS{ |
|
startRTC: time.Now(), |
|
startDTS: startDTS, |
|
td: mpegts.NewTimeDecoder(), |
|
} |
|
} |
|
|
|
func (ts *clientTimeSyncMPEGTS) convertAndSync(ctx context.Context, rawDTS int64, rawPTS int64) (time.Duration, error) { |
|
rawDTS = (rawDTS - ts.startDTS) & 0x1FFFFFFFF |
|
rawPTS = (rawPTS - ts.startDTS) & 0x1FFFFFFFF |
|
|
|
dts := ts.td.Decode(rawDTS) |
|
pts := ts.td.Decode(rawPTS) |
|
|
|
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 |
|
}
|
|
|