demuxer add pkts buf

This commit is contained in:
nareix 2016-07-01 06:10:18 +08:00
parent 93f7f62fad
commit 72fd658033

View File

@ -14,8 +14,8 @@ import (
type Demuxer struct { type Demuxer struct {
R io.Reader R io.Reader
gotpkt bool pktidx int
pkt av.Packet pkts []av.Packet
pat PAT pat PAT
pmt *PMT pmt *PMT
@ -62,20 +62,31 @@ func (self *Demuxer) ReadPacket() (pkt av.Packet, err error) {
if err = self.probe(); err != nil { if err = self.probe(); err != nil {
return return
} }
for self.pktidx == len(self.pkts) {
if err = self.poll(); err != nil { if err = self.poll(); err != nil {
return return
} }
pkt = self.pkt }
if self.pktidx < len(self.pkts) {
pkt = self.pkts[self.pktidx]
self.pktidx++
}
return return
} }
func (self *Demuxer) poll() (err error) { func (self *Demuxer) poll() (err error) {
for !self.gotpkt { self.pktidx = 0
self.pkts = self.pkts[0:0]
for {
if err = self.readTSPacket(); err != nil { if err = self.readTSPacket(); err != nil {
return return
} }
if len(self.pkts) > 0 {
break
}
} }
self.gotpkt = false
return return
} }
@ -143,18 +154,6 @@ func (self *Stream) payloadEnd() (err error) {
dts = pts dts = pts
} }
pkt := &self.demuxer.pkt
*pkt = av.Packet{
Idx: int8(self.idx),
IsKeyFrame: self.tshdr.RandomAccessIndicator,
Time: time.Duration(dts)*time.Second / time.Duration(PTS_HZ),
Data: payload,
}
if pts != dts {
pkt.CompositionTime = time.Duration(pts-dts)*time.Second / time.Duration(PTS_HZ)
}
self.demuxer.gotpkt = true
if self.CodecData == nil { if self.CodecData == nil {
switch self.streamType { switch self.streamType {
case ElementaryStreamTypeAdtsAAC: case ElementaryStreamTypeAdtsAAC:
@ -196,6 +195,18 @@ func (self *Stream) payloadEnd() (err error) {
} }
} }
demuxer := self.demuxer
pkt := &av.Packet{
Idx: int8(self.idx),
IsKeyFrame: self.tshdr.RandomAccessIndicator,
Time: time.Duration(dts)*time.Second / time.Duration(PTS_HZ),
Data: payload,
}
if pts != dts {
pkt.CompositionTime = time.Duration(pts-dts)*time.Second / time.Duration(PTS_HZ)
}
demuxer.pkts = append(demuxer.pkts, *pkt)
return return
} }