MCPcopy Create free account
hub / github.com/Monibuca/engine / ReadPESHeader

Function ReadPESHeader

codec/mpegts/mpegts_pes.go:109–348  ·  view source on GitHub ↗
(r io.Reader)

Source from the content-addressed store, hash-verified

107}
108
109func ReadPESHeader(r io.Reader) (header MpegTsPESHeader, err error) {
110 var flags uint8
111 var length uint
112
113 // packetStartCodePrefix(24) (0x000001)
114 header.PacketStartCodePrefix, err = util.ReadByteToUint24(r, true)
115 if err != nil {
116 return
117 }
118
119 if header.PacketStartCodePrefix != 0x0000001 {
120 err = errors.New("read PacketStartCodePrefix is not 0x0000001")
121 return
122 }
123
124 // streamID(8)
125 header.StreamID, err = util.ReadByteToUint8(r)
126 if err != nil {
127 return
128 }
129
130 // pes_PacketLength(16)
131 header.PesPacketLength, err = util.ReadByteToUint16(r, true)
132 if err != nil {
133 return
134 }
135
136 length = uint(header.PesPacketLength)
137
138 // PES包长度可能为0,这个时候,需要自己去算
139 // 0 <= len <= 65535
140 // 如果当length为0,那么先设置为最大值,然后用LimitedReade去读,如果读到最后面剩下的字节数小于65536,才是正确的包大小.
141 // 一个包一般情况下不可能会读1<<31个字节.
142 if length == 0 {
143 length = 1 << 31
144 }
145
146 // lrPacket 和 lrHeader 位置指针是在同一位置的
147 lrPacket := &io.LimitedReader{R: r, N: int64(length)}
148 lrHeader := lrPacket
149
150 // constTen(2)
151 // pes_ScramblingControl(2)
152 // pes_Priority(1)
153 // dataAlignmentIndicator(1)
154 // copyright(1)
155 // originalOrCopy(1)
156 flags, err = util.ReadByteToUint8(lrHeader)
157 if err != nil {
158 return
159 }
160
161 header.ConstTen = flags & 0xc0
162 header.PesScramblingControl = flags & 0x30
163 header.PesPriority = flags & 0x08
164 header.DataAlignmentIndicator = flags & 0x04
165 header.Copyright = flags & 0x02
166 header.OriginalOrCopy = flags & 0x01

Callers 1

FeedMethod · 0.85

Calls 7

ReadByteToUint24Function · 0.92
ReadByteToUint8Function · 0.92
ReadByteToUint16Function · 0.92
ReadByteToUint40Function · 0.92
GetPtsDtsFunction · 0.92
ReadByteToUint48Function · 0.92
NewMethod · 0.80

Tested by

no test coverage detected