| 559 | } |
| 560 | |
| 561 | static int parse_rps(GetBitContext *gb, unsigned int rps_idx, |
| 562 | unsigned int num_rps, |
| 563 | unsigned int num_delta_pocs[HEVC_MAX_SHORT_TERM_REF_PIC_SETS]) |
| 564 | { |
| 565 | unsigned int i; |
| 566 | |
| 567 | if (rps_idx && get_bits1(gb)) { // inter_ref_pic_set_prediction_flag |
| 568 | /* this should only happen for slice headers, and this isn't one */ |
| 569 | if (rps_idx >= num_rps) |
| 570 | return AVERROR_INVALIDDATA; |
| 571 | |
| 572 | skip_bits1 (gb); // delta_rps_sign |
| 573 | get_ue_golomb_long(gb); // abs_delta_rps_minus1 |
| 574 | |
| 575 | num_delta_pocs[rps_idx] = 0; |
| 576 | |
| 577 | /* |
| 578 | * From libavcodec/hevc_ps.c: |
| 579 | * |
| 580 | * if (is_slice_header) { |
| 581 | * //foo |
| 582 | * } else |
| 583 | * rps_ridx = &sps->st_rps[rps - sps->st_rps - 1]; |
| 584 | * |
| 585 | * where: |
| 586 | * rps: &sps->st_rps[rps_idx] |
| 587 | * sps->st_rps: &sps->st_rps[0] |
| 588 | * is_slice_header: rps_idx == num_rps |
| 589 | * |
| 590 | * thus: |
| 591 | * if (num_rps != rps_idx) |
| 592 | * rps_ridx = &sps->st_rps[rps_idx - 1]; |
| 593 | * |
| 594 | * NumDeltaPocs[RefRpsIdx]: num_delta_pocs[rps_idx - 1] |
| 595 | */ |
| 596 | for (i = 0; i <= num_delta_pocs[rps_idx - 1]; i++) { |
| 597 | uint8_t use_delta_flag = 0; |
| 598 | uint8_t used_by_curr_pic_flag = get_bits1(gb); |
| 599 | if (!used_by_curr_pic_flag) |
| 600 | use_delta_flag = get_bits1(gb); |
| 601 | |
| 602 | if (used_by_curr_pic_flag || use_delta_flag) |
| 603 | num_delta_pocs[rps_idx]++; |
| 604 | } |
| 605 | } else { |
| 606 | unsigned int num_negative_pics = get_ue_golomb_long(gb); |
| 607 | unsigned int num_positive_pics = get_ue_golomb_long(gb); |
| 608 | |
| 609 | if ((num_positive_pics + (uint64_t)num_negative_pics) * 2 > get_bits_left(gb)) |
| 610 | return AVERROR_INVALIDDATA; |
| 611 | |
| 612 | num_delta_pocs[rps_idx] = num_negative_pics + num_positive_pics; |
| 613 | |
| 614 | for (i = 0; i < num_negative_pics; i++) { |
| 615 | get_ue_golomb_long(gb); // delta_poc_s0_minus1[rps_idx] |
| 616 | skip_bits1 (gb); // used_by_curr_pic_s0_flag[rps_idx] |
| 617 | } |
| 618 |
no test coverage detected