| 376 | } |
| 377 | |
| 378 | int ff_dca_exss_parse(DCAExssParser *s, const uint8_t *data, int size) |
| 379 | { |
| 380 | int i, ret, offset, wide_hdr, header_size; |
| 381 | |
| 382 | if ((ret = init_get_bits8(&s->gb, data, size)) < 0) |
| 383 | return ret; |
| 384 | |
| 385 | // Extension substream sync word |
| 386 | skip_bits_long(&s->gb, 32); |
| 387 | |
| 388 | // User defined bits |
| 389 | skip_bits(&s->gb, 8); |
| 390 | |
| 391 | // Extension substream index |
| 392 | s->exss_index = get_bits(&s->gb, 2); |
| 393 | |
| 394 | // Flag indicating short or long header size |
| 395 | wide_hdr = get_bits1(&s->gb); |
| 396 | |
| 397 | // Extension substream header length |
| 398 | header_size = get_bits(&s->gb, 8 + 4 * wide_hdr) + 1; |
| 399 | |
| 400 | // Check CRC |
| 401 | if (s->avctx && ff_dca_check_crc(s->avctx, &s->gb, 32 + 8, header_size * 8)) { |
| 402 | av_log(s->avctx, AV_LOG_ERROR, "Invalid EXSS header checksum\n"); |
| 403 | return AVERROR_INVALIDDATA; |
| 404 | } |
| 405 | |
| 406 | s->exss_size_nbits = 16 + 4 * wide_hdr; |
| 407 | |
| 408 | // Number of bytes of extension substream |
| 409 | s->exss_size = get_bits(&s->gb, s->exss_size_nbits) + 1; |
| 410 | if (s->exss_size > size) { |
| 411 | if (s->avctx) |
| 412 | av_log(s->avctx, AV_LOG_ERROR, "Packet too short for EXSS frame\n"); |
| 413 | return AVERROR_INVALIDDATA; |
| 414 | } |
| 415 | |
| 416 | // Per stream static fields presence flag |
| 417 | if (s->static_fields_present = get_bits1(&s->gb)) { |
| 418 | int active_exss_mask[8]; |
| 419 | |
| 420 | // Reference clock code |
| 421 | skip_bits(&s->gb, 2); |
| 422 | |
| 423 | // Extension substream frame duration |
| 424 | skip_bits(&s->gb, 3); |
| 425 | |
| 426 | // Timecode presence flag |
| 427 | if (get_bits1(&s->gb)) |
| 428 | // Timecode data |
| 429 | skip_bits_long(&s->gb, 36); |
| 430 | |
| 431 | // Number of defined audio presentations |
| 432 | s->npresents = get_bits(&s->gb, 3) + 1; |
| 433 | if (s->npresents > 1) { |
| 434 | if (s->avctx) |
| 435 | avpriv_request_sample(s->avctx, "%d audio presentations", s->npresents); |
no test coverage detected