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