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
pkt := av.Packet{
Idx: int8(self.idx),
IsKeyFrame: self.tshdr.RandomAccessIndicator,
Time: time.Duration(dts)*time.Second / time.Duration(PTS_HZ) + timedelta,
Data: payload,
}
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 { switch self.streamType {
case ElementaryStreamTypeAdtsAAC: case ElementaryStreamTypeAdtsAAC:
var config aacparser.MPEG4AudioConfig var config aacparser.MPEG4AudioConfig
if config, _, _, _, err = aacparser.ReadADTSFrame(payload); err != nil { var packets [][]byte
err = fmt.Errorf("ReadADTSFrame failed: %s", err) var totsamples int
if config, packets, totsamples, err = aacparser.SplitADTSFrames(payload); err != nil {
err = fmt.Errorf("ts: demuxer: SplitADTSFrames failed: %s", err)
return 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
} }
}
frametime := time.Duration(totsamples / len(packets)) * time.Second / time.Duration(config.SampleRate)
timedelta := time.Duration(0)
for _, packet := range packets {
self.addPacket(packet, timedelta)
timedelta += frametime
}
case ElementaryStreamTypeH264: case ElementaryStreamTypeH264:
if false {
fmt.Println(hex.Dump(payload))
}
nalus, _ := h264parser.SplitNALUs(payload) nalus, _ := h264parser.SplitNALUs(payload)
var sps, pps []byte var sps, pps []byte
for _, nalu := range nalus { for _, nalu := range nalus {
if len(nalu) > 0 { if len(nalu) > 0 {
naltype := nalu[0] & 0x1f naltype := nalu[0] & 0x1f
if naltype == 7 { switch naltype {
case 7:
sps = nalu sps = nalu
} else if naltype == 8 { case 8:
pps = nalu 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 == nil && len(sps) > 0 && len(pps) > 0 {
if self.CodecData, err = h264parser.NewCodecDataFromSPSAndPPS(sps, pps); err != nil { if self.CodecData, err = h264parser.NewCodecDataFromSPSAndPPS(sps, pps); err != nil {
return return
} }
} }
} }
}
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
} }