| 607 | }; |
| 608 | |
| 609 | static int read_sbr_grid(AACContext *ac, SpectralBandReplication *sbr, |
| 610 | GetBitContext *gb, SBRData *ch_data) |
| 611 | { |
| 612 | int i; |
| 613 | unsigned bs_pointer = 0; |
| 614 | // frameLengthFlag ? 15 : 16; 960 sample length frames unsupported; this value is numTimeSlots |
| 615 | int abs_bord_trail = 16; |
| 616 | int num_rel_lead, num_rel_trail; |
| 617 | unsigned bs_num_env_old = ch_data->bs_num_env; |
| 618 | |
| 619 | ch_data->bs_freq_res[0] = ch_data->bs_freq_res[ch_data->bs_num_env]; |
| 620 | ch_data->bs_amp_res = sbr->bs_amp_res_header; |
| 621 | ch_data->t_env_num_env_old = ch_data->t_env[bs_num_env_old]; |
| 622 | |
| 623 | switch (ch_data->bs_frame_class = get_bits(gb, 2)) { |
| 624 | case FIXFIX: |
| 625 | ch_data->bs_num_env = 1 << get_bits(gb, 2); |
| 626 | num_rel_lead = ch_data->bs_num_env - 1; |
| 627 | if (ch_data->bs_num_env == 1) |
| 628 | ch_data->bs_amp_res = 0; |
| 629 | |
| 630 | if (ch_data->bs_num_env > 4) { |
| 631 | av_log(ac->avctx, AV_LOG_ERROR, |
| 632 | "Invalid bitstream, too many SBR envelopes in FIXFIX type SBR frame: %d\n", |
| 633 | ch_data->bs_num_env); |
| 634 | return -1; |
| 635 | } |
| 636 | |
| 637 | ch_data->t_env[0] = 0; |
| 638 | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
| 639 | |
| 640 | abs_bord_trail = (abs_bord_trail + (ch_data->bs_num_env >> 1)) / |
| 641 | ch_data->bs_num_env; |
| 642 | for (i = 0; i < num_rel_lead; i++) |
| 643 | ch_data->t_env[i + 1] = ch_data->t_env[i] + abs_bord_trail; |
| 644 | |
| 645 | ch_data->bs_freq_res[1] = get_bits1(gb); |
| 646 | for (i = 1; i < ch_data->bs_num_env; i++) |
| 647 | ch_data->bs_freq_res[i + 1] = ch_data->bs_freq_res[1]; |
| 648 | break; |
| 649 | case FIXVAR: |
| 650 | abs_bord_trail += get_bits(gb, 2); |
| 651 | num_rel_trail = get_bits(gb, 2); |
| 652 | ch_data->bs_num_env = num_rel_trail + 1; |
| 653 | ch_data->t_env[0] = 0; |
| 654 | ch_data->t_env[ch_data->bs_num_env] = abs_bord_trail; |
| 655 | |
| 656 | for (i = 0; i < num_rel_trail; i++) |
| 657 | ch_data->t_env[ch_data->bs_num_env - 1 - i] = |
| 658 | ch_data->t_env[ch_data->bs_num_env - i] - 2 * get_bits(gb, 2) - 2; |
| 659 | |
| 660 | bs_pointer = get_bits(gb, ceil_log2[ch_data->bs_num_env]); |
| 661 | |
| 662 | for (i = 0; i < ch_data->bs_num_env; i++) |
| 663 | ch_data->bs_freq_res[ch_data->bs_num_env - i] = get_bits1(gb); |
| 664 | break; |
| 665 | case VARFIX: |
| 666 | ch_data->t_env[0] = get_bits(gb, 2); |
no test coverage detected