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
78VOID 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
128VOID 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
181VOID 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
297VOID 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
399VOID 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
447VOID 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
557WORD32 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
1016WORD32 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
1139WORD32 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