Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *                                                                            *
      3  * Copyright (C) 2018 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 #include <string.h>
     21 #include "ixheaacd_sbr_common.h"
     22 #include <ixheaacd_type_def.h>
     23 
     24 #include "ixheaacd_constants.h"
     25 #include <ixheaacd_basic_ops32.h>
     26 #include <ixheaacd_basic_ops16.h>
     27 #include <ixheaacd_basic_ops40.h>
     28 #include "ixheaacd_basic_ops.h"
     29 #include "ixheaacd_defines.h"
     30 
     31 #include "ixheaacd_intrinsics.h"
     32 #include "ixheaacd_sbr_const.h"
     33 #include <ixheaacd_basic_op.h>
     34 #include "ixheaacd_defines.h"
     35 #include "ixheaacd_bitbuffer.h"
     36 #include "ixheaacd_pns.h"
     37 
     38 #include <ixheaacd_aac_rom.h>
     39 #include "ixheaacd_pulsedata.h"
     40 
     41 #include "ixheaacd_drc_data_struct.h"
     42 #include "ixheaacd_lt_predict.h"
     43 #include "ixheaacd_channelinfo.h"
     44 #include "ixheaacd_drc_dec.h"
     45 
     46 #include "ixheaacd_sbrdecoder.h"
     47 
     48 #include "ixheaacd_sbrdecsettings.h"
     49 #include "ixheaacd_sbr_scale.h"
     50 #include "ixheaacd_lpp_tran.h"
     51 #include "ixheaacd_env_extr_part.h"
     52 #include <ixheaacd_sbr_rom.h>
     53 #include "ixheaacd_hybrid.h"
     54 #include "ixheaacd_ps_dec.h"
     55 #include "ixheaacd_ps_bitdec.h"
     56 #include "ixheaacd_env_extr.h"
     57 #include "ixheaacd_common_rom.h"
     58 #include "ixheaacd_freq_sca.h"
     59 
     60 #include "ixheaacd_qmf_dec.h"
     61 
     62 #include "ixheaacd_env_calc.h"
     63 
     64 #include "ixheaacd_pvc_dec.h"
     65 #include "ixheaacd_sbr_dec.h"
     66 #include "ixheaacd_env_dec.h"
     67 #include "ixheaacd_basic_funcs.h"
     68 #include "ixheaacd_sbr_crc.h"
     69 
     70 #include "ixheaacd_sbrqmftrans.h"
     71 
     72 #include "ixheaacd_audioobjtypes.h"
     73 
     74 #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3)
     75 
     76 WORD32 ixheaacd_getsize_sbr_persistent() {
     77   return (ALIGN_SIZE64(sizeof(ia_sbr_pers_struct)));
     78 }
     79 
     80 WORD32 ixheaacd_esbr_hbe_data_init(
     81     ia_esbr_hbe_txposer_struct *pstr_esbr_hbe_txposer,
     82     const WORD32 num_aac_samples, WORD32 samp_fac_4_flag,
     83     const WORD32 num_out_samples, VOID *persistent_hbe_mem) {
     84   WORD32 i;
     85   WORD32 used_persistent = 0;
     86 
     87   if (pstr_esbr_hbe_txposer) {
     88     memset(pstr_esbr_hbe_txposer, 0, sizeof(ia_esbr_hbe_txposer_struct));
     89 
     90     pstr_esbr_hbe_txposer->core_frame_length = num_aac_samples;
     91 
     92     pstr_esbr_hbe_txposer->no_bins = num_out_samples / NO_QMF_SYNTH_CHANNELS;
     93 
     94     pstr_esbr_hbe_txposer->hbe_qmf_in_len =
     95         pstr_esbr_hbe_txposer->no_bins / 2 + HBE_OPER_WIN_LEN - 1;
     96     pstr_esbr_hbe_txposer->hbe_qmf_out_len =
     97         2 * pstr_esbr_hbe_txposer->hbe_qmf_in_len;
     98 
     99     pstr_esbr_hbe_txposer->ptr_input_buf =
    100         (FLOAT32 *)((WORD8 *)persistent_hbe_mem);
    101     used_persistent +=
    102         (num_aac_samples + NO_QMF_SYNTH_CHANNELS) * sizeof(FLOAT32);
    103 
    104     pstr_esbr_hbe_txposer->qmf_in_buf =
    105         (FLOAT32 **)((WORD8 *)persistent_hbe_mem + used_persistent);
    106     used_persistent +=
    107         pstr_esbr_hbe_txposer->hbe_qmf_in_len * sizeof(FLOAT32 *);
    108 
    109     for (i = 0; i < pstr_esbr_hbe_txposer->hbe_qmf_in_len; i++) {
    110       pstr_esbr_hbe_txposer->qmf_in_buf[i] =
    111           (FLOAT32 *)((WORD8 *)persistent_hbe_mem + used_persistent);
    112 
    113       used_persistent += (TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
    114     }
    115 
    116     pstr_esbr_hbe_txposer->qmf_out_buf =
    117         (FLOAT32 **)((WORD8 *)persistent_hbe_mem + used_persistent);
    118     used_persistent +=
    119         (pstr_esbr_hbe_txposer->hbe_qmf_out_len * sizeof(FLOAT32 *));
    120 
    121     for (i = 0; i < pstr_esbr_hbe_txposer->hbe_qmf_out_len; i++) {
    122       pstr_esbr_hbe_txposer->qmf_out_buf[i] =
    123           (FLOAT32 *)((WORD8 *)persistent_hbe_mem + used_persistent);
    124       used_persistent += (TWICE_QMF_SYNTH_CHANNELS_NUM * sizeof(FLOAT32));
    125     }
    126     pstr_esbr_hbe_txposer->upsamp_4_flag = samp_fac_4_flag;
    127   }
    128 
    129   return 0;
    130 }
    131 
    132 VOID ixheaacd_set_sbr_persistent_table_pointer(
    133     VOID *sbr_persistent_mem_v, ia_sbr_tables_struct *sbr_tables_ptr,
    134     ixheaacd_misc_tables *pstr_common_tables) {
    135   ia_sbr_pers_struct *sbr_persistent_mem =
    136       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
    137   sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables = sbr_tables_ptr;
    138   sbr_persistent_mem->str_sbr_dec_inst.pstr_common_tables = pstr_common_tables;
    139 }
    140 
    141 VOID ixheaacd_set_sbr_persistent_buffers(VOID *sbr_persistent_mem_v,
    142                                          WORD32 *persistent_used,
    143                                          WORD32 num_channel, WORD ps_enable) {
    144   WORD32 i = 0;
    145   WORD32 used_persistent = *persistent_used;
    146   WORD32 temp, temp1, temp2, temp3;
    147   struct ia_sbr_pers_struct *sbr_persistent_mem =
    148       (struct ia_sbr_pers_struct *)sbr_persistent_mem_v;
    149 
    150   struct ia_sbr_dec_inst_struct *p_str_sbr_dec_inst =
    151       &sbr_persistent_mem->str_sbr_dec_inst;
    152 
    153   memset(sbr_persistent_mem, 0, sizeof(struct ia_sbr_pers_struct));
    154 
    155   sbr_persistent_mem->sbr_qmf_analy_states =
    156       (WORD16 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    157   temp = num_channel * ((QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
    158                         sizeof(WORD16));
    159   used_persistent += temp;
    160 
    161   sbr_persistent_mem->sbr_qmf_analy_states_32 =
    162       (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    163   temp1 =
    164       num_channel *
    165       ((QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) * sizeof(WORD32));
    166   used_persistent += temp1;
    167 
    168   sbr_persistent_mem->sbr_qmf_synth_states =
    169       (WORD16 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    170 
    171   temp2 =
    172       (num_channel * ((QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
    173                       sizeof(WORD16)));
    174   used_persistent += temp2;
    175 
    176   sbr_persistent_mem->sbr_qmf_synth_states_32 =
    177       (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    178 
    179   temp3 =
    180       (num_channel * ((QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
    181                       sizeof(WORD32)));
    182   used_persistent += temp3;
    183 
    184   memset(sbr_persistent_mem->sbr_qmf_analy_states, 0,
    185          (temp + temp1 + temp2 + temp3));
    186 
    187   for (i = 0; i < num_channel; i++) {
    188     sbr_persistent_mem->ptr_sbr_overlap_buf[i] =
    189         (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    190 
    191     if (ps_enable) {
    192       memset(sbr_persistent_mem->ptr_sbr_overlap_buf[i], 0,
    193              2 * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
    194       used_persistent +=
    195           2 * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
    196     } else {
    197       memset(sbr_persistent_mem->ptr_sbr_overlap_buf[i], 0,
    198              MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32));
    199       used_persistent += MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
    200     }
    201   }
    202 
    203   for (i = 0; i < num_channel; i++) {
    204     WORD32 j;
    205     sbr_persistent_mem->sbr_lpc_filter_states_real[i] =
    206         (WORD32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    207     used_persistent += LPC_ORDER * sizeof(WORD32 *);
    208     for (j = 0; j < LPC_ORDER; j++) {
    209       sbr_persistent_mem->sbr_lpc_filter_states_real[i][j] =
    210           (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    211 
    212       used_persistent += NO_ANALYSIS_CHANNELS * sizeof(WORD32);
    213 
    214       memset(sbr_persistent_mem->sbr_lpc_filter_states_real[i][j], 0,
    215              NO_ANALYSIS_CHANNELS * sizeof(WORD32));
    216     }
    217   }
    218 
    219   if (ps_enable) {
    220     for (i = 0; i < num_channel; i++) {
    221       WORD32 j;
    222 
    223       sbr_persistent_mem->sbr_lpc_filter_states_imag[i] =
    224           (WORD32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    225       used_persistent += LPC_ORDER * sizeof(WORD32 *);
    226       for (j = 0; j < LPC_ORDER; j++) {
    227         sbr_persistent_mem->sbr_lpc_filter_states_imag[i][j] =
    228             (WORD32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    229 
    230         used_persistent += NO_ANALYSIS_CHANNELS * sizeof(WORD32);
    231 
    232         memset(sbr_persistent_mem->sbr_lpc_filter_states_imag[i][j], 0,
    233                NO_ANALYSIS_CHANNELS * sizeof(WORD32));
    234       }
    235     }
    236   }
    237   for (i = 0; i < num_channel; i++) {
    238     WORD32 initial_used = used_persistent;
    239     WORD32 temp_used = used_persistent;
    240 
    241     sbr_persistent_mem->sbr_smooth_gain_buf[i] =
    242         (WORD16 *)((WORD8 *)sbr_persistent_mem_v + temp_used);
    243     temp_used += 2 * MAX_FREQ_COEFFS * sizeof(WORD16);
    244 
    245     sbr_persistent_mem->sbr_smooth_noise_buf[i] =
    246         (WORD16 *)((WORD8 *)sbr_persistent_mem_v + temp_used);
    247 
    248     temp_used += MAX_FREQ_COEFFS * sizeof(WORD16);
    249 
    250     p_str_sbr_dec_inst->pstr_freq_band_data[i] =
    251         (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
    252 
    253     temp_used += ALIGN_SIZE64(sizeof(ia_freq_band_data_struct));
    254 
    255     sbr_persistent_mem->pstr_prev_frame_data[i] =
    256         (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
    257 
    258     temp_used += ALIGN_SIZE64(sizeof(ia_sbr_prev_frame_data_struct));
    259 
    260     p_str_sbr_dec_inst->pstr_sbr_channel[i] =
    261         (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
    262 
    263     temp_used += ALIGN_SIZE64(sizeof(ia_sbr_channel_struct));
    264 
    265     p_str_sbr_dec_inst->pstr_sbr_header[i] =
    266         (VOID *)((WORD8 *)sbr_persistent_mem_v + temp_used);
    267 
    268     temp_used += ALIGN_SIZE64(sizeof(ia_sbr_header_data_struct));
    269 
    270     memset(sbr_persistent_mem->sbr_smooth_gain_buf[i], 0,
    271            temp_used - initial_used);
    272 
    273     used_persistent = temp_used;
    274   }
    275 
    276   if (ps_enable) {
    277     p_str_sbr_dec_inst->pstr_ps_stereo_dec =
    278         (ia_ps_dec_struct *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    279 
    280     memset(p_str_sbr_dec_inst->pstr_ps_stereo_dec, 0, sizeof(ia_ps_dec_struct));
    281 
    282     used_persistent += sizeof(ia_ps_dec_struct);
    283   }
    284 
    285   p_str_sbr_dec_inst->frame_buffer[0] =
    286       (VOID *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    287   memset(p_str_sbr_dec_inst->frame_buffer[0], 0,
    288          (sizeof(ia_sbr_frame_info_data_struct) +
    289           MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8));
    290   used_persistent = used_persistent + (sizeof(ia_sbr_frame_info_data_struct) +
    291                                        MAX_FREQ_COEFFS * sizeof(WORD32) + 8);
    292 
    293   p_str_sbr_dec_inst->frame_buffer[1] =
    294       (VOID *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    295   memset(p_str_sbr_dec_inst->frame_buffer[1], 0,
    296          (sizeof(ia_sbr_frame_info_data_struct) +
    297           MAX_FREQ_COEFFS * sizeof(WORD32) * 2 + 8));
    298   used_persistent = used_persistent + (sizeof(ia_sbr_frame_info_data_struct) +
    299                                        MAX_FREQ_COEFFS * sizeof(WORD32) + 8);
    300 
    301   {
    302     WORD32 index = 0;
    303     p_str_sbr_dec_inst->ptr_pvc_data_str =
    304         (ia_pvc_data_struct *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    305     memset(p_str_sbr_dec_inst->ptr_pvc_data_str, 0, sizeof(ia_pvc_data_struct));
    306     used_persistent += sizeof(ia_pvc_data_struct);
    307 
    308     p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_hbe_txposer =
    309         (ia_esbr_hbe_txposer_struct *)((WORD8 *)sbr_persistent_mem_v +
    310                                        used_persistent);
    311     memset(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.p_hbe_txposer,
    312            0, sizeof(ia_esbr_hbe_txposer_struct));
    313     used_persistent += sizeof(ia_esbr_hbe_txposer_struct);
    314 
    315     if (num_channel == 2) {
    316       p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_hbe_txposer =
    317           (ia_esbr_hbe_txposer_struct *)((WORD8 *)sbr_persistent_mem_v +
    318                                          used_persistent);
    319       memset(p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.p_hbe_txposer,
    320              0, sizeof(ia_esbr_hbe_txposer_struct));
    321       used_persistent += sizeof(ia_esbr_hbe_txposer_struct);
    322     }
    323 
    324     p_str_sbr_dec_inst->hbe_txposer_buffers =
    325         (VOID *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    326     memset(p_str_sbr_dec_inst->hbe_txposer_buffers, 0,
    327            num_channel * MAX_HBE_PERSISTENT_SIZE);
    328     used_persistent += num_channel * MAX_HBE_PERSISTENT_SIZE;
    329 
    330     p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real =
    331         (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    332     memset(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_real,
    333            0, MAX_QMF_BUF_LEN * sizeof(FLOAT32 *));
    334     used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32 *);
    335 
    336     p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag =
    337         (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    338     memset(p_str_sbr_dec_inst->pstr_sbr_channel[0]->str_sbr_dec.pp_qmf_buf_imag,
    339            0, MAX_QMF_BUF_LEN);
    340     used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32 *);
    341 
    342     if (num_channel == 2) {
    343       p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real =
    344           (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    345       memset(
    346           p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_real,
    347           0, MAX_QMF_BUF_LEN * sizeof(FLOAT32 *));
    348       used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32 *);
    349 
    350       p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag =
    351           (FLOAT32 **)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    352       memset(
    353           p_str_sbr_dec_inst->pstr_sbr_channel[1]->str_sbr_dec.pp_qmf_buf_imag,
    354           0, MAX_QMF_BUF_LEN * sizeof(FLOAT32 *));
    355       used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32 *);
    356     }
    357 
    358     for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
    359       p_str_sbr_dec_inst->pstr_sbr_channel[0]
    360           ->str_sbr_dec.pp_qmf_buf_real[index] =
    361           (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    362       used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32);
    363     }
    364 
    365     for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
    366       p_str_sbr_dec_inst->pstr_sbr_channel[0]
    367           ->str_sbr_dec.pp_qmf_buf_imag[index] =
    368           (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    369       used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32);
    370     }
    371 
    372     if (num_channel == 2) {
    373       for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
    374         p_str_sbr_dec_inst->pstr_sbr_channel[1]
    375             ->str_sbr_dec.pp_qmf_buf_real[index] =
    376             (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    377         used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32);
    378       }
    379 
    380       for (index = 0; index < MAX_QMF_BUF_LEN; index++) {
    381         p_str_sbr_dec_inst->pstr_sbr_channel[1]
    382             ->str_sbr_dec.pp_qmf_buf_imag[index] =
    383             (FLOAT32 *)((WORD8 *)sbr_persistent_mem_v + used_persistent);
    384         used_persistent += MAX_QMF_BUF_LEN * sizeof(FLOAT32);
    385       }
    386     }
    387   }
    388 
    389   *persistent_used = used_persistent;
    390 }
    391 
    392 WORD32 ia_enhaacplus_dec_get_sbr_buffers_size(WORD32 channels) {
    393   WORD32 sbr_buffers_size = 0;
    394   WORD32 temp, temp2;
    395   WORD32 num_channel = channels;
    396   WORD32 i;
    397 
    398   temp = num_channel * ((QMF_FILTER_STATE_ANA_SIZE + 2 * NO_ANALYSIS_CHANNELS) *
    399                         sizeof(WORD16));
    400   sbr_buffers_size += temp;
    401 
    402   temp2 =
    403       (num_channel * ((QMF_FILTER_STATE_SYN_SIZE + 2 * NO_SYNTHESIS_CHANNELS) *
    404                       sizeof(WORD16)));
    405   sbr_buffers_size += temp2;
    406 
    407   for (i = 0; i < num_channel; i++) {
    408     sbr_buffers_size +=
    409         2 * MAX_OV_COLS * NO_SYNTHESIS_CHANNELS * sizeof(WORD32);
    410   }
    411 
    412   for (i = 0; i < num_channel; i++) {
    413     int j;
    414     sbr_buffers_size += LPC_ORDER * sizeof(VOID *);
    415 
    416     for (j = 0; j < LPC_ORDER; j++) {
    417       sbr_buffers_size += NO_ANALYSIS_CHANNELS * sizeof(WORD32);
    418     }
    419   }
    420 
    421   for (i = 0; i < num_channel; i++) {
    422     int j;
    423     sbr_buffers_size += LPC_ORDER * sizeof(WORD32);
    424     for (j = 0; j < LPC_ORDER; j++) {
    425       sbr_buffers_size += NO_ANALYSIS_CHANNELS * sizeof(WORD32);
    426     }
    427   }
    428 
    429   for (i = 0; i < num_channel; i++) {
    430     WORD32 temp_used = sbr_buffers_size;
    431 
    432     temp_used += 2 * MAX_FREQ_COEFFS * sizeof(WORD16);
    433     temp_used += MAX_FREQ_COEFFS * sizeof(WORD16);
    434     temp_used += ALIGN_SIZE64(sizeof(ia_freq_band_data_struct));
    435     temp_used += ALIGN_SIZE64(sizeof(ia_sbr_prev_frame_data_struct));
    436     temp_used += ALIGN_SIZE64(sizeof(ia_sbr_channel_struct));
    437     temp_used += ALIGN_SIZE64(sizeof(ia_sbr_header_data_struct));
    438 
    439     sbr_buffers_size = temp_used;
    440   }
    441 
    442   sbr_buffers_size += sizeof(ia_ps_dec_struct);
    443 
    444   return sbr_buffers_size;
    445 }
    446 
    447 static PLATFORM_INLINE VOID ixheaacd_init_headerdata(
    448     ia_sbr_header_data_struct *ptr_header_data, WORD32 sample_rate_dec,
    449     WORD32 samp_per_frame, ia_freq_band_data_struct *freq_band_data,
    450     ia_sbr_tables_struct *sbr_tables, WORD audio_obj_type) {
    451   ia_freq_band_data_struct *pstr_freq_band_data = freq_band_data;
    452   WORD32 tmp;
    453 
    454   if (audio_obj_type != AOT_ER_AAC_ELD) {
    455     memcpy(ptr_header_data,
    456            &sbr_tables->env_extr_tables_ptr->str_sbr_default_header,
    457            sizeof(ia_sbr_header_data_struct));
    458   }
    459 
    460   if (audio_obj_type == AOT_ER_AAC_ELD) ptr_header_data->time_step -= 1;
    461 
    462   pstr_freq_band_data->freq_band_table[LOW] =
    463       pstr_freq_band_data->freq_band_tbl_lo;
    464   pstr_freq_band_data->freq_band_table[HIGH] =
    465       pstr_freq_band_data->freq_band_tbl_hi;
    466   ptr_header_data->pstr_freq_band_data = pstr_freq_band_data;
    467 
    468   ptr_header_data->core_frame_size = samp_per_frame;
    469   ptr_header_data->out_sampling_freq = sample_rate_dec << 1;
    470 
    471   if (audio_obj_type != AOT_ER_AAC_ELD) {
    472     tmp = ptr_header_data->time_step + 4;
    473 
    474     if (tmp < 0)
    475       ptr_header_data->num_time_slots =
    476           ixheaacd_extract16l(samp_per_frame << (-tmp));
    477     else
    478       ptr_header_data->num_time_slots =
    479           ixheaacd_extract16l(samp_per_frame >> tmp);
    480   } else {
    481     ptr_header_data->time_step = 1;
    482 
    483     ptr_header_data->num_time_slots =
    484         (samp_per_frame / 32 >> (ptr_header_data->time_step - 1));
    485   }
    486 }
    487 
    488 VOID ixheaacd_setesbr_flags(VOID *sbr_persistent_mem_v, FLAG pvc_flag,
    489                             FLAG hbe_flag, FLAG inter_tes_flag) {
    490   ia_sbr_pers_struct *sbr_persistent_mem;
    491   sbr_persistent_mem = (ia_sbr_pers_struct *)sbr_persistent_mem_v;
    492   sbr_persistent_mem->str_sbr_dec_inst.hbe_flag = hbe_flag;
    493   sbr_persistent_mem->str_sbr_dec_inst.pvc_flag = pvc_flag;
    494   sbr_persistent_mem->str_sbr_dec_inst.inter_tes_flag = inter_tes_flag;
    495   return;
    496 }
    497 
    498 ia_handle_sbr_dec_inst_struct ixheaacd_init_sbr(
    499     WORD32 sample_rate_dec, WORD32 samp_per_frame, FLAG *down_sample_flag,
    500     VOID *sbr_persistent_mem_v, WORD32 *ptr_overlap_buf, WORD32 channel,
    501     WORD32 ps_enable, WORD32 sbr_ratio_idx, WORD32 output_frame_size,
    502     WORD32 *use_hbe, VOID *p_usac_dflt_header,
    503     ia_sbr_header_data_struct str_sbr_config, WORD32 audio_object_type) {
    504   WORD16 i;
    505   WORD16 err;
    506   ia_sbr_header_data_struct *ptr_header_data[MAXNRSBRCHANNELS];
    507   ia_sbr_dec_struct *ptr_sbr_dec[2];
    508   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr;
    509   ia_sbr_pers_struct *sbr_persistent_mem;
    510 
    511   sbr_persistent_mem = (ia_sbr_pers_struct *)sbr_persistent_mem_v;
    512   ptr_sbr_dec[0] =
    513       &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[0]->str_sbr_dec;
    514   ptr_sbr_dec[1] =
    515       &sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[1]->str_sbr_dec;
    516 
    517   qmf_dec_tables_ptr =
    518       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr;
    519 
    520   if (sample_rate_dec > 48000) {
    521     *down_sample_flag = 1;
    522   }
    523 
    524   for (i = 0; i < channel; i++) {
    525     if (audio_object_type == AOT_ER_AAC_ELD) {
    526       memcpy(sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[i],
    527              &str_sbr_config, sizeof(ia_sbr_header_data_struct));
    528     }
    529     ptr_header_data[i] =
    530         sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_header[i];
    531 
    532     ixheaacd_init_headerdata(
    533         ptr_header_data[i], sample_rate_dec, samp_per_frame,
    534         sbr_persistent_mem->str_sbr_dec_inst.pstr_freq_band_data[i],
    535         sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables,
    536         audio_object_type);
    537 
    538     err = ixheaacd_create_sbrdec(
    539 
    540         sbr_persistent_mem->str_sbr_dec_inst.pstr_common_tables,
    541         sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_channel[i],
    542         ptr_header_data[i], i, *down_sample_flag, sbr_persistent_mem, ps_enable,
    543         audio_object_type);
    544 
    545     ptr_header_data[i]->status = 1;
    546 
    547     if (err) {
    548       return NULL;
    549     }
    550   }
    551 
    552   if (channel != 1) {
    553     if (ps_enable) {
    554       if (audio_object_type == AOT_ER_AAC_ELD)
    555         err = (WORD16)ixheaacd_create_psdec(
    556             sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec,
    557             sbr_persistent_mem, &ptr_overlap_buf[512 * 4]);
    558       else
    559         err = (WORD16)ixheaacd_create_psdec(
    560             sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec,
    561             sbr_persistent_mem, ptr_overlap_buf);
    562       if (err) {
    563         return NULL;
    564       }
    565     }
    566   }
    567 
    568   if (use_hbe != NULL) {
    569     ia_sbr_header_data_struct *ptr_sbr_dflt_header =
    570         &sbr_persistent_mem->str_sbr_dec_inst.str_sbr_dflt_header;
    571     ia_sbr_header_data_struct *ptr_usac_dflt_header =
    572         (ia_sbr_header_data_struct *)p_usac_dflt_header;
    573     struct ia_sbr_dec_inst_struct *p_str_sbr_dec_inst =
    574         &sbr_persistent_mem->str_sbr_dec_inst;
    575     VOID *hbe_txposer_buffers = p_str_sbr_dec_inst->hbe_txposer_buffers;
    576 
    577     ptr_header_data[0] = p_str_sbr_dec_inst->pstr_sbr_header[0];
    578     ptr_header_data[1] = p_str_sbr_dec_inst->pstr_sbr_header[1];
    579 
    580     ptr_header_data[0]->sbr_ratio_idx = sbr_ratio_idx;
    581     ptr_header_data[0]->output_framesize = output_frame_size;
    582     ptr_header_data[0]->pstr_freq_band_data->sub_band_start = 64;
    583     ptr_header_data[0]->esbr_start_up = 1;
    584     ptr_header_data[0]->esbr_start_up_pvc = 1;
    585 
    586     if (channel > 1) {
    587       ptr_header_data[1]->sbr_ratio_idx = sbr_ratio_idx;
    588       ptr_header_data[1]->output_framesize = output_frame_size;
    589       ptr_header_data[1]->pstr_freq_band_data->sub_band_start = 64;
    590       ptr_header_data[1]->esbr_start_up = 1;
    591       ptr_header_data[1]->esbr_start_up_pvc = 1;
    592     }
    593     if (hbe_txposer_buffers != NULL && (use_hbe[0] == 1)) {
    594       ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[0]->p_hbe_txposer, samp_per_frame,
    595                                   sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0,
    596                                   output_frame_size, hbe_txposer_buffers);
    597 
    598       hbe_txposer_buffers =
    599           (WORD8 *)hbe_txposer_buffers + MAX_HBE_PERSISTENT_SIZE;
    600 
    601       ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[1]->p_hbe_txposer, samp_per_frame,
    602                                   sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0,
    603                                   output_frame_size, hbe_txposer_buffers);
    604     }
    605 
    606     p_str_sbr_dec_inst->ptr_pvc_data_str->prev_first_bnd_idx = -1;
    607     p_str_sbr_dec_inst->ptr_pvc_data_str->prev_pvc_rate = -1;
    608     p_str_sbr_dec_inst->ptr_pvc_data_str->prev_sbr_mode = UNKNOWN_SBR;
    609 
    610     p_str_sbr_dec_inst->pstr_sbr_channel[0]
    611         ->str_sbr_dec.str_codec_qmf_bank.num_time_slots =
    612         output_frame_size / 64;
    613     p_str_sbr_dec_inst->pstr_sbr_channel[1]
    614         ->str_sbr_dec.str_codec_qmf_bank.num_time_slots =
    615         output_frame_size / 64;
    616 
    617     ptr_header_data[0]->core_frame_size = samp_per_frame;
    618     ptr_header_data[1]->core_frame_size = samp_per_frame;
    619 
    620     switch (sbr_ratio_idx) {
    621       case SBR_UPSAMPLE_IDX_0_0:
    622         ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 32;
    623         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
    624             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
    625         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    626             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
    627         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
    628             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
    629         ptr_header_data[0]->is_usf_4 = 0;
    630         ptr_header_data[0]->upsamp_fac = 1;
    631 
    632         ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 32;
    633         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
    634             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
    635         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    636             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
    637         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
    638             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
    639         ptr_header_data[1]->is_usf_4 = 0;
    640         ptr_header_data[1]->upsamp_fac = 1;
    641         break;
    642       case SBR_UPSAMPLE_IDX_2_1:
    643         ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 32;
    644         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
    645             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
    646         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    647             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
    648         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
    649             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
    650         ptr_header_data[0]->is_usf_4 = 0;
    651         ptr_header_data[0]->upsamp_fac = 2;
    652 
    653         ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 32;
    654         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
    655             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
    656         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    657             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
    658         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
    659             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l32;
    660         ptr_header_data[1]->is_usf_4 = 0;
    661         ptr_header_data[1]->upsamp_fac = 2;
    662         break;
    663       case SBR_UPSAMPLE_IDX_8_3:
    664         ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 24;
    665         ptr_sbr_dec[0]->str_codec_qmf_bank.filter_pos_32 =
    666             qmf_dec_tables_ptr->esbr_qmf_c_24;
    667         ptr_sbr_dec[0]->str_codec_qmf_bank.analy_win_coeff_32 =
    668             qmf_dec_tables_ptr->esbr_qmf_c_24;
    669         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
    670             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l24;
    671         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    672             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l24;
    673         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
    674             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l24;
    675 
    676         ptr_header_data[0]->is_usf_4 = 0;
    677         ptr_header_data[0]->upsamp_fac = 2;
    678 
    679         ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 24;
    680         ptr_sbr_dec[1]->str_codec_qmf_bank.filter_pos_32 =
    681             qmf_dec_tables_ptr->esbr_qmf_c_24;
    682         ptr_sbr_dec[1]->str_codec_qmf_bank.analy_win_coeff_32 =
    683             qmf_dec_tables_ptr->esbr_qmf_c_24;
    684         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
    685             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l24;
    686         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    687             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l24;
    688         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
    689             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l24;
    690 
    691         ptr_header_data[1]->is_usf_4 = 0;
    692         ptr_header_data[1]->upsamp_fac = 2;
    693         break;
    694       case SBR_UPSAMPLE_IDX_4_1:
    695         ptr_sbr_dec[0]->str_codec_qmf_bank.no_channels = 16;
    696         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_cos_twiddle =
    697             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l16;
    698         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    699             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l16;
    700         ptr_sbr_dec[0]->str_codec_qmf_bank.esbr_t_cos =
    701             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l16;
    702         ptr_header_data[0]->is_usf_4 = 1;
    703         ptr_header_data[0]->upsamp_fac = 4;
    704         ptr_header_data[0]->out_sampling_freq =
    705             ptr_header_data[0]->out_sampling_freq * 2;
    706 
    707         ptr_sbr_dec[1]->str_codec_qmf_bank.no_channels = 16;
    708         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_cos_twiddle =
    709             (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l16;
    710         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_alt_sin_twiddle =
    711             (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l16;
    712         ptr_sbr_dec[1]->str_codec_qmf_bank.esbr_t_cos =
    713             (WORD32 *)qmf_dec_tables_ptr->esbr_t_cos_sin_l16;
    714         ptr_header_data[1]->is_usf_4 = 1;
    715         ptr_header_data[1]->upsamp_fac = 4;
    716         ptr_header_data[1]->out_sampling_freq =
    717             ptr_header_data[1]->out_sampling_freq * 2;
    718         break;
    719     }
    720 
    721     ptr_sbr_dflt_header->start_freq = ptr_usac_dflt_header->start_freq;
    722     ptr_sbr_dflt_header->stop_freq = ptr_usac_dflt_header->stop_freq;
    723 
    724     if (ptr_usac_dflt_header->header_extra_1) {
    725       ptr_sbr_dflt_header->freq_scale = ptr_usac_dflt_header->freq_scale;
    726       ptr_sbr_dflt_header->alter_scale = ptr_usac_dflt_header->alter_scale;
    727       ptr_sbr_dflt_header->noise_bands = ptr_usac_dflt_header->noise_bands;
    728     } else {
    729       ptr_sbr_dflt_header->freq_scale = SBR_FREQ_SCALE_DEFAULT;
    730       ptr_sbr_dflt_header->alter_scale = SBR_ALTER_SCALE_DEFAULT;
    731       ptr_sbr_dflt_header->noise_bands = SBR_NOISE_BANDS_DEFAULT;
    732     }
    733 
    734     if (ptr_usac_dflt_header->header_extra_2) {
    735       ptr_sbr_dflt_header->limiter_bands = ptr_usac_dflt_header->limiter_bands;
    736       ptr_sbr_dflt_header->limiter_gains = ptr_usac_dflt_header->limiter_gains;
    737       ptr_sbr_dflt_header->interpol_freq = ptr_usac_dflt_header->interpol_freq;
    738       ptr_sbr_dflt_header->smoothing_mode =
    739           ptr_usac_dflt_header->smoothing_mode;
    740     } else {
    741       ptr_sbr_dflt_header->limiter_bands = SBR_LIMITER_BANDS_DEFAULT;
    742       ptr_sbr_dflt_header->limiter_gains = SBR_LIMITER_GAINS_DEFAULT;
    743       ptr_sbr_dflt_header->interpol_freq = SBR_INTERPOL_FREQ_DEFAULT;
    744       ptr_sbr_dflt_header->smoothing_mode = SBR_SMOOTHING_LENGTH_DEFAULT;
    745     }
    746   }
    747   return &(sbr_persistent_mem->str_sbr_dec_inst);
    748 }
    749 
    750 static PLATFORM_INLINE WORD16 ixheaacd_create_sbr_env_calc(
    751 
    752     ixheaacd_misc_tables *pstr_common_table, ia_sbr_calc_env_struct *hs,
    753     WORD16 chan, VOID *sbr_persistent_mem_v,
    754     ia_sbr_header_data_struct *ptr_header_data, WORD audio_object_type) {
    755   WORD16 err;
    756   ia_sbr_pers_struct *sbr_persistent_mem =
    757       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
    758 
    759   err = 0;
    760   memset(&hs->harm_flags_prev[0], 0, sizeof(WORD8) * MAX_FREQ_COEFFS);
    761 
    762   hs->harm_index = 0;
    763 
    764   hs->filt_buf_me = sbr_persistent_mem->sbr_smooth_gain_buf[chan];
    765   hs->filt_buf_noise_m = sbr_persistent_mem->sbr_smooth_noise_buf[chan];
    766   hs->tansient_env_prev = -1;
    767 
    768   ixheaacd_reset_sbrenvelope_calc(hs);
    769 
    770   if ((chan == 0) && (audio_object_type == AOT_ER_AAC_ELD)) {
    771     err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data, pstr_common_table);
    772   }
    773 
    774   return err;
    775 }
    776 
    777 static PLATFORM_INLINE VOID ixheaacd_init_sbr_prev_framedata(
    778     ia_sbr_prev_frame_data_struct *ptr_prev_data, WORD16 time_slots) {
    779   WORD16 *psfb_nrg_prev = ptr_prev_data->sfb_nrg_prev;
    780   WORD16 *psfb_noise_level = ptr_prev_data->prev_noise_level;
    781   WORD32 *ppsbr_invf_mode = ptr_prev_data->sbr_invf_mode;
    782 
    783   memset(psfb_nrg_prev, 0, sizeof(WORD16) * (MAX_FREQ_COEFFS));
    784   memset(psfb_noise_level, 0, sizeof(WORD16) * (MAX_NOISE_COEFFS));
    785 
    786   memset(ppsbr_invf_mode, 0, sizeof(WORD32) * MAX_INVF_BANDS);
    787 
    788   ptr_prev_data->end_position = time_slots;
    789   ptr_prev_data->coupling_mode = COUPLING_OFF;
    790   ptr_prev_data->amp_res = 0;
    791   ptr_prev_data->max_qmf_subband_aac = 0;
    792 }
    793 
    794 static PLATFORM_INLINE WORD32
    795 ixheaacd_create_hyb_filterbank(ia_hybrid_struct *ptr_hybrid, WORD32 **p_ptr,
    796                                ia_sbr_tables_struct *sbr_tables_ptr) {
    797   WORD16 i, ptr_step;
    798   WORD32 *ptr = (WORD32 *)*p_ptr;
    799 
    800   ptr_hybrid->ptr_resol = sbr_tables_ptr->ps_tables_ptr->hyb_resol;
    801   ptr_hybrid->ptr_qmf_buf = HYBRID_FILTER_LENGTH - 1;
    802 
    803   ptr_hybrid->ptr_temp_re = ptr;
    804   ptr += NO_HYBRID_CHANNELS_HIGH;
    805   ptr_hybrid->ptr_temp_im = ptr;
    806   ptr += NO_HYBRID_CHANNELS_HIGH;
    807 
    808   memset(ptr_hybrid->ptr_temp_re, 0,
    809          2 * NO_HYBRID_CHANNELS_HIGH * sizeof(WORD32));
    810 
    811   ptr_step = ixheaacd_add16(1, ptr_hybrid->ptr_qmf_buf);
    812   ptr_hybrid->ptr_work_re = ptr;
    813   ptr += 16;
    814   ptr_hybrid->ptr_work_im = ptr;
    815   ptr += 16;
    816 
    817   for (i = 0; i < NO_QMF_CHANNELS_IN_HYBRID; i++) {
    818     ptr_hybrid->ptr_qmf_buf_re[i] = ptr;
    819     ptr += ptr_hybrid->ptr_qmf_buf;
    820 
    821     ptr_hybrid->ptr_qmf_buf_im[i] = ptr;
    822     ptr += ptr_hybrid->ptr_qmf_buf;
    823 
    824     memset(ptr_hybrid->ptr_qmf_buf_re[i], 0,
    825            2 * ptr_hybrid->ptr_qmf_buf * sizeof(WORD32));
    826   }
    827 
    828   *p_ptr = ptr;
    829 
    830   return 0;
    831 }
    832 
    833 static PLATFORM_INLINE WORD16 ixheaacd_create_hf_generator(
    834     ia_sbr_hf_generator_struct *ptr_hf_gen_str, WORD16 num_columns, WORD16 chan,
    835     VOID *sbr_persistent_mem_v, WORD32 ps_enable) {
    836   WORD16 i;
    837   ia_sbr_pers_struct *sbr_persistent_mem =
    838       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
    839 
    840   ptr_hf_gen_str->pstr_settings = &sbr_persistent_mem->str_sbr_tran_settings;
    841 
    842   ptr_hf_gen_str->lpc_filt_states_real[0] =
    843       sbr_persistent_mem->sbr_lpc_filter_states_real[chan][0];
    844   ptr_hf_gen_str->lpc_filt_states_real[1] =
    845       sbr_persistent_mem->sbr_lpc_filter_states_real[chan][1];
    846 
    847   if (ps_enable) {
    848     ptr_hf_gen_str->lpc_filt_states_imag[0] =
    849         sbr_persistent_mem->sbr_lpc_filter_states_imag[chan][0];
    850     ptr_hf_gen_str->lpc_filt_states_imag[1] =
    851         sbr_persistent_mem->sbr_lpc_filter_states_imag[chan][1];
    852   }
    853 
    854   for (i = 0; i < LPC_ORDER; i++) {
    855     memset(ptr_hf_gen_str->lpc_filt_states_real[i], 0,
    856            NO_ANALYSIS_CHANNELS * sizeof(WORD32));
    857 
    858     if (ps_enable)
    859       memset(ptr_hf_gen_str->lpc_filt_states_imag[i], 0,
    860              NO_ANALYSIS_CHANNELS * sizeof(WORD32));
    861   }
    862 
    863   if (chan == 0) {
    864     ptr_hf_gen_str->pstr_settings->num_columns = num_columns;
    865   }
    866   return 0;
    867 }
    868 
    869 WORD32 ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec,
    870                              VOID *sbr_persistent_mem_v,
    871                              WORD32 *ptr_overlap_buf) {
    872   ia_sbr_pers_struct *sbr_persistent_mem =
    873       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
    874 
    875   WORD16 *ptr1 = (WORD16 *)&(
    876       sbr_persistent_mem->ptr_sbr_overlap_buf[MAXNRSBRCHANNELS - 1][0]);
    877   WORD32 *ptr2 = (WORD32 *)&ptr_overlap_buf[512];
    878   WORD16 *initial_ptr;
    879   WORD16 delay;
    880   WORD32 temp;
    881 
    882   ia_sbr_tables_struct *sbr_tables_ptr =
    883       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables;
    884 
    885   memset(ptr_ps_dec, 0, sizeof(ia_ps_dec_struct));
    886 
    887   ptr_ps_dec->ps_data_present = 0;
    888   ptr_ps_dec->enable_iid = 0;
    889   ptr_ps_dec->enable_icc = 0;
    890   ptr_ps_dec->enable_ext = 0;
    891   ptr_ps_dec->iid_mode = 0;
    892   ptr_ps_dec->icc_mode = 0;
    893 
    894   ptr_ps_dec->ptr_hyb_left_re = ptr2;
    895   ptr2 += 16;
    896   ptr_ps_dec->ptr_hyb_left_im = ptr2;
    897   ptr2 += 16;
    898   ptr_ps_dec->ptr_hyb_right_re = ptr2;
    899   ptr2 += 16;
    900   ptr_ps_dec->ptr_hyb_right_im = ptr2;
    901   ptr2 += 16;
    902 
    903   memset(ptr_ps_dec->ptr_hyb_left_re, 0, sizeof(WORD32) * 16 * 4);
    904 
    905   ixheaacd_create_hyb_filterbank(&ptr_ps_dec->str_hybrid, &ptr2,
    906                                  sbr_tables_ptr);
    907 
    908   ptr_ps_dec->peak_decay_diff = ptr2;
    909   ptr2 += NUM_OF_BINS;
    910   ptr_ps_dec->energy_prev = ptr2;
    911   ptr2 += NUM_OF_BINS;
    912   ptr_ps_dec->peak_decay_diff_prev = ptr2;
    913   ptr2 += NUM_OF_BINS;
    914 
    915   memset(ptr_ps_dec->peak_decay_diff, 0, 3 * sizeof(WORD32) * NUM_OF_BINS);
    916 
    917   ptr_ps_dec->delay_buf_idx = 0;
    918   ptr_ps_dec->delay_buf_idx_long = 0;
    919 
    920   memset(ptr_ps_dec->delay_buf_qmf_sub_re_im, 0,
    921          2 * 16 * DEL_ALL_PASS * sizeof(WORD16));
    922   memset(ptr_ps_dec->delay_buf_qmf_sub_ser_re_im, 0,
    923          2 * 16 * NUM_SER_AP_LINKS * 5 * sizeof(WORD16));
    924 
    925   initial_ptr = ptr1;
    926   ptr_ps_dec->delay_buf_qmf_ser_re_im = (VOID *)ptr1;
    927   ptr1 += 2 * NUM_SER_AP_LINKS * 32 * 5;
    928 
    929   delay = 2;
    930   ptr_ps_dec->delay_buf_qmf_ap_re_im = (VOID *)ptr1;
    931   ptr1 += 2 * delay * 32;
    932 
    933   delay = HIGH_DEL;
    934   ptr_ps_dec->delay_buf_qmf_ld_re_im = (VOID *)ptr1;
    935   ptr1 += 2 * delay * SMALL_DEL_STRT;
    936 
    937   delay = SMALL_DEL;
    938   ptr_ps_dec->delay_buf_qmf_sd_re_im = (VOID *)ptr1;
    939   ptr1 +=
    940       2 * delay * (NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS -
    941                    (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT));
    942 
    943   temp = ptr1 - initial_ptr;
    944   memset(ptr_ps_dec->delay_buf_qmf_ser_re_im, 0, temp * sizeof(WORD16));
    945 
    946   memset(ptr_ps_dec->delay_buf_idx_ser, 0, NUM_SER_AP_LINKS * sizeof(WORD16));
    947   memcpy(ptr_ps_dec->delay_sample_ser,
    948          sbr_tables_ptr->ps_tables_ptr->rev_link_delay_ser,
    949          NUM_SER_AP_LINKS * sizeof(WORD16));
    950 
    951   memset(ptr_ps_dec->h11_h12_vec, 0xff,
    952          (NO_IID_GROUPS + 2) * 2 * sizeof(WORD16));
    953   memset(ptr_ps_dec->h21_h22_vec, 0, sizeof(ptr_ps_dec->h21_h22_vec));
    954 
    955   return 0;
    956 }
    957 
    958 static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_anal_qmfbank(
    959     ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf,
    960     ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 no_bins, WORD16 usb,
    961     WORD16 chan, WORD16 *sbr_qmf_analy_states, WORD32 *sbr_qmf_analy_states_32,
    962     ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 audio_object_type) {
    963   memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct));
    964 
    965   if (audio_object_type != AOT_ER_AAC_ELD &&
    966       audio_object_type != AOT_ER_AAC_LD) {
    967     ptr_sbr_qmf->analy_win_coeff = qmf_dec_tables_ptr->qmf_c;
    968   } else {
    969     ptr_sbr_qmf->analy_win_coeff = qmf_dec_tables_ptr->qmf_c_eld3;
    970   }
    971 
    972   ptr_sbr_qmf->analy_win_coeff_32 = qmf_dec_tables_ptr->esbr_qmf_c;
    973 
    974   ptr_sbr_qmf->no_channels = NO_ANALYSIS_CHANNELS;
    975   ptr_sbr_qmf->num_time_slots = no_bins;
    976 
    977   ptr_sbr_qmf->lsb = 0;
    978   ptr_sbr_qmf->usb = usb;
    979 
    980   ptr_sbr_qmf->anal_filter_states =
    981       &(sbr_qmf_analy_states[chan ? QMF_FILTER_STATE_ANA_SIZE : 0]);
    982 
    983   memset(ptr_sbr_qmf->anal_filter_states, 0,
    984          sizeof(WORD16) * QMF_FILTER_STATE_ANA_SIZE);
    985 
    986   ptr_sbr_qmf->anal_filter_states_32 =
    987       &(sbr_qmf_analy_states_32[chan ? QMF_FILTER_STATE_ANA_SIZE : 0]);
    988 
    989   memset(ptr_sbr_qmf->anal_filter_states_32, 0,
    990          sizeof(WORD32) * QMF_FILTER_STATE_ANA_SIZE);
    991 
    992   ptr_sbr_qmf->core_samples_buffer = ptr_sbr_qmf->anal_filter_states;
    993 
    994   ptr_sbr_qmf->state_new_samples_pos_low_32 =
    995       ptr_sbr_qmf->anal_filter_states_32;
    996   if (audio_object_type != AOT_ER_AAC_ELD &&
    997       audio_object_type != AOT_ER_AAC_LD) {
    998     ptr_sbr_qmf->filter_pos = (WORD16 *)qmf_dec_tables_ptr->qmf_c;
    999   } else {
   1000     ptr_sbr_qmf->filter_pos = (WORD16 *)qmf_dec_tables_ptr->qmf_c_eld3;
   1001   }
   1002 
   1003   ptr_sbr_qmf->filter_pos_32 = (WORD32 *)qmf_dec_tables_ptr->esbr_qmf_c;
   1004 
   1005   sbr_scale_factor->st_lb_scale = 0;
   1006 
   1007   sbr_scale_factor->st_syn_scale = -6;
   1008 
   1009   if (audio_object_type == AOT_ER_AAC_ELD ||
   1010       audio_object_type == AOT_ER_AAC_LD) {
   1011     ptr_sbr_qmf->filter_2 = ptr_sbr_qmf->filter_pos + 32;
   1012     ptr_sbr_qmf->fp1_anal = ptr_sbr_qmf->anal_filter_states;
   1013     ptr_sbr_qmf->fp2_anal =
   1014         ptr_sbr_qmf->anal_filter_states + NO_ANALYSIS_CHANNELS;
   1015   }
   1016 
   1017   return 0;
   1018 }
   1019 
   1020 static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_synt_qmfbank(
   1021     ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf, WORD16 no_bins, WORD16 lsb,
   1022     WORD16 usb, WORD16 chan, FLAG down_sample_flag,
   1023     WORD16 *sbr_qmf_synth_states, WORD32 *sbr_qmf_synth_states_32,
   1024     ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, WORD32 audio_object_type) {
   1025   WORD32 L;
   1026 
   1027   WORD32 qmf_filter_state_size;
   1028 
   1029   memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct));
   1030 
   1031   if (down_sample_flag) {
   1032     L = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED;
   1033     qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED;
   1034     ptr_sbr_qmf->usb = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED;
   1035   } else {
   1036     L = NO_SYNTHESIS_CHANNELS;
   1037     qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE;
   1038     ptr_sbr_qmf->usb = usb;
   1039   }
   1040 
   1041   ptr_sbr_qmf->ixheaacd_drc_offset = 0;
   1042   if (audio_object_type != AOT_ER_AAC_ELD &&
   1043       audio_object_type != AOT_ER_AAC_LD) {
   1044     ptr_sbr_qmf->filter_pos_syn = (WORD16 *)qmf_dec_tables_ptr->qmf_c;
   1045     ptr_sbr_qmf->p_filter = qmf_dec_tables_ptr->qmf_c;
   1046   } else {
   1047     ptr_sbr_qmf->filter_pos_syn = (WORD16 *)qmf_dec_tables_ptr->qmf_c_eld;
   1048     ptr_sbr_qmf->p_filter = qmf_dec_tables_ptr->qmf_c_eld;
   1049   }
   1050 
   1051   ptr_sbr_qmf->filter_pos_syn_32 = (WORD32 *)qmf_dec_tables_ptr->esbr_qmf_c;
   1052   ptr_sbr_qmf->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
   1053 
   1054   ptr_sbr_qmf->no_channels = L;
   1055   ptr_sbr_qmf->qmf_filter_state_size = qmf_filter_state_size;
   1056   ptr_sbr_qmf->num_time_slots = no_bins;
   1057   ptr_sbr_qmf->lsb = lsb;
   1058 
   1059   ptr_sbr_qmf->filter_states =
   1060       &sbr_qmf_synth_states[chan ? qmf_filter_state_size : 0];
   1061 
   1062   memset(ptr_sbr_qmf->filter_states, 0, sizeof(WORD16) * qmf_filter_state_size);
   1063 
   1064   ptr_sbr_qmf->filter_states_32 =
   1065       &sbr_qmf_synth_states_32[chan ? qmf_filter_state_size : 0];
   1066 
   1067   memset(ptr_sbr_qmf->filter_states_32, 0,
   1068          sizeof(WORD32) * qmf_filter_state_size);
   1069 
   1070   if (audio_object_type == AOT_ER_AAC_ELD ||
   1071       audio_object_type == AOT_ER_AAC_LD) {
   1072     ptr_sbr_qmf->fp1_syn = ptr_sbr_qmf->filter_states;
   1073     ptr_sbr_qmf->fp2_syn =
   1074         ptr_sbr_qmf->filter_states + ptr_sbr_qmf->no_channels;
   1075     ptr_sbr_qmf->sixty4 = NO_SYNTHESIS_CHANNELS;
   1076   }
   1077 
   1078   return 0;
   1079 }
   1080 
   1081 WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table,
   1082                               ia_sbr_channel_struct *ptr_sbr_channel,
   1083                               ia_sbr_header_data_struct *ptr_header_data,
   1084                               WORD16 chan, FLAG down_sample_flag,
   1085                               VOID *sbr_persistent_mem_v, WORD ps_enable,
   1086                               WORD audio_object_type)
   1087 
   1088 {
   1089   WORD16 err;
   1090   WORD16 time_slots;
   1091   WORD16 no_bins;
   1092   ia_sbr_pers_struct *sbr_persistent_mem =
   1093       (ia_sbr_pers_struct *)sbr_persistent_mem_v;
   1094   ia_sbr_dec_struct *hs = &(ptr_sbr_channel->str_sbr_dec);
   1095 
   1096   time_slots = ptr_header_data->num_time_slots;
   1097 
   1098   no_bins = (WORD16)(time_slots * ptr_header_data->time_step);
   1099 
   1100   hs->str_sbr_scale_fact.ov_lb_scale = INT_BITS - 1;
   1101   hs->str_sbr_scale_fact.hb_scale = INT_BITS - 1;
   1102   hs->str_sbr_scale_fact.ov_hb_scale = INT_BITS - 1;
   1103   hs->str_sbr_scale_fact.st_syn_scale = INT_BITS - 1;
   1104 
   1105   ptr_sbr_channel->pstr_prev_frame_data =
   1106       sbr_persistent_mem->pstr_prev_frame_data[chan];
   1107 
   1108   err = ixheaacd_create_sbr_env_calc(pstr_common_table, &hs->str_sbr_calc_env,
   1109                                      chan, sbr_persistent_mem, ptr_header_data,
   1110                                      audio_object_type);
   1111 
   1112   if (err) {
   1113     return (-1);
   1114   }
   1115 
   1116   ixheaacd_create_cplx_anal_qmfbank(
   1117       &hs->str_codec_qmf_bank, &hs->str_sbr_scale_fact, no_bins,
   1118       ptr_header_data->pstr_freq_band_data->sub_band_start, chan,
   1119       sbr_persistent_mem->sbr_qmf_analy_states,
   1120       sbr_persistent_mem->sbr_qmf_analy_states_32,
   1121       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr,
   1122       audio_object_type);
   1123 
   1124   ixheaacd_create_cplx_synt_qmfbank(
   1125       &hs->str_synthesis_qmf_bank, no_bins,
   1126       ptr_header_data->pstr_freq_band_data->sub_band_start,
   1127       ptr_header_data->pstr_freq_band_data->sub_band_end, chan,
   1128       down_sample_flag, sbr_persistent_mem->sbr_qmf_synth_states,
   1129       sbr_persistent_mem->sbr_qmf_synth_states_32,
   1130       sbr_persistent_mem->str_sbr_dec_inst.pstr_sbr_tables->qmf_dec_tables_ptr,
   1131       audio_object_type);
   1132 
   1133   ixheaacd_init_sbr_prev_framedata(ptr_sbr_channel->pstr_prev_frame_data,
   1134                                    time_slots);
   1135 
   1136   err = ixheaacd_create_hf_generator(&hs->str_hf_generator,
   1137                                      hs->str_codec_qmf_bank.num_time_slots,
   1138                                      chan, sbr_persistent_mem, ps_enable);
   1139 
   1140   if (err) {
   1141     return (-1);
   1142   }
   1143 
   1144   hs->ptr_sbr_overlap_buf = sbr_persistent_mem->ptr_sbr_overlap_buf[chan];
   1145 
   1146   return 0;
   1147 }
   1148