mirror of
https://github.com/livekit/livekit.git
synced 2026-06-06 13:22:06 +00:00
faa870de3d
* move callbacks out of messageRouter * OCD * more OCD * fix forwarder test * even more OCD * maximum OCD * package name collision, copy lock by value
67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package sfu
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/pion/webrtc/v3"
|
|
)
|
|
|
|
var (
|
|
ntpEpoch = time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC)
|
|
)
|
|
|
|
type ntpTime uint64
|
|
|
|
const (
|
|
QuarterResolution = "q"
|
|
HalfResolution = "h"
|
|
FullResolution = "f"
|
|
)
|
|
|
|
// Do a fuzzy find for a codec in the list of codecs
|
|
// Used for lookup up a codec in an existing list to find a match
|
|
func codecParametersFuzzySearch(needle webrtc.RTPCodecParameters, haystack []webrtc.RTPCodecParameters) (webrtc.RTPCodecParameters, error) {
|
|
// First attempt to match on MimeType + SDPFmtpLine
|
|
for _, c := range haystack {
|
|
if strings.EqualFold(c.RTPCodecCapability.MimeType, needle.RTPCodecCapability.MimeType) &&
|
|
c.RTPCodecCapability.SDPFmtpLine == needle.RTPCodecCapability.SDPFmtpLine {
|
|
return c, nil
|
|
}
|
|
}
|
|
|
|
// Fallback to just MimeType
|
|
for _, c := range haystack {
|
|
if strings.EqualFold(c.RTPCodecCapability.MimeType, needle.RTPCodecCapability.MimeType) {
|
|
return c, nil
|
|
}
|
|
}
|
|
|
|
return webrtc.RTPCodecParameters{}, webrtc.ErrCodecNotFound
|
|
}
|
|
|
|
func (t ntpTime) Duration() time.Duration {
|
|
sec := (t >> 32) * 1e9
|
|
frac := (t & 0xffffffff) * 1e9
|
|
nsec := frac >> 32
|
|
if uint32(frac) >= 0x80000000 {
|
|
nsec++
|
|
}
|
|
return time.Duration(sec + nsec)
|
|
}
|
|
|
|
func (t ntpTime) Time() time.Time {
|
|
return ntpEpoch.Add(t.Duration())
|
|
}
|
|
|
|
func toNtpTime(t time.Time) ntpTime {
|
|
nsec := uint64(t.Sub(ntpEpoch))
|
|
sec := nsec / 1e9
|
|
nsec = (nsec - sec*1e9) << 32
|
|
frac := nsec / 1e9
|
|
if nsec%1e9 >= 1e9/2 {
|
|
frac++
|
|
}
|
|
return ntpTime(sec<<32 | frac)
|
|
}
|