From a623b754708bbe861a6b88297f71536c88016b7f Mon Sep 17 00:00:00 2001 From: nareix Date: Wed, 9 Mar 2016 01:25:20 +0800 Subject: [PATCH] add packet_length field for PES Header --- writer.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/writer.go b/writer.go index abb258b..4d237f3 100644 --- a/writer.go +++ b/writer.go @@ -305,10 +305,10 @@ func bswap32(v uint) uint { return (v>>24)|((v>>16)&0xff)<<8|((v>>8)&0xff)<<16|(v&0xff)<<24 } -func WritePESHeader(w io.Writer, self PESHeader) (err error) { +func WritePESHeader(w io.Writer, self PESHeader, dataLength int) (err error) { // http://dvd.sourceforge.net/dvdinfo/pes-hdr.html - var pts_dts_flags, header_length uint + var pts_dts_flags, header_length, packet_length uint // start code(24) 000001 // StreamId(8) @@ -347,8 +347,14 @@ func WritePESHeader(w io.Writer, self PESHeader) (err error) { header_length += 5 } + if dataLength > 0 { + packet_length = uint(dataLength) + header_length + 3 + } // packet_length(16) if zero then variable length - if err = WriteUInt(w, 0, 2); err != nil { + // Specifies the number of bytes remaining in the packet after this field. Can be zero. + // If the PES packet length is set to zero, the PES packet can be of any length. + // A value of zero for the PES packet length can be used only when the PES packet payload is a video elementary stream. + if err = WriteUInt(w, packet_length, 2); err != nil { return } @@ -389,7 +395,7 @@ func WritePESHeader(w io.Writer, self PESHeader) (err error) { func WritePESPacket(w *TSWriter, header PESHeader, data []byte) (err error) { bw := &bytes.Buffer{} - if err = WritePESHeader(bw, header); err != nil { + if err = WritePESHeader(bw, header, len(data)); err != nil { return } iov := &iovec{} @@ -654,7 +660,7 @@ func (self *SimpleH264Writer) WriteNALU(sync bool, duration int, nalu []byte) (e StreamId: StreamIdH264, PTS: uint64(self.PTS)*PTS_HZ/uint64(self.TimeScale), } - if err = WritePESHeader(self.pesBuf, pes); err != nil { + if err = WritePESHeader(self.pesBuf, pes, 0); err != nil { return }