joy4/pktqueue/pktqueue.go
2016-05-25 07:43:48 +08:00

85 lines
1.5 KiB
Go

package pktqueue
import (
"github.com/nareix/av"
)
type timePacket struct {
time float64
av.Packet
}
type stream struct {
pkts []timePacket
lastDuration float64
}
func (self *stream) Read(flush bool) (ok bool, pkt timePacket) {
if len(self.pkts) > 1 {
ok = true
pkt := self.pkts[0]
pkt.Duration = self.pkts[1].time - self.pkts[0].time
self.lastDuration = pkt.Duration
self.pkts = self.pkts[1:]
} else if len(self.pkts) == 1 && flush {
ok = true
pkt := self.pkts[0]
pkt.Duration = self.lastDuration
self.pkts = self.pkts[1:]
}
return
}
type Queue struct {
streams []*stream
Poll func() error
err error
time float64
}
func (self *Queue) CurrentTime() float64 {
return self.time
}
func (self *Queue) Alloc(n int) {
self.streams = make([]*stream, n)
}
func (self *Queue) Clear() {
self.Alloc(len(self.streams))
self.time = 0.0
}
func (self *Queue) ReadPacket() (i int, pkt av.Packet, err error) {
for {
flush := self.err != nil
var tpkt timePacket
var ok bool
var stream *stream
for i, stream = range self.streams {
if ok, tpkt = stream.Read(flush); ok {
break
}
}
if ok {
pkt = tpkt.Packet
self.time = tpkt.time
return
} else {
if self.err == nil {
self.err = self.Poll()
} else {
err = self.err
return
}
}
}
return
}
func (self *Queue) WriteTimePacket(i int, time float64, pkt av.Packet) {
stream := self.streams[i]
stream.pkts = append(stream.pkts, timePacket{Packet: pkt, time: time})
}