mirror of
https://github.com/aler9/gortsplib
synced 2025-10-05 15:16:51 +08:00
62 lines
1.2 KiB
Go
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))
|
|
}
|