demuxer: rewrite packet split logic

This commit is contained in:
nareix 2016-07-01 18:25:47 +08:00
parent 72fd658033
commit 6b887066cf

View File

@ -145,23 +145,41 @@ func (self *Demuxer) readTSPacket() (err error) {
return return
} }
func (self *Stream) payloadEnd() (err error) { func (self *Stream) addPacket(payload []byte, timedelta time.Duration) {
payload := self.buf.Bytes()
dts := self.peshdr.DTS dts := self.peshdr.DTS
pts := self.peshdr.PTS pts := self.peshdr.PTS
if dts == 0 { if dts == 0 {
dts = pts dts = pts
} }
if self.CodecData == nil { demuxer := self.demuxer
switch self.streamType { pkt := av.Packet{
case ElementaryStreamTypeAdtsAAC: Idx: int8(self.idx),
var config aacparser.MPEG4AudioConfig IsKeyFrame: self.tshdr.RandomAccessIndicator,
if config, _, _, _, err = aacparser.ReadADTSFrame(payload); err != nil { Time: time.Duration(dts)*time.Second / time.Duration(PTS_HZ) + timedelta,
err = fmt.Errorf("ReadADTSFrame failed: %s", err) Data: payload,
return }
} if pts != dts {
pkt.CompositionTime = time.Duration(pts-dts)*time.Second / time.Duration(PTS_HZ)
}
demuxer.pkts = append(demuxer.pkts, pkt)
}
func (self *Stream) payloadEnd() (err error) {
payload := self.buf.Bytes()
switch self.streamType {
case ElementaryStreamTypeAdtsAAC:
var config aacparser.MPEG4AudioConfig
var packets [][]byte
var totsamples int
if config, packets, totsamples, err = aacparser.SplitADTSFrames(payload); err != nil {
err = fmt.Errorf("ts: demuxer: SplitADTSFrames failed: %s", err)
return
}
config = config.Complete()
if self.CodecData == nil {
bw := &bytes.Buffer{} bw := &bytes.Buffer{}
if err = aacparser.WriteMPEG4AudioConfig(bw, config); err != nil { if err = aacparser.WriteMPEG4AudioConfig(bw, config); err != nil {
err = fmt.Errorf("WriteMPEG4AudioConfig failed: %s", err) err = fmt.Errorf("WriteMPEG4AudioConfig failed: %s", err)
@ -170,42 +188,43 @@ func (self *Stream) payloadEnd() (err error) {
if self.CodecData, err = aacparser.NewCodecDataFromMPEG4AudioConfigBytes(bw.Bytes()); err != nil { if self.CodecData, err = aacparser.NewCodecDataFromMPEG4AudioConfigBytes(bw.Bytes()); err != nil {
return return
} }
}
case ElementaryStreamTypeH264: frametime := time.Duration(totsamples / len(packets)) * time.Second / time.Duration(config.SampleRate)
if false { timedelta := time.Duration(0)
fmt.Println(hex.Dump(payload)) for _, packet := range packets {
} self.addPacket(packet, timedelta)
nalus, _ := h264parser.SplitNALUs(payload) timedelta += frametime
var sps, pps []byte }
for _, nalu := range nalus {
if len(nalu) > 0 { case ElementaryStreamTypeH264:
naltype := nalu[0] & 0x1f nalus, _ := h264parser.SplitNALUs(payload)
if naltype == 7 { var sps, pps []byte
sps = nalu for _, nalu := range nalus {
} else if naltype == 8 { if len(nalu) > 0 {
pps = nalu naltype := nalu[0] & 0x1f
switch naltype {
case 7:
sps = nalu
case 8:
pps = nalu
case 6:
case 9:
default:
if false {
fmt.Println("h264", len(nalus), "\n", hex.Dump(nalu))
} }
} self.addPacket(nalu, time.Duration(0))
}
if len(sps) > 0 && len(pps) > 0 {
if self.CodecData, err = h264parser.NewCodecDataFromSPSAndPPS(sps, pps); err != nil {
return
} }
} }
} }
}
demuxer := self.demuxer if self.CodecData == nil && len(sps) > 0 && len(pps) > 0 {
pkt := &av.Packet{ if self.CodecData, err = h264parser.NewCodecDataFromSPSAndPPS(sps, pps); err != nil {
Idx: int8(self.idx), return
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
} }