joy4/pktque/normalizer.go
2016-06-22 19:25:45 +08:00

76 lines
1.2 KiB
Go

package pktque
import (
"github.com/nareix/av"
"time"
"fmt"
)
const debugNormalizer = false
type Normalizer struct {
ques Queues
streams []av.CodecData
}
func (self *Normalizer) Push(pkt av.Packet) {
}
func (self *Normalizer) Pop() (pkt av.Packet, dur time.Duration, ok bool) {
return
}
func (self *Normalizer) Do(pkt av.Packet) (out []av.Packet) {
const MaxDiff = time.Millisecond*800
const MaxCacheTime = time.Second*5
i := int(pkt.Idx)
que := &self.ques[i]
que.Push(pkt)
if que.Tail().Time - que.Head().Time > MaxCacheTime {
que.Pop()
}
for {
ok := true
diff := time.Duration(0)
for i := range self.ques {
if que.Count() == 0 {
ok = false
break
}
tm := self.ques[i].Tail().Time
for j := 0; j < i; j++ {
v := tm - self.ques[j].Tail().Time
if v < 0 {
v = -v
}
if v > diff {
diff = v
}
}
}
if !ok {
return
}
if diff > MaxDiff {
ok = false
}
}
if debugNormalizer {
fmt.Println("normalizer: push", pkt.Idx, pkt.Time)
}
return
}
func NewNormalizer(streams []av.CodecData) *Normalizer {
self := &Normalizer{}
self.ques = make(Queues, len(streams))
self.streams = streams
return self
}