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

Method Unmarshal

codec/h264.go:183–242  ·  view source on GitHub ↗
(b []byte)

Source from the content-addressed store, hash-verified

181var ErrDecconfInvalid = errors.New("decode error")
182
183func (p *AVCDecoderConfigurationRecord) Unmarshal(b []byte) (n int, err error) {
184 if len(b) < 7 {
185 err = errors.New("not enough len")
186 return
187 }
188
189 p.AVCProfileIndication = b[1]
190 p.ProfileCompatibility = b[2]
191 p.AVCLevelIndication = b[3]
192 p.LengthSizeMinusOne = b[4] & 0x03
193 spscount := int(b[5] & 0x1f)
194 n += 6
195 var sps, pps [][]byte
196 for i := 0; i < spscount; i++ {
197 if len(b) < n+2 {
198 err = ErrDecconfInvalid
199 return
200 }
201 spslen := util.ReadBE[int](b[n : n+2])
202 n += 2
203
204 if len(b) < n+spslen {
205 err = ErrDecconfInvalid
206 return
207 }
208 sps = append(sps, b[n:n+spslen])
209 n += spslen
210 }
211 p.SequenceParameterSetLength = uint16(len(sps[0]))
212 p.SequenceParameterSetNALUnit = sps[0]
213 if len(b) < n+1 {
214 err = ErrDecconfInvalid
215 return
216 }
217 ppscount := int(b[n])
218 n++
219
220 for i := 0; i < ppscount; i++ {
221 if len(b) < n+2 {
222 err = ErrDecconfInvalid
223 return
224 }
225 ppslen := util.ReadBE[int](b[n : n+2])
226 n += 2
227
228 if len(b) < n+ppslen {
229 err = ErrDecconfInvalid
230 return
231 }
232 pps = append(pps, b[n:n+ppslen])
233 n += ppslen
234 }
235 if ppscount >= 1 {
236 p.PictureParameterSetLength = uint16(len(pps[0]))
237 p.PictureParameterSetNALUnit = pps[0]
238 } else {
239 err = ErrDecconfInvalid
240 }

Callers 1

WriteSequenceHeadMethod · 0.95

Calls 1

NewMethod · 0.80

Tested by

no test coverage detected