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 #include <string.h>
     21 #include "ixheaacd_sbr_common.h"
     22 #include <ixheaacd_type_def.h>
     23 
     24 #include "ixheaacd_constants.h"
     25 #include <ixheaacd_basic_ops32.h>
     26 #include <ixheaacd_basic_ops16.h>
     27 #include <ixheaacd_basic_ops40.h>
     28 #include "ixheaacd_basic_ops.h"
     29 
     30 #include <ixheaacd_basic_op.h>
     31 #include "ixheaacd_intrinsics.h"
     32 #include "ixheaacd_common_rom.h"
     33 #include "ixheaacd_basic_funcs.h"
     34 #include "ixheaacd_bitbuffer.h"
     35 #include "ixheaacd_sbr_common.h"
     36 #include "ixheaacd_drc_data_struct.h"
     37 #include "ixheaacd_drc_dec.h"
     38 #include "ixheaacd_sbrdecoder.h"
     39 #include "ixheaacd_sbrdecsettings.h"
     40 #include "ixheaacd_sbr_scale.h"
     41 #include "ixheaacd_lpp_tran.h"
     42 #include "ixheaacd_env_extr_part.h"
     43 #include <ixheaacd_sbr_rom.h>
     44 #include "ixheaacd_hybrid.h"
     45 #include "ixheaacd_ps_dec.h"
     46 #include "ixheaacd_env_extr.h"
     47 
     48 #include <math.h>
     49 
     50 #include "ixheaacd_sbr_const.h"
     51 #include "ixheaacd_intrinsics.h"
     52 
     53 #include "ixheaacd_pvc_dec.h"
     54 
     55 #include "ixheaacd_ps_bitdec.h"
     56 
     57 #include "ixheaacd_audioobjtypes.h"
     58 
     59 WORD32 ixheaacd_cnt_leading_ones(WORD32 a) {
     60   WORD32 count = 0;
     61 
     62   while (a) {
     63     if (a & 0x80000000)
     64       count++;
     65     else
     66       break;
     67     a = a << 1;
     68   }
     69   return count;
     70 }
     71 VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len,
     72                              const UWORD16 *input_table,
     73                              const UWORD32 *idx_table) {
     74   UWORD32 temp = 0;
     75   UWORD32 temp1 = 0;
     76   WORD32 found = 0;
     77   UWORD32 mask = 0x80000000;
     78 
     79   WORD32 clo;
     80   WORD32 MAX_LEN;
     81   WORD32 ixheaacd_drc_offset = 0;
     82   WORD32 length;
     83   UWORD32 cwrd;
     84   WORD32 len_end;
     85 
     86   MAX_LEN = input_table[0];
     87   mask = mask - (1 << (31 - MAX_LEN));
     88   mask = mask << 1;
     89   temp = (UWORD32)(it_bit_buff & mask);
     90 
     91   len_end = input_table[0];
     92   clo = ixheaacd_cnt_leading_ones(temp);
     93   do {
     94     ixheaacd_drc_offset = (idx_table[clo] >> 20) & 0xff;
     95     length = input_table[ixheaacd_drc_offset + 1] & 0x1f;
     96     cwrd = idx_table[clo] & 0xfffff;
     97     temp1 = temp >> (32 - length);
     98     if (temp1 <= cwrd) {
     99       ixheaacd_drc_offset = ixheaacd_drc_offset - (cwrd - temp1);
    100       found = 1;
    101     } else {
    102       len_end = len_end + ((idx_table[clo] >> 28) & 0xf);
    103       clo = len_end;
    104     }
    105   } while (!found);
    106   *h_index = input_table[ixheaacd_drc_offset + 1] >> 5;
    107   *len = length;
    108 }
    109 
    110 static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data,
    111                                               ia_bit_buf_struct *it_bit_buff,
    112                                               WORD32 indepFlag) {
    113   WORD32 i, j, k;
    114   WORD32 fixed_length = 0, num_grid_info = 0, grid_info;
    115   UWORD8 div_mode, ns_mode;
    116   UWORD16 pvc_id[PVC_NUM_TIME_SLOTS + 1];
    117   UWORD8 num_length;
    118   UWORD8 length;
    119   UWORD8 reuse_pvc_id;
    120   WORD32 sum_length = 0;
    121   WORD32 length_bits = 4;
    122   UWORD8 pvc_id_bits = PVC_ID_BITS;
    123 
    124   div_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_DIV_MODE_BITS);
    125   ns_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_NS_MODE_BITS);
    126 
    127   if (ptr_pvc_data->pvc_mode == 3) {
    128     pvc_id_bits = 0;
    129   }
    130 
    131   if (div_mode <= 3) {
    132     num_length = div_mode;
    133     if (indepFlag) {
    134       reuse_pvc_id = 0;
    135     } else {
    136       reuse_pvc_id =
    137           (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_REUSE_PVC_ID_BITS);
    138     }
    139     if (reuse_pvc_id == 1) {
    140       pvc_id[0] = ptr_pvc_data->prev_pvc_id;
    141     } else {
    142       pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
    143     }
    144 
    145     k = 1;
    146     if (num_length) {
    147       sum_length = 0;
    148       for (i = 0; i < num_length; i++) {
    149         if (sum_length >= 13) {
    150           length_bits = 1;
    151         } else if (sum_length >= 11) {
    152           length_bits = 2;
    153         } else if (sum_length >= 7) {
    154           length_bits = 3;
    155         } else {
    156           length_bits = 4;
    157         }
    158         length = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, length_bits);
    159         length += 1;
    160         sum_length += length;
    161         if ((k + length - 1) > PVC_NUM_TIME_SLOTS) {
    162           return -1;
    163         }
    164         for (j = 1; j < length; j++, k++) {
    165           pvc_id[k] = pvc_id[k - 1];
    166         }
    167         pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
    168       }
    169     }
    170 
    171     for (; k < 16; k++) {
    172       pvc_id[k] = pvc_id[k - 1];
    173     }
    174 
    175   } else {
    176     switch (div_mode) {
    177       case 4:
    178         num_grid_info = 2;
    179         fixed_length = 8;
    180         break;
    181       case 5:
    182         num_grid_info = 4;
    183         fixed_length = 4;
    184         break;
    185       case 6:
    186         num_grid_info = 8;
    187         fixed_length = 2;
    188         break;
    189       case 7:
    190         num_grid_info = 16;
    191         fixed_length = 1;
    192         break;
    193       default:;
    194     }
    195     if (indepFlag) {
    196       grid_info = 1;
    197     } else {
    198       grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS);
    199     }
    200     if (grid_info) {
    201       pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
    202     } else {
    203       pvc_id[0] = ptr_pvc_data->prev_pvc_id;
    204     }
    205     for (j = 1, k = 1; j < fixed_length; j++, k++) {
    206       pvc_id[k] = pvc_id[k - 1];
    207     }
    208 
    209     for (i = 1; i < num_grid_info; i++) {
    210       grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS);
    211       if (grid_info == 1) {
    212         pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
    213       } else {
    214         pvc_id[k] = pvc_id[k - 1];
    215         k++;
    216       }
    217       for (j = 1; j < fixed_length; j++, k++) {
    218         pvc_id[k] = pvc_id[k - 1];
    219       }
    220     }
    221   }
    222   ptr_pvc_data->div_mode = div_mode;
    223   ptr_pvc_data->ns_mode = ns_mode;
    224   for (i = 0; i < PVC_NUM_TIME_SLOTS; i++) {
    225     ptr_pvc_data->pvc_id[i] = pvc_id[i];
    226   }
    227   return 0;
    228 }
    229 
    230 static VOID ixheaacd_pvc_env_dtdf_data(
    231     ia_sbr_frame_info_data_struct *ptr_frame_data,
    232     ia_bit_buf_struct *it_bit_buff) {
    233   WORD32 i;
    234   WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
    235   WORD32 bs_num_noise = ptr_frame_data->str_frame_info_details.num_noise_env;
    236 
    237   if (usac_independency_flag) {
    238     ptr_frame_data->del_cod_dir_noise_arr[0] = 0;
    239   } else {
    240     ptr_frame_data->del_cod_dir_noise_arr[0] =
    241         ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS);
    242   }
    243 
    244   for (i = 1; i < bs_num_noise; i++) {
    245     ptr_frame_data->del_cod_dir_noise_arr[i] =
    246         ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS);
    247   }
    248 }
    249 
    250 static VOID ixheaacd_read_sbr_addi_data(
    251     ia_sbr_frame_info_data_struct *ptr_frame_data,
    252     ia_sbr_header_data_struct *ptr_header_data,
    253     ia_bit_buf_struct *it_bit_buff) {
    254   WORD32 i;
    255 
    256   WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
    257 
    258   ptr_frame_data->sin_start_for_cur_top =
    259       ptr_frame_data->sin_start_for_next_top;
    260   ptr_frame_data->sin_len_for_cur_top = ptr_frame_data->sin_len_for_next_top;
    261   ptr_frame_data->sin_start_for_next_top = 0;
    262   ptr_frame_data->sin_len_for_next_top = 0;
    263 
    264   if (flag) {
    265     for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
    266          i++) {
    267       ptr_frame_data->add_harmonics[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
    268     }
    269     if (ptr_frame_data->pvc_mode != 0) {
    270       ptr_frame_data->sine_position = ESC_SIN_POS;
    271 
    272       ptr_frame_data->bs_sin_pos_present =
    273           ixheaacd_read_bits_buf(it_bit_buff, 1);
    274 
    275       if (ptr_frame_data->bs_sin_pos_present == 1) {
    276         ptr_frame_data->sine_position = ixheaacd_read_bits_buf(it_bit_buff, 5);
    277       }
    278       if (ptr_frame_data->var_len > 0) {
    279         if (ptr_frame_data->sine_position > 16) {
    280           if (ptr_frame_data->sine_position == 31) {
    281             ptr_frame_data->sin_start_for_next_top = 0;
    282             ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
    283           } else {
    284             if ((ptr_frame_data->var_len + 16) ==
    285                 ptr_frame_data->sine_position) {
    286               ptr_frame_data->sin_start_for_next_top = 0;
    287               ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
    288             } else {
    289               ptr_frame_data->sin_start_for_next_top =
    290                   ptr_frame_data->sine_position - 16;
    291               ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
    292             }
    293           }
    294         } else {
    295           ptr_frame_data->sin_start_for_next_top = 0;
    296           ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
    297         }
    298       } else {
    299         ptr_frame_data->sin_start_for_next_top = 0;
    300         ptr_frame_data->sin_len_for_next_top = 0;
    301       }
    302     }
    303   }
    304   return;
    305 }
    306 
    307 WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type t_huff,
    308                              ia_handle_bit_buf_struct it_bit_buff) {
    309   WORD32 index;
    310   WORD32 value, bit;
    311   WORD16 cw;
    312   index = 0;
    313 
    314   while (index >= 0) {
    315     cw = t_huff[index];
    316 
    317     bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    318 
    319     if (bit) {
    320       WORD sign = (cw & 0x0080);
    321       if (sign) {
    322         index = (cw | 0xffffff80);
    323       } else {
    324         index = (cw & 0x007f);
    325       }
    326     } else {
    327       index = (cw >> 8);
    328     }
    329   }
    330 
    331   value = (index + 64);
    332 
    333   return (value);
    334 }
    335 
    336 WORD32 ixheaacd_sbr_read_header_data(
    337     ia_sbr_header_data_struct *pstr_sbr_header, ia_bit_buf_struct *it_bit_buff,
    338     FLAG stereo_flag, ia_sbr_header_data_struct *pstr_sbr_dflt_header) {
    339   ia_sbr_header_data_struct prev_header_info;
    340   FLAG header_extra_1 = 0, header_extra_2 = 0;
    341   WORD32 tmp;
    342   WORD32 usac_independency_flag = pstr_sbr_header->usac_independency_flag;
    343   WORD32 use_dflt_hdr = 0;
    344   WORD32 header_present = 1;
    345   WORD32 usac_flag = pstr_sbr_header->usac_flag;
    346 
    347   if (!usac_flag) {
    348     memcpy(&prev_header_info, pstr_sbr_header,
    349            sizeof(ia_sbr_header_data_struct));
    350 
    351     tmp = ixheaacd_read_bits_buf(
    352         it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS + SBR_BEGIN_SAMP_FREQ_BITS +
    353                          SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS);
    354 
    355     pstr_sbr_header->amp_res = (WORD16)(
    356         (tmp & 0x0800) >> (SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS +
    357                            SBR_CROSS_OVER_BND_BITS));
    358 
    359     pstr_sbr_header->start_freq = (WORD16)(
    360         (tmp & 0x0780) >> (SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS));
    361 
    362     pstr_sbr_header->stop_freq =
    363         (WORD16)((tmp & 0x078) >> (SBR_CROSS_OVER_BND_BITS));
    364 
    365     pstr_sbr_header->xover_band = (WORD16)((tmp & 0x07));
    366 
    367     tmp = ixheaacd_read_bits_buf(
    368         it_bit_buff,
    369         SBR_HDR_RESERV_BITS + SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
    370     header_extra_1 = (FLAG)((tmp & 0x02) >> (SBR_HDR_EXTR_2_BITS));
    371     header_extra_2 = (FLAG)((tmp & 0x01));
    372     if (stereo_flag) {
    373       pstr_sbr_header->channel_mode = SBR_STEREO;
    374     } else {
    375       pstr_sbr_header->channel_mode = SBR_MONO;
    376     }
    377   } else {
    378     WORD32 info_present = 0;
    379     if (pstr_sbr_header->sync_state == SBR_ACTIVE) {
    380       memcpy(&prev_header_info, pstr_sbr_header,
    381              sizeof(ia_sbr_header_data_struct));
    382     }
    383     if (usac_independency_flag) {
    384       header_present = 1;
    385       info_present = 1;
    386     } else {
    387       info_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
    388       if (info_present) {
    389         header_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
    390       } else {
    391         header_present = 0;
    392       }
    393     }
    394 
    395     if (info_present) {
    396       tmp = ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS +
    397                                                     ESBR_CROSS_OVER_BND_BITS +
    398                                                     ESBR_PRE_FLAT_BITS);
    399       pstr_sbr_header->amp_res = (WORD16)(
    400           (tmp & 0x0020) >> (ESBR_CROSS_OVER_BND_BITS + ESBR_PRE_FLAT_BITS));
    401       pstr_sbr_header->xover_band =
    402           (WORD16)((tmp & 0x001E) >> (ESBR_PRE_FLAT_BITS));
    403       pstr_sbr_header->pre_proc_flag = (WORD16)((tmp & 0x001));
    404       if (pstr_sbr_header->pvc_flag) {
    405         pstr_sbr_header->pvc_mode =
    406             ixheaacd_read_bits_buf(it_bit_buff, ESBR_PVC_MODE_BITS);
    407       } else {
    408         pstr_sbr_header->pvc_mode = 0;
    409       }
    410     }
    411 
    412     if (header_present) {
    413       use_dflt_hdr = ixheaacd_read_bits_buf(it_bit_buff, 1);
    414       if (use_dflt_hdr) {
    415         pstr_sbr_header->start_freq = pstr_sbr_dflt_header->start_freq;
    416         pstr_sbr_header->stop_freq = pstr_sbr_dflt_header->stop_freq;
    417         pstr_sbr_header->header_extra_1 = pstr_sbr_dflt_header->header_extra_1;
    418         pstr_sbr_header->header_extra_2 = pstr_sbr_dflt_header->header_extra_2;
    419         pstr_sbr_header->freq_scale = pstr_sbr_dflt_header->freq_scale;
    420         pstr_sbr_header->alter_scale = pstr_sbr_dflt_header->alter_scale;
    421         pstr_sbr_header->noise_bands = pstr_sbr_dflt_header->noise_bands;
    422         pstr_sbr_header->limiter_bands = pstr_sbr_dflt_header->limiter_bands;
    423         pstr_sbr_header->limiter_gains = pstr_sbr_dflt_header->limiter_gains;
    424         pstr_sbr_header->interpol_freq = pstr_sbr_dflt_header->interpol_freq;
    425         pstr_sbr_header->smoothing_mode = pstr_sbr_dflt_header->smoothing_mode;
    426       } else {
    427         tmp = ixheaacd_read_bits_buf(
    428             it_bit_buff, SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS +
    429                              SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
    430         pstr_sbr_header->start_freq =
    431             (tmp & 0x03C0) >> (SBR_END_SAMP_FREQ_BITS + SBR_HDR_EXTR_1_BITS +
    432                                SBR_HDR_EXTR_2_BITS);
    433         pstr_sbr_header->stop_freq =
    434             (tmp & 0x003C) >> (SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
    435         pstr_sbr_header->header_extra_1 =
    436             (tmp & 0x0002) >> (SBR_HDR_EXTR_2_BITS);
    437         pstr_sbr_header->header_extra_2 = (tmp & 0x0001);
    438         header_extra_1 = pstr_sbr_header->header_extra_1;
    439         header_extra_2 = pstr_sbr_header->header_extra_2;
    440       }
    441     }
    442   }
    443 
    444   if (!use_dflt_hdr && header_present) {
    445     if (header_extra_1) {
    446       tmp = ixheaacd_read_bits_buf(
    447           it_bit_buff,
    448           SBR_SAMP_FREQ_LVL_BITS + SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS);
    449       pstr_sbr_header->freq_scale =
    450           (WORD16)((tmp & 0x018) >> (SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS));
    451       pstr_sbr_header->alter_scale =
    452           (WORD16)((tmp & 0x04) >> (SBR_NOISE_BND_BITS));
    453       pstr_sbr_header->noise_bands = (WORD16)((tmp & 0x03));
    454     } else {
    455       pstr_sbr_header->freq_scale = SBR_SAMP_FEQ_LVL_DEF;
    456       pstr_sbr_header->alter_scale = SBR_CHANGE_LVL_DEF;
    457       pstr_sbr_header->noise_bands = SBR_NOISE_BND_DEF;
    458     }
    459 
    460     if (header_extra_2) {
    461       tmp = ixheaacd_read_bits_buf(
    462           it_bit_buff, SBR_BND_LIMIT_BITS + SBR_GAIN_LIMIT_BITS +
    463                            SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS);
    464       pstr_sbr_header->limiter_bands = (WORD16)(
    465           (tmp & 0x030) >> (SBR_GAIN_LIMIT_BITS + SBR_INTERPOL_SAMP_FREQ_BITS +
    466                             SBR_SMOOTH_LEN_BITS));
    467       pstr_sbr_header->limiter_gains = (WORD16)(
    468           (tmp & 0x0c) >> (SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS));
    469       pstr_sbr_header->interpol_freq =
    470           (WORD16)((tmp & 0x02) >> (SBR_SMOOTH_LEN_BITS));
    471       pstr_sbr_header->smoothing_mode = (WORD16)((tmp & 0x01));
    472     } else {
    473       pstr_sbr_header->limiter_bands = SBR_BND_LIMIT_DEF;
    474       pstr_sbr_header->limiter_gains = SBR_GAIN_LIMIT_DEF;
    475       pstr_sbr_header->interpol_freq = SBR_INTERPOL_SAMP_FEQ_DEF;
    476       pstr_sbr_header->smoothing_mode = SBR_SMOOTH_LEN_DEF;
    477     }
    478   }
    479 
    480   if ((pstr_sbr_header->sync_state != SBR_ACTIVE) ||
    481       (prev_header_info.start_freq != pstr_sbr_header->start_freq) ||
    482       (prev_header_info.stop_freq != pstr_sbr_header->stop_freq) ||
    483       (prev_header_info.xover_band != pstr_sbr_header->xover_band) ||
    484       (prev_header_info.freq_scale != pstr_sbr_header->freq_scale) ||
    485       (prev_header_info.alter_scale != pstr_sbr_header->alter_scale) ||
    486       (prev_header_info.noise_bands != pstr_sbr_header->noise_bands)) {
    487     return SBR_RESET;
    488   }
    489 
    490   return 0;
    491 }
    492 
    493 static VOID ixheaacd_sbr_sin_coding_data(
    494     ia_sbr_header_data_struct *ptr_header_data,
    495     ia_sbr_frame_info_data_struct *ptr_frame_data,
    496     ia_bit_buf_struct *it_bit_buff) {
    497   FLAG *p_add_harmonic = ptr_frame_data->add_harmonics;
    498   WORD32 i;
    499 
    500   i = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
    501   do {
    502     *p_add_harmonic++ =
    503         (FLAG)ixheaacd_read_bits_buf(it_bit_buff, SBR_ADD_SINE_FLAG_BITS);
    504     i--;
    505   } while (i != 0);
    506 
    507   return;
    508 }
    509 
    510 static WORD16 ixheaacd_validate_frame_info(
    511     ia_frame_info_struct *pstr_frame_info, WORD16 num_time_slots,
    512     WORD audio_object_type) {
    513   WORD32 i, j;
    514 
    515   WORD32 start_pos, end_pos, transient_env, start_pos_noise, end_pos_noise,
    516       num_env_sf, num_noise_env;
    517 
    518   num_env_sf = pstr_frame_info->num_env;
    519   num_noise_env = pstr_frame_info->num_noise_env;
    520 
    521   if ((num_env_sf < 1) || (num_env_sf > MAX_ENVELOPES)) return 0;
    522 
    523   if (num_noise_env > MAX_NOISE_ENVELOPES) return 0;
    524 
    525   start_pos = pstr_frame_info->border_vec[0];
    526   end_pos = pstr_frame_info->border_vec[num_env_sf];
    527   transient_env = pstr_frame_info->transient_env;
    528 
    529   if (transient_env > num_env_sf) return 0;
    530 
    531   start_pos_noise = pstr_frame_info->noise_border_vec[0];
    532   end_pos_noise = pstr_frame_info->noise_border_vec[num_noise_env];
    533 
    534   if ((start_pos < 0) || (start_pos >= end_pos)) return 0;
    535 
    536   if (start_pos > SBR_OV_SLOTS) return 0;
    537   if (audio_object_type != AOT_ER_AAC_ELD &&
    538       audio_object_type != AOT_ER_AAC_LD) {
    539     if (end_pos < SBR_TIME_SLOTS) return 0;
    540   } else {
    541     if (end_pos < num_time_slots) return 0;
    542   }
    543 
    544   if (end_pos > add_d(SBR_TIME_SLOTS, SBR_OV_SLOTS)) return 0;
    545 
    546   for (i = 0; i < num_env_sf; i++) {
    547     if (pstr_frame_info->border_vec[i] > pstr_frame_info->border_vec[i + 1])
    548       return 0;
    549   }
    550 
    551   if ((num_env_sf == 1) && (num_noise_env > 1)) return 0;
    552 
    553   if ((start_pos != start_pos_noise) || (end_pos != end_pos_noise)) return 0;
    554 
    555   for (i = 0; i < num_noise_env; i++) {
    556     start_pos_noise = pstr_frame_info->noise_border_vec[i];
    557 
    558     for (j = 0; j < num_env_sf; j++) {
    559       if (pstr_frame_info->border_vec[j] == start_pos_noise) break;
    560     }
    561     if (j == num_env_sf) return 0;
    562   }
    563 
    564   return 1;
    565 }
    566 
    567 static WORD16 ixheaacd_read_extn_data(
    568     ia_sbr_header_data_struct *ptr_header_data, ia_ps_dec_struct *ptr_ps_dec,
    569     ia_bit_buf_struct *it_bit_buff, ia_ps_tables_struct *ps_tables_ptr) {
    570   WORD i;
    571   WORD extended_data;
    572   WORD no_bits_left;
    573 
    574   extended_data = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENLARGED_DATA_BITS);
    575 
    576   if (extended_data) {
    577     WORD cnt;
    578     FLAG ps_read;
    579 
    580     ps_read = 0;
    581 
    582     cnt = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_SIZE_BITS);
    583 
    584     if (cnt == ((1 << SBR_CONT_SIZE_BITS) - 1)) {
    585       cnt = (cnt + ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ESC_CNT_BITS));
    586     }
    587 
    588     no_bits_left = (cnt << 3);
    589 
    590     while (no_bits_left > 7) {
    591       WORD extension_id = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ID_BITS);
    592 
    593       no_bits_left = (no_bits_left - SBR_CONT_ID_BITS);
    594 
    595       switch (extension_id) {
    596         case EXTENSION_ID_PS_CODING:
    597 
    598           if (ptr_ps_dec == NULL) {
    599             return 0;
    600           }
    601 
    602           if (!(ptr_ps_dec->force_mono || ps_read)) {
    603             no_bits_left =
    604                 (no_bits_left - ixheaacd_read_ps_data(ptr_ps_dec, it_bit_buff,
    605                                                       (WORD16)no_bits_left,
    606                                                       ps_tables_ptr));
    607 
    608             if (no_bits_left < 0) return 0;
    609 
    610             ptr_header_data->channel_mode = PS_STEREO;
    611             ps_read = 1;
    612             break;
    613           }
    614 
    615         default:
    616           cnt = (no_bits_left >> 3);
    617           for (i = cnt - 1; i >= 0; i--) ixheaacd_read_bits_buf(it_bit_buff, 8);
    618           no_bits_left = (no_bits_left - (cnt << 3));
    619           break;
    620       }
    621     }
    622 
    623     if (no_bits_left < 0) return 0;
    624 
    625     ixheaacd_read_bits_buf(it_bit_buff, no_bits_left);
    626   }
    627   return 1;
    628 }
    629 
    630 WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data,
    631                                  ia_bit_buf_struct *it_bit_buff,
    632                                  WORD32 hbe_flag,
    633                                  ia_pvc_data_struct *ptr_pvc_data,
    634                                  ia_sbr_tables_struct *ptr_sbr_tables,
    635                                  ia_sbr_header_data_struct *ptr_header_data) {
    636   WORD32 i;
    637   WORD32 err_code = 0;
    638   ia_env_extr_tables_struct *env_extr_tables_ptr =
    639       ptr_sbr_tables->env_extr_tables_ptr;
    640   WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
    641 
    642   if (hbe_flag) {
    643     ptr_frame_data->sbr_patching_mode =
    644         ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
    645 
    646     if (ptr_frame_data->sbr_patching_mode == 0) {
    647       ptr_frame_data->over_sampling_flag =
    648           ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
    649       if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
    650         ptr_frame_data->pitch_in_bins =
    651             ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
    652       else
    653         ptr_frame_data->pitch_in_bins = 0;
    654     } else {
    655       ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0;
    656     }
    657   }
    658 
    659   err_code = ixheaacd_pvc_time_freq_grid_info(it_bit_buff, ptr_frame_data);
    660   if (err_code) return err_code;
    661 
    662   ptr_pvc_data->prev_sbr_mode = PVC_SBR;
    663 
    664   ixheaacd_pvc_env_dtdf_data(ptr_frame_data, it_bit_buff);
    665 
    666   for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_nf_bands; i++) {
    667     ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
    668     ptr_frame_data->sbr_invf_mode[i] =
    669         (WORD32)ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
    670   }
    671 
    672   ptr_pvc_data->pvc_mode = ptr_header_data->pvc_mode;
    673 
    674   ixheaacd_read_esbr_pvc_envelope(ptr_pvc_data, it_bit_buff,
    675                                   usac_independency_flag);
    676 
    677   ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data,
    678                                      it_bit_buff, env_extr_tables_ptr);
    679 
    680   memset(ptr_frame_data->add_harmonics, 0,
    681          ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH] *
    682              sizeof(WORD32));
    683   ptr_frame_data->pvc_mode = ptr_header_data->pvc_mode;
    684 
    685   ixheaacd_read_sbr_addi_data(ptr_frame_data, ptr_header_data, it_bit_buff);
    686 
    687   ptr_frame_data->coupling_mode = COUPLING_OFF;
    688 
    689   return 0;
    690 }
    691 
    692 WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data,
    693                             ia_sbr_frame_info_data_struct *ptr_frame_data,
    694                             ia_ps_dec_struct *ptr_ps_dec,
    695                             ia_bit_buf_struct *it_bit_buff,
    696                             ia_sbr_tables_struct *ptr_sbr_tables,
    697                             WORD audio_object_type) {
    698   WORD32 bit;
    699   WORD32 i;
    700   WORD32 hbe_flag = ptr_header_data->hbe_flag;
    701   WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands;
    702   WORD32 usac_flag = ptr_header_data->usac_flag;
    703   ia_env_extr_tables_struct *env_extr_tables_ptr =
    704       ptr_sbr_tables->env_extr_tables_ptr;
    705 
    706   ptr_frame_data->coupling_mode = COUPLING_OFF;
    707 
    708   if (!usac_flag) {
    709     bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    710 
    711     if (bit) ixheaacd_read_bits_buf(it_bit_buff, SBR_SCE_RESERV_BITS);
    712     if (audio_object_type == AOT_ER_AAC_ELD ||
    713         audio_object_type == AOT_ER_AAC_LD) {
    714       if (ptr_frame_data->eld_sbr_flag == 1) {
    715         if (!ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data))
    716           return 0;
    717       }
    718     } else {
    719       if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
    720                                             env_extr_tables_ptr))
    721 
    722         return 0;
    723     }
    724     if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
    725                                       ptr_header_data->num_time_slots,
    726                                       audio_object_type))
    727       return 0;
    728 
    729   } else {
    730     if (hbe_flag) {
    731       ptr_frame_data->sbr_patching_mode =
    732           ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
    733       if (ptr_frame_data->sbr_patching_mode == 0) {
    734         ptr_frame_data->over_sampling_flag =
    735             ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
    736         if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
    737           ptr_frame_data->pitch_in_bins =
    738               ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
    739         else
    740           ptr_frame_data->pitch_in_bins = 0;
    741       } else {
    742         ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0;
    743       }
    744     }
    745     ptr_frame_data->num_time_slots = ptr_header_data->num_time_slots;
    746     if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
    747                                           env_extr_tables_ptr))
    748       return 0;
    749 
    750     if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
    751                                       ptr_header_data->num_time_slots,
    752                                       audio_object_type))
    753       return 0;
    754 
    755     ptr_frame_data->prev_sbr_mode = ORIG_SBR;
    756   }
    757 
    758   ixheaacd_sbr_env_dtdf_data(ptr_frame_data, it_bit_buff,
    759                              ptr_header_data->usac_flag);
    760 
    761   if (ptr_frame_data->del_cod_dir_arr[0] == DTDF_DIR_FREQ) {
    762     ptr_header_data->err_flag = 0;
    763   }
    764 
    765   for (i = 0; i < num_if_bands; i++) {
    766     ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
    767     ptr_frame_data->sbr_invf_mode[i] =
    768         (WORD32)ixheaacd_read_bits_buf(it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
    769   }
    770 
    771   if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data, it_bit_buff,
    772                                   env_extr_tables_ptr, audio_object_type))
    773     return 0;
    774 
    775   ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data,
    776                                      it_bit_buff, env_extr_tables_ptr);
    777 
    778   if (usac_flag) {
    779     memset(
    780         ptr_frame_data->add_harmonics, 0,
    781         ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
    782     ptr_frame_data->coupling_mode = COUPLING_OFF;
    783   }
    784 
    785   bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
    786   if (bit) {
    787     ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data, it_bit_buff);
    788   } else {
    789     memset(ptr_frame_data->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
    790   }
    791 
    792   if (!usac_flag) {
    793     ixheaacd_read_extn_data(ptr_header_data, ptr_ps_dec, it_bit_buff,
    794                             ptr_sbr_tables->ps_tables_ptr);
    795   }
    796 
    797   return 1;
    798 }
    799 
    800 WORD8 ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct *ptr_header_data,
    801                             ia_sbr_frame_info_data_struct **ptr_frame_data,
    802                             ia_bit_buf_struct *it_bit_buff,
    803                             ia_sbr_tables_struct *ptr_sbr_tables,
    804                             WORD audio_object_type) {
    805   WORD32 i, k, bit, num_ch = 2;
    806   WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands;
    807   WORD32 hbe_flag = ptr_header_data->hbe_flag;
    808   WORD32 usac_flag = ptr_header_data->usac_flag;
    809 
    810   ia_env_extr_tables_struct *env_extr_tables_ptr =
    811       ptr_sbr_tables->env_extr_tables_ptr;
    812   bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    813 
    814   if (usac_flag) {
    815     if (bit) {
    816       if (hbe_flag) {
    817         ptr_frame_data[0]->sbr_patching_mode =
    818             ptr_frame_data[1]->sbr_patching_mode =
    819                 ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
    820         if (ptr_frame_data[0]->sbr_patching_mode == 0) {
    821           ptr_frame_data[0]->over_sampling_flag =
    822               ptr_frame_data[1]->over_sampling_flag = ixheaacd_read_bits_buf(
    823                   it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
    824           if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
    825             ptr_frame_data[0]->pitch_in_bins =
    826                 ptr_frame_data[1]->pitch_in_bins =
    827                     ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
    828           else
    829             ptr_frame_data[0]->pitch_in_bins =
    830                 ptr_frame_data[1]->pitch_in_bins = 0;
    831         } else {
    832           ptr_frame_data[0]->over_sampling_flag = 0;
    833           ptr_frame_data[1]->over_sampling_flag = 0;
    834           ptr_frame_data[0]->pitch_in_bins = 0;
    835           ptr_frame_data[1]->pitch_in_bins = 0;
    836         }
    837       }
    838       ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL;
    839       ptr_frame_data[1]->coupling_mode = COUPLING_BAL;
    840     } else {
    841       if (hbe_flag) {
    842         ptr_frame_data[0]->sbr_patching_mode =
    843             ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
    844         if (ptr_frame_data[0]->sbr_patching_mode == 0) {
    845           ptr_frame_data[0]->over_sampling_flag =
    846               ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
    847           if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
    848             ptr_frame_data[0]->pitch_in_bins =
    849                 ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
    850           else
    851             ptr_frame_data[0]->pitch_in_bins = 0;
    852         } else {
    853           ptr_frame_data[0]->over_sampling_flag = 0;
    854           ptr_frame_data[0]->pitch_in_bins = 0;
    855         }
    856         ptr_frame_data[1]->sbr_patching_mode =
    857             ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
    858         if (ptr_frame_data[1]->sbr_patching_mode == 0) {
    859           ptr_frame_data[1]->over_sampling_flag =
    860               ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
    861           if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
    862             ptr_frame_data[1]->pitch_in_bins =
    863                 ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
    864           else
    865             ptr_frame_data[1]->pitch_in_bins = 0;
    866         } else {
    867           ptr_frame_data[1]->over_sampling_flag =
    868               ptr_frame_data[1]->pitch_in_bins = 0;
    869         }
    870       }
    871 
    872       ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
    873       ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
    874     }
    875   } else {
    876     if (bit) {
    877       ixheaacd_read_bits_buf(it_bit_buff,
    878                              SBR_SCE_RESERV_BITS + SBR_SCE_RESERV_BITS);
    879     }
    880     if ((audio_object_type != AOT_ER_AAC_ELD) &&
    881         (ptr_header_data->channel_mode != SBR_STEREO)) {
    882       ptr_header_data->sync_state = UPSAMPLING;
    883       return 0;
    884     }
    885 
    886     bit = ixheaacd_read_bits_buf(it_bit_buff, SBR_COUPLNG_MODE_BITS);
    887 
    888     if (bit) {
    889       ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL;
    890       ptr_frame_data[1]->coupling_mode = COUPLING_BAL;
    891     } else {
    892       ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
    893       ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
    894     }
    895   }
    896 
    897   for (i = 0; i < num_ch; i++) {
    898     ptr_frame_data[i]->num_time_slots = ptr_header_data->num_time_slots;
    899     if (audio_object_type == AOT_ER_AAC_ELD ||
    900         audio_object_type == AOT_ER_AAC_LD) {
    901       if (ptr_frame_data[i]->eld_sbr_flag == 1) {
    902         if (!ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data[i]))
    903           return 0;
    904       }
    905     } else {
    906       if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data[i],
    907                                             env_extr_tables_ptr))
    908         return 0;
    909     }
    910 
    911     if (!ixheaacd_validate_frame_info(
    912             &ptr_frame_data[i]->str_frame_info_details,
    913             ptr_header_data->num_time_slots, audio_object_type))
    914       return 0;
    915 
    916     if (ptr_frame_data[0]->coupling_mode) {
    917       memcpy(&ptr_frame_data[1]->str_frame_info_details,
    918              &ptr_frame_data[0]->str_frame_info_details,
    919              sizeof(ia_frame_info_struct));
    920       if (audio_object_type == AOT_ER_AAC_ELD ||
    921           audio_object_type == AOT_ER_AAC_LD) {
    922         ptr_frame_data[1]->amp_res = ptr_frame_data[0]->amp_res;
    923       }
    924       num_ch = 1;
    925     }
    926   }
    927 
    928   if (ptr_frame_data[0]->coupling_mode && usac_flag) {
    929     ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff,
    930                                ptr_header_data->usac_flag);
    931     ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff,
    932                                ptr_header_data->usac_flag);
    933 
    934     for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_if_bands; i++) {
    935       ptr_frame_data[0]->sbr_invf_mode_prev[i] =
    936           ptr_frame_data[0]->sbr_invf_mode[i];
    937       ptr_frame_data[1]->sbr_invf_mode_prev[i] =
    938           ptr_frame_data[1]->sbr_invf_mode[i];
    939 
    940       ptr_frame_data[0]->sbr_invf_mode[i] =
    941           (WORD32)ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
    942       ptr_frame_data[1]->sbr_invf_mode[i] = ptr_frame_data[0]->sbr_invf_mode[i];
    943     }
    944 
    945     ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0], it_bit_buff,
    946                                env_extr_tables_ptr, audio_object_type);
    947     ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
    948                                        it_bit_buff, env_extr_tables_ptr);
    949 
    950     ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1], it_bit_buff,
    951                                env_extr_tables_ptr, audio_object_type);
    952     ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1],
    953                                        it_bit_buff, env_extr_tables_ptr);
    954 
    955     memset(
    956         ptr_frame_data[0]->add_harmonics, 0,
    957         ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
    958     memset(
    959         ptr_frame_data[1]->add_harmonics, 0,
    960         ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
    961 
    962   } else {
    963     ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff,
    964                                ptr_header_data->usac_flag);
    965     ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff,
    966                                ptr_header_data->usac_flag);
    967 
    968     if ((ptr_frame_data[0]->del_cod_dir_arr[0] == DTDF_DIR_FREQ) &&
    969         (ptr_frame_data[1]->del_cod_dir_arr[0] == DTDF_DIR_FREQ)) {
    970       ptr_header_data->err_flag = 0;
    971     }
    972 
    973     for (k = 0; k < num_ch; k++) {
    974       for (i = 0; i < num_if_bands; i++) {
    975         ptr_frame_data[k]->sbr_invf_mode_prev[i] =
    976             ptr_frame_data[k]->sbr_invf_mode[i];
    977         ptr_frame_data[k]->sbr_invf_mode[i] = (WORD32)ixheaacd_read_bits_buf(
    978             it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
    979       }
    980     }
    981 
    982     if (ptr_frame_data[0]->coupling_mode) {
    983       memcpy(ptr_frame_data[1]->sbr_invf_mode, ptr_frame_data[0]->sbr_invf_mode,
    984              sizeof(WORD32) * num_if_bands);
    985 
    986       if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
    987                                       it_bit_buff, env_extr_tables_ptr,
    988                                       audio_object_type)) {
    989         return 0;
    990       }
    991 
    992       ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
    993                                          it_bit_buff, env_extr_tables_ptr);
    994 
    995       if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
    996                                       it_bit_buff, env_extr_tables_ptr,
    997                                       audio_object_type)) {
    998         return 0;
    999       }
   1000     } else {
   1001       if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
   1002                                       it_bit_buff, env_extr_tables_ptr,
   1003                                       audio_object_type))
   1004         return 0;
   1005 
   1006       if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
   1007                                       it_bit_buff, env_extr_tables_ptr,
   1008                                       audio_object_type))
   1009         return 0;
   1010 
   1011       ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
   1012                                          it_bit_buff, env_extr_tables_ptr);
   1013     }
   1014     ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1],
   1015                                        it_bit_buff, env_extr_tables_ptr);
   1016   }
   1017 
   1018   bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
   1019   if (bit) {
   1020     ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[0],
   1021                                  it_bit_buff);
   1022   } else {
   1023     memset(ptr_frame_data[0]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
   1024   }
   1025 
   1026   bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
   1027   if (bit) {
   1028     ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[1],
   1029                                  it_bit_buff);
   1030   } else {
   1031     memset(ptr_frame_data[1]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
   1032   }
   1033 
   1034   if (!usac_flag) {
   1035     ixheaacd_read_extn_data(ptr_header_data, NULL, it_bit_buff,
   1036                             ptr_sbr_tables->ps_tables_ptr);
   1037   }
   1038   return 1;
   1039 }
   1040 
   1041 VOID ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
   1042                                 ia_bit_buf_struct *it_bit_buff,
   1043                                 WORD32 usac_flag) {
   1044   WORD32 i;
   1045   WORD32 num_env = ptr_frame_data->str_frame_info_details.num_env;
   1046   WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env;
   1047   WORD16 *p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr;
   1048   WORD16 *p_coding_dir_noise_vec = ptr_frame_data->del_cod_dir_noise_arr;
   1049   WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
   1050 
   1051   if (usac_flag) {
   1052     if (usac_independency_flag) {
   1053       *p_coding_dir_vec = 0;
   1054       p_coding_dir_vec++;
   1055     } else {
   1056       *p_coding_dir_vec =
   1057           (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
   1058       p_coding_dir_vec++;
   1059     }
   1060     for (i = num_env - 1; i >= 1; i--) {
   1061       *p_coding_dir_vec++ =
   1062           (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
   1063     }
   1064     if (usac_independency_flag) {
   1065       *p_coding_dir_noise_vec = 0;
   1066       p_coding_dir_noise_vec++;
   1067     } else {
   1068       *p_coding_dir_noise_vec =
   1069           (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
   1070       p_coding_dir_noise_vec++;
   1071     }
   1072     for (i = num_noise_env - 1; i >= 1; i--) {
   1073       *p_coding_dir_noise_vec++ =
   1074           (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
   1075     }
   1076   } else {
   1077     for (i = num_env - 1; i >= 0; i--) {
   1078       *p_coding_dir_vec++ =
   1079           (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
   1080     }
   1081 
   1082     for (i = num_noise_env - 1; i >= 0; i--) {
   1083       *p_coding_dir_noise_vec++ =
   1084           (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
   1085     }
   1086   }
   1087 }
   1088 
   1089 VOID ixheaacd_read_env_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
   1090                             ia_bit_buf_struct *it_bit_buff,
   1091                             ia_huffman_data_type hcb_t,
   1092                             ia_huffman_data_type hcb_f, WORD32 *idx_t,
   1093                             WORD32 *idx_f, WORD16 *no_band, WORD32 num_env,
   1094                             WORD32 env_data_tbl_comp_factor, WORD32 start_bits,
   1095                             WORD32 start_bits_balance, WORD32 num_noise_env,
   1096                             WORD32 lav, WORD32 usac_flag) {
   1097   WORD32 j, i, ixheaacd_drc_offset = 0,
   1098                coupling_mode = ptr_frame_data->coupling_mode, delta, bits,
   1099                shift;
   1100   WORD16 *p_coding_dir_vec, *p_sbr_sf;
   1101   WORD16 index, length;
   1102   WORD32 readword;
   1103   FLOAT32 *p_sbr_sf_float;
   1104 
   1105   if (num_noise_env) {
   1106     p_coding_dir_vec = ptr_frame_data->del_cod_dir_noise_arr;
   1107     p_sbr_sf = ptr_frame_data->int_noise_floor;
   1108     p_sbr_sf_float = ptr_frame_data->flt_noise_floor;
   1109   } else {
   1110     p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr;
   1111     p_sbr_sf = ptr_frame_data->int_env_sf_arr;
   1112     p_sbr_sf_float = ptr_frame_data->flt_env_sf_arr;
   1113   }
   1114 
   1115   if (coupling_mode == COUPLING_BAL) {
   1116     bits = start_bits_balance;
   1117     shift = env_data_tbl_comp_factor;
   1118 
   1119   } else {
   1120     bits = start_bits;
   1121     shift = 0;
   1122   }
   1123 
   1124   for (j = 0; j < num_env; j++) {
   1125     ia_huffman_data_type h;
   1126     const WORD32 *idx_tab;
   1127     WORD32 dtdf_dir_flag = p_coding_dir_vec[j];
   1128 
   1129     if (dtdf_dir_flag == DTDF_DIR_FREQ) {
   1130       p_sbr_sf[ixheaacd_drc_offset] =
   1131           (WORD16)(ixheaacd_read_bits_buf(it_bit_buff, bits) << shift);
   1132       p_sbr_sf_float[ixheaacd_drc_offset] = p_sbr_sf[ixheaacd_drc_offset];
   1133       h = hcb_f;
   1134       idx_tab = idx_f;
   1135     } else {
   1136       h = hcb_t;
   1137       idx_tab = idx_t;
   1138     }
   1139 
   1140     for (i = (1 - dtdf_dir_flag); i < no_band[j]; i++) {
   1141       if (it_bit_buff->cnt_bits < 20) {
   1142         readword = ixheaacd_show_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
   1143         readword = readword << (32 - it_bit_buff->cnt_bits);
   1144       } else {
   1145         readword = ixheaacd_show_bits_buf(it_bit_buff, 20);
   1146         readword = readword << 12;
   1147       }
   1148       ixheaacd_huffman_decode(readword, &index, &length, (const UWORD16 *)h,
   1149                               (const UWORD32 *)idx_tab);
   1150       delta = index - lav;
   1151       ixheaacd_read_bits_buf(it_bit_buff, length);
   1152       p_sbr_sf[ixheaacd_drc_offset + i] =
   1153           (WORD16)(delta << env_data_tbl_comp_factor);
   1154       p_sbr_sf_float[ixheaacd_drc_offset + i] =
   1155           p_sbr_sf[ixheaacd_drc_offset + i];
   1156     }
   1157     if (usac_flag && (num_noise_env == 0)) {
   1158       ptr_frame_data->inter_temp_shape_mode[j] = 0;
   1159       if (ptr_frame_data->inter_tes_flag) {
   1160         WORD32 flag = (WORD32)ixheaacd_read_bits_buf(it_bit_buff, 1);
   1161         if (flag) {
   1162           ptr_frame_data->inter_temp_shape_mode[j] =
   1163               (WORD32)ixheaacd_read_bits_buf(it_bit_buff, 2);
   1164         }
   1165       }
   1166     }
   1167     ixheaacd_drc_offset += (no_band[j]);
   1168   }
   1169 }
   1170 
   1171 VOID ixheaacd_read_sbr_noise_floor_data(
   1172     ia_sbr_header_data_struct *ptr_header_data,
   1173     ia_sbr_frame_info_data_struct *ptr_frame_data,
   1174     ia_bit_buf_struct *it_bit_buff,
   1175     ia_env_extr_tables_struct *env_extr_tables_ptr) {
   1176   WORD32 i;
   1177   WORD32 coupling_mode;
   1178   WORD16 num_noise_bands[MAX_NOISE_ENVELOPES];
   1179   ia_huffman_data_type hcb_noise_env;
   1180   ia_huffman_data_type hcb_noise;
   1181   WORD32 *idx_noise_env;
   1182   WORD32 *idx_noise;
   1183   WORD32 lav;
   1184   WORD32 env_data_tbl_comp_factor;
   1185 
   1186   WORD32 start_bits;
   1187   WORD32 start_bits_balance;
   1188   WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env;
   1189 
   1190   for (i = 0; i < num_noise_env; i++)
   1191     num_noise_bands[i] = ptr_header_data->pstr_freq_band_data->num_nf_bands;
   1192 
   1193   start_bits = SBR_BEGIN_NOISE_BITS_AMPLITUDE_RESOLUTION_3_0;
   1194   start_bits_balance = SBR_BEGIN_NOISE_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0;
   1195 
   1196   coupling_mode = ptr_frame_data->coupling_mode;
   1197 
   1198   if (coupling_mode == COUPLING_BAL) {
   1199     lav = 12;
   1200     hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr
   1201                     ->ixheaacd_t_huffman_noise_bal_3_0db_inp_table;
   1202     idx_noise =
   1203         env_extr_tables_ptr->ixheaacd_t_huffman_noise_bal_3_0db_idx_table;
   1204     hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr
   1205                         ->ixheaacd_f_huffman_env_bal_3_0db_inp_table;
   1206     idx_noise_env =
   1207         env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table;
   1208     env_data_tbl_comp_factor = 1;
   1209   } else {
   1210     lav = 31;
   1211     hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr
   1212                     ->ixheaacd_t_huffman_noise_3_0db_inp_table;
   1213     idx_noise = env_extr_tables_ptr->ixheaacd_t_huffman_noise_3_0db_idx_table;
   1214     hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr
   1215                         ->ixheaacd_f_huffman_env_3_0db_inp_table;
   1216     idx_noise_env = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table;
   1217     env_data_tbl_comp_factor = 0;
   1218   }
   1219 
   1220   ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_noise, hcb_noise_env,
   1221                          idx_noise, idx_noise_env, &num_noise_bands[0],
   1222                          num_noise_env, env_data_tbl_comp_factor, start_bits,
   1223                          start_bits_balance, 1, lav,
   1224                          ptr_header_data->usac_flag);
   1225 }
   1226 
   1227 WORD16 ixheaacd_read_sbr_env_data(
   1228     ia_sbr_header_data_struct *ptr_header_data,
   1229     ia_sbr_frame_info_data_struct *ptr_frame_data,
   1230     ia_bit_buf_struct *it_bit_buff,
   1231     ia_env_extr_tables_struct *env_extr_tables_ptr, WORD audio_object_type) {
   1232   WORD32 coupling_mode = ptr_frame_data->coupling_mode;
   1233   WORD32 *idx_t, *idx_f;
   1234   WORD32 lav;
   1235   WORD32 i;
   1236   WORD16 no_band[MAX_ENVELOPES];
   1237   WORD32 delta;
   1238   WORD32 amp_res, num_env, env_data_tbl_comp_factor, start_bits,
   1239       start_bits_balance;
   1240   WORD16 *p_freq_res = ptr_frame_data->str_frame_info_details.freq_res;
   1241   WORD16 *p_num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
   1242   ia_huffman_data_type hcb_t, hcb_f;
   1243 
   1244   delta = 0;
   1245   amp_res = ptr_header_data->amp_res;
   1246   num_env = ptr_frame_data->str_frame_info_details.num_env;
   1247 
   1248   ptr_frame_data->num_env_sfac = 0;
   1249 
   1250   if ((ptr_frame_data->str_frame_info_details.frame_class == FIXFIX) &&
   1251       (num_env == 1)) {
   1252     if (audio_object_type != AOT_ER_AAC_ELD &&
   1253         audio_object_type != AOT_ER_AAC_LD) {
   1254       amp_res = SBR_AMPLITUDE_RESOLUTION_1_5;
   1255     } else {
   1256       amp_res = ptr_frame_data->amp_res;
   1257     }
   1258   }
   1259   ptr_frame_data->amp_res = amp_res;
   1260 
   1261   if (amp_res == SBR_AMPLITUDE_RESOLUTION_3_0) {
   1262     start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_3_0;
   1263     start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0;
   1264   } else {
   1265     start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_1_5;
   1266     start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_1_5;
   1267   }
   1268 
   1269   for (i = 0; i < num_env; i++) {
   1270     no_band[i] = p_num_sf_bands[*p_freq_res++];
   1271     ptr_frame_data->num_env_sfac =
   1272         ixheaacd_add16(ptr_frame_data->num_env_sfac, no_band[i]);
   1273   }
   1274 
   1275   if (ptr_frame_data->num_env_sfac > MAX_NUM_ENVELOPE_VALUES) return 0;
   1276 
   1277   if (coupling_mode == COUPLING_BAL) {
   1278     env_data_tbl_comp_factor = 1;
   1279 
   1280     if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) {
   1281       lav = 24;
   1282       hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
   1283                   ->ixheaacd_t_huffman_env_bal_1_5db_inp_table;
   1284       idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_1_5db_idx_table;
   1285       hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
   1286                   ->ixheaacd_f_huffman_env_bal_1_5db_inp_table;
   1287       idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_1_5db_idx_table;
   1288     } else {
   1289       lav = 12;
   1290       hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
   1291                   ->ixheaacd_t_huffman_env_bal_3_0db_inp_table;
   1292       idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_3_0db_idx_table;
   1293       hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
   1294                   ->ixheaacd_f_huffman_env_bal_3_0db_inp_table;
   1295       idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table;
   1296     }
   1297   } else {
   1298     env_data_tbl_comp_factor = 0;
   1299 
   1300     if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) {
   1301       lav = 60;
   1302       hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
   1303                   ->ixheaacd_t_huffman_env_1_5db_inp_table;
   1304       idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_1_5db_idx_table;
   1305       hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
   1306                   ->ixheaacd_f_huffman_env_1_5db_inp_table;
   1307       idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_1_5db_idx_table;
   1308     } else {
   1309       lav = 31;
   1310       hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
   1311                   ->ixheaacd_t_huffman_env_3_0db_inp_table;
   1312       idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_3_0db_idx_table;
   1313       hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
   1314                   ->ixheaacd_f_huffman_env_3_0db_inp_table;
   1315       idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table;
   1316     }
   1317   }
   1318 
   1319   ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_t, hcb_f, idx_t,
   1320                          idx_f, &no_band[0], num_env, env_data_tbl_comp_factor,
   1321                          start_bits, start_bits_balance, 0, lav,
   1322                          ptr_header_data->usac_flag);
   1323 
   1324   return 1;
   1325 }
   1326 
   1327 int ixheaacd_extract_frame_info_ld(
   1328     ia_bit_buf_struct *it_bit_buff,
   1329     ia_sbr_frame_info_data_struct *h_frame_data) {
   1330   int abs_bord_lead = 0, num_rel_lead = 0, num_rel_trail = 0, bs_num_env = 0,
   1331       frame_class, temp, env, k, abs_bord_trail = 0, middle_bord = 0,
   1332       bs_num_noise, transient_env_temp = 0, bs_transient_position = 0;
   1333 
   1334   WORD16 time_border[MAX_ENVELOPES + 1];
   1335   WORD16 time_border_noise[2 + 1];
   1336   WORD16 f[MAX_ENVELOPES + 1];
   1337   int rel_bord_lead[7] = {0};
   1338 
   1339   ia_frame_info_struct *v_frame_info = &h_frame_data->str_frame_info_details;
   1340 
   1341   int numTimeSlots = h_frame_data->num_time_slots;
   1342 
   1343   v_frame_info->frame_class = frame_class =
   1344       ixheaacd_read_bits_buf(it_bit_buff, SBRLD_CLA_BITS);
   1345 
   1346   switch (frame_class) {
   1347     case FIXFIX:
   1348       temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS);
   1349       bs_num_env = 1 << temp;
   1350 
   1351       if (bs_num_env == 1)
   1352         h_frame_data->amp_res =
   1353             ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS);
   1354 
   1355       f[0] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS);
   1356 
   1357       for (env = 1; env < bs_num_env; env++) f[env] = f[0];
   1358       break;
   1359     case LD_TRAN:
   1360       bs_transient_position =
   1361           ixheaacd_read_bits_buf(it_bit_buff, SBR_TRAN_BITS);
   1362       v_frame_info->frame_class = 0;
   1363       if ((numTimeSlots != 16) && (bs_transient_position >= LD_ENV_TBL_480)) {
   1364         return -1;
   1365       }
   1366       bs_num_env = (numTimeSlots == 16)
   1367                        ? ixheaacd_ld_env_table_512[bs_transient_position]
   1368                                                   [SBR_ENVT_NUMENV]
   1369                        : ixheaacd_ld_env_table_480[bs_transient_position]
   1370                                                   [SBR_ENVT_NUMENV];
   1371       for (env = 0; env < bs_num_env; env++)
   1372         f[env] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS);
   1373       break;
   1374   }
   1375 
   1376   switch (frame_class) {
   1377     case FIXFIX:
   1378       abs_bord_lead = 0;
   1379       abs_bord_trail = numTimeSlots;
   1380       num_rel_lead = bs_num_env - 1;
   1381       num_rel_trail = 0;
   1382 
   1383       for (k = 0; k < num_rel_lead; k++) {
   1384         rel_bord_lead[k] = ixheaacd_ld_env_table_time_slot[num_rel_lead - 1];
   1385       }
   1386 
   1387       time_border[0] = abs_bord_lead;
   1388       time_border[bs_num_env] = abs_bord_trail;
   1389       for (env = 1; env <= num_rel_lead; env++) {
   1390         time_border[env] = abs_bord_lead;
   1391         for (k = 0; k <= env - 1; k++) time_border[env] += rel_bord_lead[k];
   1392       }
   1393       break;
   1394 
   1395     case LD_TRAN:
   1396       time_border[0] = 0;
   1397       time_border[bs_num_env] = numTimeSlots;
   1398       for (k = 1; k < bs_num_env; k++)
   1399         time_border[k] =
   1400             (numTimeSlots == 16)
   1401                 ? ixheaacd_ld_env_table_512[bs_transient_position][k]
   1402                 : ixheaacd_ld_env_table_480[bs_transient_position][k];
   1403       break;
   1404 
   1405     default:
   1406       time_border[0] = 0;
   1407 
   1408       break;
   1409   };
   1410 
   1411   switch (frame_class) {
   1412     case FIXFIX:
   1413       middle_bord = bs_num_env / 2;
   1414       break;
   1415     case LD_TRAN:
   1416       middle_bord = 1;
   1417       break;
   1418   };
   1419 
   1420   time_border_noise[0] = time_border[0];
   1421   if (bs_num_env > 1) {
   1422     time_border_noise[1] = time_border[middle_bord];
   1423     time_border_noise[2] = time_border[bs_num_env];
   1424     bs_num_noise = 2;
   1425   } else {
   1426     time_border_noise[1] = time_border[bs_num_env];
   1427     bs_num_noise = 1;
   1428   }
   1429 
   1430   switch (frame_class) {
   1431     case FIXFIX:
   1432       transient_env_temp = -1;
   1433       break;
   1434     case LD_TRAN:
   1435       transient_env_temp =
   1436           (numTimeSlots == 16)
   1437               ? ixheaacd_ld_env_table_512[bs_transient_position]
   1438                                          [SBR_ENVT_TRANIDX]
   1439               : ixheaacd_ld_env_table_480[bs_transient_position]
   1440                                          [SBR_ENVT_TRANIDX];
   1441       break;
   1442   };
   1443 
   1444   v_frame_info->num_env = bs_num_env;
   1445   memcpy(v_frame_info->border_vec, time_border,
   1446          (bs_num_env + 1) * sizeof(WORD16));
   1447   memcpy(v_frame_info->freq_res, f, bs_num_env * sizeof(WORD16));
   1448   v_frame_info->transient_env = transient_env_temp;
   1449   v_frame_info->num_noise_env = bs_num_noise;
   1450   memcpy(v_frame_info->noise_border_vec, time_border_noise,
   1451          (bs_num_noise + 1) * sizeof(WORD16));
   1452 
   1453   return 1;
   1454 }
   1455 
   1456 WORD32 ixheaacd_pvc_time_freq_grid_info(
   1457     ia_bit_buf_struct *it_bit_buff,
   1458     ia_sbr_frame_info_data_struct *ptr_frame_data) {
   1459   WORD32 bs_num_env = 0, bs_num_noise = 0;
   1460   WORD32 time_border[MAX_ENVELOPES + 1];
   1461   WORD32 time_border_noise[2 + 1];
   1462   WORD32 pvc_time_border[MAX_ENVELOPES + 1];
   1463   WORD32 pvc_time_border_noise[2 + 1];
   1464   WORD32 bs_freq_res[MAX_ENVELOPES + 1];
   1465   WORD32 var_len;
   1466   ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
   1467   ia_frame_info_struct *pvc_frame_info = &ptr_frame_data->str_pvc_frame_info;
   1468   WORD32 i;
   1469   WORD32 prev_sbr_mode = ptr_frame_data->prev_sbr_mode;
   1470 
   1471   WORD32 tmp;
   1472   WORD32 bs_noise_pos;
   1473   bs_noise_pos = ixheaacd_read_bits_buf(it_bit_buff, 4);
   1474 
   1475   tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
   1476   if (tmp == 0) {
   1477     ptr_frame_data->var_len = 0;
   1478   } else {
   1479     tmp = ixheaacd_read_bits_buf(it_bit_buff, 2);
   1480     ptr_frame_data->var_len = tmp + 1;
   1481   }
   1482   var_len = ptr_frame_data->var_len;
   1483 
   1484   if (p_frame_info->num_env > 0) {
   1485     time_border[0] = p_frame_info->border_vec[p_frame_info->num_env] - 16;
   1486   } else {
   1487     time_border[0] = 0;
   1488   }
   1489   if (time_border[0] < 0) return -1;
   1490   pvc_time_border[0] = 0;
   1491   bs_freq_res[0] = 0;
   1492 
   1493   if (bs_noise_pos == 0) {
   1494     time_border[1] = 16 + var_len;
   1495     pvc_time_border[1] = 16;
   1496     bs_num_noise = 1;
   1497     bs_num_env = 1;
   1498   } else {
   1499     time_border[1] = bs_noise_pos;
   1500     pvc_time_border[1] = bs_noise_pos;
   1501     time_border[2] = 16 + var_len;
   1502     pvc_time_border[2] = 16;
   1503     bs_freq_res[1] = 0;
   1504     bs_num_noise = 2;
   1505     bs_num_env = 2;
   1506   }
   1507 
   1508   for (i = 0; i < 3; i++) {
   1509     time_border_noise[i] = time_border[i];
   1510     pvc_time_border_noise[i] = pvc_time_border[i];
   1511   }
   1512 
   1513   if (prev_sbr_mode == ORIG_SBR) {
   1514     pvc_time_border[0] = time_border[0];
   1515     pvc_time_border_noise[0] = time_border[0];
   1516   }
   1517 
   1518   pvc_frame_info->num_env = bs_num_env;
   1519   for (i = 0; i < (bs_num_env + 1); i++) {
   1520     pvc_frame_info->border_vec[i] = pvc_time_border[i];
   1521   }
   1522   for (i = 0; i < (bs_num_env); i++) {
   1523     pvc_frame_info->freq_res[i] = bs_freq_res[i];
   1524   }
   1525   pvc_frame_info->transient_env = -1;
   1526   pvc_frame_info->num_noise_env = bs_num_noise;
   1527   for (i = 0; i < (bs_num_noise + 1); i++) {
   1528     pvc_frame_info->noise_border_vec[i] = pvc_time_border_noise[i];
   1529   }
   1530   p_frame_info->num_env = bs_num_env;
   1531   for (i = 0; i < (bs_num_env + 1); i++) {
   1532     p_frame_info->border_vec[i] = time_border[i];
   1533   }
   1534   for (i = 0; i < (bs_num_env); i++) {
   1535     p_frame_info->freq_res[i] = bs_freq_res[i];
   1536   }
   1537   p_frame_info->transient_env = -1;
   1538   p_frame_info->num_noise_env = bs_num_noise;
   1539   for (i = 0; i < (bs_num_noise + 1); i++) {
   1540     p_frame_info->noise_border_vec[i] = time_border_noise[i];
   1541   }
   1542   return 0;
   1543 }
   1544 
   1545 WORD16 ixheaacd_sbr_time_freq_grid_info(
   1546     ia_bit_buf_struct *it_bit_buff,
   1547     ia_sbr_frame_info_data_struct *ptr_frame_data,
   1548     ia_env_extr_tables_struct *env_extr_tables_ptr) {
   1549   WORD32 i, k, bs_num_rel = 0;
   1550   WORD32 bs_pointer_bits = 0, bs_num_env = 0, border, bs_pointer,
   1551          bs_var_bord = 0, temp = 0;
   1552   WORD32 freq_res_0 = 0, frame_class;
   1553   WORD32 abs_bord_lead, abs_bord_trail, num_rel_trail, num_rel_lead;
   1554   WORD32 pointer_bits_array[7] = {1, 2, 2, 3, 3, 3, 3};
   1555   ia_frame_info_struct *p_fixfix_tab;
   1556   ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
   1557 
   1558   frame_class = ixheaacd_read_bits_buf(it_bit_buff, SBR_FRAME_CLASS_BITS);
   1559   p_frame_info->frame_class = frame_class;
   1560 
   1561   switch (frame_class) {
   1562     case FIXFIX:
   1563       temp =
   1564           ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS + SBR_FRQ_RES_BITS);
   1565       bs_num_env = (temp & 0x6) >> SBR_FRQ_RES_BITS;
   1566       p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env];
   1567       memcpy(p_frame_info, p_fixfix_tab, sizeof(ia_frame_info_struct));
   1568       bs_num_env = (1 << bs_num_env);
   1569       freq_res_0 = temp & 0x1;
   1570 
   1571       if (!freq_res_0) {
   1572         memset(&p_frame_info->freq_res[0], 0, sizeof(WORD16) * bs_num_env);
   1573       }
   1574       break;
   1575     case FIXVAR:
   1576       bs_var_bord =
   1577           ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS);
   1578       bs_num_rel = bs_var_bord & 3;
   1579       bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
   1580       bs_num_env = bs_num_rel + 1;
   1581       p_frame_info->border_vec[0] = 0;
   1582       border = bs_var_bord + SBR_TIME_SLOTS;
   1583       p_frame_info->border_vec[bs_num_env] = border;
   1584       for (k = bs_num_rel; k > 0; k--) {
   1585         temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
   1586         border = border - ((temp << 1) + 2);
   1587         if (border < 0) border = 0;
   1588         p_frame_info->border_vec[k] = border;
   1589       }
   1590 
   1591       bs_pointer_bits = pointer_bits_array[bs_num_rel];
   1592       bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
   1593 
   1594       if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0;
   1595 
   1596       for (k = bs_num_rel; k >= 0; k--) {
   1597         p_frame_info->freq_res[k] =
   1598             ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
   1599       }
   1600       if (bs_pointer) {
   1601         p_frame_info->transient_env = bs_num_env + 1 - bs_pointer;
   1602       } else {
   1603         p_frame_info->transient_env = -1;
   1604       }
   1605       if ((bs_pointer == 0) || (bs_pointer == 1))
   1606         p_frame_info->noise_border_vec[1] =
   1607             p_frame_info->border_vec[bs_num_rel];
   1608       else
   1609         p_frame_info->noise_border_vec[1] =
   1610             p_frame_info->border_vec[p_frame_info->transient_env];
   1611 
   1612       break;
   1613 
   1614     case VARFIX:
   1615       bs_var_bord =
   1616           ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS);
   1617       bs_num_rel = bs_var_bord & 3;
   1618       bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
   1619       bs_num_env = bs_num_rel + 1;
   1620 
   1621       border = bs_var_bord;
   1622       p_frame_info->border_vec[0] = border;
   1623       for (k = 1; k <= bs_num_rel; k++) {
   1624         temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
   1625         border = border + ((temp << 1) + 2);
   1626         if (border > SBR_TIME_SLOTS) border = SBR_TIME_SLOTS;
   1627         p_frame_info->border_vec[k] = border;
   1628       }
   1629       p_frame_info->border_vec[k] = SBR_TIME_SLOTS;
   1630 
   1631       bs_pointer_bits = pointer_bits_array[bs_num_rel];
   1632 
   1633       bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
   1634 
   1635       if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0;
   1636 
   1637       if (bs_pointer == 0 || (bs_pointer - 1) == 0) {
   1638         p_frame_info->transient_env = -1;
   1639       } else {
   1640         p_frame_info->transient_env = bs_pointer - 1;
   1641       }
   1642 
   1643       for (k = 0; k <= bs_num_rel; k++) {
   1644         p_frame_info->freq_res[k] =
   1645             ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
   1646       }
   1647 
   1648       switch (bs_pointer) {
   1649         case 0:
   1650           p_frame_info->noise_border_vec[1] = p_frame_info->border_vec[1];
   1651           break;
   1652         case 1:
   1653           p_frame_info->noise_border_vec[1] =
   1654               p_frame_info->border_vec[bs_num_rel];
   1655           break;
   1656         default:
   1657           p_frame_info->noise_border_vec[1] =
   1658               p_frame_info->border_vec[(WORD32)p_frame_info->transient_env];
   1659           break;
   1660       }
   1661 
   1662       break;
   1663 
   1664     case VARVAR:
   1665       abs_bord_lead = ixheaacd_read_bits_buf(
   1666           it_bit_buff, 2 * SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
   1667       abs_bord_trail =
   1668           (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + SBR_TIME_SLOTS);
   1669       num_rel_trail = ((abs_bord_lead & 0xc) >> SBR_NUM_BITS);
   1670       num_rel_lead = (abs_bord_lead & 0x3);
   1671       abs_bord_lead = abs_bord_lead >> (SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
   1672       bs_num_env = ((num_rel_trail + num_rel_lead) + 1);
   1673       border = abs_bord_lead;
   1674       p_frame_info->border_vec[0] = border;
   1675 
   1676       for (k = 1; k <= num_rel_trail; k++) {
   1677         temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
   1678         border = border + ((temp << 1) + 2);
   1679         p_frame_info->border_vec[k] = border;
   1680       }
   1681 
   1682       border = abs_bord_trail;
   1683       i = bs_num_env;
   1684 
   1685       p_frame_info->border_vec[i] = border;
   1686 
   1687       for (k = 0; k < num_rel_lead; k++) {
   1688         temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
   1689         border = border - ((temp << 1) + 2);
   1690         i--;
   1691         p_frame_info->border_vec[i] = border;
   1692       }
   1693       bs_pointer_bits = pointer_bits_array[num_rel_trail + num_rel_lead];
   1694 
   1695       bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
   1696       if ((bs_pointer - ((num_rel_trail + num_rel_lead) + 1)) > 0) return 0;
   1697 
   1698       if (bs_pointer) {
   1699         p_frame_info->transient_env = bs_num_env + 1 - bs_pointer;
   1700       } else {
   1701         p_frame_info->transient_env = -1;
   1702       }
   1703 
   1704       for (k = 0; k < bs_num_env; k++) {
   1705         p_frame_info->freq_res[k] =
   1706             ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
   1707       }
   1708       p_frame_info->noise_border_vec[0] = abs_bord_lead;
   1709       if (bs_num_env == 1) {
   1710         p_frame_info->noise_border_vec[1] = abs_bord_trail;
   1711       } else {
   1712         if (bs_pointer == 0 || (bs_pointer - 1) == 0)
   1713           p_frame_info->noise_border_vec[1] =
   1714               p_frame_info->border_vec[bs_num_env - 1];
   1715         else
   1716           p_frame_info->noise_border_vec[1] =
   1717               p_frame_info->border_vec[(WORD32)p_frame_info->transient_env];
   1718 
   1719         p_frame_info->noise_border_vec[2] = abs_bord_trail;
   1720       }
   1721       break;
   1722   }
   1723   p_frame_info->num_env = bs_num_env;
   1724 
   1725   if (bs_num_env == 1)
   1726     p_frame_info->num_noise_env = 1;
   1727   else
   1728     p_frame_info->num_noise_env = 2;
   1729 
   1730   if (frame_class == VARFIX || frame_class == FIXVAR) {
   1731     p_frame_info->noise_border_vec[0] = p_frame_info->border_vec[0];
   1732     p_frame_info->noise_border_vec[p_frame_info->num_noise_env] =
   1733         p_frame_info->border_vec[bs_num_env];
   1734   }
   1735   return 1;
   1736 }
   1737