Files
gortsplib/pkg/rtptime/encoder.go
Alessandro Ros 2ca0bffa20 use native timestamps instead of time.Duration (#627)
this improves timestamp precision
2024-10-07 15:58:43 +02:00

62 lines
1.2 KiB
Go

package rtptime
import (
"crypto/rand"
"time"
)
func divCeil(n, d uint64) uint64 {
v := n / d
if (n % d) != 0 {
v++
}
return v
}
func randUint32() (uint32, error) {
var b [4]byte
_, err := rand.Read(b[:])
if err != nil {
return 0, err
}
return uint32(b[0])<<24 | uint32(b[1])<<16 | uint32(b[2])<<8 | uint32(b[3]), nil
}
// Encoder is a RTP timestamp encoder.
//
// Deprecated: not used anymore.
type Encoder struct {
// Clock rate.
ClockRate int
// (optional) initial timestamp.
// It defaults to a random value.
InitialTimestamp *uint32
clockRateTD time.Duration
initialTimestampTD time.Duration
}
// Initialize initializes an Encoder.
func (e *Encoder) Initialize() error {
e.clockRateTD = time.Duration(e.ClockRate)
if e.InitialTimestamp == nil {
v, err := randUint32()
if err != nil {
return err
}
e.InitialTimestamp = &v
}
e.initialTimestampTD = time.Duration(divCeil(uint64(*e.InitialTimestamp)*uint64(time.Second), uint64(e.ClockRate)))
return nil
}
// Encode encodes a timestamp.
func (e *Encoder) Encode(ts time.Duration) uint32 {
ts += e.initialTimestampTD
return uint32(multiplyAndDivide(ts, e.clockRateTD, time.Second))
}