85 lines
1.5 KiB
Go
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})
|
|
}
|
|
|