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 <stdio.h>
     22 #include <stdarg.h>
     23 #include <assert.h>
     24 
     25 #include <ixheaacd_type_def.h>
     26 
     27 #include "ixheaacd_bitbuffer.h"
     28 
     29 #include "ixheaacd_defines.h"
     30 #include "ixheaacd_memory_standards.h"
     31 #include "ixheaacd_sbrdecsettings.h"
     32 #include "ixheaacd_env_extr_part.h"
     33 #include "ixheaacd_aac_rom.h"
     34 #include "ixheaacd_common_rom.h"
     35 #include <ixheaacd_sbr_rom.h>
     36 #include "ixheaacd_pulsedata.h"
     37 #include "ixheaacd_pns.h"
     38 
     39 #include "ixheaacd_sbr_common.h"
     40 #include "ixheaacd_drc_data_struct.h"
     41 #include "ixheaacd_drc_dec.h"
     42 
     43 #include "ixheaacd_lt_predict.h"
     44 
     45 #include "ixheaacd_channelinfo.h"
     46 #include "ixheaacd_channel.h"
     47 #include "ixheaacd_channelinfo.h"
     48 #include "ixheaacd_sbrdecoder.h"
     49 #include "ixheaacd_audioobjtypes.h"
     50 #include "ixheaacd_latmdemux.h"
     51 #include "ixheaacd_aacdec.h"
     52 #include "ixheaacd_sbr_common.h"
     53 
     54 #include "ixheaacd_mps_polyphase.h"
     55 #include "ixheaacd_config.h"
     56 #include "ixheaacd_mps_dec.h"
     57 
     58 #include "ixheaacd_struct_def.h"
     59 
     60 #include "ixheaacd_config.h"
     61 #include "ixheaacd_interface.h"
     62 #include "ixheaacd_info.h"
     63 #include "ixheaacd_struct.h"
     64 #include "ixheaacd_constants.h"
     65 
     66 UWORD32 ixheaacd_sbr_ratio(UWORD32 core_sbr_framelength_idx) {
     67   UWORD32 sbr_ratio_index = 0x0FF;
     68 
     69   switch (core_sbr_framelength_idx) {
     70     case 0:
     71     case 1:
     72       sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
     73       break;
     74     case 2:
     75       sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3;
     76       break;
     77     case 3:
     78       sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1;
     79       break;
     80     case 4:
     81       sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1;
     82       break;
     83   }
     84 
     85   return sbr_ratio_index;
     86 }
     87 
     88 WORD32 ixheaacd_get_sample_freq_indx(WORD32 sampling_freq) {
     89   WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000,
     90                                 24000, 22050, 16000, 12000, 11025, 8000,
     91                                 7350,  0,     0,     0};
     92 
     93   WORD32 index;
     94   WORD32 tbl_size = sizeof(sampling_rate_tbl) / sizeof(WORD32) - 1;
     95 
     96   for (index = 0; index < tbl_size; index++) {
     97     if (sampling_rate_tbl[index] == sampling_freq) break;
     98   }
     99 
    100   if (index > tbl_size) {
    101     return tbl_size - 1;
    102   }
    103 
    104   return index;
    105 }
    106 UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx,
    107                             WORD32 *output_framelength, WORD32 *block_size,
    108                             WORD32 *output_samples, WORD32 *sample_rate_layer,
    109                             UWORD32 *sample_freq_indx) {
    110   UWORD32 sbr_ratio_index = 0x0FF;
    111 
    112   *output_framelength = -1;
    113 
    114   switch (core_sbr_framelength_idx) {
    115     case 0:
    116       sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
    117       *output_framelength = USAC_OUT_FRAMELENGTH_768;
    118       *block_size = 768;
    119       *output_samples = *block_size;
    120       break;
    121     case 1:
    122       sbr_ratio_index = USAC_SBR_RATIO_NO_SBR;
    123       *output_framelength = USAC_OUT_FRAMELENGTH_1024;
    124       *block_size = 1024;
    125       *output_samples = *block_size;
    126       break;
    127     case 2:
    128       sbr_ratio_index = USAC_SBR_RATIO_INDEX_8_3;
    129       *output_framelength = USAC_OUT_FRAMELENGTH_2048;
    130       *block_size = 768;
    131       *output_samples = (*block_size * 8) / 3;
    132       *sample_rate_layer = (*sample_rate_layer * 3) >> 3;
    133       break;
    134     case 3:
    135       sbr_ratio_index = USAC_SBR_RATIO_INDEX_2_1;
    136       *output_framelength = USAC_OUT_FRAMELENGTH_2048;
    137       *block_size = 1024;
    138       *output_samples = *block_size * 2;
    139       *sample_rate_layer = *sample_rate_layer >> 1;
    140       break;
    141     case 4:
    142       sbr_ratio_index = USAC_SBR_RATIO_INDEX_4_1;
    143       *output_framelength = USAC_OUT_FRAMELENGTH_4096;
    144       *block_size = 1024;
    145       *output_samples = *block_size * 4;
    146       *sample_rate_layer = *sample_rate_layer >> 2;
    147       break;
    148   }
    149 
    150   *sample_freq_indx = ixheaacd_get_sample_freq_indx(*sample_rate_layer);
    151 
    152   return sbr_ratio_index;
    153 }
    154 
    155 VOID ixheaacd_read_escape_value(ia_bit_buf_struct *it_bit_buff,
    156                                 UWORD32 *ext_ele_value, UWORD32 no_bits1,
    157                                 UWORD32 no_bits2, UWORD32 no_bits3) {
    158   UWORD32 value = 0;
    159   UWORD32 val_add = 0;
    160   UWORD32 max_val1 = (1 << no_bits1) - 1;
    161   UWORD32 max_val2 = (1 << no_bits2) - 1;
    162 
    163   value = ixheaacd_read_bits_buf(it_bit_buff, no_bits1);
    164 
    165   if (value == max_val1) {
    166     val_add = ixheaacd_read_bits_buf(it_bit_buff, no_bits2);
    167 
    168     value += val_add;
    169 
    170     if (val_add == max_val2) {
    171       val_add = ixheaacd_read_bits_buf(it_bit_buff, no_bits3);
    172 
    173       value += val_add;
    174     }
    175   }
    176 
    177   *ext_ele_value = value;
    178 }
    179 
    180 static VOID ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config,
    181                                         UWORD32 ch_config_index) {
    182   switch (ch_config_index) {
    183     case 1:
    184       pstr_usac_config->num_out_channels = 1;
    185       pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_C;
    186       break;
    187     case 2:
    188       pstr_usac_config->num_out_channels = 2;
    189       pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_L;
    190       pstr_usac_config->output_channel_pos[1] = BS_OUTPUT_CHANNEL_POS_R;
    191       break;
    192 
    193     default:
    194       assert(0);
    195       break;
    196   }
    197 }
    198 
    199 VOID ixheaacd_sbr_config(ia_bit_buf_struct *it_bit_buff,
    200                          ia_usac_dec_sbr_config_struct *pstr_usac_sbr_config) {
    201   pstr_usac_sbr_config->harmonic_sbr = ixheaacd_read_bits_buf(it_bit_buff, 1);
    202   pstr_usac_sbr_config->bs_inter_tes = ixheaacd_read_bits_buf(it_bit_buff, 1);
    203   pstr_usac_sbr_config->bs_pvc = ixheaacd_read_bits_buf(it_bit_buff, 1);
    204   pstr_usac_sbr_config->dflt_start_freq =
    205       ixheaacd_read_bits_buf(it_bit_buff, 4);
    206 
    207   pstr_usac_sbr_config->dflt_stop_freq = ixheaacd_read_bits_buf(it_bit_buff, 4);
    208   pstr_usac_sbr_config->dflt_header_extra1 =
    209       ixheaacd_read_bits_buf(it_bit_buff, 1);
    210   pstr_usac_sbr_config->dflt_header_extra2 =
    211       ixheaacd_read_bits_buf(it_bit_buff, 1);
    212 
    213   if (pstr_usac_sbr_config->dflt_header_extra1) {
    214     pstr_usac_sbr_config->dflt_freq_scale =
    215         ixheaacd_read_bits_buf(it_bit_buff, 2);
    216     pstr_usac_sbr_config->dflt_alter_scale =
    217         ixheaacd_read_bits_buf(it_bit_buff, 1);
    218     pstr_usac_sbr_config->dflt_noise_bands =
    219         ixheaacd_read_bits_buf(it_bit_buff, 2);
    220   }
    221 
    222   if (pstr_usac_sbr_config->dflt_header_extra2) {
    223     pstr_usac_sbr_config->dflt_limiter_bands =
    224         ixheaacd_read_bits_buf(it_bit_buff, 2);
    225     pstr_usac_sbr_config->dflt_limiter_gains =
    226         ixheaacd_read_bits_buf(it_bit_buff, 2);
    227     pstr_usac_sbr_config->dflt_interpol_freq =
    228         ixheaacd_read_bits_buf(it_bit_buff, 1);
    229     pstr_usac_sbr_config->dflt_smoothing_mode =
    230         ixheaacd_read_bits_buf(it_bit_buff, 1);
    231   }
    232 }
    233 
    234 WORD32 ixheaacd_ext_element_config(
    235     ia_bit_buf_struct *it_bit_buff,
    236     ia_usac_dec_element_config_struct *pstr_usac_element_config,
    237     UWORD8 *ptr_usac_ext_ele_payload, WORD32 *ptr_usac_ext_ele_payload_len,
    238     WORD32 *preroll_flag) {
    239   UWORD32 usac_ext_element_type, usac_ext_element_config_length, flag;
    240 
    241   UWORD32 i;
    242 
    243   ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_type), 4, 8, 16);
    244 
    245   ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_config_length), 4,
    246                              8, 16);
    247   if (usac_ext_element_config_length >= 768) return -1;
    248 
    249   flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
    250 
    251   *ptr_usac_ext_ele_payload_len = 0;
    252 
    253   if (flag) {
    254     ixheaacd_read_escape_value(
    255         it_bit_buff,
    256         (UWORD32 *)(&(pstr_usac_element_config->usac_ext_eleme_def_len)), 8, 16,
    257         0);
    258     pstr_usac_element_config->usac_ext_eleme_def_len += 1;
    259 
    260   } else {
    261     pstr_usac_element_config->usac_ext_eleme_def_len = 0;
    262   }
    263 
    264   pstr_usac_element_config->usac_ext_elem_pld_frag =
    265       ixheaacd_read_bits_buf(it_bit_buff, 1);
    266 
    267   switch (usac_ext_element_type) {
    268     case ID_EXT_ELE_FILL:
    269       break;
    270     case ID_EXT_ELE_AUDIOPREROLL:
    271       *preroll_flag = 1;
    272       break;
    273     case ID_EXT_ELE_UNI_DRC:
    274       for (i = 0; i < usac_ext_element_config_length; i++) {
    275         ptr_usac_ext_ele_payload[i] = ixheaacd_read_bits_buf(it_bit_buff, 8);
    276       }
    277       *ptr_usac_ext_ele_payload_len = usac_ext_element_config_length;
    278       break;
    279 
    280     default:
    281       if ((it_bit_buff->cnt_bits >> 3) < (WORD32)usac_ext_element_config_length)
    282         return -1;
    283       it_bit_buff->ptr_read_next += usac_ext_element_config_length;
    284       it_bit_buff->cnt_bits -= (usac_ext_element_config_length << 3);
    285 
    286       break;
    287   }
    288 
    289   return 0;
    290 }
    291 
    292 VOID ixheaacd_mps212_config(
    293     ia_bit_buf_struct *it_bit_buff,
    294     ia_usac_dec_mps_config_struct *pstr_usac_mps212_config,
    295     WORD32 stereo_config_index) {
    296   pstr_usac_mps212_config->bs_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3);
    297 
    298   pstr_usac_mps212_config->bs_fixed_gain_dmx =
    299       ixheaacd_read_bits_buf(it_bit_buff, 3);
    300 
    301   pstr_usac_mps212_config->bs_temp_shape_config =
    302       ixheaacd_read_bits_buf(it_bit_buff, 2);
    303 
    304   pstr_usac_mps212_config->bs_decorr_config =
    305       ixheaacd_read_bits_buf(it_bit_buff, 2);
    306 
    307   pstr_usac_mps212_config->bs_high_rate_mode =
    308       ixheaacd_read_bits_buf(it_bit_buff, 1);
    309 
    310   pstr_usac_mps212_config->bs_phase_coding =
    311       ixheaacd_read_bits_buf(it_bit_buff, 1);
    312 
    313   pstr_usac_mps212_config->bs_ott_bands_phase_present =
    314       ixheaacd_read_bits_buf(it_bit_buff, 1);
    315 
    316   if (pstr_usac_mps212_config->bs_ott_bands_phase_present) {
    317     pstr_usac_mps212_config->bs_ott_bands_phase =
    318         ixheaacd_read_bits_buf(it_bit_buff, 5);
    319   }
    320 
    321   if (stereo_config_index > 1) {
    322     pstr_usac_mps212_config->bs_residual_bands =
    323         ixheaacd_read_bits_buf(it_bit_buff, 5);
    324 
    325     pstr_usac_mps212_config->bs_ott_bands_phase =
    326         max(pstr_usac_mps212_config->bs_ott_bands_phase,
    327             pstr_usac_mps212_config->bs_residual_bands);
    328 
    329     pstr_usac_mps212_config->bs_pseudo_lr =
    330         ixheaacd_read_bits_buf(it_bit_buff, 1);
    331   }
    332 
    333   if (pstr_usac_mps212_config->bs_temp_shape_config == 2)
    334     pstr_usac_mps212_config->bs_env_quant_mode =
    335         ixheaacd_read_bits_buf(it_bit_buff, 1);
    336 }
    337 
    338 VOID ixheaacd_cpe_config(
    339     ia_bit_buf_struct *it_bit_buff,
    340     ia_usac_dec_element_config_struct *pstr_usac_element_config,
    341     WORD32 sbr_ratio_index) {
    342   pstr_usac_element_config->tw_mdct = ixheaacd_read_bits_buf(it_bit_buff, 1);
    343   pstr_usac_element_config->noise_filling =
    344       ixheaacd_read_bits_buf(it_bit_buff, 1);
    345 
    346   if (sbr_ratio_index > 0) {
    347     ixheaacd_sbr_config(it_bit_buff,
    348                         &(pstr_usac_element_config->str_usac_sbr_config));
    349     pstr_usac_element_config->stereo_config_index =
    350         ixheaacd_read_bits_buf(it_bit_buff, 2);
    351 
    352   } else {
    353     pstr_usac_element_config->stereo_config_index = 0;
    354   }
    355 
    356   if (pstr_usac_element_config->stereo_config_index > 0)
    357     ixheaacd_mps212_config(it_bit_buff,
    358                            &(pstr_usac_element_config->str_usac_mps212_config),
    359                            pstr_usac_element_config->stereo_config_index);
    360 }
    361 
    362 WORD32 ixheaacd_decoder_config(
    363     ia_bit_buf_struct *it_bit_buff,
    364     ia_usac_decoder_config_struct *pstr_usac_decoder_config,
    365     WORD32 sbr_ratio_index, UINT32 *chan) {
    366   UWORD32 elem_idx = 0;
    367   UWORD32 err = 0;
    368 
    369   ixheaacd_read_escape_value(
    370       it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16);
    371   pstr_usac_decoder_config->num_elements += 1;
    372   pstr_usac_decoder_config->preroll_flag = 0;
    373 
    374   if (pstr_usac_decoder_config->num_elements > USAC_MAX_ELEMENTS) {
    375     return -1;
    376   }
    377 
    378   for (elem_idx = 0; elem_idx < pstr_usac_decoder_config->num_elements;
    379        elem_idx++) {
    380     ia_usac_dec_element_config_struct *pstr_usac_element_config =
    381         &(pstr_usac_decoder_config->str_usac_element_config[elem_idx]);
    382 
    383     pstr_usac_decoder_config->usac_element_type[elem_idx] =
    384         ixheaacd_read_bits_buf(it_bit_buff, 2);
    385 
    386     switch (pstr_usac_decoder_config->usac_element_type[elem_idx]) {
    387       case ID_USAC_SCE:
    388 
    389         pstr_usac_element_config->tw_mdct =
    390             ixheaacd_read_bits_buf(it_bit_buff, 1);
    391         pstr_usac_element_config->noise_filling =
    392             ixheaacd_read_bits_buf(it_bit_buff, 1);
    393 
    394         if (sbr_ratio_index > 0)
    395           ixheaacd_sbr_config(it_bit_buff,
    396                               &(pstr_usac_element_config->str_usac_sbr_config));
    397 
    398         break;
    399 
    400       case ID_USAC_CPE:
    401         ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config,
    402                             sbr_ratio_index);
    403         if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2)
    404           return -1;
    405 
    406         break;
    407 
    408       case ID_USAC_LFE:
    409 
    410         pstr_usac_element_config->tw_mdct = 0;
    411         pstr_usac_element_config->noise_filling = 0;
    412         break;
    413 
    414       case ID_USAC_EXT:
    415         err = ixheaacd_ext_element_config(
    416             it_bit_buff, pstr_usac_element_config,
    417             &pstr_usac_decoder_config->usac_ext_ele_payload_buf[elem_idx][0],
    418             &pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx],
    419             &(pstr_usac_decoder_config->preroll_flag));
    420 
    421         if (pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx] > 0) {
    422           pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 1;
    423         } else {
    424           pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 0;
    425         }
    426         if (err != 0) return -1;
    427         break;
    428       default:
    429         return -1;
    430         break;
    431     }
    432   }
    433   return err;
    434 }
    435 
    436 WORD32 ixheaacd_config_extension(
    437     ia_bit_buf_struct *it_bit_buff,
    438     ia_usac_decoder_config_struct *pstr_usac_decoder_config) {
    439   UWORD32 i, j;
    440   UWORD32 num_config_extensions;
    441   UWORD32 usac_config_ext_type, usac_config_ext_len;
    442 
    443   ixheaacd_read_escape_value(it_bit_buff, &(num_config_extensions), 2, 4, 8);
    444   num_config_extensions += 1;
    445   if (USAC_MAX_CONFIG_EXTENSIONS < num_config_extensions) {
    446     return -1;
    447   }
    448 
    449   pstr_usac_decoder_config->num_config_extensions = num_config_extensions;
    450   memset(pstr_usac_decoder_config->usac_cfg_ext_info_len, 0,
    451          USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32));
    452   memset(pstr_usac_decoder_config->usac_cfg_ext_info_present, 0,
    453          USAC_MAX_CONFIG_EXTENSIONS * sizeof(WORD32));
    454 
    455   for (j = 0; j < num_config_extensions; j++) {
    456     UWORD32 tmp;
    457     UWORD32 fill_byte_val = 0xa5;
    458 
    459     ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_type), 4, 8, 16);
    460     ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_len), 4, 8, 16);
    461 
    462     switch (usac_config_ext_type) {
    463       case ID_CONFIG_EXT_FILL:
    464         for (i = 0; i < usac_config_ext_len; i++) {
    465           fill_byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8);
    466           if (fill_byte_val != 0xa5) return -1;
    467         }
    468         break;
    469       default:
    470         if ((WORD32)usac_config_ext_len > (it_bit_buff->cnt_bits >> 3)) {
    471           return -1;
    472         }
    473         if (ID_CONFIG_EXT_LOUDNESS_INFO == usac_config_ext_type) {
    474           for (i = 0; i < usac_config_ext_len; i++) {
    475             UWORD8 byte_val = ixheaacd_read_bits_buf(it_bit_buff, 8);
    476             pstr_usac_decoder_config->usac_cfg_ext_info_buf[j][i] = byte_val;
    477           }
    478           pstr_usac_decoder_config->usac_cfg_ext_info_len[j] =
    479               usac_config_ext_len;
    480           pstr_usac_decoder_config->usac_cfg_ext_info_present[j] = 1;
    481         } else {
    482           for (i = 0; i < usac_config_ext_len; i++)
    483             tmp = ixheaacd_read_bits_buf(it_bit_buff, 8);
    484         }
    485         break;
    486     }
    487   }
    488 
    489   return 0;
    490 }
    491 
    492 WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff,
    493                        ia_usac_config_struct *pstr_usac_conf, UINT32 *chan) {
    494   WORD32 tmp, err;
    495   err = 0;
    496 
    497   pstr_usac_conf->usac_sampling_frequency_index =
    498       ixheaacd_read_bits_buf(it_bit_buff, 5);
    499 
    500   if (pstr_usac_conf->usac_sampling_frequency_index == 0x1f)
    501     pstr_usac_conf->usac_sampling_frequency =
    502         ixheaacd_read_bits_buf(it_bit_buff, 24);
    503 
    504   pstr_usac_conf->core_sbr_framelength_index =
    505       ixheaacd_read_bits_buf(it_bit_buff, 3);
    506 
    507   if (pstr_usac_conf->core_sbr_framelength_index > 4) return -1;
    508 
    509   pstr_usac_conf->channel_configuration_index =
    510       ixheaacd_read_bits_buf(it_bit_buff, 5);
    511   if (pstr_usac_conf->channel_configuration_index >= 3) return -1;
    512 
    513   if (pstr_usac_conf->channel_configuration_index == 0) {
    514     UWORD32 i;
    515 
    516     ixheaacd_read_escape_value(it_bit_buff,
    517                                (UWORD32 *)(&(pstr_usac_conf->num_out_channels)),
    518                                5, 8, 16);
    519     if (BS_MAX_NUM_OUT_CHANNELS < pstr_usac_conf->num_out_channels) {
    520       return -1;
    521     }
    522     for (i = 0; i < pstr_usac_conf->num_out_channels; i++)
    523       pstr_usac_conf->output_channel_pos[i] =
    524           ixheaacd_read_bits_buf(it_bit_buff, 5);
    525 
    526   } else {
    527     ixheaacd_get_usac_chan_conf(pstr_usac_conf,
    528                                 pstr_usac_conf->channel_configuration_index);
    529   }
    530 
    531   err = ixheaacd_decoder_config(
    532       it_bit_buff, &(pstr_usac_conf->str_usac_dec_config),
    533       ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan);
    534   if (err != 0) return -1;
    535 
    536   tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
    537 
    538   if (tmp) {
    539     err = ixheaacd_config_extension(it_bit_buff,
    540                                     &pstr_usac_conf->str_usac_dec_config);
    541     if (err != 0) return -1;
    542   }
    543 
    544   return err;
    545 }
    546 
    547 VOID ixheaacd_conf_default(ia_usac_config_struct *pstr_usac_conf) {
    548   WORD32 i;
    549 
    550   pstr_usac_conf->num_out_channels = 0;
    551 
    552   for (i = 0; i < BS_MAX_NUM_OUT_CHANNELS; i++)
    553     pstr_usac_conf->output_channel_pos[i] = BS_OUTPUT_CHANNEL_POS_NA;
    554 
    555   pstr_usac_conf->str_usac_dec_config.num_elements = 0;
    556 
    557   for (i = 0; i < USAC_MAX_ELEMENTS; i++)
    558     pstr_usac_conf->str_usac_dec_config.usac_element_type[i] = ID_USAC_INVALID;
    559 
    560   return;
    561 }
    562