Files
gortsplib/pkg/rtptime/decoder.go
2023-08-16 13:24:18 +02:00

45 lines
959 B
Go

// Package rtptime contains a RTP timestamp decoder and encoder.
package rtptime
import (
"time"
)
// avoid an int64 overflow and preserve resolution by splitting division into two parts:
// first add the integer part, then the decimal part.
func multiplyAndDivide(v, m, d time.Duration) time.Duration {
secs := v / d
dec := v % d
return (secs*m + dec*m/d)
}
// Decoder is a RTP timestamp decoder.
type Decoder struct {
clockRate time.Duration
initialized bool
overall time.Duration
prev uint32
}
// NewDecoder allocates a Decoder.
func NewDecoder(clockRate int) *Decoder {
return &Decoder{
clockRate: time.Duration(clockRate),
}
}
// Decode decodes a timestamp.
func (d *Decoder) Decode(ts uint32) time.Duration {
if !d.initialized {
d.initialized = true
d.prev = ts
return 0
}
diff := int32(ts - d.prev)
d.prev = ts
d.overall += time.Duration(diff)
return multiplyAndDivide(d.overall, time.Second, d.clockRate)
}