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 
     30 #include <ixheaacd_basic_op.h>
     31 #include "ixheaacd_intrinsics.h"
     32 #include "ixheaacd_common_rom.h"
     33 #include "ixheaacd_basic_funcs.h"
     34 #include "ixheaacd_bitbuffer.h"
     35 #include "ixheaacd_defines.h"
     36 
     37 #include "ixheaacd_pns.h"
     38 
     39 #include <ixheaacd_aac_rom.h>
     40 #include "ixheaacd_pulsedata.h"
     41 
     42 #include "ixheaacd_drc_data_struct.h"
     43 #include "ixheaacd_lt_predict.h"
     44 #include "ixheaacd_channelinfo.h"
     45 #include "ixheaacd_drc_dec.h"
     46 #include "ixheaacd_sbrdecoder.h"
     47 
     48 #include "ixheaacd_defines.h"
     49 #include "ixheaacd_sbrdecoder.h"
     50 #include "ixheaacd_definitions.h"
     51 #include "ixheaacd_error_codes.h"
     52 
     53 #include "ixheaacd_pulsedata.h"
     54 
     55 #include "ixheaacd_sbrdecsettings.h"
     56 #include "ixheaacd_sbr_scale.h"
     57 #include "ixheaacd_lpp_tran.h"
     58 #include "ixheaacd_env_extr_part.h"
     59 #include <ixheaacd_sbr_rom.h>
     60 #include "ixheaacd_hybrid.h"
     61 #include "ixheaacd_ps_dec.h"
     62 #include "ixheaacd_env_extr.h"
     63 
     64 #include "ixheaacd_qmf_dec.h"
     65 
     66 #include "ixheaacd_env_calc.h"
     67 #include "ixheaacd_sbr_const.h"
     68 
     69 #include "ixheaacd_pvc_dec.h"
     70 #include "ixheaacd_sbr_dec.h"
     71 #include "ixheaacd_env_extr.h"
     72 #include "ixheaacd_env_calc.h"
     73 #include "ixheaacd_ps_dec.h"
     74 #include "ixheaacd_function_selector.h"
     75 
     76 #include "ixheaacd_audioobjtypes.h"
     77 
     78 VOID ixheaacd_qmf_enrg_calc(ia_sbr_dec_struct *ptr_sbr_dec,
     79                             WORD32 upsample_ratio_idx, WORD32 low_pow_flag) {
     80   WORD32 i, j;
     81   if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
     82     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
     83       for (j = 0; j < 16; j++) {
     84         ptr_sbr_dec->qmf_energy_buf[i][j] =
     85             ptr_sbr_dec->qmf_buf_real[2 + i][j] *
     86             ptr_sbr_dec->qmf_buf_real[2 + i][j];
     87         if (!low_pow_flag)
     88           ptr_sbr_dec->qmf_energy_buf[i][j] +=
     89               (ptr_sbr_dec->qmf_buf_imag[2 + i][j] *
     90                ptr_sbr_dec->qmf_buf_imag[2 + i][j]);
     91       }
     92     }
     93 
     94     for (i = 0; i < 16; i++) {
     95       for (j = 0; j < 16; j++) {
     96         ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] =
     97             (ptr_sbr_dec->qmf_energy_buf[4 * i + 0][j] +
     98              ptr_sbr_dec->qmf_energy_buf[4 * i + 1][j] +
     99              ptr_sbr_dec->qmf_energy_buf[4 * i + 2][j] +
    100              ptr_sbr_dec->qmf_energy_buf[4 * i + 3][j]) *
    101             0.25f;
    102       }
    103     }
    104   } else {
    105     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    106       for (j = 0; j < 32; j++) {
    107         ptr_sbr_dec->qmf_energy_buf[i][j] =
    108             ptr_sbr_dec->qmf_buf_real[2 + i][j] *
    109             ptr_sbr_dec->qmf_buf_real[2 + i][j];
    110         if (!low_pow_flag)
    111           ptr_sbr_dec->qmf_energy_buf[i][j] +=
    112               (ptr_sbr_dec->qmf_buf_imag[2 + i][j] *
    113                ptr_sbr_dec->qmf_buf_imag[2 + i][j]);
    114       }
    115     }
    116 
    117     for (i = 0; i < 16; i++) {
    118       for (j = 0; j < 32; j++) {
    119         ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] =
    120             (ptr_sbr_dec->qmf_energy_buf[2 * i + 0][j] +
    121              ptr_sbr_dec->qmf_energy_buf[2 * i + 1][j]) *
    122             0.5f;
    123       }
    124     }
    125   }
    126 }
    127 
    128 VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES],
    129                             FLOAT32 qmf_buf_real[][64],
    130                             FLOAT32 qmf_buf_imag[][64], WORD32 no_bins,
    131                             WORD32 max_stretch) {
    132   WORD32 patch_bands;
    133   WORD32 patch, band, col, target, source_bands, i;
    134   WORD32 num_patches = 0;
    135 
    136   for (i = 1; i < MAX_NUM_PATCHES; i++) {
    137     if (x_over_qmf[i] != 0) {
    138       num_patches++;
    139     }
    140   }
    141 
    142   for (patch = (max_stretch - 1); patch < num_patches; patch++) {
    143     patch_bands = x_over_qmf[patch + 1] - x_over_qmf[patch];
    144     target = x_over_qmf[patch];
    145     source_bands = x_over_qmf[max_stretch - 1] - x_over_qmf[max_stretch - 2];
    146     while (patch_bands > 0) {
    147       WORD32 ixheaacd_num_bands = source_bands;
    148       WORD32 start_band = x_over_qmf[max_stretch - 1] - 1;
    149       if (target + ixheaacd_num_bands >= x_over_qmf[patch + 1]) {
    150         ixheaacd_num_bands = x_over_qmf[patch + 1] - target;
    151       }
    152       if ((((target + ixheaacd_num_bands - 1) & 1) +
    153            ((x_over_qmf[max_stretch - 1] - 1) & 1)) &
    154           1) {
    155         if (ixheaacd_num_bands == source_bands) {
    156           ixheaacd_num_bands--;
    157         } else {
    158           start_band--;
    159         }
    160       }
    161       for (col = 0; col < no_bins; col++) {
    162         WORD32 i = 0;
    163         band = target + ixheaacd_num_bands - 1;
    164         if (64 <= band) {
    165           band = 63;
    166         }
    167         if (x_over_qmf[patch + 1] <= band) {
    168           band = x_over_qmf[patch + 1] - 1;
    169         }
    170         for (i = 0; i < ixheaacd_num_bands; i++, band--) {
    171           qmf_buf_real[col][band] = qmf_buf_real[col][start_band - i];
    172           qmf_buf_imag[col][band] = qmf_buf_imag[col][start_band - i];
    173         }
    174       }
    175       target += ixheaacd_num_bands;
    176       patch_bands -= ixheaacd_num_bands;
    177     }
    178   }
    179 }
    180 
    181 VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec,
    182                                        ia_sbr_tables_struct *sbr_tables_ptr,
    183                                        WORD32 op_delay) {
    184   FLOAT32 *core_coder_samples;
    185   WORD32 *ptr_filt_states;
    186   WORD32 *ptr_filt_states_1;
    187   WORD32 *ptr_filt_states_2;
    188   WORD32 *ptr_temp;
    189   WORD32 *ptr_win_coeffs_1;
    190   WORD32 *ptr_win_coeffs_2;
    191   WORD32 *ptr_win_coeffs;
    192   WORD32 *ploc_qmf_buf_real;
    193   WORD32 *ploc_qmf_buf_imag;
    194   WORD32 local_qmf_buffer[128] = {0};
    195   WORD32 anal_buf[2 * 32];
    196   WORD32 idx, z;
    197   WORD32 core_syn_ch_index;
    198   FLOAT32 gain;
    199   WORD32 filt_offset;
    200   WORD32 num_columns;
    201   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
    202       sbr_tables_ptr->qmf_dec_tables_ptr;
    203   ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank =
    204       &ptr_sbr_dec->str_codec_qmf_bank;
    205   core_coder_samples = ptr_sbr_dec->time_sample_buf;
    206   ptr_filt_states = pstr_qmf_anal_bank->state_new_samples_pos_low_32;
    207   ptr_win_coeffs_1 = pstr_qmf_anal_bank->filter_pos_32;
    208   num_columns = pstr_qmf_anal_bank->no_channels;
    209 
    210   switch (num_columns) {
    211     case 16:
    212       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
    213       gain = 128.0f;
    214       filt_offset = 64;
    215       break;
    216     case 24:
    217       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24;
    218       gain = 12.0f;
    219       filt_offset = 24;
    220       break;
    221     case 32:
    222       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
    223       gain = 256.0f;
    224       filt_offset = 64;
    225       break;
    226     default:
    227       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
    228       gain = 256.0f;
    229       filt_offset = 64;
    230       break;
    231   }
    232   gain = 1.0f / gain;
    233 
    234   pstr_qmf_anal_bank->usb = num_columns;
    235 
    236   ploc_qmf_buf_real = &local_qmf_buffer[0];
    237   ploc_qmf_buf_imag = &local_qmf_buffer[64];
    238 
    239   ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32;
    240   ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns;
    241 
    242   for (idx = 0; idx < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; idx++) {
    243     for (z = 0; z < num_columns; z++) {
    244       ptr_filt_states[num_columns - 1 - z] =
    245           (WORD32)(core_coder_samples[z] * (1 << 15));
    246     }
    247     ixheaacd_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2,
    248                                    ptr_win_coeffs_1, ptr_win_coeffs_2, anal_buf,
    249                                    num_columns);
    250 
    251     core_coder_samples += num_columns;
    252 
    253     ptr_filt_states -= num_columns;
    254     if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) {
    255       ptr_filt_states = pstr_qmf_anal_bank->anal_filter_states_32 +
    256                         10 * num_columns - num_columns;
    257     }
    258 
    259     ptr_temp = ptr_filt_states_1;
    260     ptr_filt_states_1 = ptr_filt_states_2;
    261     ptr_filt_states_2 = ptr_temp;
    262 
    263     ptr_win_coeffs_1 += filt_offset;
    264     ptr_win_coeffs_2 += filt_offset;
    265 
    266     ptr_win_coeffs = ptr_win_coeffs_1;
    267     ptr_win_coeffs_1 = ptr_win_coeffs_2;
    268     ptr_win_coeffs_2 = ptr_win_coeffs;
    269 
    270     if (ptr_win_coeffs_2 >
    271         (pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset * 10)) {
    272       ptr_win_coeffs_1 = pstr_qmf_anal_bank->analy_win_coeff_32;
    273       ptr_win_coeffs_2 = pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset;
    274     }
    275 
    276     ixheaacd_esbr_fwd_modulation(anal_buf, &ploc_qmf_buf_real[0],
    277                                  &ploc_qmf_buf_imag[0], pstr_qmf_anal_bank,
    278                                  qmf_dec_tables_ptr);
    279     core_syn_ch_index = num_columns;
    280 
    281     for (z = 0; z < core_syn_ch_index; z++) {
    282       ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] =
    283           ((FLOAT32)ploc_qmf_buf_real[z] * gain);
    284       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] =
    285           ((FLOAT32)ploc_qmf_buf_imag[z] * gain);
    286     }
    287     for (z = core_syn_ch_index; z < num_columns; z++) {
    288       ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = (FLOAT32)0.0f;
    289       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = (FLOAT32)0.0f;
    290     }
    291   }
    292 
    293   pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1;
    294   pstr_qmf_anal_bank->state_new_samples_pos_low_32 = ptr_filt_states;
    295 }
    296 
    297 VOID ixheaacd_esbr_synthesis_regrp(
    298     FLOAT32 *qmf_buf_real, FLOAT32 *qmf_buf_imag,
    299     ia_sbr_dec_struct *ptr_sbr_dec,
    300     ia_sbr_frame_info_data_struct *ptr_frame_data,
    301     ia_sbr_header_data_struct *ptr_header_data, WORD32 stereo_config_idx,
    302     WORD32 apply_processing) {
    303   WORD32 i, k;
    304   WORD32 stop_border = 0;
    305   WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
    306   WORD32 x_over_band = num_anal_bands;
    307 
    308   if (apply_processing) {
    309     if (ptr_header_data->sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    310       stop_border = 4 * ptr_frame_data->str_frame_info_details.border_vec[0];
    311     } else {
    312       stop_border = 2 * ptr_frame_data->str_frame_info_details.border_vec[0];
    313     }
    314     x_over_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
    315   }
    316 
    317   if (stereo_config_idx > 0) {
    318     for (i = 0; i < stop_border; i++) {
    319       for (k = 0; k < 3; k++) {
    320         *qmf_buf_real++ =
    321             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
    322         *qmf_buf_imag++ =
    323             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
    324       }
    325 
    326       for (; k < x_over_band; k++) {
    327         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    328         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    329       }
    330 
    331       for (; k < 64; k++) {
    332         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    333         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    334       }
    335 
    336       qmf_buf_real += 14;
    337       qmf_buf_imag += 14;
    338     }
    339 
    340     x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
    341 
    342     for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    343       for (k = 0; k < 3; k++) {
    344         *qmf_buf_real++ =
    345             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
    346         *qmf_buf_imag++ =
    347             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
    348       }
    349 
    350       for (; k < x_over_band; k++) {
    351         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    352         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    353       }
    354 
    355       for (; k < 64; k++) {
    356         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    357         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    358       }
    359 
    360       qmf_buf_real += 14;
    361       qmf_buf_imag += 14;
    362     }
    363 
    364   } else {
    365     for (i = 0; i < stop_border; i++) {
    366       for (k = 0; k < x_over_band; k++) {
    367         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    368         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    369       }
    370 
    371       for (; k < 64; k++) {
    372         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    373         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    374       }
    375 
    376       qmf_buf_real += 14;
    377       qmf_buf_imag += 14;
    378     }
    379 
    380     x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
    381 
    382     for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    383       for (k = 0; k < x_over_band; k++) {
    384         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    385         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    386       }
    387 
    388       for (; k < 64; k++) {
    389         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    390         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    391       }
    392 
    393       qmf_buf_real += 14;
    394       qmf_buf_imag += 14;
    395     }
    396   }
    397 }
    398 
    399 VOID ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 *qmf_buf_real,
    400                                        FLOAT32 *qmf_buf_imag,
    401                                        ia_sbr_dec_struct *ptr_sbr_dec,
    402                                        WORD32 stereo_config_idx) {
    403   WORD32 i, k;
    404   WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
    405   WORD32 x_over_band = num_anal_bands;
    406 
    407   if (stereo_config_idx > 0) {
    408     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    409       for (k = 0; k < 3; k++) {
    410         *qmf_buf_real++ =
    411             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
    412         *qmf_buf_imag++ =
    413             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
    414       }
    415 
    416       for (; k < x_over_band; k++) {
    417         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    418         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    419       }
    420 
    421       for (; k < 64; k++) {
    422         *qmf_buf_real++ = 0;
    423         *qmf_buf_imag++ = 0;
    424       }
    425 
    426       qmf_buf_real += 14;
    427       qmf_buf_imag += 14;
    428     }
    429   } else {
    430     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    431       for (k = 0; k < x_over_band; k++) {
    432         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    433         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    434       }
    435 
    436       for (; k < 64; k++) {
    437         *qmf_buf_real++ = 0.0f;
    438         *qmf_buf_imag++ = 0.0f;
    439       }
    440 
    441       qmf_buf_real += 14;
    442       qmf_buf_imag += 14;
    443     }
    444   }
    445 }
    446 
    447 VOID ixheaacd_esbr_synthesis_filt_block(
    448     ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
    449     ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing,
    450     FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx,
    451     ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac) {
    452   WORD32 i, k, p1;
    453   WORD32 *ptr_filt_states;
    454   WORD32 *ptr_filt_states_1;
    455   WORD32 *ptr_filt_states_2;
    456   WORD32 *filter_l;
    457   WORD32 *ploc_qmf_buf_real;
    458   WORD32 *ploc_qmf_buf_imag;
    459   WORD32 out_scalefactor;
    460   WORD32 sixty4;
    461   WORD32 no_synthesis_channels;
    462   WORD32 ixheaacd_drc_offset;
    463   FLOAT32 *syn_buffer;
    464   WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local;
    465   WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]);
    466 
    467   ia_sbr_qmf_filter_bank_struct *qmf_bank =
    468       &ptr_sbr_dec->str_synthesis_qmf_bank;
    469   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
    470       sbr_tables_ptr->qmf_dec_tables_ptr;
    471 
    472   if (!mps_sbr_flag) {
    473     ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
    474                                   ptr_sbr_dec, ptr_frame_data, ptr_header_data,
    475                                   stereo_config_idx, apply_processing);
    476   } else {
    477     ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
    478                                       ptr_sbr_dec, stereo_config_idx);
    479   }
    480 
    481   out_scalefactor = 5;
    482   qmf_bank->no_channels = 64;
    483   qmf_bank->esbr_cos_twiddle =
    484       (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64;
    485   qmf_bank->esbr_alt_sin_twiddle =
    486       (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64;
    487 
    488   qmf_bank->filter_pos_syn_32 +=
    489       qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32;
    490   qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
    491 
    492   sixty4 = NO_SYNTHESIS_CHANNELS;
    493 
    494   ptr_filt_states = qmf_bank->filter_states_32;
    495 
    496   no_synthesis_channels = qmf_bank->no_channels;
    497   ptr_filt_states_1 = &ptr_filt_states[0];
    498   ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels;
    499 
    500   filter_l = qmf_bank->filter_pos_syn_32;
    501 
    502   p1 = 0;
    503 
    504   ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset;
    505 
    506   for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    507     for (k = 0; k < 64; k++) {
    508       local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64);
    509       local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64);
    510     }
    511     ploc_qmf_buf_real = local_qmf_buffer;
    512     ploc_qmf_buf_imag = local_qmf_buffer + 64;
    513 
    514     ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real,
    515                                  &ptr_sbr_dec->str_synthesis_qmf_bank,
    516                                  sbr_tables_ptr->qmf_dec_tables_ptr);
    517 
    518     ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag,
    519                                        &ptr_filt_states[ixheaacd_drc_offset],
    520                                        no_synthesis_channels,
    521                                        out_scalefactor + 1);
    522 
    523     ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2,
    524                                   filter_l, &time_out[0], ch_fac);
    525 
    526     syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64;
    527     for (k = 0; k < 64; k++) {
    528       syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
    529     }
    530 
    531     ptr_filt_states_1 += sixty4;
    532     ptr_filt_states_2 -= sixty4;
    533     sixty4 = -sixty4;
    534     ixheaacd_drc_offset -= 128;
    535 
    536     if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
    537 
    538     filter_l += 64;
    539 
    540     if (filter_l == qmf_bank->p_filter_32 + 640)
    541       filter_l = (WORD32 *)qmf_bank->p_filter_32;
    542 
    543     p1 += no_synthesis_channels;
    544   }
    545 
    546   qmf_bank->filter_pos_syn_32 = filter_l;
    547   qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset;
    548 
    549   if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0;
    550 
    551   if (apply_processing && !mps_sbr_flag) {
    552     ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
    553         ptr_header_data->pstr_freq_band_data->sub_band_start;
    554   }
    555 }
    556 
    557 WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
    558                         ia_sbr_header_data_struct *ptr_header_data,
    559                         ia_sbr_frame_info_data_struct *ptr_frame_data,
    560                         ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
    561                         ia_ps_dec_struct *ptr_ps_dec,
    562                         ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r,
    563                         ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
    564                         FLAG apply_processing, FLAG low_pow_flag,
    565                         WORD32 *ptr_work_buf_core,
    566                         ia_sbr_tables_struct *sbr_tables_ptr,
    567                         ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
    568                         ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on,
    569                         WORD32 drc_sbr_factors[][64],
    570                         WORD32 audio_object_type) {
    571   WORD i;
    572   WORD slot, reserve;
    573   WORD save_lb_scale;
    574   WORD op_delay;
    575 
    576   WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS + MAX_ENV_COLS];
    577   WORD32 **p_arr_qmf_buf_imag = &p_arr_qmf_buf_real[MAX_ENV_COLS];
    578   WORD32 *ptr;
    579   WORD hbe_flag = ptr_header_data->hbe_flag;
    580 
    581   FLOAT32 **pp_qmf_buf_real = NULL;
    582   FLOAT32 **pp_qmf_buf_imag = NULL;
    583   FLOAT32 pvc_dec_out_buf[16 * 64];
    584 
    585   WORD upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
    586   WORD no_bins;
    587   WORD mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
    588   WORD stereo_config_idx = ptr_frame_data->stereo_config_idx;
    589   WORD sbr_mode = ptr_frame_data->sbr_mode;
    590   WORD usac_flag = ptr_header_data->usac_flag;
    591 
    592   FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr;
    593 
    594   memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
    595   memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32));
    596   if (audio_object_type == AOT_ER_AAC_ELD) {
    597     op_delay = 0;
    598   } else {
    599     op_delay = 6;
    600   }
    601   if (usac_flag) {
    602     pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
    603     pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
    604     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    605       op_delay = 2 * 6;
    606     }
    607   }
    608 
    609   no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step);
    610 
    611   if (!usac_flag) {
    612     WORD32 num = op_delay;
    613     WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
    614     WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag));
    615     if (!low_pow_flag) {
    616       num = num << 1;
    617     }
    618     if (audio_object_type != AOT_ER_AAC_ELD) {
    619       memcpy(p_scr_qmf_real, ptr_pers_qmf_real,
    620              sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
    621     }
    622     ptr = p_scr_qmf_real;
    623 
    624     for (slot = 0; slot < op_delay + no_bins; slot++) {
    625       p_arr_qmf_buf_real[slot] = ptr;
    626       ptr += NO_SYNTHESIS_CHANNELS;
    627 
    628       if (!low_pow_flag) {
    629         p_arr_qmf_buf_imag[slot] = ptr;
    630         ptr += NO_SYNTHESIS_CHANNELS;
    631       }
    632     }
    633 
    634     ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
    635 
    636     if (apply_processing) {
    637       ixheaacd_rescale_x_overlap(ptr_sbr_dec, ptr_header_data, ptr_frame_data,
    638                                  ptr_frame_data_prev, p_arr_qmf_buf_real,
    639                                  low_pow_flag);
    640     }
    641   }
    642 
    643   if (usac_flag) {
    644     WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
    645     WORD32 codec_x_delay = 0;
    646     WORD32 core_syn_ch_index = 0;
    647     WORD32 frame_move = 288;
    648     WORD32 core_frame_size = ptr_header_data->core_frame_size;
    649 
    650     if (hbe_flag) {
    651       codec_x_delay = 32;
    652     }
    653     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    654       codec_x_delay = 2 * codec_x_delay;
    655     }
    656 
    657     if (hbe_flag || mps_sbr_flag) {
    658       core_syn_ch_index = num_anal_bands;
    659     } else {
    660       core_syn_ch_index = ptr_header_data->pstr_freq_band_data->sub_band_start;
    661     }
    662 
    663     frame_move = 9 * num_anal_bands;
    664 
    665     memmove(ptr_sbr_dec->core_sample_buf,
    666             ptr_sbr_dec->core_sample_buf + core_frame_size,
    667             frame_move * sizeof(FLOAT32));
    668     memcpy(&ptr_sbr_dec->core_sample_buf[frame_move],
    669            &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32));
    670 
    671     memmove(
    672         &ptr_sbr_dec->qmf_buf_real[0][0],
    673         &ptr_sbr_dec
    674              ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
    675         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
    676 
    677     memmove(
    678         &ptr_sbr_dec->qmf_buf_imag[0][0],
    679         &ptr_sbr_dec
    680              ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
    681         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
    682 
    683     memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
    684             &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
    685                                                .num_time_slots][0],
    686             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
    687 
    688     memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
    689             &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
    690                                                .num_time_slots][0],
    691             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
    692 
    693     if (hbe_flag) {
    694       memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
    695               &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
    696                                                   .num_time_slots][0],
    697               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
    698 
    699       memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
    700               ptr_sbr_dec->ph_vocod_qmf_imag +
    701                   ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
    702               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
    703     }
    704     ixheaacd_esbr_analysis_filt_block(
    705         ptr_sbr_dec, sbr_tables_ptr,
    706         op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
    707 
    708     if (hbe_flag) {
    709       WORD32 err_code = ixheaacd_qmf_hbe_apply(
    710           ptr_sbr_dec->p_hbe_txposer,
    711           ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
    712               ESBR_HBE_DELAY_OFFSET,
    713           ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
    714               ESBR_HBE_DELAY_OFFSET,
    715           ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
    716           ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
    717           ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
    718           ptr_frame_data->pitch_in_bins);
    719       if (err_code) return err_code;
    720 
    721       if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    722         ixheaacd_hbe_repl_spec(
    723             &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
    724             ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
    725             ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
    726             ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
    727             ptr_sbr_dec->p_hbe_txposer->max_stretch);
    728       }
    729     }
    730     ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
    731 
    732     if (!mps_sbr_flag && apply_processing) {
    733       WORD32 err_code = 0;
    734       err_code = ixheaacd_generate_hf(
    735           ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
    736           ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
    737           ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
    738           ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
    739           ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
    740           ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data,
    741           ptr_header_data);
    742       if (err_code) return err_code;
    743 
    744       ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac;
    745 
    746       if (sbr_mode == PVC_SBR) {
    747         ixheaacd_pvc_process(
    748             ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start,
    749             ptr_frame_data->str_pvc_frame_info.border_vec[0],
    750             &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]);
    751         ptr_pvc_data->prev_pvc_flg = 1;
    752       } else {
    753         memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
    754         ptr_pvc_data->prev_pvc_flg = 0;
    755       }
    756 
    757       ptr_pvc_data->prev_first_bnd_idx =
    758           ptr_header_data->pstr_freq_band_data->sub_band_start;
    759       ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate;
    760 
    761       ptr_frame_data->pstr_sbr_header = ptr_header_data;
    762       if (ptr_header_data->hbe_flag == 0)
    763         ixheaacd_sbr_env_calc(
    764             ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
    765             ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
    766             ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
    767             ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL,
    768             ptr_sbr_dec->scratch_buff, pvc_dec_out_buf);
    769       else
    770         ixheaacd_sbr_env_calc(
    771             ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
    772             ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
    773             ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
    774             ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
    775             ptr_sbr_dec->p_hbe_txposer->x_over_qmf, ptr_sbr_dec->scratch_buff,
    776             pvc_dec_out_buf);
    777 
    778     } else {
    779       for (i = 0; i < 64; i++) {
    780         memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32));
    781         memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
    782       }
    783     }
    784 
    785     ixheaacd_esbr_synthesis_filt_block(
    786         ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
    787         pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
    788         mps_sbr_flag, ch_fac);
    789 
    790     ptr_frame_data->prev_sbr_mode = sbr_mode;
    791 
    792     return 0;
    793   }
    794 
    795   ixheaacd_cplx_anal_qmffilt(
    796       ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact,
    797       &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay],
    798       &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr,
    799       ch_fac, low_pow_flag, audio_object_type);
    800 
    801   {
    802     WORD shift1, shift2;
    803     WORD min_shift;
    804     WORD shift_over;
    805     WORD reserve_ov1, reserve_ov2;
    806     WORD reservea[2];
    807     WORD i = 0;
    808     WORD usb = ptr_sbr_dec->str_codec_qmf_bank.usb;
    809     WORD iter_val = 1;
    810     if (audio_object_type == AOT_ER_AAC_ELD ||
    811         audio_object_type == AOT_ER_AAC_LD) {
    812       iter_val = 0;
    813     }
    814     do {
    815       WORD t1 = op_delay;
    816       WORD t2 = no_bins + op_delay;
    817       if (i) {
    818         t1 = 0;
    819         t2 = op_delay;
    820       }
    821       reservea[i] = (*ixheaacd_ixheaacd_expsubbandsamples)(
    822           p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, t1, t2, low_pow_flag);
    823       i++;
    824     } while (i <= iter_val);
    825     ;
    826 
    827     reserve = reservea[0];
    828     if (audio_object_type != AOT_ER_AAC_ELD &&
    829         audio_object_type != AOT_ER_AAC_LD)
    830       reserve_ov1 = reservea[1];
    831     else
    832       reserve_ov1 = reserve;
    833     ptr_sbr_dec->max_samp_val = ixheaacd_min32(reserve, reserve_ov1);
    834 
    835     reserve_ov2 = (*ixheaacd_ixheaacd_expsubbandsamples)(
    836         ptr_sbr_dec->str_hf_generator.lpc_filt_states_real,
    837         ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, 0, usb, 0,
    838         LPC_ORDER, low_pow_flag);
    839 
    840     reserve_ov1 = ixheaacd_min32(reserve_ov1, reserve_ov2);
    841 
    842     shift1 = ptr_sbr_dec->str_sbr_scale_fact.lb_scale + reserve;
    843 
    844     shift2 = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale + reserve_ov1;
    845     min_shift = ixheaacd_min32(shift1, shift2);
    846     shift_over = (shift2 - min_shift);
    847     reserve -= (shift1 - min_shift);
    848 
    849     ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale += (reserve_ov1 - shift_over);
    850 
    851     (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, 0,
    852                              op_delay, reserve_ov1 - shift_over, low_pow_flag);
    853 
    854     (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb,
    855                              op_delay, (no_bins + op_delay), reserve,
    856                              low_pow_flag);
    857 
    858     (*ixheaacd_adjust_scale)(ptr_sbr_dec->str_hf_generator.lpc_filt_states_real,
    859                              ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag,
    860                              0, usb, 0, LPC_ORDER, reserve_ov1 - shift_over,
    861                              low_pow_flag);
    862 
    863     ptr_sbr_dec->str_sbr_scale_fact.lb_scale += reserve;
    864 
    865     save_lb_scale = ptr_sbr_dec->str_sbr_scale_fact.lb_scale;
    866   }
    867 
    868   {
    869     WORD32 num = no_bins;
    870     WORD32 *p_loc_qmf_real =
    871         &p_arr_qmf_buf_real[op_delay][NO_ANALYSIS_CHANNELS];
    872 
    873     if (!low_pow_flag) {
    874       num = num << 1;
    875     }
    876 
    877     ixheaacd_clr_subsamples(p_loc_qmf_real, num - 1, (NO_SYN_ANA_CHANNELS));
    878   }
    879 
    880   if (apply_processing) {
    881     WORD16 degree_alias[NO_SYNTHESIS_CHANNELS];
    882     WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
    883 
    884     if (low_pow_flag) {
    885       memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16));
    886     }
    887 
    888     if (low_pow_flag) {
    889       WORD32 com_low_band_scale;
    890       ixheaacd_low_pow_hf_generator(
    891           &ptr_sbr_dec->str_hf_generator, p_arr_qmf_buf_real, degree_alias,
    892           border_vec[0] * ptr_header_data->time_step,
    893           ptr_header_data->time_step *
    894               ixheaacd_sub16_sat(
    895                   border_vec[ptr_frame_data->str_frame_info_details.num_env],
    896                   ptr_header_data->num_time_slots),
    897           ptr_header_data->pstr_freq_band_data->num_if_bands,
    898           ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
    899           ptr_frame_data_prev->sbr_invf_mode, ptr_sbr_dec->max_samp_val,
    900           ptr_work_buf_core);
    901 
    902       com_low_band_scale =
    903           ixheaacd_min32(ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale,
    904                          ptr_sbr_dec->str_sbr_scale_fact.lb_scale);
    905 
    906       ptr_sbr_dec->str_sbr_scale_fact.hb_scale =
    907           (WORD16)(com_low_band_scale - 2);
    908     } else {
    909       ixheaacd_hf_generator(
    910           &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact,
    911           p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step,
    912           border_vec[0],
    913           ixheaacd_sub16_sat(
    914               border_vec[ptr_frame_data->str_frame_info_details.num_env],
    915               ptr_header_data->num_time_slots),
    916           ptr_header_data->pstr_freq_band_data->num_if_bands,
    917           ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
    918           ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core,
    919           audio_object_type);
    920     }
    921 
    922     ixheaacd_calc_sbrenvelope(
    923         &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env,
    924         ptr_header_data, ptr_frame_data, ptr_frame_data_prev,
    925         p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag,
    926         sbr_tables_ptr, pstr_common_tables,
    927         ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)),
    928         audio_object_type);
    929 
    930     memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode,
    931            ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32));
    932 
    933     ptr_frame_data_prev->coupling_mode = ptr_frame_data->coupling_mode;
    934     ptr_frame_data_prev->max_qmf_subband_aac =
    935         ptr_frame_data->max_qmf_subband_aac;
    936     ptr_frame_data_prev->end_position =
    937         border_vec[ptr_frame_data->str_frame_info_details.num_env];
    938     ptr_frame_data_prev->amp_res = ptr_frame_data->amp_res;
    939   } else {
    940     ptr_sbr_dec->str_sbr_scale_fact.hb_scale = save_lb_scale;
    941   }
    942 
    943   if (!low_pow_flag) {
    944     for (i = 0; i < LPC_ORDER; i++) {
    945       WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0];
    946       WORD32 *p_loc_qmf_imag = &p_arr_qmf_buf_imag[no_bins - LPC_ORDER + i][0];
    947       WORD32 *plpc_filt_states_real =
    948           &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0];
    949       WORD32 *plpc_filt_states_imag =
    950           &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[i][0];
    951 
    952       memcpy(plpc_filt_states_real, p_loc_qmf_real,
    953              sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
    954       memcpy(plpc_filt_states_imag, p_loc_qmf_imag,
    955              sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
    956     }
    957   } else {
    958     for (i = 0; i < LPC_ORDER; i++) {
    959       WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0];
    960       WORD32 *plpc_filt_states_real =
    961           &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0];
    962       memcpy(plpc_filt_states_real, p_loc_qmf_real,
    963              sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
    964     }
    965   }
    966 
    967   if (apply_processing && ptr_header_data->channel_mode == PS_STEREO &&
    968       ((audio_object_type != AOT_ER_AAC_ELD) &&
    969        (audio_object_type != AOT_ER_AAC_LD))) {
    970     WORD32 ps_scale;
    971 
    972     ixheaacd_init_ps_scale(ptr_ps_dec, &ptr_sbr_dec->str_sbr_scale_fact);
    973 
    974     ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
    975                                &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data,
    976                                &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec,
    977                                1, 0, sbr_tables_ptr, pstr_common_tables, ch_fac,
    978                                drc_on, drc_sbr_factors, audio_object_type);
    979 
    980     ps_scale = ptr_sbr_dec->str_sbr_scale_fact.ps_scale;
    981     ptr_sbr_sf_r->ov_lb_scale = ps_scale;
    982     ptr_sbr_sf_r->lb_scale = ps_scale;
    983     ptr_sbr_sf_r->hb_scale = ps_scale;
    984 
    985     ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
    986                                ptr_sbr_sf_r, ptr_time_data + 1,
    987                                ptr_qmf_synth_bank_r, ptr_ps_dec, 0, 0,
    988                                sbr_tables_ptr, pstr_common_tables, ch_fac,
    989                                drc_on, drc_sbr_factors, audio_object_type);
    990   } else {
    991     ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
    992                                &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data,
    993                                &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec,
    994                                0, low_pow_flag, sbr_tables_ptr,
    995                                pstr_common_tables, ch_fac, drc_on,
    996                                drc_sbr_factors, audio_object_type);
    997   }
    998 
    999   {
   1000     WORD32 num = op_delay;
   1001     WORD32 *p_loc_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
   1002     WORD32 *p_loc_qmf_real_1 = &p_arr_qmf_buf_real[no_bins][0];
   1003 
   1004     if (!low_pow_flag) {
   1005       num = num << 1;
   1006     }
   1007 
   1008     memcpy(p_loc_qmf_real, p_loc_qmf_real_1,
   1009            sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
   1010   }
   1011 
   1012   ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale;
   1013   return 0;
   1014 }
   1015 
   1016 WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec,
   1017                          ia_sbr_header_data_struct *ptr_header_data,
   1018                          ia_sbr_frame_info_data_struct *ptr_frame_data,
   1019                          FLAG apply_processing, FLAG low_pow_flag,
   1020                          ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) {
   1021   WORD32 i;
   1022   WORD32 op_delay;
   1023 
   1024   WORD32 codec_x_delay = 0;
   1025 
   1026   FLOAT32 **pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
   1027   FLOAT32 **pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
   1028 
   1029   WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
   1030   WORD32 core_frame_size = ptr_header_data->core_frame_size;
   1031 
   1032   WORD32 no_bins;
   1033   WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
   1034   WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx;
   1035   WORD32 hbe_flag = ptr_header_data->hbe_flag;
   1036   WORD32 sbr_mode = ptr_frame_data->sbr_mode;
   1037 
   1038   op_delay = 6;
   1039   if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
   1040     op_delay = 2 * 6;
   1041   }
   1042 
   1043   no_bins = ptr_sbr_dec->str_codec_qmf_bank.num_time_slots;
   1044 
   1045   ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
   1046   {
   1047     WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
   1048     WORD32 frame_move = 288;
   1049     if (hbe_flag) {
   1050       codec_x_delay = 32;
   1051     }
   1052     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
   1053       codec_x_delay = 2 * codec_x_delay;
   1054     }
   1055 
   1056     frame_move = 9 * num_anal_bands;
   1057 
   1058     memmove(ptr_sbr_dec->core_sample_buf,
   1059             ptr_sbr_dec->core_sample_buf + core_frame_size,
   1060             frame_move * sizeof(FLOAT32));
   1061 
   1062     memcpy(&ptr_sbr_dec->core_sample_buf[frame_move],
   1063            &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32));
   1064 
   1065     memmove(
   1066         &ptr_sbr_dec->qmf_buf_real[0][0],
   1067         &ptr_sbr_dec
   1068              ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
   1069         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
   1070     memmove(
   1071         &ptr_sbr_dec->qmf_buf_imag[0][0],
   1072         &ptr_sbr_dec
   1073              ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
   1074         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
   1075 
   1076     memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
   1077             &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
   1078                                                .num_time_slots][0],
   1079             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
   1080     memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
   1081             &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
   1082                                                .num_time_slots][0],
   1083             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
   1084 
   1085     if (hbe_flag) {
   1086       memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
   1087               &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
   1088                                                   .num_time_slots][0],
   1089               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
   1090       memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
   1091               ptr_sbr_dec->ph_vocod_qmf_imag +
   1092                   ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
   1093               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
   1094     }
   1095   }
   1096 
   1097   ixheaacd_esbr_analysis_filt_block(
   1098       ptr_sbr_dec, ptr_sbr_tables,
   1099       op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
   1100 
   1101   if (hbe_flag) {
   1102     WORD32 err = ixheaacd_qmf_hbe_apply(
   1103         ptr_sbr_dec->p_hbe_txposer,
   1104         ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
   1105             ESBR_HBE_DELAY_OFFSET,
   1106         ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
   1107             ESBR_HBE_DELAY_OFFSET,
   1108         ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
   1109         ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
   1110         ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
   1111         ptr_frame_data->pitch_in_bins);
   1112     if (err) return err;
   1113 
   1114     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
   1115       ixheaacd_hbe_repl_spec(
   1116           &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
   1117           ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
   1118           ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
   1119           ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
   1120           ptr_sbr_dec->p_hbe_txposer->max_stretch);
   1121     }
   1122   }
   1123   ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
   1124 
   1125   for (i = 0; i < 64; i++) {
   1126     memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32));
   1127     memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
   1128   }
   1129 
   1130   ixheaacd_esbr_synthesis_filt_block(
   1131       ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
   1132       pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables,
   1133       mps_sbr_flag, ch_fac);
   1134 
   1135   ptr_frame_data->prev_sbr_mode = sbr_mode;
   1136   return 0;
   1137 }
   1138 
   1139 WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec,
   1140                                  VOID *p_sbr_frame, VOID *p_sbr_header) {
   1141   WORD32 i, k;
   1142   ia_sbr_frame_info_data_struct *ptr_frame_data =
   1143       (ia_sbr_frame_info_data_struct *)p_sbr_frame;
   1144   ia_sbr_header_data_struct *ptr_header_data =
   1145       (ia_sbr_header_data_struct *)p_sbr_header;
   1146   ia_sbr_dec_struct *ptr_sbr_dec = (ia_sbr_dec_struct *)p_sbr_dec;
   1147   ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
   1148   WORD32 no_bins;
   1149   WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
   1150   WORD32 op_delay = 6 + SBR_HF_ADJ_OFFSET;
   1151   WORD32 num_anal_bands = 40;
   1152   WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
   1153   WORD32 err = 0;
   1154 
   1155   if (ptr_header_data->is_usf_4) {
   1156     op_delay += 6;
   1157   }
   1158 
   1159   num_anal_bands = num_anal_bands - (upsample_ratio_idx << 3);
   1160 
   1161   if (!mps_sbr_flag) {
   1162     return 0;
   1163   }
   1164 
   1165   no_bins = ptr_header_data->output_framesize / 64;
   1166 
   1167   for (i = 0; i < no_bins; i++) {
   1168     FLOAT32 *p_loc_mps_qmf_output =
   1169         p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
   1170     for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
   1171       ptr_sbr_dec->mps_qmf_buf_real[op_delay + i][k] = *p_loc_mps_qmf_output++;
   1172       ptr_sbr_dec->mps_qmf_buf_imag[op_delay + i][k] = *p_loc_mps_qmf_output++;
   1173 
   1174       ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k] =
   1175           ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
   1176       ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k] =
   1177           ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
   1178     }
   1179   }
   1180 
   1181   if (ptr_frame_data->reset_flag) {
   1182     WORD32 l;
   1183     WORD32 start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
   1184     WORD32 end_band = num_anal_bands;
   1185     WORD32 start_slot =
   1186         SBR_HF_ADJ_OFFSET + ptr_frame_data->rate * p_frame_info->border_vec[0];
   1187 
   1188     for (l = start_slot; l < op_delay; l++) {
   1189       for (k = start_band; k < end_band; k++) {
   1190         ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0;
   1191         ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0;
   1192       }
   1193     }
   1194 
   1195     for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) {
   1196       for (k = start_band; k < end_band; k++) {
   1197         ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0;
   1198         ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0;
   1199       }
   1200     }
   1201   }
   1202   ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
   1203       ptr_header_data->pstr_freq_band_data->sub_band_start;
   1204 
   1205   err = ixheaacd_generate_hf(
   1206       ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1207       ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL,
   1208       ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1209       ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, ptr_frame_data,
   1210       ptr_header_data);
   1211   if (err) return err;
   1212 
   1213   ptr_frame_data->pstr_sbr_header = ptr_header_data;
   1214   ptr_frame_data->sbr_mode = ORIG_SBR;
   1215   ptr_frame_data->prev_sbr_mode = ORIG_SBR;
   1216   if (ptr_header_data->hbe_flag == 0)
   1217     ixheaacd_sbr_env_calc(ptr_frame_data,
   1218                           ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1219                           ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
   1220                           ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1221                           ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
   1222                           NULL, ptr_sbr_dec->scratch_buff, NULL);
   1223   else
   1224     ixheaacd_sbr_env_calc(ptr_frame_data,
   1225                           ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1226                           ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
   1227                           ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1228                           ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
   1229                           ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
   1230                           ptr_sbr_dec->scratch_buff, NULL);
   1231 
   1232   for (i = 0; i < no_bins; i++) {
   1233     FLOAT32 *p_loc_mps_qmf_output =
   1234         p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
   1235     for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
   1236       *p_loc_mps_qmf_output++ =
   1237           ptr_sbr_dec->mps_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
   1238       *p_loc_mps_qmf_output++ =
   1239           ptr_sbr_dec->mps_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
   1240     }
   1241     for (k = ptr_header_data->pstr_freq_band_data->sub_band_start; k < 64;
   1242          k++) {
   1243       *p_loc_mps_qmf_output++ =
   1244           ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
   1245       *p_loc_mps_qmf_output++ =
   1246           ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
   1247     }
   1248   }
   1249 
   1250   for (i = 0; i < op_delay; i++) {
   1251     memmove(ptr_sbr_dec->mps_qmf_buf_real[i],
   1252             ptr_sbr_dec->mps_qmf_buf_real[no_bins + i], 64 * sizeof(FLOAT32));
   1253 
   1254     memmove(ptr_sbr_dec->mps_qmf_buf_imag[i],
   1255             ptr_sbr_dec->mps_qmf_buf_imag[no_bins + i], 64 * sizeof(FLOAT32));
   1256 
   1257     memmove(ptr_sbr_dec->mps_sbr_qmf_buf_real[i],
   1258             ptr_sbr_dec->mps_sbr_qmf_buf_real[no_bins + i],
   1259             64 * sizeof(FLOAT32));
   1260 
   1261     memmove(ptr_sbr_dec->mps_sbr_qmf_buf_imag[i],
   1262             ptr_sbr_dec->mps_sbr_qmf_buf_imag[no_bins + i],
   1263             64 * sizeof(FLOAT32));
   1264   }
   1265 
   1266   ptr_frame_data->reset_flag = 0;
   1267   return err;
   1268 }
   1269