Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *                                                                            *
      3  * Copyright (C) 2018 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 
     21 #include <string.h>
     22 #include "ixheaacd_sbr_common.h"
     23 #include <ixheaacd_type_def.h>
     24 
     25 #include "ixheaacd_constants.h"
     26 #include "ixheaacd_basic_ops32.h"
     27 #include "ixheaacd_basic_ops16.h"
     28 #include "ixheaacd_basic_ops40.h"
     29 #include "ixheaacd_basic_ops.h"
     30 
     31 #include "ixheaacd_bitbuffer.h"
     32 #include "ixheaacd_error_codes.h"
     33 #include "ixheaacd_defines.h"
     34 #include "ixheaacd_aac_rom.h"
     35 #include "ixheaacd_pulsedata.h"
     36 
     37 #include "ixheaacd_pns.h"
     38 #include "ixheaacd_drc_data_struct.h"
     39 
     40 #include "ixheaacd_lt_predict.h"
     41 #include "ixheaacd_channelinfo.h"
     42 
     43 #include "ixheaacd_drc_dec.h"
     44 
     45 #include "ixheaacd_sbrdecoder.h"
     46 
     47 #include "ixheaacd_block.h"
     48 #include "ixheaacd_channel.h"
     49 
     50 #include "ixheaacd_common_rom.h"
     51 #include "ixheaacd_basic_funcs.h"
     52 #include "ixheaacd_basic_op.h"
     53 
     54 #include "ixheaacd_aacdec.h"
     55 
     56 #include "ixheaacd_sbrdecsettings.h"
     57 #include "ixheaacd_sbr_scale.h"
     58 #include "ixheaacd_env_extr_part.h"
     59 #include "ixheaacd_sbr_rom.h"
     60 #include "ixheaacd_audioobjtypes.h"
     61 #include "ixheaacd_sbrdecoder.h"
     62 #include "ixheaacd_memory_standards.h"
     63 #include "ixheaacd_latmdemux.h"
     64 #include "ixheaacd_mps_polyphase.h"
     65 #include "ixheaacd_config.h"
     66 #include "ixheaacd_mps_dec.h"
     67 #include "ixheaacd_struct_def.h"
     68 
     69 #include "ixheaacd_cnst.h"
     70 
     71 #define RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID 0x80000000
     72 #define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_FWD 0x40000000
     73 #define RVLC_ERROR_RVL_SUM_BIT_COUNTER_BELOW_ZERO_BWD 0x20000000
     74 #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD 0x08000000
     75 #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD 0x04000000
     76 
     77 #define FWD 0
     78 #define BWD 1
     79 
     80 #define MAX_RVL 7
     81 #define MIN_RVL -7
     82 #define MAX_ALLOWED_DPCM_INDEX 14
     83 #define TABLE_OFFSET 7
     84 #define MAX_LEN_RVLC_CODE_WORD 9
     85 #define MAX_LEN_RVLC_ESCAPE_WORD 20
     86 
     87 #define DPCM_NOISE_NRG_BITS 9
     88 #define SF_OFFSET 100
     89 
     90 #define CONCEAL_MAX_INIT 1311
     91 #define CONCEAL_MIN_INIT -1311
     92 
     93 #define RVLC_MAX_SFB ((8) * (16))
     94 
     95 #define MASK_LEFT 0xFFF000
     96 #define MASK_RIGHT 0xFFF
     97 #define CLR_BIT_10 0x3FF
     98 #define NODE_MASK 0x400
     99 
    100 #define LEFT_OFFSET 12
    101 
    102 static int ixheaacd_rvlc_decode(short cw, int len, int *found) {
    103   short indx = 0;
    104   *found = 0;
    105   switch (len) {
    106     case 1:
    107       if (cw == 0)
    108         indx = 0;
    109       else
    110         return 3;
    111       break;
    112     case 3:
    113       switch (cw) {
    114         case 5:
    115           indx = -1;
    116           break;
    117         case 7:
    118           indx = 1;
    119           break;
    120         default:
    121           return 4;
    122       }
    123       break;
    124     case 4:
    125       if (cw == 9)
    126         indx = -2;
    127       else
    128         return 5;
    129       break;
    130     case 5:
    131       switch (cw) {
    132         case 17:
    133           indx = -3;
    134           break;
    135         case 27:
    136           indx = 2;
    137           break;
    138         default:
    139           return 6;
    140       }
    141       break;
    142     case 6:
    143       switch (cw) {
    144         case 33:
    145           indx = -4;
    146           break;
    147         case 51:
    148           indx = 3;
    149           break;
    150         default:
    151           return 7;
    152       }
    153       break;
    154     case 7:
    155       switch (cw) {
    156         case 65:
    157           indx = -7;
    158           break;
    159         case 107:
    160           indx = 4;
    161           break;
    162         case 99:
    163           indx = 7;
    164           break;
    165         default:
    166           return 8;
    167       }
    168       break;
    169     case 8:
    170       switch (cw) {
    171         case 129:
    172           indx = -5;
    173           break;
    174         case 195:
    175           indx = 5;
    176           break;
    177         default:
    178           return 9;
    179       }
    180       break;
    181     case 9:
    182       switch (cw) {
    183         case 257:
    184           indx = -6;
    185           break;
    186         case 427:
    187           indx = 6;
    188           break;
    189         default:
    190           return -1;
    191       }
    192       break;
    193     default:
    194       return -1;
    195   }
    196   *found = 1;
    197   return indx;
    198 }
    199 
    200 static int ixheaacd_rvlc_decode_esc(int cw, int len, int *found) {
    201   short indx = 0;
    202   *found = 0;
    203   switch (len) {
    204     case 2:
    205       switch (cw) {
    206         case 2:
    207           indx = 0;
    208           break;
    209         case 0:
    210           indx = 1;
    211           break;
    212         default:
    213           return 3;
    214       }
    215       break;
    216     case 3:
    217       switch (cw) {
    218         case 6:
    219           indx = 2;
    220           break;
    221         case 2:
    222           indx = 3;
    223           break;
    224         default:
    225           return 4;
    226       }
    227       break;
    228     case 4:
    229       if (cw == 14)
    230         indx = 4;
    231       else
    232         return 5;
    233       break;
    234     case 5:
    235       switch (cw) {
    236         case 31:
    237           indx = 5;
    238           break;
    239         case 15:
    240           indx = 6;
    241           break;
    242         case 13:
    243           indx = 7;
    244           break;
    245         default:
    246           return 6;
    247       }
    248       break;
    249     case 6:
    250       switch (cw) {
    251         case 61:
    252           indx = 8;
    253           break;
    254         case 29:
    255           indx = 9;
    256           break;
    257         case 25:
    258           indx = 10;
    259           break;
    260         case 24:
    261           indx = 11;
    262           break;
    263         default:
    264           return 7;
    265       }
    266       break;
    267     case 7:
    268       switch (cw) {
    269         case 120:
    270           indx = 12;
    271           break;
    272         case 56:
    273           indx = 13;
    274           break;
    275         default:
    276           return 8;
    277       }
    278       break;
    279     case 8:
    280       switch (cw) {
    281         case 242:
    282           indx = 14;
    283           break;
    284         case 114:
    285           indx = 15;
    286           break;
    287         default:
    288           return 9;
    289       }
    290       break;
    291     case 9:
    292       switch (cw) {
    293         case 486:
    294           indx = 16;
    295           break;
    296         case 230:
    297           indx = 17;
    298           break;
    299         default:
    300           return 10;
    301       }
    302       break;
    303     case 10:
    304       switch (cw) {
    305         case 974:
    306           indx = 18;
    307           break;
    308         case 463:
    309           indx = 19;
    310           break;
    311         default:
    312           return 11;
    313       }
    314       break;
    315     case 11:
    316       switch (cw) {
    317         case 1950:
    318           indx = 20;
    319           break;
    320         case 1951:
    321           indx = 21;
    322           break;
    323         case 925:
    324           indx = 22;
    325           break;
    326         default:
    327           return 12;
    328       }
    329       break;
    330     case 12:
    331       if (cw == 1848)
    332         indx = 23;
    333       else
    334         return 13;
    335       break;
    336     case 13:
    337       if (cw == 3698)
    338         indx = 25;
    339       else
    340         return 14;
    341       break;
    342     case 14:
    343       if (cw == 7399)
    344         indx = 24;
    345       else
    346         return 15;
    347       break;
    348     case 15:
    349       if (cw == 14797)
    350         indx = 26;
    351       else
    352         return 19;
    353       break;
    354     case 19:
    355       if ((cw >= 236736) && (cw <= 236740))
    356         indx = 53 - (236740 - cw);
    357       else
    358         return 20;
    359       break;
    360     case 20:
    361       if ((cw >= 473482) && (cw <= 473503))
    362         indx = 48 - (473503 - cw);
    363       else
    364         return -1;
    365       break;
    366     default:
    367       return -1;
    368   }
    369   *found = 1;
    370   return indx;
    371 }
    372 static VOID ixheaacd_rvlc_check_intensity_cb(
    373     ia_rvlc_info_struct *ptr_rvlc,
    374     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
    375   WORD32 group, band, bnds;
    376 
    377   ptr_rvlc->intensity_used = 0;
    378 
    379   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
    380     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
    381       bnds = 16 * group + band;
    382       if ((ptr_aac_dec_channel_info->ptr_code_book[bnds] == INTENSITY_HCB) ||
    383           (ptr_aac_dec_channel_info->ptr_code_book[bnds] == INTENSITY_HCB2)) {
    384         ptr_rvlc->intensity_used = 1;
    385         break;
    386       }
    387     }
    388   }
    389 }
    390 
    391 VOID ixheaacd_carry_bit_branch_val(UWORD8 carry_bit, UWORD32 tree_node,
    392                                    UWORD32 *branch_val, UWORD32 *branch_node) {
    393   if (carry_bit == 0) {
    394     *branch_node = (tree_node & MASK_LEFT) >> LEFT_OFFSET;
    395   } else {
    396     *branch_node = tree_node & MASK_RIGHT;
    397   }
    398 
    399   *branch_val = *branch_node & CLR_BIT_10;
    400 }
    401 
    402 UWORD8 ixheaacd_rvlc_read_bits(ia_bit_buf_struct *it_bit_buff,
    403                                UWORD16 *ptr_position, UWORD8 read_direction) {
    404   UWORD32 bit;
    405   WORD32 read_bit_offset =
    406       *ptr_position - (it_bit_buff->size - it_bit_buff->cnt_bits);
    407 
    408   if (read_bit_offset) it_bit_buff->cnt_bits -= read_bit_offset;
    409 
    410   it_bit_buff->ptr_read_next =
    411       it_bit_buff->ptr_bit_buf_base +
    412       ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
    413   it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
    414 
    415   if (read_direction == 0) {
    416     bit = ixheaacd_aac_read_bit_rev(it_bit_buff);
    417 
    418     *ptr_position += 1;
    419   } else {
    420     bit = ixheaacd_aac_read_bit(it_bit_buff);
    421 
    422     *ptr_position -= 1;
    423   }
    424 
    425   return (bit);
    426 }
    427 
    428 static WORD8 ixheaacd_rvlc_decode_escape_word(ia_rvlc_info_struct *ptr_rvlc,
    429                                               ia_bit_buf_struct *it_bit_buff) {
    430   WORD32 i;
    431 
    432   UWORD8 carry_bit;
    433 
    434   UWORD16 *ptr_bitstream_index_esc;
    435 
    436   int len = 0;
    437   int codeword = 0;
    438   int found = 0;
    439   int indx;
    440 
    441   ptr_bitstream_index_esc = &(ptr_rvlc->esc_bit_str_idx);
    442 
    443   for (i = MAX_LEN_RVLC_ESCAPE_WORD - 1; i >= 0; i--) {
    444     carry_bit =
    445         ixheaacd_rvlc_read_bits(it_bit_buff, ptr_bitstream_index_esc, FWD);
    446 
    447     len++;
    448     codeword = codeword << 1 | carry_bit;
    449     indx = ixheaacd_rvlc_decode_esc(codeword, len, &found);
    450 
    451     if (found) {
    452       ptr_rvlc->rvlc_esc_len -= (MAX_LEN_RVLC_ESCAPE_WORD - i);
    453       return indx;
    454     }
    455   }
    456 
    457   ptr_rvlc->rvlc_err_log |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
    458 
    459   return -1;
    460 }
    461 
    462 static VOID ixheaacd_rvlc_decode_escape(ia_rvlc_info_struct *ptr_rvlc,
    463                                         WORD16 *ptr_escape,
    464                                         ia_bit_buf_struct *it_bit_buff) {
    465   WORD8 esc_word;
    466   WORD8 esc_cnt = 0;
    467   WORD16 *ptr_esc_bit_cnt_sum;
    468 
    469   ptr_esc_bit_cnt_sum = &(ptr_rvlc->rvlc_esc_len);
    470 
    471   while (*ptr_esc_bit_cnt_sum > 0) {
    472     esc_word = ixheaacd_rvlc_decode_escape_word(ptr_rvlc, it_bit_buff);
    473 
    474     if (esc_word >= 0) {
    475       ptr_escape[esc_cnt] = esc_word;
    476       esc_cnt++;
    477     } else {
    478       ptr_rvlc->rvlc_err_log |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
    479       ptr_rvlc->num_esc_words_decoded = esc_cnt;
    480 
    481       return;
    482     }
    483   }
    484 
    485   ptr_rvlc->num_esc_words_decoded = esc_cnt;
    486 }
    487 
    488 WORD8 ixheaacd_decode_rvlc_code_word(ia_bit_buf_struct *it_bit_buff,
    489                                      ia_rvlc_info_struct *ptr_rvlc) {
    490   WORD32 i;
    491 
    492   UWORD8 carry_bit;
    493 
    494   UWORD8 direction = ptr_rvlc->direction;
    495   UWORD16 *ptr_bit_str_idx_rvl = ptr_rvlc->ptr_rvl_bit_str_idx;
    496 
    497   int len = 0;
    498   short codeword = 0;
    499   int found = 0;
    500   int indx;
    501 
    502   for (i = MAX_LEN_RVLC_CODE_WORD - 1; i >= 0; i--) {
    503     carry_bit =
    504         ixheaacd_rvlc_read_bits(it_bit_buff, ptr_bit_str_idx_rvl, direction);
    505 
    506     len++;
    507     codeword = codeword << 1 | carry_bit;
    508     indx = ixheaacd_rvlc_decode(codeword, len, &found);
    509     if (found) {
    510       indx = indx + 7;
    511       *ptr_rvlc->ptr_rvl_bit_cnt -= (MAX_LEN_RVLC_CODE_WORD - i);
    512       return indx;
    513     }
    514   }
    515 
    516   return -1;
    517 }
    518 
    519 static VOID ixheaacd_rvlc_decode_forward(
    520     ia_rvlc_info_struct *ptr_rvlc,
    521     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
    522     ia_bit_buf_struct *it_bit_buff) {
    523   WORD32 band = 0;
    524   WORD32 group = 0;
    525   WORD32 bnds = 0;
    526 
    527   WORD16 dpcm;
    528 
    529   ia_bit_buf_struct temp_buf;
    530 
    531   WORD16 factor = ptr_aac_dec_channel_info->global_gain;
    532   WORD16 position = 0;
    533   WORD16 noise_energy = ptr_aac_dec_channel_info->global_gain - 90 - 256;
    534 
    535   WORD16 *ptr_scf_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr;
    536   WORD16 *ptr_scf_esc = ptr_aac_dec_channel_info->rvlc_scf_esc_arr;
    537   UWORD8 *ptr_esc_fwd_cnt = &(ptr_rvlc->num_fwd_esc_words_decoded);
    538 
    539   ptr_rvlc->ptr_rvl_bit_cnt = &(ptr_rvlc->rvlc_sf_fwd_len);
    540   ptr_rvlc->ptr_rvl_bit_str_idx = &(ptr_rvlc->rvl_fwd_bit_str_idx);
    541 
    542   *ptr_esc_fwd_cnt = 0;
    543   ptr_rvlc->direction = 0;
    544   ptr_rvlc->noise_used = 0;
    545   ptr_rvlc->sf_used = 0;
    546   ptr_rvlc->last_scale_fac = 0;
    547   ptr_rvlc->last_nrg = 0;
    548   ptr_rvlc->is_last = 0;
    549 
    550   ixheaacd_rvlc_check_intensity_cb(ptr_rvlc, ptr_aac_dec_channel_info);
    551 
    552   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
    553     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
    554       bnds = 16 * group + band;
    555 
    556       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
    557         case ZERO_HCB:
    558           ptr_scf_fwd[bnds] = 0;
    559           break;
    560 
    561         case INTENSITY_HCB2:
    562         case INTENSITY_HCB:
    563 
    564         {
    565           dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    566           if (dpcm < 0) {
    567             ptr_rvlc->conceal_max = bnds;
    568             return;
    569           }
    570           dpcm -= 7;
    571         }
    572           if ((dpcm == -7) || (dpcm == 7)) {
    573             if (ptr_rvlc->rvlc_esc_len) {
    574               ptr_rvlc->conceal_max = bnds;
    575               return;
    576             } else {
    577               if (dpcm == -7) {
    578                 dpcm -= *ptr_scf_esc++;
    579               } else {
    580                 dpcm += *ptr_scf_esc++;
    581               }
    582               (*ptr_esc_fwd_cnt)++;
    583               if (ptr_rvlc->conceal_max_esc == 1311) {
    584                 ptr_rvlc->conceal_max_esc = bnds;
    585               }
    586             }
    587           }
    588           position += dpcm;
    589           ptr_scf_fwd[bnds] = position;
    590           ptr_rvlc->is_last = position;
    591           break;
    592 
    593         case NOISE_HCB:
    594           if (ptr_rvlc->noise_used == 0) {
    595             ptr_rvlc->noise_used = 1;
    596             ptr_rvlc->first_noise_band = bnds;
    597             noise_energy += ptr_rvlc->dpcm_noise_nrg;
    598             ptr_scf_fwd[bnds] = noise_energy;
    599             ptr_rvlc->last_nrg = noise_energy;
    600           } else {
    601             dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    602             if (dpcm < 0) {
    603               ptr_rvlc->conceal_max = bnds;
    604               return;
    605             }
    606             dpcm -= 7;
    607             if ((dpcm == -7) || (dpcm == 7)) {
    608               if (ptr_rvlc->rvlc_esc_len) {
    609                 ptr_rvlc->conceal_max = bnds;
    610                 return;
    611               } else {
    612                 if (dpcm == -7) {
    613                   dpcm -= *ptr_scf_esc++;
    614                 } else {
    615                   dpcm += *ptr_scf_esc++;
    616                 }
    617                 (*ptr_esc_fwd_cnt)++;
    618                 if (ptr_rvlc->conceal_max_esc == 1311) {
    619                   ptr_rvlc->conceal_max_esc = bnds;
    620                 }
    621               }
    622             }
    623             noise_energy += dpcm;
    624             ptr_scf_fwd[bnds] = noise_energy;
    625             ptr_rvlc->last_nrg = noise_energy;
    626           }
    627           ptr_aac_dec_channel_info->str_pns_info.pns_used[bnds] = 1;
    628           break;
    629 
    630         default:
    631           ptr_rvlc->sf_used = 1;
    632           {
    633             memcpy(&temp_buf, it_bit_buff, sizeof(ia_bit_buf_struct));
    634 
    635             dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    636             if (dpcm < 0) {
    637               ptr_rvlc->conceal_max = bnds;
    638               return;
    639             }
    640             dpcm -= 7;
    641           }
    642           if ((dpcm == -7) || (dpcm == 7)) {
    643             if (ptr_rvlc->rvlc_esc_len) {
    644               ptr_rvlc->conceal_max = bnds;
    645               return;
    646             } else {
    647               if (dpcm == -7) {
    648                 dpcm -= *ptr_scf_esc++;
    649               } else {
    650                 dpcm += *ptr_scf_esc++;
    651               }
    652               (*ptr_esc_fwd_cnt)++;
    653               if (ptr_rvlc->conceal_max_esc == 1311) {
    654                 ptr_rvlc->conceal_max_esc = bnds;
    655               }
    656             }
    657           }
    658           factor += dpcm;
    659           ptr_scf_fwd[bnds] = factor;
    660           ptr_rvlc->last_scale_fac = factor;
    661           break;
    662       }
    663     }
    664   }
    665 
    666   if (ptr_rvlc->intensity_used) {
    667     dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    668     if (dpcm < 0) {
    669       ptr_rvlc->conceal_max = bnds;
    670       return;
    671     }
    672     dpcm -= 7;
    673     if ((dpcm == -7) || (dpcm == 7)) {
    674       if (ptr_rvlc->rvlc_esc_len) {
    675         ptr_rvlc->conceal_max = bnds;
    676         return;
    677       } else {
    678         if (dpcm == -7) {
    679           dpcm -= *ptr_scf_esc++;
    680         } else {
    681           dpcm += *ptr_scf_esc++;
    682         }
    683         (*ptr_esc_fwd_cnt)++;
    684         if (ptr_rvlc->conceal_max_esc == 1311) {
    685           ptr_rvlc->conceal_max_esc = bnds;
    686         }
    687       }
    688     }
    689     ptr_rvlc->dpcm_is_last_pos = dpcm;
    690   }
    691 }
    692 
    693 static VOID ixheaacd_rvlc_decode_backward(
    694     ia_rvlc_info_struct *ptr_rvlc,
    695     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
    696     ia_bit_buf_struct *it_bit_buff) {
    697   WORD16 band, group, dpcm, ixheaacd_drc_offset;
    698   WORD16 bnds = ptr_rvlc->max_sfb_transmitted - 1;
    699 
    700   WORD16 factor = ptr_rvlc->rev_global_gain;
    701   WORD16 position = ptr_rvlc->dpcm_is_last_pos;
    702   WORD16 noise_energy =
    703       ptr_rvlc->rev_global_gain + ptr_rvlc->dpcm_noise_last_pos - 90 - 256;
    704 
    705   WORD16 *ptr_scf_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr;
    706   WORD16 *ptr_scf_esc = ptr_aac_dec_channel_info->rvlc_scf_esc_arr;
    707   UWORD8 *ptr_esc_cnt = &(ptr_rvlc->num_esc_words_decoded);
    708   UWORD8 *ptr_esc_bwd_cnt = &(ptr_rvlc->num_bwd_esc_words_decoded);
    709 
    710   ptr_rvlc->ptr_rvl_bit_cnt = &(ptr_rvlc->rvlc_sf_bwd_len);
    711   ptr_rvlc->ptr_rvl_bit_str_idx = &(ptr_rvlc->rvl_bwd_bit_str_idx);
    712 
    713   *ptr_esc_bwd_cnt = 0;
    714   ptr_rvlc->direction = 1;
    715   ptr_scf_esc += *ptr_esc_cnt - 1;
    716   ptr_rvlc->firt_scale_fac = 0;
    717   ptr_rvlc->first_nrg = 0;
    718   ptr_rvlc->is_first = 0;
    719 
    720   if (ptr_rvlc->intensity_used) {
    721     dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    722     if (dpcm < 0) {
    723       ptr_rvlc->dpcm_is_last_pos = 0;
    724       ptr_rvlc->conceal_min = bnds;
    725       return;
    726     }
    727     dpcm -= 7;
    728     if ((dpcm == -7) || (dpcm == 7)) {
    729       if (ptr_rvlc->rvlc_esc_len) {
    730         ptr_rvlc->conceal_min = bnds;
    731         return;
    732       } else {
    733         if (dpcm == -7) {
    734           dpcm -= *ptr_scf_esc--;
    735         } else {
    736           dpcm += *ptr_scf_esc--;
    737         }
    738         (*ptr_esc_bwd_cnt)++;
    739         if (ptr_rvlc->conceal_min_esc == -1311) {
    740           ptr_rvlc->conceal_min_esc = bnds;
    741         }
    742       }
    743     }
    744     ptr_rvlc->dpcm_is_last_pos = dpcm;
    745   }
    746 
    747   for (group = ptr_rvlc->num_wind_grps - 1; group >= 0; group--) {
    748     for (band = ptr_rvlc->max_sfb_transmitted - 1; band >= 0; band--) {
    749       bnds = 16 * group + band;
    750       if ((band == 0) && (ptr_rvlc->num_wind_grps != 1))
    751         ixheaacd_drc_offset = 16 - ptr_rvlc->max_sfb_transmitted + 1;
    752       else
    753         ixheaacd_drc_offset = 1;
    754 
    755       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
    756         case ZERO_HCB:
    757           ptr_scf_bwd[bnds] = 0;
    758           break;
    759 
    760         case INTENSITY_HCB2:
    761         case INTENSITY_HCB:
    762 
    763           dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    764           if (dpcm < 0) {
    765             ptr_scf_bwd[bnds] = position;
    766 
    767             return;
    768           }
    769           dpcm -= 7;
    770           if ((dpcm == -7) || (dpcm == 7)) {
    771             if (ptr_rvlc->rvlc_esc_len) {
    772               ptr_scf_bwd[bnds] = position;
    773 
    774               return;
    775             } else {
    776               if (dpcm == -7) {
    777                 dpcm -= *ptr_scf_esc--;
    778               } else {
    779                 dpcm += *ptr_scf_esc--;
    780               }
    781               (*ptr_esc_bwd_cnt)++;
    782               if (ptr_rvlc->conceal_min_esc == -1311) {
    783               }
    784             }
    785           }
    786           ptr_scf_bwd[bnds] = position;
    787           position -= dpcm;
    788           ptr_rvlc->is_first = position;
    789           break;
    790 
    791         case NOISE_HCB:
    792           if (bnds == ptr_rvlc->first_noise_band) {
    793             ptr_scf_bwd[bnds] = ptr_rvlc->dpcm_noise_nrg +
    794                                 ptr_aac_dec_channel_info->global_gain - 90 -
    795                                 256;
    796             ptr_rvlc->first_nrg = ptr_scf_bwd[bnds];
    797           } else {
    798             dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    799             if (dpcm < 0) {
    800               ptr_scf_bwd[bnds] = noise_energy;
    801               return;
    802             }
    803             dpcm -= 7;
    804             if ((dpcm == -7) || (dpcm == 7)) {
    805               if (ptr_rvlc->rvlc_esc_len) {
    806                 ptr_scf_bwd[bnds] = noise_energy;
    807                 return;
    808               } else {
    809                 if (dpcm == -7) {
    810                   dpcm -= *ptr_scf_esc--;
    811                 } else {
    812                   dpcm += *ptr_scf_esc--;
    813                 }
    814                 (*ptr_esc_bwd_cnt)++;
    815                 if (ptr_rvlc->conceal_min_esc == -1311) {
    816                 }
    817               }
    818             }
    819             ptr_scf_bwd[bnds] = noise_energy;
    820             noise_energy -= dpcm;
    821             ptr_rvlc->first_nrg = noise_energy;
    822           }
    823           break;
    824 
    825         default:
    826           dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
    827           if (dpcm < 0) {
    828             ptr_scf_bwd[bnds] = factor;
    829 
    830             return;
    831           }
    832           dpcm -= 7;
    833           if ((dpcm == -7) || (dpcm == 7)) {
    834             if (ptr_rvlc->rvlc_esc_len) {
    835               ptr_scf_bwd[bnds] = factor;
    836 
    837               return;
    838             } else {
    839               if (dpcm == -7) {
    840                 dpcm -= *ptr_scf_esc--;
    841               } else {
    842                 dpcm += *ptr_scf_esc--;
    843               }
    844               (*ptr_esc_bwd_cnt)++;
    845               if (ptr_rvlc->conceal_min_esc == -1311) {
    846               }
    847             }
    848           }
    849           ptr_scf_bwd[bnds] = factor;
    850           factor -= dpcm;
    851           ptr_rvlc->firt_scale_fac = factor;
    852           break;
    853       }
    854     }
    855   }
    856 }
    857 
    858 VOID ixheaacd_rvlc_read(
    859     ia_bit_buf_struct *it_bit_buff,
    860     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
    861   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
    862 
    863   WORD32 group, band;
    864 
    865   ptr_rvlc->num_wind_grps =
    866       ptr_aac_dec_channel_info->str_ics_info.num_window_groups;
    867   ptr_rvlc->max_sfb_transmitted =
    868       ptr_aac_dec_channel_info->str_ics_info.max_sfb;
    869   ptr_rvlc->noise_used = 0;
    870   ptr_rvlc->dpcm_noise_nrg = 0;
    871   ptr_rvlc->dpcm_noise_last_pos = 0;
    872   ptr_rvlc->rvlc_esc_len = -1;
    873   ptr_rvlc->dpcm_is_last_pos = 0;
    874 
    875   ptr_rvlc->sf_concealment = ixheaacd_read_bits_buf(it_bit_buff, 1);
    876   ptr_rvlc->rev_global_gain = ixheaacd_read_bits_buf(it_bit_buff, 8);
    877 
    878   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
    879       EIGHT_SHORT_SEQUENCE) {
    880     ptr_rvlc->rvlc_sf_len = ixheaacd_read_bits_buf(it_bit_buff, 11);
    881   } else {
    882     ptr_rvlc->rvlc_sf_len = ixheaacd_read_bits_buf(it_bit_buff, 9);
    883   }
    884 
    885   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
    886     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
    887       if (ptr_aac_dec_channel_info->ptr_code_book[16 * group + band] ==
    888           NOISE_HCB) {
    889         ptr_rvlc->noise_used = 1;
    890         break;
    891       }
    892     }
    893   }
    894 
    895   if (ptr_rvlc->noise_used)
    896     ptr_rvlc->dpcm_noise_nrg = ixheaacd_read_bits_buf(it_bit_buff, 9);
    897 
    898   ptr_rvlc->sf_esc_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
    899 
    900   if (ptr_rvlc->sf_esc_present) {
    901     ptr_rvlc->rvlc_esc_len = ixheaacd_read_bits_buf(it_bit_buff, 8);
    902   }
    903 
    904   if (ptr_rvlc->noise_used) {
    905     ptr_rvlc->dpcm_noise_last_pos = ixheaacd_read_bits_buf(it_bit_buff, 9);
    906     ptr_rvlc->rvlc_sf_len -= 9;
    907   }
    908 
    909   ptr_rvlc->rvlc_sf_fwd_len = ptr_rvlc->rvlc_sf_len;
    910   ptr_rvlc->rvlc_sf_bwd_len = ptr_rvlc->rvlc_sf_len;
    911 }
    912 
    913 VOID ixheaacd_hcr_read(ia_bit_buf_struct *it_bit_buff,
    914                        ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
    915                        WORD32 ele_type) {
    916   WORD16 len_reordered_spec_data;
    917   WORD8 len_longest_code_word;
    918 
    919   ptr_aac_dec_channel_info->reorder_spect_data_len = 0;
    920   ptr_aac_dec_channel_info->longest_cw_len = 0;
    921 
    922   len_reordered_spec_data = ixheaacd_read_bits_buf(it_bit_buff, 14);
    923   if (ele_type == ID_CPE) {
    924     if ((len_reordered_spec_data >= 0) && (len_reordered_spec_data <= 12288)) {
    925       ptr_aac_dec_channel_info->reorder_spect_data_len =
    926           len_reordered_spec_data;
    927     } else {
    928       if (len_reordered_spec_data > 12288) {
    929         ptr_aac_dec_channel_info->reorder_spect_data_len = 12288;
    930       }
    931     }
    932   } else if (ele_type == ID_SCE || ele_type == ID_LFE || ele_type == ID_CCE) {
    933     if ((len_reordered_spec_data >= 0) && (len_reordered_spec_data <= 6144)) {
    934       ptr_aac_dec_channel_info->reorder_spect_data_len =
    935           len_reordered_spec_data;
    936     } else {
    937       if (len_reordered_spec_data > 6144) {
    938         ptr_aac_dec_channel_info->reorder_spect_data_len = 6144;
    939       }
    940     }
    941   }
    942 
    943   len_longest_code_word = ixheaacd_read_bits_buf(it_bit_buff, 6);
    944   if ((len_longest_code_word >= 0) && (len_longest_code_word <= 49)) {
    945     ptr_aac_dec_channel_info->longest_cw_len = len_longest_code_word;
    946   } else {
    947     if (len_longest_code_word > 49) {
    948       ptr_aac_dec_channel_info->longest_cw_len = 49;
    949     }
    950   }
    951 }
    952 
    953 static VOID ixheaacd_rvlc_init(
    954     ia_rvlc_info_struct *ptr_rvlc,
    955     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
    956     ia_bit_buf_struct *it_bit_buff) {
    957   WORD16 *ptr_scf_esc = ptr_aac_dec_channel_info->rvlc_scf_esc_arr;
    958   WORD16 *ptr_scf_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr;
    959   WORD16 *ptr_scf_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr;
    960   WORD16 *ptr_scale_factor = ptr_aac_dec_channel_info->ptr_scale_factor;
    961   WORD32 bnds;
    962 
    963   ptr_aac_dec_channel_info->rvlc_intensity_used = 0;
    964 
    965   ptr_rvlc->num_esc_words_decoded = 0;
    966   ptr_rvlc->num_fwd_esc_words_decoded = 0;
    967   ptr_rvlc->num_bwd_esc_words_decoded = 0;
    968 
    969   ptr_rvlc->intensity_used = 0;
    970   ptr_rvlc->rvlc_err_log = 0;
    971 
    972   ptr_rvlc->conceal_max = CONCEAL_MAX_INIT;
    973   ptr_rvlc->conceal_min = CONCEAL_MIN_INIT;
    974 
    975   ptr_rvlc->conceal_max_esc = CONCEAL_MAX_INIT;
    976   ptr_rvlc->conceal_min_esc = CONCEAL_MIN_INIT;
    977 
    978   for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) {
    979     ptr_scf_fwd[bnds] = 0;
    980     ptr_scf_bwd[bnds] = 0;
    981     ptr_scf_esc[bnds] = 0;
    982     ptr_scale_factor[bnds] = 0;
    983   }
    984 
    985   ptr_rvlc->rvl_fwd_bit_str_idx = it_bit_buff->size - it_bit_buff->cnt_bits;
    986   ptr_rvlc->rvl_bwd_bit_str_idx =
    987       it_bit_buff->size - it_bit_buff->cnt_bits + ptr_rvlc->rvlc_sf_len - 1;
    988 
    989   it_bit_buff->cnt_bits -= ptr_rvlc->rvlc_sf_len;
    990   it_bit_buff->ptr_read_next =
    991       it_bit_buff->ptr_bit_buf_base +
    992       ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
    993   it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
    994 
    995   if (ptr_rvlc->sf_esc_present != 0) {
    996     ptr_rvlc->esc_bit_str_idx = it_bit_buff->size - it_bit_buff->cnt_bits;
    997 
    998     it_bit_buff->cnt_bits -= ptr_rvlc->rvlc_esc_len;
    999     it_bit_buff->ptr_read_next =
   1000         it_bit_buff->ptr_bit_buf_base +
   1001         ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
   1002     it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
   1003   }
   1004 }
   1005 
   1006 VOID ixheaacd_bi_dir_est_scf_prev_frame_reference(
   1007     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
   1008     ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
   1009   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   1010   WORD32 band, bnds, start_band, end_band, group;
   1011   WORD32 conceal_min, conceal_max;
   1012   WORD32 conceal_group_min, conceal_group_max;
   1013   WORD32 max_scf_bands;
   1014   WORD32 common_min;
   1015 
   1016   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1017       EIGHT_SHORT_SEQUENCE) {
   1018     max_scf_bands = 16;
   1019   } else {
   1020     max_scf_bands = 64;
   1021   }
   1022 
   1023   if (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) ptr_rvlc->conceal_min = 0;
   1024 
   1025   if (ptr_rvlc->conceal_max == CONCEAL_MAX_INIT)
   1026     ptr_rvlc->conceal_max =
   1027         (ptr_rvlc->num_wind_grps - 1) * 16 + ptr_rvlc->max_sfb_transmitted - 1;
   1028 
   1029   conceal_min = ptr_rvlc->conceal_min % max_scf_bands;
   1030   conceal_group_min = ptr_rvlc->conceal_min / max_scf_bands;
   1031   conceal_max = ptr_rvlc->conceal_max % max_scf_bands;
   1032   conceal_group_max = ptr_rvlc->conceal_max / max_scf_bands;
   1033 
   1034   ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_max] =
   1035       ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_max];
   1036   ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_min] =
   1037       ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_min];
   1038 
   1039   start_band = conceal_min;
   1040   if (conceal_group_min == conceal_group_max)
   1041     end_band = conceal_max;
   1042   else
   1043     end_band = ptr_rvlc->max_sfb_transmitted - 1;
   1044 
   1045   for (group = conceal_group_min; group <= conceal_group_max; group++) {
   1046     for (band = start_band; band <= end_band; band++) {
   1047       bnds = 16 * group + band;
   1048       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1049         case ZERO_HCB:
   1050           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = 0;
   1051           break;
   1052 
   1053         case INTENSITY_HCB:
   1054         case INTENSITY_HCB2:
   1055           if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
   1056                INTENSITY_HCB) ||
   1057               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
   1058                INTENSITY_HCB2)) {
   1059             common_min = ixheaacd_min32(
   1060                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1061                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1062             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1063                 common_min,
   1064                 ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
   1065           } else {
   1066             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1067                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1068                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1069           }
   1070           break;
   1071 
   1072         case NOISE_HCB:
   1073           if (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
   1074               NOISE_HCB) {
   1075             common_min = ixheaacd_min32(
   1076                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1077                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1078             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1079                 common_min,
   1080                 ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
   1081           } else {
   1082             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1083                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1084                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1085           }
   1086           break;
   1087 
   1088         default:
   1089           if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1090                ZERO_HCB) &&
   1091               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1092                NOISE_HCB) &&
   1093               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1094                INTENSITY_HCB) &&
   1095               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1096                INTENSITY_HCB2)) {
   1097             common_min = ixheaacd_min32(
   1098                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1099                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1100             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1101                 common_min,
   1102                 ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
   1103           } else {
   1104             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1105                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1106                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1107           }
   1108           break;
   1109       }
   1110     }
   1111     start_band = 0;
   1112     if ((group + 1) == conceal_group_max) end_band = conceal_max;
   1113   }
   1114 
   1115   if (conceal_group_min == 0)
   1116     end_band = conceal_min;
   1117   else
   1118     end_band = ptr_rvlc->max_sfb_transmitted;
   1119   for (group = 0; group <= conceal_group_min; group++) {
   1120     for (band = 0; band < end_band; band++) {
   1121       bnds = 16 * group + band;
   1122       ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1123           ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1124     }
   1125     if ((group + 1) == conceal_group_min) end_band = conceal_min;
   1126   }
   1127 
   1128   start_band = conceal_max + 1;
   1129   for (group = conceal_group_max; group < ptr_rvlc->num_wind_grps; group++) {
   1130     for (band = start_band; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1131       bnds = 16 * group + band;
   1132       ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1133           ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1134     }
   1135     start_band = 0;
   1136   }
   1137 }
   1138 
   1139 static VOID ixheaacd_calc_ref_val_fwd(
   1140     ia_rvlc_info_struct *ptr_rvlc,
   1141     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD32 *ref_fwd,
   1142     WORD32 *ref_nrg_fwd, WORD32 *ref_scf_fwd) {
   1143   WORD32 band, bnds, group, start_band;
   1144   WORD32 id_is, id_nrg, id_scf;
   1145   WORD32 conceal_min, conceal_group_min;
   1146   WORD32 max_scf_bands;
   1147 
   1148   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1149       EIGHT_SHORT_SEQUENCE)
   1150     max_scf_bands = 16;
   1151   else
   1152     max_scf_bands = 64;
   1153 
   1154   conceal_min = ptr_rvlc->conceal_min % max_scf_bands;
   1155   conceal_group_min = ptr_rvlc->conceal_min / max_scf_bands;
   1156 
   1157   id_is = id_nrg = id_scf = 1;
   1158 
   1159   *ref_nrg_fwd = ptr_aac_dec_channel_info->global_gain - 90 - 256;
   1160   *ref_scf_fwd = ptr_aac_dec_channel_info->global_gain;
   1161 
   1162   start_band = conceal_min - 1;
   1163   for (group = conceal_group_min; group >= 0; group--) {
   1164     for (band = start_band; band >= 0; band--) {
   1165       bnds = 16 * group + band;
   1166       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1167         case ZERO_HCB:
   1168           break;
   1169         case INTENSITY_HCB:
   1170         case INTENSITY_HCB2:
   1171           if (id_is) {
   1172             *ref_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1173             id_is = 0;
   1174           }
   1175           break;
   1176         case NOISE_HCB:
   1177           if (id_nrg) {
   1178             *ref_nrg_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1179             id_nrg = 0;
   1180           }
   1181           break;
   1182         default:
   1183           if (id_scf) {
   1184             *ref_scf_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1185             id_scf = 0;
   1186           }
   1187           break;
   1188       }
   1189     }
   1190     start_band = ptr_rvlc->max_sfb_transmitted - 1;
   1191   }
   1192 }
   1193 
   1194 static VOID ixheaacd_calc_ref_val_bwd(
   1195     ia_rvlc_info_struct *ptr_rvlc,
   1196     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD32 *ref_bwd,
   1197     WORD32 *ref_nrg_bwd, WORD32 *ref_scf_bwd) {
   1198   WORD32 band, bnds, group, start_band;
   1199   WORD32 id_is, id_nrg, id_scf;
   1200   WORD32 conceal_max, conceal_group_max;
   1201   WORD32 max_scf_bands;
   1202 
   1203   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1204       EIGHT_SHORT_SEQUENCE)
   1205     max_scf_bands = 16;
   1206   else
   1207     max_scf_bands = 64;
   1208 
   1209   conceal_max = ptr_rvlc->conceal_max % max_scf_bands;
   1210   conceal_group_max = ptr_rvlc->conceal_max / max_scf_bands;
   1211 
   1212   id_is = id_nrg = id_scf = 1;
   1213 
   1214   *ref_bwd = ptr_rvlc->dpcm_is_last_pos;
   1215   *ref_nrg_bwd = ptr_rvlc->rev_global_gain + ptr_rvlc->dpcm_noise_last_pos -
   1216                  90 - 256 + ptr_rvlc->dpcm_noise_nrg;
   1217   *ref_scf_bwd = ptr_rvlc->rev_global_gain;
   1218 
   1219   start_band = conceal_max + 1;
   1220 
   1221   for (group = conceal_group_max; group < ptr_rvlc->num_wind_grps; group++) {
   1222     for (band = start_band; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1223       bnds = 16 * group + band;
   1224       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1225         case ZERO_HCB:
   1226           break;
   1227         case INTENSITY_HCB:
   1228         case INTENSITY_HCB2:
   1229           if (id_is) {
   1230             *ref_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1231             id_is = 0;
   1232           }
   1233           break;
   1234         case NOISE_HCB:
   1235           if (id_nrg) {
   1236             *ref_nrg_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1237             id_nrg = 0;
   1238           }
   1239           break;
   1240         default:
   1241           if (id_scf) {
   1242             *ref_scf_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1243             id_scf = 0;
   1244           }
   1245           break;
   1246       }
   1247     }
   1248     start_band = 0;
   1249   }
   1250 }
   1251 
   1252 VOID ixheaacd_bi_dir_est_lower_scf_cur_frame(
   1253     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
   1254   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   1255   WORD32 band, bnds, start_band, end_band, group;
   1256   WORD32 conceal_min, conceal_max;
   1257   WORD32 conceal_group_min, conceal_group_max;
   1258   WORD32 max_scf_bands;
   1259 
   1260   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1261       EIGHT_SHORT_SEQUENCE) {
   1262     max_scf_bands = 16;
   1263   } else {
   1264     max_scf_bands = 64;
   1265   }
   1266 
   1267   if (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) ptr_rvlc->conceal_min = 0;
   1268 
   1269   if (ptr_rvlc->conceal_max == CONCEAL_MAX_INIT)
   1270     ptr_rvlc->conceal_max =
   1271         (ptr_rvlc->num_wind_grps - 1) * 16 + ptr_rvlc->max_sfb_transmitted - 1;
   1272 
   1273   conceal_min = ptr_rvlc->conceal_min % max_scf_bands;
   1274   conceal_group_min = ptr_rvlc->conceal_min / max_scf_bands;
   1275   conceal_max = ptr_rvlc->conceal_max % max_scf_bands;
   1276   conceal_group_max = ptr_rvlc->conceal_max / max_scf_bands;
   1277 
   1278   if (ptr_rvlc->conceal_min == ptr_rvlc->conceal_max) {
   1279     WORD32 ref_fwd, ref_nrg_fwd, ref_scf_fwd;
   1280     WORD32 ref_bwd, ref_nrg_bwd, ref_scf_bwd;
   1281 
   1282     bnds = ptr_rvlc->conceal_min;
   1283     ixheaacd_calc_ref_val_fwd(ptr_rvlc, ptr_aac_dec_channel_info, &ref_fwd,
   1284                               &ref_nrg_fwd, &ref_scf_fwd);
   1285     ixheaacd_calc_ref_val_bwd(ptr_rvlc, ptr_aac_dec_channel_info, &ref_bwd,
   1286                               &ref_nrg_bwd, &ref_scf_bwd);
   1287 
   1288     switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1289       case ZERO_HCB:
   1290         break;
   1291       case INTENSITY_HCB:
   1292       case INTENSITY_HCB2:
   1293         if (ref_fwd < ref_bwd)
   1294           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_fwd;
   1295         else
   1296           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_bwd;
   1297         break;
   1298       case NOISE_HCB:
   1299         if (ref_nrg_fwd < ref_nrg_bwd)
   1300           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_nrg_fwd;
   1301         else
   1302           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_nrg_bwd;
   1303         break;
   1304       default:
   1305         if (ref_scf_fwd < ref_scf_bwd)
   1306           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_scf_fwd;
   1307         else
   1308           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_scf_bwd;
   1309         break;
   1310     }
   1311   } else {
   1312     ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_max] =
   1313         ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_max];
   1314     ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_min] =
   1315         ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_min];
   1316 
   1317     start_band = conceal_min;
   1318     if (conceal_group_min == conceal_group_max)
   1319       end_band = conceal_max;
   1320     else
   1321       end_band = ptr_rvlc->max_sfb_transmitted - 1;
   1322 
   1323     for (group = conceal_group_min; group <= conceal_group_max; group++) {
   1324       for (band = start_band; band <= end_band; band++) {
   1325         bnds = 16 * group + band;
   1326         if (ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds] <
   1327             ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds])
   1328           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1329               ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1330         else
   1331           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1332               ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1333       }
   1334       start_band = 0;
   1335       if ((group + 1) == conceal_group_max) end_band = conceal_max;
   1336     }
   1337   }
   1338 
   1339   if (conceal_group_min == 0)
   1340     end_band = conceal_min;
   1341   else
   1342     end_band = ptr_rvlc->max_sfb_transmitted;
   1343   for (group = 0; group <= conceal_group_min; group++) {
   1344     for (band = 0; band < end_band; band++) {
   1345       bnds = 16 * group + band;
   1346       ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1347           ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1348     }
   1349     if ((group + 1) == conceal_group_min) end_band = conceal_min;
   1350   }
   1351 
   1352   start_band = conceal_max + 1;
   1353   for (group = conceal_group_max; group < ptr_rvlc->num_wind_grps; group++) {
   1354     for (band = start_band; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1355       bnds = 16 * group + band;
   1356       ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1357           ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1358     }
   1359     start_band = 0;
   1360   }
   1361 }
   1362 
   1363 VOID ixheaacd_statistical_estimation(
   1364     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
   1365   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   1366   WORD32 band, bnds, group;
   1367   WORD32 sum_fwd, sum_bwd;
   1368   WORD32 sum_nrg_fwd, sum_nrg_bwd;
   1369   WORD32 sum_scf_fwd, sum_scf_bwd;
   1370   WORD32 use_fwd, use_nrg_fwd, use_scf_fwd;
   1371   WORD32 max_scf_bands;
   1372 
   1373   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1374       EIGHT_SHORT_SEQUENCE)
   1375     max_scf_bands = 16;
   1376   else
   1377     max_scf_bands = 64;
   1378 
   1379   sum_fwd = sum_bwd = sum_nrg_fwd = sum_nrg_bwd = sum_scf_fwd = sum_scf_bwd = 0;
   1380   use_fwd = use_nrg_fwd = use_scf_fwd = 0;
   1381 
   1382   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
   1383     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1384       bnds = 16 * group + band;
   1385       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1386         case ZERO_HCB:
   1387           break;
   1388 
   1389         case INTENSITY_HCB:
   1390         case INTENSITY_HCB2:
   1391           sum_fwd += ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1392           sum_bwd += ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1393           break;
   1394 
   1395         case NOISE_HCB:
   1396           sum_nrg_fwd += ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1397           sum_nrg_bwd += ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1398           break;
   1399 
   1400         default:
   1401           sum_scf_fwd += ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1402           sum_scf_bwd += ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1403           break;
   1404       }
   1405     }
   1406   }
   1407 
   1408   if (sum_fwd < sum_bwd) use_fwd = 1;
   1409 
   1410   if (sum_nrg_fwd < sum_nrg_bwd) use_nrg_fwd = 1;
   1411 
   1412   if (sum_scf_fwd < sum_scf_bwd) use_scf_fwd = 1;
   1413 
   1414   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
   1415     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1416       bnds = 16 * group + band;
   1417       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1418         case ZERO_HCB:
   1419           break;
   1420 
   1421         case INTENSITY_HCB:
   1422         case INTENSITY_HCB2:
   1423           if (use_fwd)
   1424             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1425                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1426           else
   1427             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1428                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1429           break;
   1430 
   1431         case NOISE_HCB:
   1432           if (use_nrg_fwd)
   1433             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1434                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1435           else
   1436             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1437                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1438           break;
   1439 
   1440         default:
   1441           if (use_scf_fwd)
   1442             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1443                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1444           else
   1445             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1446                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
   1447           break;
   1448       }
   1449     }
   1450   }
   1451 }
   1452 
   1453 VOID ixheaacd_predictive_interpolation(
   1454     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
   1455     ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
   1456   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   1457   WORD32 band, bnds, group;
   1458   WORD32 max_scf_bands;
   1459   WORD32 common_min;
   1460 
   1461   if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1462       EIGHT_SHORT_SEQUENCE)
   1463     max_scf_bands = 16;
   1464   else
   1465     max_scf_bands = 64;
   1466 
   1467   for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
   1468     for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1469       bnds = 16 * group + band;
   1470       switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
   1471         case ZERO_HCB:
   1472           ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = 0;
   1473           break;
   1474 
   1475         case INTENSITY_HCB:
   1476         case INTENSITY_HCB2:
   1477           if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
   1478                INTENSITY_HCB) ||
   1479               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
   1480                INTENSITY_HCB2)) {
   1481             common_min = ixheaacd_min32(
   1482                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1483                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1484             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1485                 common_min,
   1486                 ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
   1487           } else {
   1488             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = -110;
   1489           }
   1490           break;
   1491 
   1492         case NOISE_HCB:
   1493           if (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
   1494               NOISE_HCB) {
   1495             common_min = ixheaacd_min32(
   1496                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1497                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1498             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1499                 common_min,
   1500                 ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
   1501           } else {
   1502             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = -110;
   1503           }
   1504           break;
   1505 
   1506         default:
   1507           if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1508                ZERO_HCB) &&
   1509               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1510                NOISE_HCB) &&
   1511               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1512                INTENSITY_HCB) &&
   1513               (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
   1514                INTENSITY_HCB2)) {
   1515             common_min = ixheaacd_min32(
   1516                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
   1517                 ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
   1518             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaacd_min32(
   1519                 common_min,
   1520                 ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
   1521           } else {
   1522             ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = 0;
   1523           }
   1524           break;
   1525       }
   1526     }
   1527   }
   1528 }
   1529 static VOID ixheaacd_rvlc_final_error_detection(
   1530     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
   1531     ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
   1532   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   1533   UWORD8 err_status_complete = 0;
   1534   UWORD8 err_status_length_fwd = 0;
   1535   UWORD8 err_status_length_bwd = 0;
   1536   UWORD8 err_status_length_escape = 0;
   1537   UWORD8 err_status_first_scf = 0;
   1538   UWORD8 err_status_last_scf = 0;
   1539   UWORD8 err_status_first_nrg = 0;
   1540   UWORD8 err_status_last_nrg = 0;
   1541   UWORD8 err_status_first_is = 0;
   1542   UWORD8 err_status_last_is = 0;
   1543   UWORD8 err_status_forbidden_cw_fwd = 0;
   1544   UWORD8 err_status_forbidden_cw_bwd = 0;
   1545   UWORD8 err_status_num_escapes_fwd = 0;
   1546   UWORD8 err_status_num_escapes_bwd = 0;
   1547   UWORD8 conceal_status = 1;
   1548   UWORD8 current_block_type;
   1549 
   1550   ptr_aac_dec_channel_info->rvlc_curr_sf_flag = 1;
   1551 
   1552   if (ptr_rvlc->rvlc_err_log & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD)
   1553     err_status_forbidden_cw_fwd = 1;
   1554 
   1555   if (ptr_rvlc->rvlc_err_log & RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD)
   1556     err_status_forbidden_cw_bwd = 1;
   1557 
   1558   if (ptr_rvlc->rvlc_sf_fwd_len) err_status_length_fwd = 1;
   1559 
   1560   if (ptr_rvlc->rvlc_sf_bwd_len) err_status_length_bwd = 1;
   1561 
   1562   if (ptr_rvlc->sf_esc_present)
   1563     if (ptr_rvlc->rvlc_esc_len) err_status_length_escape = 1;
   1564 
   1565   if (ptr_rvlc->sf_used) {
   1566     if (ptr_rvlc->firt_scale_fac != (ptr_aac_dec_channel_info->global_gain))
   1567       err_status_first_scf = 1;
   1568 
   1569     if (ptr_rvlc->last_scale_fac != (ptr_rvlc->rev_global_gain))
   1570       err_status_last_scf = 1;
   1571   }
   1572 
   1573   if (ptr_rvlc->noise_used) {
   1574     if (ptr_rvlc->first_nrg != (ptr_aac_dec_channel_info->global_gain +
   1575                                 ptr_rvlc->dpcm_noise_nrg - 90 - 256))
   1576       err_status_first_nrg = 1;
   1577 
   1578     if (ptr_rvlc->last_nrg !=
   1579         (ptr_rvlc->rev_global_gain + ptr_rvlc->dpcm_noise_last_pos - 90 - 256))
   1580       err_status_last_nrg = 1;
   1581   }
   1582 
   1583   if (ptr_rvlc->intensity_used) {
   1584     if (ptr_rvlc->is_first != 0) err_status_first_is = 1;
   1585 
   1586     if (ptr_rvlc->is_last != (ptr_rvlc->dpcm_is_last_pos))
   1587       err_status_last_is = 1;
   1588   }
   1589 
   1590   if ((ptr_rvlc->num_fwd_esc_words_decoded !=
   1591        ptr_rvlc->num_esc_words_decoded) &&
   1592       (ptr_rvlc->conceal_max == CONCEAL_MAX_INIT)) {
   1593     err_status_num_escapes_fwd = 1;
   1594   }
   1595 
   1596   if ((ptr_rvlc->num_bwd_esc_words_decoded !=
   1597        ptr_rvlc->num_esc_words_decoded) &&
   1598       (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT)) {
   1599     err_status_num_escapes_bwd = 1;
   1600   }
   1601 
   1602   if (err_status_length_escape ||
   1603       (((ptr_rvlc->conceal_max == CONCEAL_MAX_INIT) &&
   1604         (ptr_rvlc->num_fwd_esc_words_decoded !=
   1605          ptr_rvlc->num_esc_words_decoded) &&
   1606         (err_status_last_scf || err_status_last_nrg || err_status_last_is))
   1607 
   1608        &&
   1609 
   1610        ((ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) &&
   1611         (ptr_rvlc->num_bwd_esc_words_decoded !=
   1612          ptr_rvlc->num_esc_words_decoded) &&
   1613         (err_status_first_scf || err_status_first_nrg ||
   1614          err_status_first_is))) ||
   1615       ((ptr_rvlc->conceal_max == CONCEAL_MAX_INIT) &&
   1616        ((ptr_rvlc->rev_global_gain - ptr_rvlc->last_scale_fac) < -15)) ||
   1617       ((ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) &&
   1618        ((ptr_aac_dec_channel_info->global_gain - ptr_rvlc->firt_scale_fac) <
   1619         -15))) {
   1620     if ((ptr_rvlc->conceal_max == CONCEAL_MAX_INIT) ||
   1621         (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT)) {
   1622       ptr_rvlc->conceal_max = 0;
   1623       ptr_rvlc->conceal_min =
   1624           ixheaacd_max32(0, (ptr_rvlc->num_wind_grps - 1) * 16 +
   1625                                 ptr_rvlc->max_sfb_transmitted - 1);
   1626     } else {
   1627       ptr_rvlc->conceal_max =
   1628           ixheaacd_min32(ptr_rvlc->conceal_max, ptr_rvlc->conceal_max_esc);
   1629       ptr_rvlc->conceal_min =
   1630           ixheaacd_max32(ptr_rvlc->conceal_min, ptr_rvlc->conceal_min_esc);
   1631     }
   1632   }
   1633 
   1634   err_status_complete =
   1635       err_status_last_scf || err_status_first_scf || err_status_last_nrg ||
   1636       err_status_first_nrg || err_status_last_is || err_status_first_is ||
   1637       err_status_forbidden_cw_fwd || err_status_forbidden_cw_bwd ||
   1638       err_status_length_fwd || err_status_length_bwd ||
   1639       err_status_length_escape || err_status_num_escapes_fwd ||
   1640       err_status_num_escapes_bwd;
   1641 
   1642   current_block_type =
   1643       (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
   1644        EIGHT_SHORT_SEQUENCE)
   1645           ? 0
   1646           : 1;
   1647 
   1648   if (!err_status_complete) {
   1649     WORD32 band;
   1650     WORD32 group;
   1651     WORD32 bnds;
   1652     WORD32 last_sfb_idx;
   1653 
   1654     last_sfb_idx = (ptr_rvlc->num_wind_grps > 1) ? 16 : 64;
   1655 
   1656     for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
   1657       for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1658         bnds = 16 * group + band;
   1659         ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
   1660             ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds] =
   1661                 ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
   1662       }
   1663     }
   1664 
   1665     for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
   1666       for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1667         bnds = 16 * group + band;
   1668         ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] =
   1669             ptr_aac_dec_channel_info->ptr_code_book[bnds];
   1670       }
   1671       for (; band < last_sfb_idx; band++) {
   1672         bnds = 16 * group + band;
   1673         ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] = ZERO_HCB;
   1674       }
   1675     }
   1676   } else {
   1677     WORD32 band;
   1678     WORD32 group;
   1679 
   1680     if (((ptr_rvlc->conceal_min != CONCEAL_MIN_INIT) ||
   1681          (ptr_rvlc->conceal_max != CONCEAL_MAX_INIT)) &&
   1682         (ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
   1683         (ptr_aac_dec_static_channel_info->rvlc_prev_blk_type ==
   1684          current_block_type) &&
   1685         ptr_aac_dec_static_channel_info->rvlc_prev_sf_ok &&
   1686         ptr_rvlc->sf_concealment && conceal_status) {
   1687       ixheaacd_bi_dir_est_scf_prev_frame_reference(
   1688           ptr_aac_dec_channel_info, ptr_aac_dec_static_channel_info);
   1689       conceal_status = 0;
   1690     }
   1691 
   1692     if ((ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
   1693         ((ptr_rvlc->conceal_min != CONCEAL_MIN_INIT) ||
   1694          (ptr_rvlc->conceal_max != CONCEAL_MAX_INIT)) &&
   1695         !(ptr_aac_dec_static_channel_info->rvlc_prev_sf_ok &&
   1696           ptr_rvlc->sf_concealment &&
   1697           (ptr_aac_dec_static_channel_info->rvlc_prev_blk_type ==
   1698            current_block_type)) &&
   1699         conceal_status) {
   1700       ixheaacd_bi_dir_est_lower_scf_cur_frame(ptr_aac_dec_channel_info);
   1701       conceal_status = 0;
   1702     }
   1703 
   1704     if ((ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
   1705         ((err_status_last_scf && err_status_first_scf) ||
   1706          (err_status_last_nrg && err_status_first_nrg) ||
   1707          (err_status_last_is && err_status_first_is)) &&
   1708         !(err_status_forbidden_cw_fwd || err_status_forbidden_cw_bwd ||
   1709           err_status_length_escape) &&
   1710         conceal_status) {
   1711       ixheaacd_statistical_estimation(ptr_aac_dec_channel_info);
   1712       conceal_status = 0;
   1713     }
   1714 
   1715     if ((ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
   1716         ptr_aac_dec_static_channel_info->rvlc_prev_sf_ok &&
   1717         ptr_rvlc->sf_concealment &&
   1718         (ptr_aac_dec_static_channel_info->rvlc_prev_blk_type ==
   1719          current_block_type) &&
   1720         conceal_status) {
   1721       ixheaacd_predictive_interpolation(ptr_aac_dec_channel_info,
   1722                                         ptr_aac_dec_static_channel_info);
   1723       conceal_status = 0;
   1724     }
   1725 
   1726     if (conceal_status) {
   1727       for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
   1728         for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
   1729           ptr_aac_dec_channel_info->ptr_scale_factor[16 * group + band] = 0;
   1730         }
   1731       }
   1732       ptr_aac_dec_channel_info->rvlc_curr_sf_flag = 0;
   1733     }
   1734   }
   1735 }
   1736 
   1737 VOID ixheaacd_rvlc_dec(ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
   1738                        ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info,
   1739                        ia_bit_buf_struct *it_bit_buff) {
   1740   ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
   1741   WORD32 bit_cnt_offset;
   1742   UWORD32 save_bit_cnt;
   1743 
   1744   ixheaacd_rvlc_init(ptr_rvlc, ptr_aac_dec_channel_info, it_bit_buff);
   1745 
   1746   save_bit_cnt = it_bit_buff->cnt_bits;
   1747 
   1748   if (ptr_rvlc->sf_esc_present)
   1749     ixheaacd_rvlc_decode_escape(
   1750         ptr_rvlc, ptr_aac_dec_channel_info->rvlc_scf_esc_arr, it_bit_buff);
   1751 
   1752   ixheaacd_rvlc_decode_forward(ptr_rvlc, ptr_aac_dec_channel_info, it_bit_buff);
   1753   ixheaacd_rvlc_decode_backward(ptr_rvlc, ptr_aac_dec_channel_info,
   1754                                 it_bit_buff);
   1755   ixheaacd_rvlc_final_error_detection(ptr_aac_dec_channel_info,
   1756                                       ptr_aac_dec_static_channel_info);
   1757 
   1758   ptr_aac_dec_channel_info->rvlc_intensity_used = ptr_rvlc->intensity_used;
   1759   ptr_aac_dec_channel_info->str_pns_info.pns_active = ptr_rvlc->noise_used;
   1760 
   1761   bit_cnt_offset = it_bit_buff->cnt_bits - save_bit_cnt;
   1762   if (bit_cnt_offset) {
   1763     it_bit_buff->cnt_bits -= bit_cnt_offset;
   1764     it_bit_buff->ptr_read_next =
   1765         it_bit_buff->ptr_bit_buf_base +
   1766         ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
   1767     it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
   1768   }
   1769 }