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       if (!ixheaacd_num_bands) break;
    162       for (col = 0; col < no_bins; col++) {
    163         WORD32 i = 0;
    164         band = target + ixheaacd_num_bands - 1;
    165         if (64 <= band) {
    166           band = 63;
    167         }
    168         if (x_over_qmf[patch + 1] <= band) {
    169           band = x_over_qmf[patch + 1] - 1;
    170         }
    171         for (i = 0; i < ixheaacd_num_bands; i++, band--) {
    172           qmf_buf_real[col][band] = qmf_buf_real[col][start_band - i];
    173           qmf_buf_imag[col][band] = qmf_buf_imag[col][start_band - i];
    174         }
    175       }
    176       target += ixheaacd_num_bands;
    177       patch_bands -= ixheaacd_num_bands;
    178     }
    179   }
    180 }
    181 
    182 VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec,
    183                                        ia_sbr_tables_struct *sbr_tables_ptr,
    184                                        WORD32 op_delay) {
    185   FLOAT32 *core_coder_samples;
    186   WORD32 *ptr_filt_states;
    187   WORD32 *ptr_filt_states_1;
    188   WORD32 *ptr_filt_states_2;
    189   WORD32 *ptr_temp;
    190   WORD32 *ptr_win_coeffs_1;
    191   WORD32 *ptr_win_coeffs_2;
    192   WORD32 *ptr_win_coeffs;
    193   WORD32 *ploc_qmf_buf_real;
    194   WORD32 *ploc_qmf_buf_imag;
    195   WORD32 local_qmf_buffer[128] = {0};
    196   WORD32 anal_buf[2 * 32];
    197   WORD32 idx, z;
    198   WORD32 core_syn_ch_index;
    199   FLOAT32 gain;
    200   WORD32 filt_offset;
    201   WORD32 num_columns;
    202   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
    203       sbr_tables_ptr->qmf_dec_tables_ptr;
    204   ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank =
    205       &ptr_sbr_dec->str_codec_qmf_bank;
    206   core_coder_samples = ptr_sbr_dec->time_sample_buf;
    207   ptr_filt_states = pstr_qmf_anal_bank->state_new_samples_pos_low_32;
    208   ptr_win_coeffs_1 = pstr_qmf_anal_bank->filter_pos_32;
    209   num_columns = pstr_qmf_anal_bank->no_channels;
    210 
    211   switch (num_columns) {
    212     case 16:
    213       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
    214       gain = 128.0f;
    215       filt_offset = 64;
    216       break;
    217     case 24:
    218       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24;
    219       gain = 12.0f;
    220       filt_offset = 24;
    221       break;
    222     case 32:
    223       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
    224       gain = 256.0f;
    225       filt_offset = 64;
    226       break;
    227     default:
    228       ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
    229       gain = 256.0f;
    230       filt_offset = 64;
    231       break;
    232   }
    233   gain = 1.0f / gain;
    234 
    235   pstr_qmf_anal_bank->usb = num_columns;
    236 
    237   ploc_qmf_buf_real = &local_qmf_buffer[0];
    238   ploc_qmf_buf_imag = &local_qmf_buffer[64];
    239 
    240   ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32;
    241   ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns;
    242 
    243   for (idx = 0; idx < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; idx++) {
    244     for (z = 0; z < num_columns; z++) {
    245       ptr_filt_states[num_columns - 1 - z] =
    246           (WORD32)(core_coder_samples[z] * (1 << 15));
    247     }
    248     ixheaacd_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2,
    249                                    ptr_win_coeffs_1, ptr_win_coeffs_2, anal_buf,
    250                                    num_columns);
    251 
    252     core_coder_samples += num_columns;
    253 
    254     ptr_filt_states -= num_columns;
    255     if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) {
    256       ptr_filt_states = pstr_qmf_anal_bank->anal_filter_states_32 +
    257                         10 * num_columns - num_columns;
    258     }
    259 
    260     ptr_temp = ptr_filt_states_1;
    261     ptr_filt_states_1 = ptr_filt_states_2;
    262     ptr_filt_states_2 = ptr_temp;
    263 
    264     ptr_win_coeffs_1 += filt_offset;
    265     ptr_win_coeffs_2 += filt_offset;
    266 
    267     ptr_win_coeffs = ptr_win_coeffs_1;
    268     ptr_win_coeffs_1 = ptr_win_coeffs_2;
    269     ptr_win_coeffs_2 = ptr_win_coeffs;
    270 
    271     if (ptr_win_coeffs_2 >
    272         (pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset * 10)) {
    273       ptr_win_coeffs_1 = pstr_qmf_anal_bank->analy_win_coeff_32;
    274       ptr_win_coeffs_2 = pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset;
    275     }
    276 
    277     ixheaacd_esbr_fwd_modulation(anal_buf, &ploc_qmf_buf_real[0],
    278                                  &ploc_qmf_buf_imag[0], pstr_qmf_anal_bank,
    279                                  qmf_dec_tables_ptr);
    280     core_syn_ch_index = num_columns;
    281 
    282     for (z = 0; z < core_syn_ch_index; z++) {
    283       ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] =
    284           ((FLOAT32)ploc_qmf_buf_real[z] * gain);
    285       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] =
    286           ((FLOAT32)ploc_qmf_buf_imag[z] * gain);
    287     }
    288     for (z = core_syn_ch_index; z < num_columns; z++) {
    289       ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = (FLOAT32)0.0f;
    290       ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = (FLOAT32)0.0f;
    291     }
    292   }
    293 
    294   pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1;
    295   pstr_qmf_anal_bank->state_new_samples_pos_low_32 = ptr_filt_states;
    296 }
    297 
    298 VOID ixheaacd_esbr_synthesis_regrp(
    299     FLOAT32 *qmf_buf_real, FLOAT32 *qmf_buf_imag,
    300     ia_sbr_dec_struct *ptr_sbr_dec,
    301     ia_sbr_frame_info_data_struct *ptr_frame_data,
    302     ia_sbr_header_data_struct *ptr_header_data, WORD32 stereo_config_idx,
    303     WORD32 apply_processing) {
    304   WORD32 i, k;
    305   WORD32 stop_border = 0;
    306   WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
    307   WORD32 x_over_band = num_anal_bands;
    308 
    309   if (apply_processing) {
    310     if (ptr_header_data->sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    311       stop_border = 4 * ptr_frame_data->str_frame_info_details.border_vec[0];
    312     } else {
    313       stop_border = 2 * ptr_frame_data->str_frame_info_details.border_vec[0];
    314     }
    315     x_over_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
    316   }
    317 
    318   if (stereo_config_idx > 0) {
    319     for (i = 0; i < stop_border; i++) {
    320       for (k = 0; k < 3; k++) {
    321         *qmf_buf_real++ =
    322             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
    323         *qmf_buf_imag++ =
    324             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
    325       }
    326 
    327       for (; k < x_over_band; k++) {
    328         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    329         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    330       }
    331 
    332       for (; k < 64; k++) {
    333         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    334         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    335       }
    336 
    337       qmf_buf_real += 14;
    338       qmf_buf_imag += 14;
    339     }
    340 
    341     x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
    342 
    343     for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    344       for (k = 0; k < 3; k++) {
    345         *qmf_buf_real++ =
    346             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
    347         *qmf_buf_imag++ =
    348             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
    349       }
    350 
    351       for (; k < x_over_band; k++) {
    352         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    353         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    354       }
    355 
    356       for (; k < 64; k++) {
    357         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    358         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    359       }
    360 
    361       qmf_buf_real += 14;
    362       qmf_buf_imag += 14;
    363     }
    364 
    365   } else {
    366     for (i = 0; i < stop_border; i++) {
    367       for (k = 0; k < x_over_band; k++) {
    368         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    369         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    370       }
    371 
    372       for (; k < 64; k++) {
    373         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    374         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    375       }
    376 
    377       qmf_buf_real += 14;
    378       qmf_buf_imag += 14;
    379     }
    380 
    381     x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
    382 
    383     for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    384       for (k = 0; k < x_over_band; k++) {
    385         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    386         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    387       }
    388 
    389       for (; k < 64; k++) {
    390         *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
    391         *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
    392       }
    393 
    394       qmf_buf_real += 14;
    395       qmf_buf_imag += 14;
    396     }
    397   }
    398 }
    399 
    400 VOID ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 *qmf_buf_real,
    401                                        FLOAT32 *qmf_buf_imag,
    402                                        ia_sbr_dec_struct *ptr_sbr_dec,
    403                                        WORD32 stereo_config_idx) {
    404   WORD32 i, k;
    405   WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
    406   WORD32 x_over_band = num_anal_bands;
    407 
    408   if (stereo_config_idx > 0) {
    409     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    410       for (k = 0; k < 3; k++) {
    411         *qmf_buf_real++ =
    412             ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
    413         *qmf_buf_imag++ =
    414             ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
    415       }
    416 
    417       for (; k < x_over_band; k++) {
    418         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    419         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    420       }
    421 
    422       for (; k < 64; k++) {
    423         *qmf_buf_real++ = 0;
    424         *qmf_buf_imag++ = 0;
    425       }
    426 
    427       qmf_buf_real += 14;
    428       qmf_buf_imag += 14;
    429     }
    430   } else {
    431     for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    432       for (k = 0; k < x_over_band; k++) {
    433         *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
    434         *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
    435       }
    436 
    437       for (; k < 64; k++) {
    438         *qmf_buf_real++ = 0.0f;
    439         *qmf_buf_imag++ = 0.0f;
    440       }
    441 
    442       qmf_buf_real += 14;
    443       qmf_buf_imag += 14;
    444     }
    445   }
    446 }
    447 
    448 VOID ixheaacd_esbr_synthesis_filt_block(
    449     ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
    450     ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing,
    451     FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx,
    452     ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac) {
    453   WORD32 i, k, p1;
    454   WORD32 *ptr_filt_states;
    455   WORD32 *ptr_filt_states_1;
    456   WORD32 *ptr_filt_states_2;
    457   WORD32 *filter_l;
    458   WORD32 *ploc_qmf_buf_real;
    459   WORD32 *ploc_qmf_buf_imag;
    460   WORD32 out_scalefactor;
    461   WORD32 sixty4;
    462   WORD32 no_synthesis_channels;
    463   WORD32 ixheaacd_drc_offset;
    464   FLOAT32 *syn_buffer;
    465   WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local;
    466   WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]);
    467 
    468   ia_sbr_qmf_filter_bank_struct *qmf_bank =
    469       &ptr_sbr_dec->str_synthesis_qmf_bank;
    470   ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
    471       sbr_tables_ptr->qmf_dec_tables_ptr;
    472 
    473   if (!mps_sbr_flag) {
    474     ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
    475                                   ptr_sbr_dec, ptr_frame_data, ptr_header_data,
    476                                   stereo_config_idx, apply_processing);
    477   } else {
    478     ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
    479                                       ptr_sbr_dec, stereo_config_idx);
    480   }
    481 
    482   out_scalefactor = 5;
    483   qmf_bank->no_channels = 64;
    484   qmf_bank->esbr_cos_twiddle =
    485       (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64;
    486   qmf_bank->esbr_alt_sin_twiddle =
    487       (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64;
    488 
    489   qmf_bank->filter_pos_syn_32 +=
    490       qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32;
    491   qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
    492 
    493   sixty4 = NO_SYNTHESIS_CHANNELS;
    494 
    495   ptr_filt_states = qmf_bank->filter_states_32;
    496 
    497   no_synthesis_channels = qmf_bank->no_channels;
    498   ptr_filt_states_1 = &ptr_filt_states[0];
    499   ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels;
    500 
    501   filter_l = qmf_bank->filter_pos_syn_32;
    502 
    503   p1 = 0;
    504 
    505   ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset;
    506 
    507   for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
    508     for (k = 0; k < 64; k++) {
    509       local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64);
    510       local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64);
    511     }
    512     ploc_qmf_buf_real = local_qmf_buffer;
    513     ploc_qmf_buf_imag = local_qmf_buffer + 64;
    514 
    515     ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real,
    516                                  &ptr_sbr_dec->str_synthesis_qmf_bank,
    517                                  sbr_tables_ptr->qmf_dec_tables_ptr);
    518 
    519     ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag,
    520                                        &ptr_filt_states[ixheaacd_drc_offset],
    521                                        no_synthesis_channels,
    522                                        out_scalefactor + 1);
    523 
    524     ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2,
    525                                   filter_l, &time_out[0], ch_fac);
    526 
    527     syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64;
    528     for (k = 0; k < 64; k++) {
    529       syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
    530     }
    531 
    532     ptr_filt_states_1 += sixty4;
    533     ptr_filt_states_2 -= sixty4;
    534     sixty4 = -sixty4;
    535     ixheaacd_drc_offset -= 128;
    536 
    537     if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
    538 
    539     filter_l += 64;
    540 
    541     if (filter_l == qmf_bank->p_filter_32 + 640)
    542       filter_l = (WORD32 *)qmf_bank->p_filter_32;
    543 
    544     p1 += no_synthesis_channels;
    545   }
    546 
    547   qmf_bank->filter_pos_syn_32 = filter_l;
    548   qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset;
    549 
    550   if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0;
    551 
    552   if (apply_processing && !mps_sbr_flag) {
    553     ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
    554         ptr_header_data->pstr_freq_band_data->sub_band_start;
    555   }
    556 }
    557 
    558 WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
    559                         ia_sbr_header_data_struct *ptr_header_data,
    560                         ia_sbr_frame_info_data_struct *ptr_frame_data,
    561                         ia_sbr_prev_frame_data_struct *ptr_frame_data_prev,
    562                         ia_ps_dec_struct *ptr_ps_dec,
    563                         ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r,
    564                         ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
    565                         FLAG apply_processing, FLAG low_pow_flag,
    566                         WORD32 *ptr_work_buf_core,
    567                         ia_sbr_tables_struct *sbr_tables_ptr,
    568                         ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
    569                         ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on,
    570                         WORD32 drc_sbr_factors[][64],
    571                         WORD32 audio_object_type) {
    572   WORD i;
    573   WORD slot, reserve;
    574   WORD save_lb_scale;
    575   WORD op_delay;
    576 
    577   WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS] = {0};
    578   WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS] = {0};
    579   WORD32 *ptr;
    580   WORD hbe_flag = ptr_header_data->hbe_flag;
    581 
    582   FLOAT32 **pp_qmf_buf_real = NULL;
    583   FLOAT32 **pp_qmf_buf_imag = NULL;
    584   FLOAT32 pvc_dec_out_buf[16 * 64];
    585 
    586   WORD upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
    587   WORD no_bins;
    588   WORD mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
    589   WORD stereo_config_idx = ptr_frame_data->stereo_config_idx;
    590   WORD sbr_mode = ptr_frame_data->sbr_mode;
    591   WORD usac_flag = ptr_header_data->usac_flag;
    592 
    593   FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr;
    594 
    595   memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
    596   memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32));
    597   if (audio_object_type == AOT_ER_AAC_ELD) {
    598     op_delay = 0;
    599   } else {
    600     op_delay = 6;
    601   }
    602   if (usac_flag) {
    603     pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
    604     pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
    605     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    606       op_delay = 2 * 6;
    607     }
    608   }
    609 
    610   no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step);
    611 
    612   if (!usac_flag) {
    613     WORD32 num = op_delay;
    614     WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
    615     WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag));
    616 
    617     if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS))
    618       return -1;
    619 
    620     if (!low_pow_flag) {
    621       num = num << 1;
    622     }
    623     if (audio_object_type != AOT_ER_AAC_ELD) {
    624       memcpy(p_scr_qmf_real, ptr_pers_qmf_real,
    625              sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
    626     }
    627     ptr = p_scr_qmf_real;
    628 
    629     for (slot = 0; slot < op_delay + no_bins; slot++) {
    630       p_arr_qmf_buf_real[slot] = ptr;
    631       ptr += NO_SYNTHESIS_CHANNELS;
    632 
    633       if (!low_pow_flag) {
    634         p_arr_qmf_buf_imag[slot] = ptr;
    635         ptr += NO_SYNTHESIS_CHANNELS;
    636       }
    637     }
    638 
    639     ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
    640 
    641     if (apply_processing) {
    642       ixheaacd_rescale_x_overlap(ptr_sbr_dec, ptr_header_data, ptr_frame_data,
    643                                  ptr_frame_data_prev, p_arr_qmf_buf_real,
    644                                  p_arr_qmf_buf_imag, low_pow_flag);
    645     }
    646   }
    647 
    648   if (usac_flag) {
    649     WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
    650     WORD32 codec_x_delay = 0;
    651     WORD32 core_syn_ch_index = 0;
    652     WORD32 frame_move = 288;
    653     WORD32 core_frame_size = ptr_header_data->core_frame_size;
    654 
    655     if (hbe_flag) {
    656       codec_x_delay = 32;
    657     }
    658     if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    659       codec_x_delay = 2 * codec_x_delay;
    660     }
    661 
    662     if (hbe_flag || mps_sbr_flag) {
    663       core_syn_ch_index = num_anal_bands;
    664     } else {
    665       core_syn_ch_index = ptr_header_data->pstr_freq_band_data->sub_band_start;
    666     }
    667 
    668     frame_move = 9 * num_anal_bands;
    669 
    670     memmove(ptr_sbr_dec->core_sample_buf,
    671             ptr_sbr_dec->core_sample_buf + core_frame_size,
    672             frame_move * sizeof(FLOAT32));
    673     memcpy(&ptr_sbr_dec->core_sample_buf[frame_move],
    674            &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32));
    675 
    676     memmove(
    677         &ptr_sbr_dec->qmf_buf_real[0][0],
    678         &ptr_sbr_dec
    679              ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
    680         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
    681 
    682     memmove(
    683         &ptr_sbr_dec->qmf_buf_imag[0][0],
    684         &ptr_sbr_dec
    685              ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
    686         (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
    687 
    688     memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
    689             &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
    690                                                .num_time_slots][0],
    691             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
    692 
    693     memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
    694             &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
    695                                                .num_time_slots][0],
    696             (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
    697 
    698     if (hbe_flag) {
    699       memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
    700               &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
    701                                                   .num_time_slots][0],
    702               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
    703 
    704       memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
    705               ptr_sbr_dec->ph_vocod_qmf_imag +
    706                   ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
    707               64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
    708     }
    709     ixheaacd_esbr_analysis_filt_block(
    710         ptr_sbr_dec, sbr_tables_ptr,
    711         op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
    712 
    713     if (hbe_flag) {
    714       WORD32 err_code = ixheaacd_qmf_hbe_apply(
    715           ptr_sbr_dec->p_hbe_txposer,
    716           ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
    717               ESBR_HBE_DELAY_OFFSET,
    718           ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
    719               ESBR_HBE_DELAY_OFFSET,
    720           ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
    721           ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
    722           ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
    723           ptr_frame_data->pitch_in_bins);
    724       if (err_code) return err_code;
    725 
    726       if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
    727         ixheaacd_hbe_repl_spec(
    728             &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
    729             ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
    730             ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
    731             ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
    732             ptr_sbr_dec->p_hbe_txposer->max_stretch);
    733       }
    734     }
    735     ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
    736 
    737     if (!mps_sbr_flag && apply_processing) {
    738       WORD32 err_code = 0;
    739       err_code = ixheaacd_generate_hf(
    740           ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
    741           ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
    742           ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
    743           ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
    744           ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
    745           ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data,
    746           ptr_header_data);
    747       if (err_code) return err_code;
    748 
    749       ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac;
    750 
    751       if (sbr_mode == PVC_SBR) {
    752         ixheaacd_pvc_process(
    753             ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start,
    754             ptr_frame_data->str_pvc_frame_info.border_vec[0],
    755             &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]);
    756         ptr_pvc_data->prev_pvc_flg = 1;
    757       } else {
    758         memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
    759         ptr_pvc_data->prev_pvc_flg = 0;
    760       }
    761 
    762       ptr_pvc_data->prev_first_bnd_idx =
    763           ptr_header_data->pstr_freq_band_data->sub_band_start;
    764       ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate;
    765 
    766       ptr_frame_data->pstr_sbr_header = ptr_header_data;
    767       err_code = ixheaacd_sbr_env_calc(
    768           ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
    769           ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
    770           ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
    771           ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
    772           (ptr_header_data->hbe_flag == 0)
    773               ? NULL
    774               : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
    775           ptr_sbr_dec->scratch_buff, pvc_dec_out_buf);
    776       if (err_code) return err_code;
    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   err = ixheaacd_sbr_env_calc(
   1217       ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1218       ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
   1219       ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
   1220       ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
   1221       (ptr_header_data->hbe_flag == 0) ? NULL
   1222                                        : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
   1223       ptr_sbr_dec->scratch_buff, NULL);
   1224 
   1225   if (err) return err;
   1226   for (i = 0; i < no_bins; i++) {
   1227     FLOAT32 *p_loc_mps_qmf_output =
   1228         p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
   1229     for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
   1230       *p_loc_mps_qmf_output++ =
   1231           ptr_sbr_dec->mps_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
   1232       *p_loc_mps_qmf_output++ =
   1233           ptr_sbr_dec->mps_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
   1234     }
   1235     for (k = ptr_header_data->pstr_freq_band_data->sub_band_start; k < 64;
   1236          k++) {
   1237       *p_loc_mps_qmf_output++ =
   1238           ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
   1239       *p_loc_mps_qmf_output++ =
   1240           ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
   1241     }
   1242   }
   1243 
   1244   for (i = 0; i < op_delay; i++) {
   1245     memmove(ptr_sbr_dec->mps_qmf_buf_real[i],
   1246             ptr_sbr_dec->mps_qmf_buf_real[no_bins + i], 64 * sizeof(FLOAT32));
   1247 
   1248     memmove(ptr_sbr_dec->mps_qmf_buf_imag[i],
   1249             ptr_sbr_dec->mps_qmf_buf_imag[no_bins + i], 64 * sizeof(FLOAT32));
   1250 
   1251     memmove(ptr_sbr_dec->mps_sbr_qmf_buf_real[i],
   1252             ptr_sbr_dec->mps_sbr_qmf_buf_real[no_bins + i],
   1253             64 * sizeof(FLOAT32));
   1254 
   1255     memmove(ptr_sbr_dec->mps_sbr_qmf_buf_imag[i],
   1256             ptr_sbr_dec->mps_sbr_qmf_buf_imag[no_bins + i],
   1257             64 * sizeof(FLOAT32));
   1258   }
   1259 
   1260   ptr_frame_data->reset_flag = 0;
   1261   return err;
   1262 }
   1263