diff --git a/format/ts/muxer.go b/format/ts/muxer.go index 6fb64b5..7b880b4 100644 --- a/format/ts/muxer.go +++ b/format/ts/muxer.go @@ -102,6 +102,7 @@ func (self *Muxer) WritePATPMT() (err error) { }, } patlen := pat.Marshal(self.psidata[tsio.PSIHeaderLength:]) + tsio.FillPSI(self.psidata, tsio.TableIdPAT, tsio.TableExtPAT, patlen) self.datav[0] = self.psidata[:tsio.PSIHeaderLength+patlen] if err = self.tswpat.WritePackets(self.w, self.datav[:1], 0, false, true); err != nil { return @@ -133,6 +134,7 @@ func (self *Muxer) WritePATPMT() (err error) { return } pmt.Marshal(self.psidata[tsio.PSIHeaderLength:]) + tsio.FillPSI(self.psidata, tsio.TableIdPMT, tsio.TableExtPMT, pmtlen) self.datav[0] = self.psidata[:tsio.PSIHeaderLength+pmtlen] if err = self.tswpmt.WritePackets(self.w, self.datav[:1], 0, false, true); err != nil { return diff --git a/format/ts/tsio/tsio.go b/format/ts/tsio/tsio.go index fb2ba6a..9a7c37b 100644 --- a/format/ts/tsio/tsio.go +++ b/format/ts/tsio/tsio.go @@ -306,6 +306,11 @@ func ParsePSI(h []byte) (tableid uint8, tableext uint16, hdrlen int, datalen int datalen = int(pio.U16BE(h[hdrlen:]))&0x3ff - 9 hdrlen += 2 + if datalen < 0 { + err = ErrPSIHeader + return + } + // Table ID extension(16) tableext = pio.U16BE(h[hdrlen:]) hdrlen += 2 @@ -330,7 +335,7 @@ func ParsePSI(h []byte) (tableid uint8, tableext uint16, hdrlen int, datalen int const PSIHeaderLength = 9 -func FillPSI(h []byte, tableid uint8, tableext uint16, data []byte) (n int) { +func FillPSI(h []byte, tableid uint8, tableext uint16, datalen int) (n int) { // pointer(8) h[n] = 0 n++ @@ -340,7 +345,7 @@ func FillPSI(h []byte, tableid uint8, tableext uint16, data []byte) (n int) { n++ // section_syntax_indicator(1)=1,private_bit(1)=0,reserved(2)=3,unused(2)=0,section_length(10) - pio.PutU16BE(h[n:], uint16(0xa<<12 | 2+3+4+len(data))) + pio.PutU16BE(h[n:], uint16(0xa<<12 | 2+3+4+datalen)) n += 2 // Table ID extension(16) @@ -359,8 +364,7 @@ func FillPSI(h []byte, tableid uint8, tableext uint16, data []byte) (n int) { h[n] = 0 n++ - copy(h[n:], data) - n += len(data) + n += datalen crc := calcCRC32(0xffffffff, h[1:n]) pio.PutU32LE(h[n:], crc)