demuxer: rewrite packet split logic
This commit is contained in:
parent
72fd658033
commit
6b887066cf
99
demuxer.go
99
demuxer.go
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user