| 181 | var ErrDecconfInvalid = errors.New("decode error") |
| 182 | |
| 183 | func (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 | } |