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 <stdio.h>
     21 #include <stdlib.h>
     22 #include <string.h>
     23 #include <assert.h>
     24 
     25 #include <ixheaacd_type_def.h>
     26 
     27 #include "ixheaacd_cnst.h"
     28 
     29 #include "ixheaacd_bitbuffer.h"
     30 #include "ixheaacd_config.h"
     31 #include "ixheaacd_interface.h"
     32 #include "ixheaacd_acelp_info.h"
     33 
     34 #include "ixheaacd_tns_usac.h"
     35 #include "ixheaacd_sbrdecsettings.h"
     36 #include "ixheaacd_info.h"
     37 #include "ixheaacd_struct.h"
     38 #include "ixheaacd_sbr_common.h"
     39 #include "ixheaacd_drc_data_struct.h"
     40 #include "ixheaacd_drc_dec.h"
     41 
     42 #include "ixheaacd_sbr_scale.h"
     43 #include "ixheaacd_env_extr_part.h"
     44 #include "ixheaacd_sbr_rom.h"
     45 #include "ixheaacd_hybrid.h"
     46 #include "ixheaacd_ps_dec.h"
     47 #include "ixheaacd_common_rom.h"
     48 #include "ixheaacd_qmf_dec.h"
     49 #include "ixheaacd_sbr_const.h"
     50 #include "ixheaacd_lpp_tran.h"
     51 #include "ixheaacd_sbrdecoder.h"
     52 #include "ixheaacd_env_extr.h"
     53 #include "ixheaacd_env_calc.h"
     54 #include "ixheaacd_pvc_dec.h"
     55 #include "ixheaacd_sbr_dec.h"
     56 #include "ixheaacd_mps_polyphase.h"
     57 #include "ixheaacd_sbr_const.h"
     58 
     59 #include "ixheaacd_main.h"
     60 
     61 #include "ixheaacd_arith_dec.h"
     62 
     63 #include <ixheaacd_type_def.h>
     64 #include "ixheaacd_memory_standards.h"
     65 #include "ixheaacd_sbrdecsettings.h"
     66 #include "ixheaacd_defines.h"
     67 #include <ixheaacd_aac_rom.h>
     68 #include "ixheaacd_common_rom.h"
     69 #include <ixheaacd_sbr_rom.h>
     70 #include "ixheaacd_bitbuffer.h"
     71 #include "ixheaacd_pulsedata.h"
     72 #include "ixheaacd_pns.h"
     73 
     74 #include "ixheaacd_lt_predict.h"
     75 
     76 #include "ixheaacd_channelinfo.h"
     77 #include "ixheaacd_channel.h"
     78 #include "ixheaacd_channelinfo.h"
     79 #include "ixheaacd_sbrdecoder.h"
     80 #include "ixheaacd_audioobjtypes.h"
     81 #include "ixheaacd_latmdemux.h"
     82 #include "ixheaacd_aacdec.h"
     83 #include "ixheaacd_sbr_common.h"
     84 
     85 #include "ixheaacd_mps_polyphase.h"
     86 #include "ixheaacd_config.h"
     87 #include "ixheaacd_mps_dec.h"
     88 #include "ixheaacd_struct_def.h"
     89 
     90 #include "ixheaacd_create.h"
     91 
     92 #include "ixheaacd_process.h"
     93 
     94 #include "ixheaacd_sbrdecoder.h"
     95 
     96 #include "ixheaacd_mps_interface.h"
     97 
     98 #include "ixheaacd_bit_extract.h"
     99 #include "ixheaacd_func_def.h"
    100 #include "ixheaacd_interface.h"
    101 
    102 extern ia_huff_code_word_struct ixheaacd_huff_book_scl[];
    103 
    104 extern WORD32 ixheaacd_book_scl_index[];
    105 extern WORD16 ixheaacd_book_scl_code_book[];
    106 
    107 extern ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
    108 extern const WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)];
    109 
    110 const WORD32 ixheaacd_sampl_freq_idx_table[17] = {
    111     96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000,
    112     12000, 11025, 8000,  7350,  -1,    -1,    -1,    -1};
    113 
    114 static VOID ixheaacd_info_init(ia_usac_samp_rate_info *ptr_samp_info,
    115                                WORD32 block_size_samples,
    116                                ia_sfb_info_struct *pstr_sfb_info_long,
    117                                ia_sfb_info_struct *pstr_sfb_info_short,
    118                                WORD16 *sfb_width_short,
    119                                WORD16 *sfb_width_long) {
    120   WORD32 i, j, k, n, ws;
    121   const WORD16 *sfbands;
    122   ia_sfb_info_struct *pstr_sfb_info_ip;
    123 
    124   pstr_sfb_info_long->islong = 1;
    125   pstr_sfb_info_long->max_win_len = 1;
    126   pstr_sfb_info_long->samp_per_bk = block_size_samples;
    127 
    128   switch (block_size_samples) {
    129     case 480:
    130       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_480;
    131       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_480;
    132       break;
    133     case 512:
    134       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_512;
    135       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_512;
    136       break;
    137     case 768:
    138       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_768;
    139       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_768;
    140       break;
    141     case 960:
    142       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_960;
    143       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_960;
    144       break;
    145     case 1024:
    146       pstr_sfb_info_long->sfb_per_sbk = ptr_samp_info->num_sfb_1024;
    147       pstr_sfb_info_long->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_1024;
    148       break;
    149     default:
    150       assert(0);
    151       break;
    152   }
    153 
    154   pstr_sfb_info_long->sfb_width = sfb_width_long;
    155   pstr_sfb_info_long->num_groups = 1;
    156   pstr_sfb_info_long->group_len[0] = 1;
    157 
    158   for (i = 0, j = 0, n = pstr_sfb_info_long->sfb_per_sbk; i < n; i++) {
    159     k = pstr_sfb_info_long->ptr_sfb_tbl[i];
    160     pstr_sfb_info_long->sfb_width[i] = k - j;
    161     j = k;
    162   }
    163 
    164   pstr_sfb_info_short->islong = 0;
    165   pstr_sfb_info_short->max_win_len = NSHORT;
    166   pstr_sfb_info_short->samp_per_bk = block_size_samples;
    167 
    168   for (i = 0; i < pstr_sfb_info_short->max_win_len; i++) {
    169     switch (block_size_samples) {
    170       case 768:
    171         pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_96;
    172         pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_96;
    173         break;
    174       case 960:
    175         pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_120;
    176         pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_120;
    177         break;
    178       case 1024:
    179         pstr_sfb_info_short->ptr_sfb_tbl = ptr_samp_info->ptr_sfb_128;
    180         pstr_sfb_info_short->sfb_per_sbk = ptr_samp_info->num_sfb_128;
    181         break;
    182       default:
    183         assert(0);
    184         break;
    185     }
    186   }
    187 
    188   pstr_sfb_info_short->sfb_width = sfb_width_short;
    189   for (i = 0, j = 0, n = pstr_sfb_info_short->sfb_per_sbk; i < n; i++) {
    190     k = pstr_sfb_info_short->ptr_sfb_tbl[i];
    191     pstr_sfb_info_short->sfb_width[i] = k - j;
    192     j = k;
    193   }
    194 
    195   pstr_sfb_info_ip = pstr_sfb_info_long;
    196   for (ws = 0; ws < 2; ws++) {
    197     pstr_sfb_info_ip->sfb_per_bk = 0;
    198     k = 0;
    199     n = 0;
    200     for (i = 0; i < pstr_sfb_info_ip->max_win_len; i++) {
    201       pstr_sfb_info_ip->bins_per_sbk =
    202           pstr_sfb_info_ip->samp_per_bk / pstr_sfb_info_ip->max_win_len;
    203 
    204       pstr_sfb_info_ip->sfb_per_bk += pstr_sfb_info_ip->sfb_per_sbk;
    205 
    206       sfbands = pstr_sfb_info_ip->ptr_sfb_tbl;
    207       for (j = 0; j < pstr_sfb_info_ip->sfb_per_sbk; j++)
    208         pstr_sfb_info_ip->sfb_idx_tbl[j + k] = sfbands[j] + n;
    209 
    210       n += pstr_sfb_info_ip->bins_per_sbk;
    211       k += pstr_sfb_info_ip->sfb_per_sbk;
    212     }
    213     pstr_sfb_info_ip = pstr_sfb_info_short;
    214   }
    215 }
    216 
    217 WORD32 ixheaacd_decode_init(
    218     VOID *handle, WORD32 sample_rate, ia_usac_data_struct *usac_data,
    219     ia_audio_specific_config_struct *pstr_stream_config) {
    220   WORD32 i;
    221   ia_exhaacplus_dec_api_struct *codec_handle =
    222       (ia_exhaacplus_dec_api_struct *)handle;
    223   ia_aac_dec_state_struct *aac_dec_handle = codec_handle->p_state_aac;
    224   WORD32 fscale;
    225 
    226   WORD32 ele_id = 0;
    227 
    228   ia_usac_config_struct *ptr_usac_config =
    229       &(pstr_stream_config->str_usac_config);
    230   ia_usac_decoder_config_struct *ptr_usac_dec_config =
    231       &(pstr_stream_config->str_usac_config.str_usac_dec_config);
    232   WORD32 num_elements = ptr_usac_dec_config->num_elements;
    233   WORD32 chan = 0;
    234 
    235   usac_data->huffman_code_book_scl = aac_dec_handle->huffman_code_book_scl;
    236   usac_data->huffman_code_book_scl_index =
    237       aac_dec_handle->huffman_code_book_scl_index;
    238 
    239   usac_data->tns_coeff3_32 =
    240       aac_dec_handle->pstr_aac_tables->pstr_block_tables->tns_coeff3_32;
    241   usac_data->tns_coeff4_32 =
    242       aac_dec_handle->pstr_aac_tables->pstr_block_tables->tns_coeff4_32;
    243   usac_data->tns_max_bands_tbl_usac =
    244       &aac_dec_handle->pstr_aac_tables->pstr_block_tables
    245            ->tns_max_bands_tbl_usac;
    246 
    247   for (i = 0; i < 11; i++) {
    248     if (ixheaacd_sampling_boundaries[i] <= sample_rate) break;
    249   }
    250 
    251   if (i == (1 << LEN_SAMP_IDX)) return -1;
    252   usac_data->sampling_rate_idx = i;
    253 
    254   fscale = (WORD32)((double)sample_rate * (double)FSCALE_DENOM / 12800.0f);
    255 
    256   for (i = 0; i < MAX_NUM_CHANNELS; i++) {
    257     usac_data->window_shape_prev[i] = 0;
    258     usac_data->window_shape[i] = 0;
    259   }
    260 
    261   ixheaacd_hufftab(&ixheaacd_book, ixheaacd_huff_book_scl,
    262                    ixheaacd_book_scl_code_book, ixheaacd_book_scl_index, 1, 60,
    263                    60, 1, 19);
    264 
    265   usac_data->pstr_usac_winmap[0] = &usac_data->str_only_long_info;
    266   usac_data->pstr_usac_winmap[1] = &usac_data->str_only_long_info;
    267   usac_data->pstr_usac_winmap[2] = &usac_data->str_eight_short_info;
    268   usac_data->pstr_usac_winmap[3] = &usac_data->str_only_long_info;
    269   usac_data->pstr_usac_winmap[4] = &usac_data->str_only_long_info;
    270 
    271   if ((usac_data->ccfl != 480) && (usac_data->ccfl != 512) &&
    272       (usac_data->ccfl != 768) && (usac_data->ccfl != 960) &&
    273       (usac_data->ccfl != 1024))
    274     return -1;
    275   ixheaacd_info_init(&ixheaacd_samp_rate_info[usac_data->sampling_rate_idx],
    276                      usac_data->ccfl, usac_data->pstr_usac_winmap[0],
    277                      usac_data->pstr_usac_winmap[2], usac_data->sfb_width_short,
    278                      usac_data->sfb_width_long);
    279 
    280   for (i = 0; i < MAX_NUM_CHANNELS; i++) {
    281     usac_data->str_tddec[i] = &usac_data->arr_str_tddec[i];
    282     usac_data->str_tddec[i]->fscale =
    283         ((fscale)*usac_data->ccfl) / LEN_SUPERFRAME;
    284     usac_data->len_subfrm = usac_data->ccfl / 4;
    285     usac_data->num_subfrm = (MAX_NUM_SUBFR * usac_data->ccfl) / LEN_SUPERFRAME;
    286 
    287     ixheaacd_init_acelp_data(usac_data, usac_data->str_tddec[i]);
    288 
    289     usac_data->str_tddec[i]->fd_synth =
    290         &usac_data->str_tddec[i]->fd_synth_buf[LEN_FRAME];
    291   }
    292 
    293   for (ele_id = 0; ele_id < num_elements; ele_id++) {
    294     UWORD32 ele_type;
    295     WORD32 stereo_config_index;
    296 
    297     ia_usac_dec_element_config_struct *ptr_usac_ele_config =
    298         &ptr_usac_config->str_usac_dec_config.str_usac_element_config[ele_id];
    299 
    300     if (ptr_usac_ele_config) {
    301       if (usac_data->tw_mdct[ele_id]) {
    302         return -1;
    303       }
    304 
    305       usac_data->noise_filling_config[ele_id] =
    306           ptr_usac_ele_config->noise_filling;
    307     }
    308 
    309     ele_type = ptr_usac_config->str_usac_dec_config.usac_element_type[ele_id];
    310 
    311     stereo_config_index = ptr_usac_ele_config->stereo_config_index;
    312 
    313     switch (ele_type) {
    314       case ID_USAC_SCE:
    315       case ID_USAC_LFE:
    316 
    317         if ((chan + 1) > MAX_NUM_CHANNELS_USAC_LVL2) return -1;
    318         usac_data->seed_value[chan] = 0x3039;
    319         chan++;
    320 
    321         break;
    322 
    323       case ID_USAC_CPE: {
    324         static const WORD32 frame_len_tbl[MAX_CORE_SBR_FRAME_LEN_IDX + 1] = {
    325             -1, -1, 32, 32, 64};
    326 
    327         if ((chan + 2) > MAX_NUM_CHANNELS_USAC_LVL2) return -1;
    328         usac_data->seed_value[chan] = 0x3039;
    329         chan++;
    330 
    331         usac_data->seed_value[chan] = 0x10932;
    332         chan++;
    333 
    334         if (stereo_config_index > 0) {
    335           WORD32 bs_frame_length =
    336               frame_len_tbl[ptr_usac_config->core_sbr_framelength_index];
    337           WORD32 bs_residual_coding = (stereo_config_index > 1) ? 1 : 0;
    338 
    339           ia_usac_dec_mps_config_struct *ptr_usac_mps212_config =
    340               &(ptr_usac_config->str_usac_dec_config
    341                     .str_usac_element_config[ele_id]
    342                     .str_usac_mps212_config);
    343 
    344           if (ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle,
    345                                   bs_frame_length, bs_residual_coding,
    346                                   ptr_usac_mps212_config)) {
    347             return -1;
    348           }
    349         }
    350         break;
    351       }
    352 
    353       break;
    354       case ID_USAC_EXT:
    355         break;
    356       default:
    357         return -1;
    358         break;
    359     }
    360   }
    361 
    362   return 0;
    363 }
    364 
    365 WORD32 ixheaacd_dec_data_init(VOID *handle,
    366                               ia_frame_data_struct *pstr_frame_data,
    367                               ia_usac_data_struct *usac_data) {
    368   ia_audio_specific_config_struct *pstr_stream_config, *layer_config;
    369   WORD32 err_code = 0;
    370 
    371   WORD32 num_out_chan = 0;
    372 
    373   WORD32 i_ch, i, ele_id;
    374   WORD32 num_elements;
    375 
    376   WORD32 out_frame_len, sbr_ratio_idx;
    377 
    378   ia_usac_config_struct *ptr_usac_config =
    379       &(pstr_frame_data->str_audio_specific_config.str_usac_config);
    380 
    381   usac_data->window_shape_prev[0] = WIN_SEL_0;
    382   usac_data->window_shape_prev[1] = WIN_SEL_0;
    383 
    384   pstr_frame_data->str_layer.bit_rate =
    385       pstr_frame_data->str_audio_specific_config.avg_bit_rate;
    386   pstr_stream_config = &pstr_frame_data->str_audio_specific_config;
    387   layer_config = &pstr_frame_data->str_audio_specific_config;
    388 
    389   sbr_ratio_idx = ixheaacd_sbr_params(
    390       ptr_usac_config->core_sbr_framelength_index, &out_frame_len,
    391       &usac_data->ccfl, &usac_data->output_samples,
    392       &pstr_frame_data->str_layer.sample_rate_layer,
    393       &layer_config->samp_frequency_index);
    394 
    395   pstr_stream_config->sampling_frequency =
    396       pstr_frame_data->str_layer.sample_rate_layer;
    397   pstr_stream_config->samp_frequency_index = layer_config->samp_frequency_index;
    398 
    399   num_elements = ptr_usac_config->str_usac_dec_config.num_elements;
    400 
    401   for (ele_id = 0; ele_id < num_elements; ele_id++) {
    402     ia_usac_dec_element_config_struct *ptr_usac_ele_config =
    403         &(ptr_usac_config->str_usac_dec_config.str_usac_element_config[ele_id]);
    404 
    405     if (ptr_usac_ele_config) {
    406       usac_data->tw_mdct[ele_id] = ptr_usac_ele_config->tw_mdct;
    407     }
    408 
    409     {
    410       ia_usac_dec_mps_config_struct *ptr_usac_mps212_config =
    411           &ptr_usac_ele_config->str_usac_mps212_config;
    412       WORD32 stereo_config_index = ptr_usac_ele_config->stereo_config_index;
    413 
    414       usac_data->mps_pseudo_lr[ele_id] =
    415           (stereo_config_index > 1) ? ptr_usac_mps212_config->bs_pseudo_lr : 0;
    416     }
    417   }
    418 
    419   usac_data->sbr_ratio_idx = sbr_ratio_idx;
    420   usac_data->esbr_bit_str[0].no_elements = 0;
    421   usac_data->esbr_bit_str[1].no_elements = 0;
    422 
    423   num_out_chan = ptr_usac_config->num_out_channels;
    424 
    425   if (usac_data->ccfl == 768)
    426     pstr_frame_data->str_layer.sample_rate_layer =
    427         4 * pstr_frame_data->str_layer.sample_rate_layer / 3;
    428 
    429   for (i = 0; i < MAX_NUM_CHANNELS; i++) {
    430     usac_data->coef_fix[i] = &usac_data->arr_coef_fix[i][0];
    431     usac_data->coef[i] = &usac_data->arr_coef[i][0];
    432     usac_data->coef_save[i] = &usac_data->arr_coef_save[i][0];
    433     usac_data->factors[i] = &usac_data->arr_factors[i][0];
    434     usac_data->group_dis[i] = &usac_data->arr_group_dis[i][0];
    435     usac_data->pstr_tns[i] = &usac_data->arr_str_tns[i];
    436     usac_data->tw_ratio[i] = &usac_data->arr_tw_ratio[i][0];
    437     usac_data->ms_used[i] = &usac_data->arr_ms_used[i][0];
    438     usac_data->window_shape_prev[i] = WIN_SEL_0;
    439 
    440     usac_data->seed_value[i] = 0x0;
    441 
    442     usac_data->fac_data_present[i] = 0;
    443   }
    444 
    445   err_code =
    446       ixheaacd_decode_init(handle, pstr_frame_data->str_layer.sample_rate_layer,
    447                            usac_data, pstr_stream_config);
    448   if (err_code != 0) return err_code;
    449 
    450   for (i_ch = 0; i_ch < MAX_NUM_CHANNELS; i_ch++) {
    451     if (usac_data->tw_mdct[0] == 1) {
    452       WORD32 i;
    453       for (i = 0; i < 2 * usac_data->ccfl; i++) {
    454         usac_data->warp_cont_mem[i_ch][i] = 1.0;
    455       }
    456       usac_data->warp_sum[i_ch][0] = usac_data->warp_sum[i_ch][1] =
    457           (FLOAT32)usac_data->ccfl;
    458     }
    459   }
    460   return err_code;
    461 }
    462 
    463 static VOID ixheaacd_count_tracks_per_layer(int *max_layer, int *stream_count,
    464                                             int *tracks_in_layer) {
    465   WORD32 stream;
    466   WORD32 num_layer;
    467   WORD32 num_streams;
    468   WORD32 layer = 0;
    469 
    470   if (stream_count == NULL)
    471     num_streams = 0;
    472   else
    473     num_streams = *stream_count;
    474   if (max_layer == NULL)
    475     num_layer = num_streams;
    476   else
    477     num_layer = *max_layer;
    478   if (num_layer < 0) num_layer = num_streams;
    479 
    480   for (stream = 0; (layer <= num_layer) && (stream < num_streams);) {
    481     *tracks_in_layer = 1;
    482     stream += 1;
    483     layer++;
    484     if (layer <= num_layer) *tracks_in_layer = 0;
    485   }
    486 
    487   if (max_layer) *max_layer = (layer - 1);
    488   if (stream_count) *stream_count = stream;
    489 }
    490 
    491 WORD32 ixheaacd_frm_data_init(ia_audio_specific_config_struct *pstr_audio_conf,
    492                               ia_dec_data_struct *pstr_dec_data)
    493 
    494 {
    495   WORD32 layer;
    496   WORD32 track;
    497   WORD32 num_dec_streams;
    498   ia_frame_data_struct *pstr_frame_data;
    499 
    500   WORD32 stream_count = 1;
    501   WORD32 max_layer = -1;
    502 
    503   memset(pstr_dec_data, 0, sizeof(ia_dec_data_struct));
    504   memset(&(pstr_dec_data->str_frame_data), 0,
    505          sizeof(pstr_dec_data->str_frame_data));
    506 
    507   pstr_frame_data = &(pstr_dec_data->str_frame_data);
    508 
    509   if (max_layer < 0) max_layer = stream_count - 1;
    510 
    511   ixheaacd_count_tracks_per_layer(&max_layer, &stream_count,
    512                                   &pstr_frame_data->tracks_in_layer);
    513 
    514   pstr_frame_data->scal_out_select = max_layer;
    515 
    516   pstr_frame_data->stream_count = 0;
    517 
    518   num_dec_streams = track = 0;
    519   for (layer = 0; layer < (signed)pstr_frame_data->scal_out_select + 1;
    520        layer++) {
    521     WORD32 j;
    522     for (j = 0; j < 1; j++, num_dec_streams++) {
    523       pstr_frame_data->str_audio_specific_config = *pstr_audio_conf;
    524       pstr_frame_data->str_layer.sample_rate_layer =
    525           pstr_frame_data->str_audio_specific_config.sampling_frequency;
    526       pstr_frame_data->str_layer.bit_rate =
    527           pstr_frame_data->str_audio_specific_config.avg_bit_rate;
    528     }
    529 
    530     track += pstr_frame_data->tracks_in_layer;
    531   }
    532 
    533   pstr_frame_data->stream_count = num_dec_streams;
    534 
    535   return num_dec_streams;
    536 }
    537 
    538 WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle,
    539                               ia_dec_data_struct *pstr_dec_data,
    540                               WORD32 tracks_for_decoder) {
    541   WORD32 stream;
    542 
    543   WORD32 err = 0;
    544   ia_frame_data_struct *pstr_frame_data;
    545   WORD32 stream_count;
    546   ia_aac_dec_state_struct *aac_dec_handle = handle->p_state_aac;
    547   pstr_frame_data = &(pstr_dec_data->str_frame_data);
    548   stream_count = pstr_frame_data->stream_count;
    549   pstr_frame_data->stream_count = tracks_for_decoder;
    550 
    551   for (stream = 0; stream < stream_count; stream++) {
    552     UWORD32 aot = pstr_frame_data->str_audio_specific_config.audio_object_type;
    553 
    554     switch (aot) {
    555       case AOT_USAC:
    556 
    557         err = ixheaacd_dec_data_init(handle, pstr_frame_data,
    558                                      &(pstr_dec_data->str_usac_data));
    559 
    560         if (err != 0) return err;
    561 
    562         switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) {
    563           case 0:
    564             handle->aac_config.ui_sbr_mode = 0;
    565             break;
    566           case 1:
    567             handle->aac_config.ui_sbr_mode = 1;
    568             break;
    569           case 2:
    570             handle->aac_config.ui_sbr_mode = 1;
    571             break;
    572           case 3:
    573             handle->aac_config.ui_sbr_mode = 3;
    574             break;
    575 
    576           default:
    577             handle->aac_config.ui_sbr_mode = 0;
    578         }
    579 
    580 
    581         break;
    582 
    583       default:
    584 
    585         break;
    586     }
    587   }
    588 
    589   pstr_frame_data->scal_out_object_type =
    590       pstr_frame_data->str_audio_specific_config.audio_object_type;
    591   pstr_frame_data->scal_out_num_channels =
    592       pstr_frame_data->str_audio_specific_config.channel_configuration;
    593   pstr_frame_data->scal_out_sampling_frequency =
    594       pstr_frame_data->str_audio_specific_config.sampling_frequency;
    595 
    596   if (&(pstr_dec_data->str_usac_data) != NULL) {
    597     ia_sbr_header_data_struct usac_def_header;
    598     ia_audio_specific_config_struct *pstr_aud_spec_config =
    599         &pstr_frame_data->str_audio_specific_config;
    600     ia_usac_config_struct *ptr_usac_config =
    601         &(pstr_frame_data->str_audio_specific_config.str_usac_config);
    602 
    603     WORD32 inter_tes[MAX_NUM_ELEMENTS] = {0};
    604     WORD32 bs_pvc[MAX_NUM_ELEMENTS] = {0};
    605     WORD32 harmonic_sbr[MAX_NUM_ELEMENTS] = {0};
    606     WORD32 inter_test_flag = 0;
    607     WORD32 bs_pvc_flag = 0;
    608     WORD32 harmonic_Sbr_flag = 0;
    609 
    610     ia_usac_decoder_config_struct *ptr_usac_dec_config =
    611         &ptr_usac_config->str_usac_dec_config;
    612     WORD32 const num_ele = ptr_usac_dec_config->num_elements;
    613     WORD32 elem_idx = 0;
    614 
    615     memset(&usac_def_header, 0, sizeof(ia_sbr_header_data_struct));
    616 
    617     for (elem_idx = 0; elem_idx < num_ele; elem_idx++) {
    618       UWORD32 usac_ele_type =
    619           ptr_usac_config->str_usac_dec_config.usac_element_type[elem_idx];
    620       ia_usac_dec_element_config_struct *ptr_usac_ele_config =
    621           &ptr_usac_config->str_usac_dec_config
    622                .str_usac_element_config[elem_idx];
    623 
    624       ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
    625           &(ptr_usac_dec_config->str_usac_element_config[elem_idx]
    626                 .str_usac_sbr_config);
    627       inter_tes[elem_idx] =
    628           (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->bs_inter_tes : 0;
    629       bs_pvc[elem_idx] =
    630           (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->bs_pvc : 0;
    631       harmonic_sbr[elem_idx] =
    632           (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->harmonic_sbr : 0;
    633 
    634       if (ptr_usac_sbr_config->bs_inter_tes) inter_test_flag = 1;
    635       if (ptr_usac_sbr_config->bs_pvc) bs_pvc_flag = 1;
    636       if (ptr_usac_sbr_config->harmonic_sbr) harmonic_Sbr_flag = 1;
    637 
    638       if ((usac_ele_type != ID_USAC_LFE) && (usac_ele_type != ID_USAC_EXT)) {
    639         ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config =
    640             &(ptr_usac_ele_config->str_usac_sbr_config);
    641 
    642         usac_def_header.start_freq = ptr_usac_sbr_config->dflt_start_freq;
    643         usac_def_header.stop_freq = ptr_usac_sbr_config->dflt_stop_freq;
    644         usac_def_header.header_extra_1 =
    645             ptr_usac_sbr_config->dflt_header_extra1;
    646         usac_def_header.header_extra_2 =
    647             ptr_usac_sbr_config->dflt_header_extra2;
    648         usac_def_header.freq_scale = ptr_usac_sbr_config->dflt_freq_scale;
    649         usac_def_header.alter_scale = ptr_usac_sbr_config->dflt_alter_scale;
    650         usac_def_header.noise_bands = ptr_usac_sbr_config->dflt_noise_bands;
    651         usac_def_header.limiter_bands = ptr_usac_sbr_config->dflt_limiter_bands;
    652         usac_def_header.limiter_gains = ptr_usac_sbr_config->dflt_limiter_gains;
    653         usac_def_header.interpol_freq = ptr_usac_sbr_config->dflt_interpol_freq;
    654         usac_def_header.smoothing_mode =
    655             ptr_usac_sbr_config->dflt_smoothing_mode;
    656       }
    657     }
    658 
    659     pstr_dec_data->str_usac_data.down_samp_sbr = 0;
    660 
    661     if (pstr_dec_data->str_usac_data.sbr_ratio_idx > 0) {
    662       if (pstr_aud_spec_config->ext_sampling_frequency ==
    663           pstr_aud_spec_config->sampling_frequency) {
    664         pstr_dec_data->str_usac_data.down_samp_sbr = 1;
    665       }
    666       if (pstr_dec_data->str_usac_data.down_samp_sbr == 0) {
    667         if (pstr_dec_data->str_usac_data.sbr_ratio_idx == 3) {
    668           pstr_frame_data->scal_out_sampling_frequency =
    669               4 * pstr_frame_data->scal_out_sampling_frequency;
    670         } else {
    671           pstr_frame_data->scal_out_sampling_frequency =
    672               2 * pstr_frame_data->scal_out_sampling_frequency;
    673         }
    674       }
    675 
    676       {
    677         void *sbr_persistent_mem_v = aac_dec_handle->sbr_persistent_mem_u;
    678 
    679         pstr_dec_data->str_usac_data.pstr_esbr_dec = ixheaacd_init_sbr(
    680             pstr_frame_data->str_layer.sample_rate_layer,
    681             pstr_dec_data->str_usac_data.ccfl,
    682             &pstr_dec_data->str_usac_data.down_samp_sbr, sbr_persistent_mem_v,
    683             NULL, pstr_frame_data->scal_out_num_channels, 0,
    684             pstr_dec_data->str_usac_data.sbr_ratio_idx,
    685             pstr_dec_data->str_usac_data.output_samples, &harmonic_Sbr_flag,
    686             (void *)&usac_def_header, aac_dec_handle->str_sbr_config,
    687             pstr_dec_data->str_usac_data.audio_object_type);
    688         pstr_dec_data->str_usac_data.sbr_scratch_mem_base =
    689             aac_dec_handle->sbr_scratch_mem_u;
    690         if (num_ele)
    691           ixheaacd_setesbr_flags(sbr_persistent_mem_v, bs_pvc_flag,
    692                                  harmonic_Sbr_flag, inter_test_flag);
    693       }
    694 
    695       if (pstr_dec_data->str_usac_data.pstr_esbr_dec == NULL) {
    696         return -1;
    697       } else {
    698         pstr_dec_data->str_usac_data.pstr_esbr_dec->xaac_jmp_buf =
    699             &(aac_dec_handle->xaac_jmp_buf);
    700       }
    701     }
    702   }
    703   aac_dec_handle->decode_create_done = 1;
    704   return 0;
    705 }
    706