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_type_def.h>
     22 
     23 #include "ixheaacd_sbr_common.h"
     24 
     25 #include "ixheaacd_constants.h"
     26 #include <ixheaacd_basic_ops32.h>
     27 #include <ixheaacd_basic_ops16.h>
     28 #include <ixheaacd_basic_ops40.h>
     29 #include "ixheaacd_basic_ops.h"
     30 #include "ixheaacd_bitbuffer.h"
     31 
     32 #include <ixheaacd_basic_op.h>
     33 #include "ixheaacd_intrinsics.h"
     34 
     35 #include "ixheaacd_defines.h"
     36 
     37 #include <ixheaacd_aac_rom.h>
     38 
     39 #include "ixheaacd_definitions.h"
     40 
     41 #include "ixheaacd_error_codes.h"
     42 
     43 #include "ixheaacd_pulsedata.h"
     44 
     45 #include "ixheaacd_pns.h"
     46 #include "ixheaacd_drc_data_struct.h"
     47 
     48 #include "ixheaacd_lt_predict.h"
     49 
     50 #include "ixheaacd_channelinfo.h"
     51 #include "ixheaacd_drc_dec.h"
     52 
     53 #include "ixheaacd_sbrdecoder.h"
     54 #include "ixheaacd_block.h"
     55 #include "ixheaacd_channel.h"
     56 
     57 #include "ixheaacd_sbr_payload.h"
     58 #include "ixheaacd_common_rom.h"
     59 
     60 #include <ixheaacd_type_def.h>
     61 
     62 #include "ixheaacd_sbrdecsettings.h"
     63 #include "ixheaacd_sbr_scale.h"
     64 #include "ixheaacd_env_extr_part.h"
     65 #include <ixheaacd_sbr_rom.h>
     66 
     67 #include "ixheaacd_lpp_tran.h"
     68 #include "ixheaacd_hybrid.h"
     69 #include "ixheaacd_ps_dec.h"
     70 
     71 #include "ixheaacd_env_extr.h"
     72 #include "ixheaacd_adts.h"
     73 #include "ixheaacd_audioobjtypes.h"
     74 #include "ixheaacd_memory_standards.h"
     75 
     76 #include "ixheaacd_latmdemux.h"
     77 
     78 #include "ixheaacd_aacdec.h"
     79 #include "ixheaacd_mps_polyphase.h"
     80 #include "ixheaacd_config.h"
     81 #include "ixheaacd_mps_dec.h"
     82 
     83 #include "ixheaacd_struct_def.h"
     84 
     85 #include "ixheaacd_multichannel.h"
     86 
     87 #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
     88 
     89 WORD32 ixheaacd_set_aac_persistent_buffers(VOID *aac_persistent_mem_v,
     90                                            WORD32 num_channel) {
     91   WORD32 persistent_used;
     92 
     93   struct ia_aac_persistent_struct *aac_persistent_mem =
     94       (struct ia_aac_persistent_struct *)aac_persistent_mem_v;
     95 
     96   persistent_used = sizeof(struct ia_aac_persistent_struct);
     97 
     98   memset(aac_persistent_mem, 0, sizeof(struct ia_aac_persistent_struct));
     99   aac_persistent_mem->overlap_buffer =
    100       (WORD32 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
    101 
    102   memset((WORD32 *)((WORD8 *)aac_persistent_mem_v + persistent_used), 0,
    103          4 * 512 * num_channel * sizeof(WORD32));
    104 
    105   persistent_used += 4 * 512 * num_channel * sizeof(WORD32);
    106 
    107   aac_persistent_mem->sbr_payload_buffer =
    108       (WORD8 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
    109 
    110   memset((WORD16 *)((WORD8 *)aac_persistent_mem_v + persistent_used), 0,
    111          ALIGN_SIZE64(MAXSBRBYTES) * num_channel * sizeof(WORD8));
    112 
    113   persistent_used += ALIGN_SIZE64(MAXSBRBYTES) * num_channel * sizeof(WORD8);
    114 
    115   {
    116     WORD32 i;
    117 
    118     for (i = 0; i < num_channel; i++) {
    119       aac_persistent_mem->ltp_buf[i] =
    120           (WORD16 *)((WORD8 *)aac_persistent_mem_v + persistent_used);
    121 
    122       memset((WORD16 *)((WORD8 *)aac_persistent_mem_v + persistent_used), 0,
    123              ltp_buffer_size * sizeof(WORD16));
    124 
    125       persistent_used += (ltp_buffer_size * sizeof(WORD16));
    126 
    127       aac_persistent_mem->ptr_aac_dec_static_channel_info[i] =
    128           (ia_aac_dec_channel_info *)((WORD8 *)aac_persistent_mem_v +
    129                                       persistent_used);
    130       persistent_used += sizeof(ia_aac_dec_channel_info);
    131 
    132       aac_persistent_mem->ptr_aac_dec_static_channel_info[i]
    133           ->overlap_add_data.win_shape = 0;
    134       aac_persistent_mem->ptr_aac_dec_static_channel_info[i]
    135           ->overlap_add_data.win_seq = 0;
    136 
    137       aac_persistent_mem->ptr_aac_dec_static_channel_info[i]
    138           ->overlap_add_data.ptr_overlap_buf =
    139           &aac_persistent_mem->overlap_buffer[i * OVERLAP_BUFFER_SIZE];
    140     }
    141   }
    142 
    143   return persistent_used;
    144 }
    145 
    146 VOID ixheaacd_huff_tables_create(ia_aac_dec_tables_struct *ptr_aac_tables) {
    147   ptr_aac_tables->code_book[0] = 0;
    148   ptr_aac_tables->code_book[1] =
    149       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb1;
    150   ptr_aac_tables->code_book[2] =
    151       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb2;
    152   ptr_aac_tables->code_book[3] =
    153       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb3;
    154   ptr_aac_tables->code_book[4] =
    155       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb4;
    156   ptr_aac_tables->code_book[5] =
    157       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb5;
    158   ptr_aac_tables->code_book[6] =
    159       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb6;
    160   ptr_aac_tables->code_book[7] =
    161       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb7;
    162   ptr_aac_tables->code_book[8] =
    163       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb8;
    164   ptr_aac_tables->code_book[9] =
    165       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb9;
    166   ptr_aac_tables->code_book[10] =
    167       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb10;
    168   ptr_aac_tables->code_book[11] =
    169       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb10;
    170   ptr_aac_tables->code_book[12] =
    171       (UWORD16 *)ptr_aac_tables->pstr_huffmann_tables->input_table_cb10;
    172 
    173   ptr_aac_tables->index_table[1] =
    174       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf1;
    175   ptr_aac_tables->index_table[2] =
    176       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf2;
    177   ptr_aac_tables->index_table[3] =
    178       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf3;
    179   ptr_aac_tables->index_table[4] =
    180       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf4;
    181   ptr_aac_tables->index_table[5] =
    182       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf5;
    183   ptr_aac_tables->index_table[6] =
    184       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf6;
    185   ptr_aac_tables->index_table[7] =
    186       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf7;
    187   ptr_aac_tables->index_table[8] =
    188       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf8;
    189   ptr_aac_tables->index_table[9] =
    190       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf9;
    191   ptr_aac_tables->index_table[10] =
    192       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf10;
    193   ptr_aac_tables->index_table[11] =
    194       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf10;
    195   ptr_aac_tables->index_table[12] =
    196       (UWORD32 *)ptr_aac_tables->pstr_huffmann_tables->idx_table_hf10;
    197 
    198   ptr_aac_tables->scale_factor_bands_short[0] =
    199       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_128;
    200   ptr_aac_tables->scale_factor_bands_short[1] =
    201       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_128;
    202   ptr_aac_tables->scale_factor_bands_short[2] =
    203       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_128;
    204   ptr_aac_tables->scale_factor_bands_short[3] =
    205       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_128;
    206   ptr_aac_tables->scale_factor_bands_short[4] =
    207       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_128;
    208   ptr_aac_tables->scale_factor_bands_short[5] =
    209       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_128;
    210   ptr_aac_tables->scale_factor_bands_short[6] =
    211       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_128;
    212   ptr_aac_tables->scale_factor_bands_short[7] =
    213       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_128;
    214   ptr_aac_tables->scale_factor_bands_short[8] =
    215       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_128;
    216   ptr_aac_tables->scale_factor_bands_short[9] =
    217       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_128;
    218   ptr_aac_tables->scale_factor_bands_short[10] =
    219       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_128;
    220   ptr_aac_tables->scale_factor_bands_short[11] =
    221       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_128;
    222 
    223   ptr_aac_tables->scale_factor_bands_long[0] =
    224       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_1024;
    225   ptr_aac_tables->scale_factor_bands_long[1] =
    226       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_96_1024;
    227   ptr_aac_tables->scale_factor_bands_long[2] =
    228       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_64_1024;
    229   ptr_aac_tables->scale_factor_bands_long[3] =
    230       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_1024;
    231   ptr_aac_tables->scale_factor_bands_long[4] =
    232       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_1024;
    233   ptr_aac_tables->scale_factor_bands_long[5] =
    234       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_32_1024;
    235   ptr_aac_tables->scale_factor_bands_long[6] =
    236       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_1024;
    237   ptr_aac_tables->scale_factor_bands_long[7] =
    238       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_1024;
    239   ptr_aac_tables->scale_factor_bands_long[8] =
    240       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_1024;
    241   ptr_aac_tables->scale_factor_bands_long[9] =
    242       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_1024;
    243   ptr_aac_tables->scale_factor_bands_long[10] =
    244       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_16_1024;
    245   ptr_aac_tables->scale_factor_bands_long[11] =
    246       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_8_1024;
    247 
    248   ptr_aac_tables->scale_fac_bands_512[0] =
    249       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
    250   ptr_aac_tables->scale_fac_bands_512[1] =
    251       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
    252   ptr_aac_tables->scale_fac_bands_512[2] =
    253       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
    254   ptr_aac_tables->scale_fac_bands_512[3] =
    255       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
    256   ptr_aac_tables->scale_fac_bands_512[4] =
    257       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_512;
    258   ptr_aac_tables->scale_fac_bands_512[5] =
    259       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_32_512;
    260   ptr_aac_tables->scale_fac_bands_512[6] =
    261       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    262   ptr_aac_tables->scale_fac_bands_512[7] =
    263       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    264   ptr_aac_tables->scale_fac_bands_512[8] =
    265       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    266   ptr_aac_tables->scale_fac_bands_512[9] =
    267       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    268   ptr_aac_tables->scale_fac_bands_512[10] =
    269       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    270   ptr_aac_tables->scale_fac_bands_512[11] =
    271       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    272   ptr_aac_tables->scale_fac_bands_512[12] =
    273       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    274   ptr_aac_tables->scale_fac_bands_512[13] =
    275       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    276   ptr_aac_tables->scale_fac_bands_512[14] =
    277       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    278   ptr_aac_tables->scale_fac_bands_512[15] =
    279       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_512;
    280 
    281   ptr_aac_tables->scale_fac_bands_480[0] =
    282       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
    283   ptr_aac_tables->scale_fac_bands_480[1] =
    284       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
    285   ptr_aac_tables->scale_fac_bands_480[2] =
    286       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
    287   ptr_aac_tables->scale_fac_bands_480[3] =
    288       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
    289   ptr_aac_tables->scale_fac_bands_480[4] =
    290       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_48_480;
    291   ptr_aac_tables->scale_fac_bands_480[5] =
    292       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_32_480;
    293   ptr_aac_tables->scale_fac_bands_480[6] =
    294       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    295   ptr_aac_tables->scale_fac_bands_480[7] =
    296       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    297   ptr_aac_tables->scale_fac_bands_480[8] =
    298       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    299   ptr_aac_tables->scale_fac_bands_480[9] =
    300       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    301   ptr_aac_tables->scale_fac_bands_480[10] =
    302       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    303   ptr_aac_tables->scale_fac_bands_480[11] =
    304       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    305   ptr_aac_tables->scale_fac_bands_480[12] =
    306       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    307   ptr_aac_tables->scale_fac_bands_480[13] =
    308       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    309   ptr_aac_tables->scale_fac_bands_480[14] =
    310       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    311   ptr_aac_tables->scale_fac_bands_480[15] =
    312       ptr_aac_tables->pstr_huffmann_tables->ixheaacd_sfb_24_480;
    313 }
    314 
    315 ia_aac_decoder_struct *ixheaacd_aac_decoder_init(
    316     ia_aac_dec_state_struct *p_state_enhaacplus_dec,
    317     ia_aac_dec_sbr_bitstream_struct *ptr_sbr_bitstream, WORD channels,
    318     VOID *aac_persistent_mem_v, WORD32 frame_length) {
    319   WORD i, ch;
    320   struct ia_aac_persistent_struct *aac_persistent_mem;
    321   aac_persistent_mem = (struct ia_aac_persistent_struct *)aac_persistent_mem_v;
    322 
    323   aac_persistent_mem->str_aac_decoder.pstr_sbr_bitstream = ptr_sbr_bitstream;
    324 
    325   for (ch = 0; ch < channels; ch++) {
    326     ia_aac_decoder_struct *aac_dec_handle =
    327         &aac_persistent_mem->str_aac_decoder;
    328     aac_dec_handle->pstr_aac_dec_overlap_info[ch] =
    329         &aac_persistent_mem->str_aac_dec_overlap_info[ch];
    330     aac_dec_handle->pstr_pns_rand_vec_data =
    331         &aac_persistent_mem->str_pns_rand_vec_data;
    332 
    333     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->window_shape = 0;
    334     aac_dec_handle->pstr_aac_dec_overlap_info[ch]->window_sequence = 0;
    335     if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD)
    336       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_overlap_buf =
    337           &aac_persistent_mem->overlap_buffer[ch * 4 * OVERLAP_BUFFER_SIZE];
    338     else
    339       aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_overlap_buf =
    340           &aac_persistent_mem->overlap_buffer[ch * OVERLAP_BUFFER_SIZE];
    341 
    342     {
    343       WORD32 *ptr_overlap_buf =
    344           aac_dec_handle->pstr_aac_dec_overlap_info[ch]->ptr_overlap_buf;
    345       memset(ptr_overlap_buf, 0, sizeof(WORD32) * 4 * 512);
    346     }
    347     aac_persistent_mem->str_aac_decoder.ptr_aac_dec_static_channel_info[ch] =
    348         aac_persistent_mem->ptr_aac_dec_static_channel_info[ch];
    349     aac_persistent_mem->str_aac_decoder.ptr_aac_dec_static_channel_info[ch]
    350         ->ltp_buf = aac_persistent_mem->ltp_buf[ch];
    351   }
    352 
    353   for (i = 0; i < 1; i++) {
    354     ia_aac_dec_sbr_bitstream_struct *ptr_sbr_bitstream =
    355         &aac_persistent_mem->str_aac_decoder.pstr_sbr_bitstream[i];
    356 
    357     ptr_sbr_bitstream->no_elements = 0;
    358     ptr_sbr_bitstream->str_sbr_ele[0].ptr_sbr_data =
    359         &aac_persistent_mem->sbr_payload_buffer[ALIGN_SIZE64(MAXSBRBYTES) * i];
    360     ptr_sbr_bitstream->str_sbr_ele[0].sbr_ele_id = ID_SCE;
    361     ptr_sbr_bitstream->str_sbr_ele[0].size_payload = 0;
    362   }
    363 
    364   {
    365     ia_aac_dec_tables_struct *ptr_aac_tables =
    366         aac_persistent_mem->str_aac_decoder.pstr_aac_tables;
    367     ia_aac_dec_huffman_tables_struct *pstr_huffmann_tables =
    368         ptr_aac_tables->pstr_huffmann_tables;
    369 
    370     WORD num_entries = sizeof(pstr_huffmann_tables->str_sample_rate_info) /
    371                        sizeof(ia_sampling_rate_info_struct);
    372 
    373     WORD32 sampling_rate = p_state_enhaacplus_dec->sampling_rate;
    374 
    375     i = 0;
    376     while (sampling_rate != ((pstr_huffmann_tables->str_sample_rate_info[i]
    377                                   .sampling_frequency)) &&
    378            (i < num_entries)) {
    379       i++;
    380     }
    381     if (i == 12) {
    382       i = i - 1;
    383     }
    384 
    385     if (i == num_entries) {
    386       return NULL;
    387     }
    388 
    389     if (frame_length == 1024) {
    390       WORD16 *psfb_table_idx[2];
    391       const WORD8 *psfb_width[2];
    392       WORD width_idx;
    393       WORD32 j;
    394 
    395       psfb_table_idx[0] = ptr_aac_tables->sfb_long_table;
    396       psfb_table_idx[1] = ptr_aac_tables->sfb_short_table;
    397 
    398       psfb_width[0] = ptr_aac_tables->scale_factor_bands_long[i];
    399       psfb_width[1] = ptr_aac_tables->scale_factor_bands_short[i];
    400 
    401       for (j = 1; j >= 0; j--) {
    402         const WORD8 *ptr_width = psfb_width[j];
    403         WORD16 *ptable_idx = psfb_table_idx[j];
    404         width_idx = 0;
    405         *ptable_idx++ = width_idx;
    406         do {
    407           width_idx += (*ptr_width++);
    408           *ptable_idx++ = width_idx;
    409         } while (*ptr_width != -1);
    410 
    411         aac_persistent_mem->str_aac_decoder.num_swb_window[j] =
    412             (WORD8)(ptr_width - psfb_width[j]);
    413       }
    414 
    415       {
    416         ptr_aac_tables->str_aac_sfb_info[0].sfb_index =
    417             ptr_aac_tables->sfb_long_table;
    418         ptr_aac_tables->str_aac_sfb_info[1].sfb_index =
    419             ptr_aac_tables->sfb_long_table;
    420         ptr_aac_tables->str_aac_sfb_info[3].sfb_index =
    421             ptr_aac_tables->sfb_long_table;
    422 
    423         ptr_aac_tables->str_aac_sfb_info[2].sfb_index =
    424             ptr_aac_tables->sfb_short_table;
    425 
    426         ptr_aac_tables->str_aac_sfb_info[0].sfb_width = (WORD8 *)psfb_width[0];
    427         ptr_aac_tables->str_aac_sfb_info[1].sfb_width = (WORD8 *)psfb_width[0];
    428         ptr_aac_tables->str_aac_sfb_info[3].sfb_width = (WORD8 *)psfb_width[0];
    429 
    430         ptr_aac_tables->str_aac_sfb_info[2].sfb_width = (WORD8 *)psfb_width[1];
    431       }
    432     } else {
    433       WORD16 *ptr_sfb_idx[2];
    434       const WORD8 *ptr_sfb_width[2];
    435       WORD width_idx;
    436       WORD32 j;
    437 
    438       ptr_sfb_idx[0] = ptr_aac_tables->sfb_long_table;
    439       ptr_sfb_idx[1] = ptr_aac_tables->sfb_short_table;
    440 
    441       if (frame_length == 512)
    442         ptr_sfb_width[0] = ptr_aac_tables->scale_fac_bands_512[i];
    443       else
    444         ptr_sfb_width[0] = ptr_aac_tables->scale_fac_bands_480[i];
    445 
    446       for (j = 0; j >= 0; j--) {
    447         const WORD8 *ptr_width = ptr_sfb_width[j];
    448         WORD16 *ptr_idx = ptr_sfb_idx[j];
    449         width_idx = 0;
    450         *ptr_idx++ = width_idx;
    451         do {
    452           width_idx += (*ptr_width++);
    453           *ptr_idx++ = width_idx;
    454         } while (*ptr_width != -1);
    455 
    456         aac_persistent_mem->str_aac_decoder.num_swb_window[j] =
    457             (WORD8)(ptr_width - ptr_sfb_width[j]);
    458       }
    459 
    460       {
    461         ptr_aac_tables->str_aac_sfb_info[0].sfb_index =
    462             ptr_aac_tables->sfb_long_table;
    463         ptr_aac_tables->str_aac_sfb_info[1].sfb_index =
    464             ptr_aac_tables->sfb_long_table;
    465         ptr_aac_tables->str_aac_sfb_info[3].sfb_index =
    466             ptr_aac_tables->sfb_long_table;
    467         ptr_aac_tables->str_aac_sfb_info[2].sfb_index =
    468             ptr_aac_tables->sfb_short_table;
    469 
    470         ptr_aac_tables->str_aac_sfb_info[0].sfb_width =
    471             (WORD8 *)ptr_sfb_width[0];
    472         ptr_aac_tables->str_aac_sfb_info[1].sfb_width =
    473             (WORD8 *)ptr_sfb_width[0];
    474         ptr_aac_tables->str_aac_sfb_info[3].sfb_width =
    475             (WORD8 *)ptr_sfb_width[0];
    476         ptr_aac_tables->str_aac_sfb_info[2].sfb_width =
    477             (WORD8 *)ptr_sfb_width[1];
    478       }
    479     }
    480     {
    481       ia_aac_decoder_struct *aac_dec_handle =
    482           &aac_persistent_mem->str_aac_decoder;
    483       aac_dec_handle->sampling_rate_index = (WORD16)i;
    484       aac_dec_handle->sampling_rate = sampling_rate;
    485       aac_dec_handle->channels = 1;
    486       aac_dec_handle->block_number = 0;
    487       aac_dec_handle->samples_per_frame = frame_length;
    488     }
    489   }
    490 
    491   return &(aac_persistent_mem->str_aac_decoder);
    492 }
    493