Coverage Report

Created: 2026-02-26 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_sbr_dec.c
Line
Count
Source
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 "ixheaac_type_def.h"
23
24
#include "ixheaac_constants.h"
25
#include "ixheaac_basic_ops32.h"
26
#include "ixheaac_basic_ops16.h"
27
#include "ixheaac_basic_ops40.h"
28
#include "ixheaac_basic_ops.h"
29
30
#include "ixheaac_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_cnst.h"
45
#include "ixheaacd_ec_defines.h"
46
#include "ixheaacd_ec_struct_def.h"
47
#include "ixheaacd_channelinfo.h"
48
#include "ixheaacd_drc_dec.h"
49
#include "ixheaacd_sbrdecoder.h"
50
51
#include "ixheaacd_defines.h"
52
#include "ixheaacd_sbrdecoder.h"
53
#include "ixheaacd_definitions.h"
54
#include "ixheaacd_error_codes.h"
55
56
#include "ixheaacd_pulsedata.h"
57
58
#include "ixheaacd_sbrdecsettings.h"
59
#include "ixheaacd_sbr_scale.h"
60
#include "ixheaacd_lpp_tran.h"
61
#include "ixheaacd_env_extr_part.h"
62
#include "ixheaacd_sbr_rom.h"
63
#include "ixheaacd_hybrid.h"
64
#include "ixheaacd_ps_dec.h"
65
#include "ixheaacd_env_extr.h"
66
67
#include "ixheaacd_qmf_dec.h"
68
69
#include "ixheaacd_env_calc.h"
70
#include "ixheaac_sbr_const.h"
71
72
#include "ixheaacd_pvc_dec.h"
73
#include "ixheaacd_sbr_dec.h"
74
#include "ixheaacd_env_extr.h"
75
#include "ixheaacd_env_calc.h"
76
#include "ixheaacd_ps_dec.h"
77
#include "ixheaacd_function_selector.h"
78
79
#include "ixheaacd_audioobjtypes.h"
80
81
VOID ixheaacd_qmf_enrg_calc(ia_sbr_dec_struct *ptr_sbr_dec,
82
64.8k
                            WORD32 upsample_ratio_idx, WORD32 low_pow_flag) {
83
64.8k
  WORD32 i, j;
84
64.8k
  if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
85
1.07M
    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
86
18.0M
      for (j = 0; j < 16; j++) {
87
16.9M
        ptr_sbr_dec->qmf_energy_buf[i][j] =
88
16.9M
            ptr_sbr_dec->qmf_buf_real[2 + i][j] *
89
16.9M
            ptr_sbr_dec->qmf_buf_real[2 + i][j];
90
16.9M
        if (!low_pow_flag)
91
16.9M
          ptr_sbr_dec->qmf_energy_buf[i][j] +=
92
16.9M
              (ptr_sbr_dec->qmf_buf_imag[2 + i][j] *
93
16.9M
               ptr_sbr_dec->qmf_buf_imag[2 + i][j]);
94
16.9M
      }
95
1.06M
    }
96
97
281k
    for (i = 0; i < 16; i++) {
98
4.50M
      for (j = 0; j < 16; j++) {
99
4.24M
        ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] =
100
4.24M
            (ptr_sbr_dec->qmf_energy_buf[4 * i + 0][j] +
101
4.24M
             ptr_sbr_dec->qmf_energy_buf[4 * i + 1][j] +
102
4.24M
             ptr_sbr_dec->qmf_energy_buf[4 * i + 2][j] +
103
4.24M
             ptr_sbr_dec->qmf_energy_buf[4 * i + 3][j]) *
104
4.24M
            0.25f;
105
4.24M
      }
106
265k
    }
107
48.3k
  } else {
108
1.59M
    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
109
51.0M
      for (j = 0; j < 32; j++) {
110
49.4M
        ptr_sbr_dec->qmf_energy_buf[i][j] =
111
49.4M
            ptr_sbr_dec->qmf_buf_real[2 + i][j] *
112
49.4M
            ptr_sbr_dec->qmf_buf_real[2 + i][j];
113
49.4M
        if (!low_pow_flag)
114
49.4M
          ptr_sbr_dec->qmf_energy_buf[i][j] +=
115
49.4M
              (ptr_sbr_dec->qmf_buf_imag[2 + i][j] *
116
49.4M
               ptr_sbr_dec->qmf_buf_imag[2 + i][j]);
117
49.4M
      }
118
1.54M
    }
119
120
821k
    for (i = 0; i < 16; i++) {
121
25.5M
      for (j = 0; j < 32; j++) {
122
24.7M
        ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] =
123
24.7M
            (ptr_sbr_dec->qmf_energy_buf[2 * i + 0][j] +
124
24.7M
             ptr_sbr_dec->qmf_energy_buf[2 * i + 1][j]) *
125
24.7M
            0.5f;
126
24.7M
      }
127
773k
    }
128
48.3k
  }
129
64.8k
}
130
131
VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES],
132
                            FLOAT32 qmf_buf_real[][64],
133
                            FLOAT32 qmf_buf_imag[][64], WORD32 no_bins,
134
30.2k
                            WORD32 max_stretch) {
135
30.2k
  WORD32 patch_bands;
136
30.2k
  WORD32 patch, band, col, target, source_bands, i;
137
30.2k
  WORD32 num_patches = 0;
138
139
181k
  for (i = 1; i < MAX_NUM_PATCHES; i++) {
140
151k
    if (x_over_qmf[i] != 0) {
141
78.5k
      num_patches++;
142
78.5k
    }
143
151k
  }
144
145
38.4k
  for (patch = (max_stretch - 1); patch < num_patches; patch++) {
146
8.18k
    patch_bands = x_over_qmf[patch + 1] - x_over_qmf[patch];
147
8.18k
    target = x_over_qmf[patch];
148
8.18k
    source_bands = x_over_qmf[max_stretch - 1] - x_over_qmf[max_stretch - 2];
149
26.1k
    while (patch_bands > 0) {
150
17.9k
      WORD32 ixheaacd_num_bands = source_bands;
151
17.9k
      WORD32 start_band = x_over_qmf[max_stretch - 1] - 1;
152
17.9k
      if (target + ixheaacd_num_bands >= x_over_qmf[patch + 1]) {
153
11.3k
        ixheaacd_num_bands = x_over_qmf[patch + 1] - target;
154
11.3k
      }
155
17.9k
      if ((((target + ixheaacd_num_bands - 1) & 1) +
156
17.9k
           ((x_over_qmf[max_stretch - 1] - 1) & 1)) &
157
17.9k
          1) {
158
13.5k
        if (ixheaacd_num_bands == source_bands) {
159
9.57k
          ixheaacd_num_bands--;
160
9.57k
        } else {
161
3.94k
          start_band--;
162
3.94k
        }
163
13.5k
      }
164
17.9k
      if (!ixheaacd_num_bands) break;
165
1.16M
      for (col = 0; col < no_bins; col++) {
166
1.15M
        WORD32 i = 0;
167
1.15M
        band = target + ixheaacd_num_bands - 1;
168
1.15M
        if (64 <= band) {
169
0
          band = 63;
170
0
        }
171
1.15M
        if (x_over_qmf[patch + 1] <= band) {
172
0
          band = x_over_qmf[patch + 1] - 1;
173
0
        }
174
4.90M
        for (i = 0; i < ixheaacd_num_bands; i++, band--) {
175
3.75M
          qmf_buf_real[col][band] = qmf_buf_real[col][start_band - i];
176
3.75M
          qmf_buf_imag[col][band] = qmf_buf_imag[col][start_band - i];
177
3.75M
        }
178
1.15M
      }
179
17.9k
      target += ixheaacd_num_bands;
180
17.9k
      patch_bands -= ixheaacd_num_bands;
181
17.9k
    }
182
8.18k
  }
183
30.2k
}
184
185
VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec,
186
                                       ia_sbr_tables_struct *sbr_tables_ptr,
187
182k
                                       WORD32 op_delay) {
188
182k
  FLOAT32 *core_coder_samples;
189
182k
  WORD32 *ptr_filt_states;
190
182k
  WORD32 *ptr_filt_states_1;
191
182k
  WORD32 *ptr_filt_states_2;
192
182k
  WORD32 *ptr_temp;
193
182k
  WORD32 *ptr_win_coeffs_1;
194
182k
  WORD32 *ptr_win_coeffs_2;
195
182k
  WORD32 *ptr_win_coeffs;
196
182k
  WORD32 *ploc_qmf_buf_real;
197
182k
  WORD32 *ploc_qmf_buf_imag;
198
182k
  WORD32 local_qmf_buffer[128] = {0};
199
182k
  WORD32 anal_buf[2 * 32];
200
182k
  WORD32 idx, z;
201
182k
  WORD32 core_syn_ch_index;
202
182k
  FLOAT32 gain;
203
182k
  WORD32 filt_offset;
204
182k
  WORD32 num_columns;
205
182k
  ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
206
182k
      sbr_tables_ptr->qmf_dec_tables_ptr;
207
182k
  ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank =
208
182k
      &ptr_sbr_dec->str_codec_qmf_bank;
209
182k
  core_coder_samples = ptr_sbr_dec->time_sample_buf;
210
182k
  ptr_filt_states = pstr_qmf_anal_bank->state_new_samples_pos_low_32;
211
182k
  ptr_win_coeffs_1 = pstr_qmf_anal_bank->filter_pos_32;
212
182k
  num_columns = pstr_qmf_anal_bank->no_channels;
213
214
182k
  switch (num_columns) {
215
27.4k
    case 16:
216
27.4k
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
217
27.4k
      gain = 128.0f;
218
27.4k
      filt_offset = 64;
219
27.4k
      break;
220
13.4k
    case 24:
221
13.4k
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24;
222
13.4k
      gain = 12.0f;
223
13.4k
      filt_offset = 24;
224
13.4k
      break;
225
141k
    case 32:
226
141k
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
227
141k
      gain = 256.0f;
228
141k
      filt_offset = 64;
229
141k
      break;
230
0
    default:
231
0
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
232
0
      gain = 256.0f;
233
0
      filt_offset = 64;
234
0
      break;
235
182k
  }
236
182k
  gain = 1.0f / gain;
237
238
182k
  pstr_qmf_anal_bank->usb = num_columns;
239
240
182k
  ploc_qmf_buf_real = &local_qmf_buffer[0];
241
182k
  ploc_qmf_buf_imag = &local_qmf_buffer[64];
242
243
182k
  ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32;
244
182k
  ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns;
245
246
6.90M
  for (idx = 0; idx < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; idx++) {
247
190M
    for (z = 0; z < num_columns; z++) {
248
183M
      ptr_filt_states[num_columns - 1 - z] =
249
183M
          (WORD32)(core_coder_samples[z] * (1 << 15));
250
183M
    }
251
6.72M
    ixheaacd_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2,
252
6.72M
                                   ptr_win_coeffs_1, ptr_win_coeffs_2, anal_buf,
253
6.72M
                                   num_columns);
254
255
6.72M
    core_coder_samples += num_columns;
256
257
6.72M
    ptr_filt_states -= num_columns;
258
6.72M
    if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) {
259
674k
      ptr_filt_states = pstr_qmf_anal_bank->anal_filter_states_32 +
260
674k
                        10 * num_columns - num_columns;
261
674k
    }
262
263
6.72M
    ptr_temp = ptr_filt_states_1;
264
6.72M
    ptr_filt_states_1 = ptr_filt_states_2;
265
6.72M
    ptr_filt_states_2 = ptr_temp;
266
267
6.72M
    ptr_win_coeffs_1 += filt_offset;
268
6.72M
    ptr_win_coeffs_2 += filt_offset;
269
270
6.72M
    ptr_win_coeffs = ptr_win_coeffs_1;
271
6.72M
    ptr_win_coeffs_1 = ptr_win_coeffs_2;
272
6.72M
    ptr_win_coeffs_2 = ptr_win_coeffs;
273
274
6.72M
    if (ptr_win_coeffs_2 >
275
6.72M
        (pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset * 10)) {
276
671k
      ptr_win_coeffs_1 = pstr_qmf_anal_bank->analy_win_coeff_32;
277
671k
      ptr_win_coeffs_2 = pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset;
278
671k
    }
279
280
6.72M
    ixheaacd_esbr_fwd_modulation(anal_buf, &ploc_qmf_buf_real[0],
281
6.72M
                                 &ploc_qmf_buf_imag[0], pstr_qmf_anal_bank,
282
6.72M
                                 qmf_dec_tables_ptr);
283
6.72M
    core_syn_ch_index = num_columns;
284
285
190M
    for (z = 0; z < core_syn_ch_index; z++) {
286
183M
      ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] =
287
183M
          ((FLOAT32)ploc_qmf_buf_real[z] * gain);
288
183M
      ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] =
289
183M
          ((FLOAT32)ploc_qmf_buf_imag[z] * gain);
290
183M
    }
291
6.72M
  }
292
293
182k
  pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1;
294
182k
  pstr_qmf_anal_bank->state_new_samples_pos_low_32 = ptr_filt_states;
295
182k
}
296
297
VOID ixheaacd_esbr_synthesis_regrp(
298
    FLOAT32 *qmf_buf_real, FLOAT32 *qmf_buf_imag,
299
    ia_sbr_dec_struct *ptr_sbr_dec,
300
    ia_sbr_frame_info_data_struct *ptr_frame_data,
301
    ia_sbr_header_data_struct *ptr_header_data, WORD32 stereo_config_idx,
302
127k
    WORD32 apply_processing) {
303
127k
  WORD32 i, k;
304
127k
  WORD32 stop_border = 0;
305
127k
  WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
306
127k
  WORD32 x_over_band = num_anal_bands;
307
308
127k
  if (apply_processing) {
309
105k
    if (ptr_header_data->sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
310
8.77k
      stop_border = 4 * ptr_frame_data->str_frame_info_details.border_vec[0];
311
96.6k
    } else {
312
96.6k
      stop_border = 2 * ptr_frame_data->str_frame_info_details.border_vec[0];
313
96.6k
    }
314
105k
    x_over_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
315
105k
  }
316
317
127k
  if (stereo_config_idx > 0) {
318
55.4k
    for (i = 0; i < stop_border; i++) {
319
40.5k
      for (k = 0; k < 3; k++) {
320
30.4k
        *qmf_buf_real++ =
321
30.4k
            ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
322
30.4k
        *qmf_buf_imag++ =
323
30.4k
            ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
324
30.4k
      }
325
326
171k
      for (; k < x_over_band; k++) {
327
161k
        *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
328
161k
        *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
329
161k
      }
330
331
467k
      for (; k < 64; k++) {
332
456k
        *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
333
456k
        *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
334
456k
      }
335
336
10.1k
      qmf_buf_real += 14;
337
10.1k
      qmf_buf_imag += 14;
338
10.1k
    }
339
340
45.2k
    x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
341
342
2.03M
    for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
343
7.95M
      for (k = 0; k < 3; k++) {
344
5.96M
        *qmf_buf_real++ =
345
5.96M
            ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
346
5.96M
        *qmf_buf_imag++ =
347
5.96M
            ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
348
5.96M
      }
349
350
66.1M
      for (; k < x_over_band; k++) {
351
64.1M
        *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
352
64.1M
        *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
353
64.1M
      }
354
355
59.1M
      for (; k < 64; k++) {
356
57.1M
        *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
357
57.1M
        *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
358
57.1M
      }
359
360
1.98M
      qmf_buf_real += 14;
361
1.98M
      qmf_buf_imag += 14;
362
1.98M
    }
363
364
82.6k
  } else {
365
120k
    for (i = 0; i < stop_border; i++) {
366
745k
      for (k = 0; k < x_over_band; k++) {
367
707k
        *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
368
707k
        *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
369
707k
      }
370
371
1.73M
      for (; k < 64; k++) {
372
1.69M
        *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
373
1.69M
        *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
374
1.69M
      }
375
376
37.5k
      qmf_buf_real += 14;
377
37.5k
      qmf_buf_imag += 14;
378
37.5k
    }
379
380
82.6k
    x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start;
381
382
2.69M
    for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
383
40.4M
      for (k = 0; k < x_over_band; k++) {
384
37.8M
        *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
385
37.8M
        *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
386
37.8M
      }
387
388
131M
      for (; k < 64; k++) {
389
129M
        *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k];
390
129M
        *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k];
391
129M
      }
392
393
2.61M
      qmf_buf_real += 14;
394
2.61M
      qmf_buf_imag += 14;
395
2.61M
    }
396
82.6k
  }
397
127k
}
398
399
VOID ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 *qmf_buf_real,
400
                                       FLOAT32 *qmf_buf_imag,
401
                                       ia_sbr_dec_struct *ptr_sbr_dec,
402
54.7k
                                       WORD32 stereo_config_idx) {
403
54.7k
  WORD32 i, k;
404
54.7k
  WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
405
54.7k
  WORD32 x_over_band = num_anal_bands;
406
407
54.7k
  if (stereo_config_idx > 0) {
408
2.12M
    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
409
8.29M
      for (k = 0; k < 3; k++) {
410
6.21M
        *qmf_buf_real++ =
411
6.21M
            ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k];
412
6.21M
        *qmf_buf_imag++ =
413
6.21M
            ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k];
414
6.21M
      }
415
416
51.2M
      for (; k < x_over_band; k++) {
417
49.1M
        *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
418
49.1M
        *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
419
49.1M
      }
420
421
79.3M
      for (; k < 64; k++) {
422
77.2M
        *qmf_buf_real++ = 0;
423
77.2M
        *qmf_buf_imag++ = 0;
424
77.2M
      }
425
426
2.07M
      qmf_buf_real += 14;
427
2.07M
      qmf_buf_imag += 14;
428
2.07M
    }
429
54.7k
  } else {
430
0
    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
431
0
      for (k = 0; k < x_over_band; k++) {
432
0
        *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k];
433
0
        *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k];
434
0
      }
435
436
0
      for (; k < 64; k++) {
437
0
        *qmf_buf_real++ = 0.0f;
438
0
        *qmf_buf_imag++ = 0.0f;
439
0
      }
440
441
0
      qmf_buf_real += 14;
442
0
      qmf_buf_imag += 14;
443
0
    }
444
0
  }
445
54.7k
}
446
447
VOID ixheaacd_esbr_synthesis_filt_block(
448
    ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data,
449
    ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing,
450
    FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx,
451
    ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac,
452
    WORD32 ps_enable, WORD32 skip_re_grouping, ia_ps_dec_struct *ptr_ps_dec,
453
189k
    FLAG drc_on, WORD32 drc_sbr_factors[][64]) {
454
455
189k
    WORD32 i, k;
456
189k
    WORD32 *ptr_filt_states;
457
189k
    WORD32 *ptr_filt_states_1;
458
189k
    WORD32 *ptr_filt_states_2;
459
189k
    WORD32 *filter_l;
460
189k
    WORD32 *ploc_qmf_buf_real;
461
189k
    WORD32 *ploc_qmf_buf_imag;
462
189k
    WORD32 out_scalefactor;
463
189k
    WORD32 sixty4, thrity2;
464
189k
    WORD32 no_synthesis_channels;
465
189k
    WORD32 ixheaacd_drc_offset;
466
189k
    FLOAT32 *syn_buffer;
467
189k
    WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local;
468
189k
    WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]);
469
189k
  FLOAT32 *time_sample_buf;
470
189k
  if (ps_enable) {
471
14.2k
    time_sample_buf = ptr_ps_dec->time_sample_buf[0];
472
175k
  } else {
473
175k
    time_sample_buf = ptr_sbr_dec->time_sample_buf;
474
175k
  }
475
189k
    ia_sbr_qmf_filter_bank_struct *qmf_bank =
476
189k
        &ptr_sbr_dec->str_synthesis_qmf_bank;
477
189k
    ia_qmf_dec_tables_struct *qmf_dec_tables_ptr =
478
189k
        sbr_tables_ptr->qmf_dec_tables_ptr;
479
480
189k
  if (!skip_re_grouping) {
481
182k
    if (!mps_sbr_flag) {
482
127k
      ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
483
127k
                                    ptr_sbr_dec, ptr_frame_data, ptr_header_data,
484
127k
                                    stereo_config_idx, apply_processing);
485
127k
      if (ps_enable) {
486
7.13k
        FLOAT32 factor = 1.0f;
487
49.9k
        for (i = ptr_ps_dec->num_sub_samples;i < (WORD32)ptr_ps_dec->num_sub_samples + 6;i++) {
488
256k
          for (k = 0; k < 5; k++)
489
214k
          {
490
214k
            if (drc_on)
491
214k
            {
492
214k
              if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30)
493
0
              {
494
0
                factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25;
495
0
              }
496
214k
              else
497
214k
              {
498
214k
                factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25;
499
214k
              }
500
214k
            }
501
214k
            ptr_ps_dec->pp_qmf_buf_real[0][i][k] =
502
214k
              factor * ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
503
214k
            ptr_ps_dec->pp_qmf_buf_imag[0][i][k] =
504
214k
              factor * ptr_sbr_dec->qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
505
214k
          }
506
42.8k
        }
507
7.13k
      }
508
127k
      if (ps_enable && apply_processing) {
509
7.03k
        WORD32 usb = ptr_header_data->pstr_freq_band_data->sub_band_end;
510
511
7.03k
        ixheaacd_esbr_apply_ps(ptr_ps_dec,
512
7.03k
                               ptr_ps_dec->pp_qmf_buf_real[0],
513
7.03k
                               ptr_ps_dec->pp_qmf_buf_imag[0],
514
7.03k
                               ptr_ps_dec->pp_qmf_buf_real[1],
515
7.03k
                               ptr_ps_dec->pp_qmf_buf_imag[1],
516
7.03k
                               usb, sbr_tables_ptr->ps_tables_ptr,
517
7.03k
                               ptr_header_data->num_time_slots);
518
120k
      } else if (ps_enable) {
519
3.43k
        for (i = 0; i < (ptr_header_data->num_time_slots * 2); i++) {
520
216k
          for (k = 0; k < 64; k++) {
521
212k
            ptr_ps_dec->pp_qmf_buf_real[1][i][k] = ptr_ps_dec->pp_qmf_buf_real[0][i][k];
522
212k
            ptr_ps_dec->pp_qmf_buf_imag[1][i][k] = ptr_ps_dec->pp_qmf_buf_imag[0][i][k];
523
212k
          }
524
3.32k
        }
525
104
      }
526
127k
    } else {
527
54.7k
      ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0],
528
54.7k
                                        ptr_sbr_dec, stereo_config_idx);
529
54.7k
    }
530
182k
  } else {
531
7.13k
    if (ps_enable) {
532
7.13k
      time_sample_buf = ptr_ps_dec->time_sample_buf[1];
533
7.13k
    }
534
7.13k
  }
535
536
189k
  if (drc_on)
537
18.0k
  {
538
18.0k
    FLOAT32 factor = 1.0f;
539
594k
    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++)
540
576k
    {
541
37.4M
      for (k = 0; k < 64; k++)
542
36.8M
      {
543
36.8M
        if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30)
544
34.5k
        {
545
34.5k
          factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25;
546
34.5k
        }
547
36.8M
        else
548
36.8M
        {
549
36.8M
          factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25;
550
36.8M
        }
551
36.8M
        qmf_buf_real[i][k] *= factor;
552
36.8M
        qmf_buf_imag[i][k] *= factor;
553
36.8M
      }
554
576k
    }
555
18.0k
  }
556
557
189k
  if (stereo_config_idx <= 0) {
558
89.7k
    out_scalefactor = 5;
559
89.7k
    no_synthesis_channels = qmf_bank->no_channels;
560
89.7k
    sixty4 = NO_SYNTHESIS_CHANNELS;
561
89.7k
    thrity2 = qmf_bank->no_channels;
562
563
89.7k
    if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED)
564
206
    {
565
206
        qmf_bank->esbr_cos_twiddle =
566
206
          (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32;
567
206
        qmf_bank->esbr_alt_sin_twiddle =
568
206
          (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32;
569
206
    }
570
89.5k
    else
571
89.5k
    {
572
89.5k
      qmf_bank->esbr_cos_twiddle =
573
89.5k
        (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64;
574
89.5k
      qmf_bank->esbr_alt_sin_twiddle =
575
89.5k
        (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64;
576
89.5k
    }
577
578
89.7k
    qmf_bank->filter_pos_syn_32 +=
579
89.7k
        qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32;
580
89.7k
    qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c;
581
582
89.7k
    ptr_filt_states = qmf_bank->filter_states_32;
583
584
89.7k
    ptr_filt_states_1 = &ptr_filt_states[0];
585
89.7k
    ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels;
586
587
89.7k
    filter_l = qmf_bank->filter_pos_syn_32;
588
589
89.7k
    ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset;
590
591
2.96M
    for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) {
592
187M
      for (k = 0; k < 64; k++) {
593
184M
        local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64);
594
184M
        local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64);
595
184M
      }
596
2.87M
      ploc_qmf_buf_real = local_qmf_buffer;
597
2.87M
      ploc_qmf_buf_imag = local_qmf_buffer + 64;
598
599
2.87M
      ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real,
600
2.87M
                                   &ptr_sbr_dec->str_synthesis_qmf_bank,
601
2.87M
                                   sbr_tables_ptr->qmf_dec_tables_ptr,
602
2.87M
                                   no_synthesis_channels);
603
604
2.87M
      ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag,
605
2.87M
                                         &ptr_filt_states[ixheaacd_drc_offset],
606
2.87M
                                         no_synthesis_channels,
607
2.87M
                                         out_scalefactor + 1);
608
609
2.87M
      if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) {
610
6.59k
        ixheaacd_esbr_qmfsyn32_winadd(ptr_filt_states_1, ptr_filt_states_2,
611
6.59k
                                      filter_l, &time_out[0], ch_fac);
612
613
6.59k
        if (!mps_sbr_flag) {
614
6.59k
          syn_buffer = time_sample_buf + i * 32;
615
6.59k
        } else {
616
0
          syn_buffer = ptr_sbr_dec->time_sample_buf + i * 32;
617
0
        }
618
217k
        for (k = 0; k < 32; k++) {
619
210k
          syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
620
210k
        }
621
622
6.59k
        ptr_filt_states_1 += thrity2;
623
6.59k
        ptr_filt_states_2 -= thrity2;
624
6.59k
        thrity2 = -thrity2;
625
6.59k
        ixheaacd_drc_offset -= 64;
626
627
6.59k
        if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 640;
628
2.87M
      } else {
629
2.87M
        ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2,
630
2.87M
                                      filter_l, &time_out[0], ch_fac);
631
632
2.87M
        if (!mps_sbr_flag) {
633
2.87M
          syn_buffer = time_sample_buf + i * 64;
634
2.87M
        } else {
635
0
          syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64;
636
0
        }
637
186M
        for (k = 0; k < 64; k++) {
638
183M
          syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16);
639
183M
        }
640
641
2.87M
        ptr_filt_states_1 += sixty4;
642
2.87M
        ptr_filt_states_2 -= sixty4;
643
2.87M
        sixty4 = -sixty4;
644
2.87M
        ixheaacd_drc_offset -= 128;
645
646
2.87M
        if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280;
647
2.87M
      }
648
649
2.87M
      filter_l += 64;
650
651
2.87M
      if (filter_l == qmf_bank->p_filter_32 + 640)
652
287k
        filter_l = (WORD32 *)qmf_bank->p_filter_32;
653
2.87M
    }
654
655
89.7k
    qmf_bank->filter_pos_syn_32 = filter_l;
656
89.7k
    qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset;
657
89.7k
  }
658
659
189k
  if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0;
660
189k
}
661
662
WORD32 ixheaacd_sbr_dec(
663
    ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data,
664
    ia_sbr_header_data_struct *ptr_header_data, ia_sbr_frame_info_data_struct *ptr_frame_data,
665
    ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, ia_ps_dec_struct *ptr_ps_dec,
666
    ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, ia_sbr_scale_fact_struct *ptr_sbr_sf_r,
667
    FLAG apply_processing, FLAG low_pow_flag, WORD32 *ptr_work_buf_core,
668
    ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac,
669
    ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, WORD32 drc_sbr_factors[][64],
670
    WORD32 audio_object_type, WORD32 ldmps_present, VOID *self, WORD32 heaac_mps_present,
671
198k
    WORD32 ec_flag) {
672
198k
  WORD i, j, k;
673
198k
  WORD slot, reserve;
674
198k
  WORD save_lb_scale;
675
198k
  WORD op_delay;
676
198k
  IA_ERRORCODE err_code = IA_NO_ERROR;
677
678
198k
  WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS] = {0};
679
198k
  WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS] = {0};
680
198k
  WORD32 *ptr;
681
198k
  WORD hbe_flag = ptr_header_data->hbe_flag;
682
683
198k
  FLOAT32 **pp_qmf_buf_real = NULL;
684
198k
  FLOAT32 **pp_qmf_buf_imag = NULL;
685
198k
  FLOAT32 pvc_dec_out_buf[16 * 64];
686
687
198k
  WORD upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
688
198k
  WORD no_bins;
689
198k
  WORD mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
690
198k
  WORD stereo_config_idx = ptr_frame_data->stereo_config_idx;
691
198k
  WORD sbr_mode = ptr_frame_data->sbr_mode;
692
198k
  WORD usac_flag = ptr_header_data->usac_flag;
693
198k
  WORD add_slot = 0;
694
695
198k
  FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr;
696
697
198k
  WORD32 dft_hbe_flag = ptr_header_data->esbr_hq;
698
198k
  WORD32 esbr_hbe_delay_offsets;
699
198k
  if (ptr_header_data->num_time_slots == 15)
700
10.3k
    esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET_960;
701
187k
  else
702
187k
    esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET;
703
704
198k
  memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
705
198k
  memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32));
706
198k
  if (audio_object_type == AOT_ER_AAC_ELD) {
707
33.4k
    op_delay = 0;
708
164k
  } else {
709
164k
    op_delay = 6;
710
164k
  }
711
712
198k
  if (ldmps_present == 1) add_slot = SBR_HF_ADJ_OFFSET;
713
714
198k
  if (!((audio_object_type == AOT_ER_AAC_ELD) || (audio_object_type == AOT_ER_AAC_LD))
715
164k
      && ptr_header_data->enh_sbr) {
716
164k
    ch_fac = 1;
717
164k
    pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
718
164k
    pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
719
164k
    if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
720
18.8k
      op_delay = 2 * 6;
721
18.8k
    }
722
164k
  }
723
724
198k
  no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step);
725
726
198k
  if ((audio_object_type == AOT_ER_AAC_ELD) ||
727
164k
      (audio_object_type == AOT_ER_AAC_LD)  ||
728
164k
      !ptr_header_data->enh_sbr) {
729
33.4k
    WORD32 num = op_delay;
730
33.4k
    WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
731
33.4k
    WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag));
732
733
33.4k
    if (ptr_header_data->num_time_slots != 15) {
734
23.0k
      if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS)) {
735
0
        if (ec_flag)
736
0
          no_bins = LPC_ORDER;
737
0
        else
738
0
          return -1;
739
0
      }
740
23.0k
    } else {
741
10.3k
      if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS_960)) {
742
0
        if (ec_flag)
743
0
          no_bins = LPC_ORDER;
744
0
        else
745
0
          return -1;
746
0
      }
747
10.3k
    }
748
749
33.4k
    if (!low_pow_flag) {
750
33.4k
      num = num << 1;
751
33.4k
    }
752
33.4k
    if (audio_object_type != AOT_ER_AAC_ELD) {
753
0
      memcpy(p_scr_qmf_real, ptr_pers_qmf_real,
754
0
             sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
755
0
    }
756
33.4k
    ptr = p_scr_qmf_real;
757
758
564k
    for (slot = 0; slot < op_delay + no_bins + add_slot; slot++) {
759
531k
      p_arr_qmf_buf_real[slot] = ptr;
760
531k
      ptr += NO_SYNTHESIS_CHANNELS;
761
762
531k
      if (!low_pow_flag) {
763
531k
        p_arr_qmf_buf_imag[slot] = ptr;
764
531k
        ptr += NO_SYNTHESIS_CHANNELS;
765
531k
      }
766
531k
    }
767
768
33.4k
    ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
769
770
33.4k
    if (apply_processing) {
771
33.4k
      ixheaacd_rescale_x_overlap(ptr_sbr_dec, ptr_header_data, ptr_frame_data,
772
33.4k
                                 ptr_frame_data_prev, p_arr_qmf_buf_real,
773
33.4k
                                 p_arr_qmf_buf_imag, low_pow_flag);
774
33.4k
    }
775
33.4k
  }
776
777
198k
  if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1) && ptr_header_data->enh_sbr) {
778
464
    WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
779
464
    WORD32 frame_move = 9 * num_anal_bands;
780
464
    WORD32 core_frame_size = ptr_header_data->core_frame_size;
781
782
464
    memcpy(&ptr_sbr_dec->core_sample_buf[core_frame_size],
783
464
           &ptr_sbr_dec->time_sample_buf[core_frame_size - frame_move],
784
464
           frame_move * sizeof(FLOAT32));
785
786
464
    memmove(&ptr_sbr_dec->time_sample_buf[frame_move], &ptr_sbr_dec->time_sample_buf[0],
787
464
            (core_frame_size - frame_move));
788
789
464
    memcpy(&ptr_sbr_dec->time_sample_buf[0], &ptr_sbr_dec->core_sample_buf[0],
790
464
           frame_move * sizeof(FLOAT32));
791
792
464
    memcpy(&ptr_sbr_dec->core_sample_buf[0], &ptr_sbr_dec->core_sample_buf[core_frame_size],
793
464
           frame_move * sizeof(FLOAT32));
794
464
  }
795
198k
  if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1) &&
796
464
    !ptr_header_data->enh_sbr) {
797
0
    WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
798
0
    WORD32 frame_move = 9 * num_anal_bands;
799
0
    WORD32 core_frame_size = ptr_header_data->core_frame_size;
800
801
0
    memcpy(&ptr_sbr_dec->core_sample_buf_sbr[core_frame_size],
802
0
           &ptr_time_data[core_frame_size - frame_move],
803
0
           frame_move * sizeof(WORD16));
804
805
0
    memmove(&ptr_time_data[frame_move], &ptr_time_data[0],
806
0
            (core_frame_size - frame_move));
807
808
0
    memcpy(&ptr_time_data[0], &ptr_sbr_dec->core_sample_buf_sbr[0],
809
0
           frame_move * sizeof(WORD16));
810
811
0
    memcpy(&ptr_sbr_dec->core_sample_buf_sbr[0],
812
0
           &ptr_sbr_dec->core_sample_buf_sbr[core_frame_size],
813
0
           frame_move * sizeof(WORD16));
814
0
  }
815
816
198k
  if ((audio_object_type != AOT_ER_AAC_ELD) &&
817
164k
      (audio_object_type != AOT_ER_AAC_LD) &&
818
164k
      ptr_header_data->enh_sbr) {
819
164k
    WORD32 codec_x_delay = 0;
820
821
164k
    if (hbe_flag || !usac_flag) {
822
114k
      codec_x_delay = esbr_hbe_delay_offsets;
823
114k
    }
824
164k
    if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
825
18.8k
      codec_x_delay = 2 * codec_x_delay;
826
18.8k
    }
827
    /* fixed decoder delay for bitstreams with SBR 4:1 and stereoConfigIndex 3
828
     */
829
164k
    if (ptr_header_data->num_time_slots != 15) {
830
164k
      if (mps_sbr_flag) op_delay = MPS_SBR_DELAY;
831
164k
    } else {
832
39
      if (mps_sbr_flag) op_delay = MPS_SBR_DELAY_960;
833
39
    }
834
835
164k
    {
836
164k
    memmove(
837
164k
        &ptr_sbr_dec->qmf_buf_real[0][0],
838
164k
        &ptr_sbr_dec
839
164k
             ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
840
164k
        (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
841
842
164k
    memmove(
843
164k
        &ptr_sbr_dec->qmf_buf_imag[0][0],
844
164k
        &ptr_sbr_dec
845
164k
             ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
846
164k
        (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
847
848
164k
    memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
849
164k
            &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
850
164k
                                               .num_time_slots][0],
851
164k
            (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
852
853
164k
    memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
854
164k
            &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
855
164k
                                               .num_time_slots][0],
856
164k
            (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
857
858
164k
    if (hbe_flag) {
859
114k
      memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
860
114k
              &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
861
114k
                                                  .num_time_slots][0],
862
114k
              64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
863
864
114k
      memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
865
114k
              ptr_sbr_dec->ph_vocod_qmf_imag +
866
114k
                  ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
867
114k
              64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
868
114k
        if (!usac_flag) {
869
11.2k
          WORD32 qmf_sb_prev = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
870
78.6k
          for (i = SBR_HF_ADJ_OFFSET; i < op_delay + SBR_HF_ADJ_OFFSET; ++i) {
871
67.4k
            memset(&ptr_sbr_dec->qmf_buf_real[i][qmf_sb_prev], 0, (64 - qmf_sb_prev));
872
67.4k
            memset(&ptr_sbr_dec->qmf_buf_imag[i][qmf_sb_prev], 0, (64 - qmf_sb_prev));
873
67.4k
          }
874
11.2k
        }
875
114k
      }
876
164k
    }
877
164k
    ixheaacd_esbr_analysis_filt_block(
878
164k
        ptr_sbr_dec, sbr_tables_ptr,
879
164k
        op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
880
881
164k
    if (hbe_flag && apply_processing) {
882
108k
      if (dft_hbe_flag == 1) {
883
0
        WORD32 err_code = 0;
884
0
        ptr_sbr_dec->p_hbe_txposer->oversampling_flag =
885
0
            ptr_frame_data->over_sampling_flag;
886
0
        err_code = ixheaacd_dft_hbe_apply(
887
0
          ptr_sbr_dec->p_hbe_txposer,
888
0
          ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
889
0
          esbr_hbe_delay_offsets,
890
0
          ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
891
0
          esbr_hbe_delay_offsets,
892
0
          ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
893
0
          ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
894
0
          ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
895
0
          ptr_frame_data->pitch_in_bins, (FLOAT32 *)ptr_work_buf_core);
896
0
        if (err_code) return err_code;
897
108k
      } else {
898
108k
          WORD32 err_code = ixheaacd_qmf_hbe_apply(
899
108k
              ptr_sbr_dec->p_hbe_txposer,
900
108k
              ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
901
108k
              esbr_hbe_delay_offsets,
902
108k
              ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
903
108k
              esbr_hbe_delay_offsets,
904
108k
              ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
905
108k
              ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
906
108k
              ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
907
108k
              ptr_frame_data->pitch_in_bins, ptr_header_data);
908
108k
          if (err_code) return err_code;
909
910
108k
        if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
911
18.6k
          ixheaacd_hbe_repl_spec(
912
18.6k
              &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
913
18.6k
              ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
914
18.6k
              ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
915
18.6k
              ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
916
18.6k
              ptr_sbr_dec->p_hbe_txposer->max_stretch);
917
18.6k
        }
918
108k
      }
919
108k
    }
920
164k
    if (!mps_sbr_flag && apply_processing) {
921
105k
      err_code = ixheaacd_generate_hf(ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
922
105k
                                      ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
923
105k
                                      ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
924
105k
                                      ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
925
105k
                                      ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
926
105k
                                      ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
927
105k
                                      ptr_frame_data, ptr_header_data, ldmps_present,
928
105k
                                      ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
929
105k
      if (err_code) return err_code;
930
931
105k
      ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac;
932
933
105k
      if (sbr_mode == PVC_SBR) {
934
46.9k
        ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
935
46.9k
        if (ec_flag) {
936
0
          ptr_pvc_data->pvc_mode = 1;
937
0
        }
938
46.9k
        err_code = ixheaacd_pvc_process(
939
46.9k
            ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start,
940
46.9k
            ptr_frame_data->str_pvc_frame_info.border_vec[0],
941
46.9k
            &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]);
942
943
46.9k
        if (err_code) return err_code;
944
945
46.9k
        ptr_pvc_data->prev_pvc_flg = 1;
946
58.4k
      } else {
947
58.4k
        memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32));
948
58.4k
        ptr_pvc_data->prev_pvc_flg = 0;
949
58.4k
      }
950
951
105k
      ptr_pvc_data->prev_first_bnd_idx =
952
105k
          ptr_header_data->pstr_freq_band_data->sub_band_start;
953
105k
      ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate;
954
955
105k
      ptr_frame_data->pstr_sbr_header = ptr_header_data;
956
105k
      err_code = ixheaacd_sbr_env_calc(
957
105k
          ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
958
105k
          ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
959
105k
          ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
960
105k
          ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
961
105k
          (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
962
105k
          ptr_sbr_dec->scratch_buff, pvc_dec_out_buf, ldmps_present, ec_flag);
963
964
105k
      if (err_code) return err_code;
965
966
105k
    } else {
967
3.85M
      for (i = 0; i < 64; i++) {
968
3.79M
        memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32));
969
3.79M
        memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
970
3.79M
      }
971
59.3k
    }
972
973
164k
    if (!mps_sbr_flag) {
974
109k
      ptr_sbr_dec->band_count =
975
109k
          ptr_header_data->pstr_freq_band_data->sub_band_end;
976
109k
    } else
977
54.7k
      ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
978
979
164k
    ixheaacd_esbr_synthesis_filt_block(
980
164k
        ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
981
164k
        pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
982
164k
        mps_sbr_flag, ch_fac,
983
164k
        ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps),
984
164k
        0, ptr_ps_dec, drc_on, drc_sbr_factors);
985
986
164k
    if (ptr_header_data->enh_sbr_ps || ptr_header_data->channel_mode == PS_STEREO) {
987
7.13k
      pp_qmf_buf_real = ptr_ps_dec->pp_qmf_buf_real[1];
988
7.13k
      pp_qmf_buf_imag = ptr_ps_dec->pp_qmf_buf_imag[1];
989
7.13k
      ixheaacd_esbr_synthesis_filt_block(
990
7.13k
          (ia_sbr_dec_struct *)
991
7.13k
          (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_channel[1]->str_sbr_dec)),
992
7.13k
          (ia_sbr_header_data_struct *)
993
7.13k
          (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_header[1])),
994
7.13k
          (ia_sbr_frame_info_data_struct *)
995
7.13k
          (&(((ia_handle_sbr_dec_inst_struct)self)->frame_buffer[1])), apply_processing,
996
7.13k
          pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr,
997
7.13k
          mps_sbr_flag, ch_fac,
998
7.13k
          ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps),
999
7.13k
          1, ptr_ps_dec, drc_on, drc_sbr_factors);
1000
7.13k
    }
1001
164k
    if (apply_processing && ec_flag) {
1002
0
      WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
1003
0
      ptr_frame_data_prev->end_position =
1004
0
          border_vec[ptr_frame_data->str_frame_info_details.num_env];
1005
0
    }
1006
164k
    ptr_frame_data->prev_sbr_mode = sbr_mode;
1007
1008
164k
    return 0;
1009
164k
  }
1010
1011
33.4k
  if (ldmps_present) {
1012
3.38k
    if (ptr_sbr_dec->str_codec_qmf_bank.no_channels > 32) {
1013
24
      if (ec_flag) {
1014
0
        ptr_sbr_dec->str_codec_qmf_bank.no_channels = 32;
1015
24
      } else {
1016
24
        return IA_FATAL_ERROR;
1017
24
      }
1018
24
    }
1019
3.36k
    ixheaacd_cplx_anal_qmffilt_32(
1020
3.36k
        (WORD32 *)ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact,
1021
3.36k
        &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay],
1022
3.36k
        &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr,
1023
3.36k
        ch_fac, 1);
1024
30.0k
  } else {
1025
30.0k
    ixheaacd_cplx_anal_qmffilt(
1026
30.0k
        ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, &p_arr_qmf_buf_real[op_delay],
1027
30.0k
        &p_arr_qmf_buf_imag[op_delay], &ptr_sbr_dec->str_codec_qmf_bank,
1028
30.0k
        sbr_tables_ptr->qmf_dec_tables_ptr, ch_fac, low_pow_flag, audio_object_type);
1029
30.0k
  }
1030
1031
33.3k
  if (ldmps_present == 1) {
1032
3.36k
    for (j = SBR_HF_ADJ_OFFSET;
1033
56.6k
         j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + SBR_HF_ADJ_OFFSET;
1034
53.2k
         j++) {
1035
3.46M
      for (k = 0; k < 64; k++) {
1036
3.41M
        WORD32 scale = 7;
1037
3.41M
        ptr_sbr_dec->mps_qmf_buf_real[j][k] = 0.0f;
1038
3.41M
        ptr_sbr_dec->mps_qmf_buf_imag[j][k] = 0.0f;
1039
3.41M
        if (k < ptr_sbr_dec->str_codec_qmf_bank.usb) {
1040
1.29M
          ptr_sbr_dec->mps_qmf_buf_real[j][k] +=
1041
1.29M
              (FLOAT32)(p_arr_qmf_buf_real[j][k] / (FLOAT32)(1 << scale));
1042
1.29M
          ptr_sbr_dec->mps_qmf_buf_imag[j][k] +=
1043
1.29M
              (FLOAT32)(p_arr_qmf_buf_imag[j][k] / (FLOAT32)(1 << scale));
1044
1.29M
        }
1045
3.41M
      }
1046
53.2k
    }
1047
3.36k
  }
1048
  /*ITTIAM : the size of real and img coeff are not same as that of the mps
1049
   * analysis.*/
1050
33.3k
  {
1051
33.3k
    WORD shift1, shift2;
1052
33.3k
    WORD min_shift;
1053
33.3k
    WORD shift_over;
1054
33.3k
    WORD reserve_ov1, reserve_ov2;
1055
33.3k
    WORD reservea[2];
1056
33.3k
    WORD i = 0;
1057
33.3k
    WORD usb = ptr_sbr_dec->str_codec_qmf_bank.usb;
1058
33.3k
    WORD iter_val = 1;
1059
33.3k
    if (audio_object_type == AOT_ER_AAC_ELD ||
1060
33.3k
        audio_object_type == AOT_ER_AAC_LD) {
1061
33.3k
      iter_val = 0;
1062
33.3k
    }
1063
33.3k
    do {
1064
33.3k
      WORD t1 = op_delay;
1065
33.3k
      WORD t2 = no_bins + op_delay;
1066
33.3k
      if (i) {
1067
0
        t1 = 0;
1068
0
        t2 = op_delay;
1069
0
      }
1070
33.3k
      reservea[i] = (*ixheaacd_ixheaacd_expsubbandsamples)(
1071
33.3k
          p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, t1, t2, low_pow_flag);
1072
33.3k
      i++;
1073
33.3k
    } while (i <= iter_val);
1074
33.3k
    ;
1075
1076
33.3k
    reserve = reservea[0];
1077
33.3k
    if (audio_object_type != AOT_ER_AAC_ELD &&
1078
0
        audio_object_type != AOT_ER_AAC_LD)
1079
0
      reserve_ov1 = reservea[1];
1080
33.3k
    else
1081
33.3k
      reserve_ov1 = reserve;
1082
33.3k
    ptr_sbr_dec->max_samp_val = ixheaac_min32(reserve, reserve_ov1);
1083
1084
33.3k
    reserve_ov2 = (*ixheaacd_ixheaacd_expsubbandsamples)(
1085
33.3k
        ptr_sbr_dec->str_hf_generator.lpc_filt_states_real,
1086
33.3k
        ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, 0, usb, 0,
1087
33.3k
        LPC_ORDER, low_pow_flag);
1088
1089
33.3k
    reserve_ov1 = ixheaac_min32(reserve_ov1, reserve_ov2);
1090
1091
33.3k
    shift1 = ptr_sbr_dec->str_sbr_scale_fact.lb_scale + reserve;
1092
1093
33.3k
    shift2 = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale + reserve_ov1;
1094
33.3k
    min_shift = ixheaac_min32(shift1, shift2);
1095
33.3k
    shift_over = (shift2 - min_shift);
1096
33.3k
    reserve -= (shift1 - min_shift);
1097
1098
33.3k
    ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale += (reserve_ov1 - shift_over);
1099
1100
33.3k
    (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, 0,
1101
33.3k
                             op_delay, reserve_ov1 - shift_over, low_pow_flag);
1102
1103
33.3k
    (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb,
1104
33.3k
                             op_delay, (no_bins + op_delay), reserve,
1105
33.3k
                             low_pow_flag);
1106
1107
33.3k
    (*ixheaacd_adjust_scale)(ptr_sbr_dec->str_hf_generator.lpc_filt_states_real,
1108
33.3k
                             ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag,
1109
33.3k
                             0, usb, 0, LPC_ORDER, reserve_ov1 - shift_over,
1110
33.3k
                             low_pow_flag);
1111
1112
33.3k
    ptr_sbr_dec->str_sbr_scale_fact.lb_scale += reserve;
1113
1114
33.3k
    save_lb_scale = ptr_sbr_dec->str_sbr_scale_fact.lb_scale;
1115
33.3k
  }
1116
1117
33.3k
  {
1118
33.3k
    WORD32 num = no_bins;
1119
33.3k
    WORD32 *p_loc_qmf_real =
1120
33.3k
        &p_arr_qmf_buf_real[op_delay][NO_ANALYSIS_CHANNELS];
1121
1122
33.3k
    if (!low_pow_flag) {
1123
33.3k
      num = num << 1;
1124
33.3k
    }
1125
1126
33.3k
    ixheaacd_clr_subsamples(p_loc_qmf_real, num - 1, (NO_SYN_ANA_CHANNELS));
1127
33.3k
  }
1128
1129
33.3k
  if (apply_processing) {
1130
33.3k
    WORD16 degree_alias[NO_SYNTHESIS_CHANNELS];
1131
33.3k
    WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec;
1132
1133
33.3k
    if (low_pow_flag) {
1134
0
      memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16));
1135
0
    }
1136
1137
33.3k
    if (low_pow_flag) {
1138
0
      WORD32 com_low_band_scale;
1139
0
      ixheaacd_low_pow_hf_generator(
1140
0
          &ptr_sbr_dec->str_hf_generator, p_arr_qmf_buf_real, degree_alias,
1141
0
          border_vec[0] * ptr_header_data->time_step,
1142
0
          ptr_header_data->time_step *
1143
0
              ixheaac_sub16_sat(
1144
0
                  border_vec[ptr_frame_data->str_frame_info_details.num_env],
1145
0
                  ptr_header_data->num_time_slots),
1146
0
          ptr_header_data->pstr_freq_band_data->num_if_bands,
1147
0
          ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
1148
0
          ptr_frame_data_prev->sbr_invf_mode, ptr_sbr_dec->max_samp_val,
1149
0
          ptr_work_buf_core);
1150
1151
0
      com_low_band_scale =
1152
0
          ixheaac_min32(ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale,
1153
0
                         ptr_sbr_dec->str_sbr_scale_fact.lb_scale);
1154
1155
0
      ptr_sbr_dec->str_sbr_scale_fact.hb_scale =
1156
0
          (WORD16)(com_low_band_scale - 2);
1157
33.3k
    } else {
1158
33.3k
      if (ldmps_present == 1) {
1159
3.36k
        err_code = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + (SBR_HF_ADJ_OFFSET),
1160
3.36k
                                        ptr_sbr_dec->mps_qmf_buf_imag + (SBR_HF_ADJ_OFFSET),
1161
3.36k
                                        ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET),
1162
3.36k
                                        ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET),
1163
3.36k
                                        ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
1164
3.36k
                                        ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
1165
3.36k
                                        ptr_frame_data, ptr_header_data, ldmps_present,
1166
3.36k
                                        ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
1167
3.36k
        if (err_code) return err_code;
1168
30.0k
      } else {
1169
30.0k
        ixheaacd_hf_generator(
1170
30.0k
            &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact,
1171
30.0k
            p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step,
1172
30.0k
            border_vec[0],
1173
30.0k
            ixheaac_sub16_sat(
1174
30.0k
                border_vec[ptr_frame_data->str_frame_info_details.num_env],
1175
30.0k
                ptr_header_data->num_time_slots),
1176
30.0k
            ptr_header_data->pstr_freq_band_data->num_if_bands,
1177
30.0k
            ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode,
1178
30.0k
            ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core,
1179
30.0k
            audio_object_type);
1180
30.0k
      }
1181
33.3k
    }
1182
33.3k
    if (ldmps_present == 1) {
1183
3.36k
      ptr_frame_data->pstr_sbr_header = ptr_header_data;
1184
3.36k
      err_code = ixheaacd_sbr_env_calc(
1185
3.36k
          ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET),
1186
3.36k
          ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET),
1187
3.36k
          ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET),
1188
3.36k
          ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, ptr_sbr_dec->scratch_buff,
1189
3.36k
          pvc_dec_out_buf, ldmps_present, ec_flag);
1190
1191
63.3k
      for (j = 0; j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + 2; j++) {
1192
2.44M
        for (k = ptr_sbr_dec->str_codec_qmf_bank.usb; k < 64; k++) {
1193
2.38M
          ptr_sbr_dec->mps_qmf_buf_real[j][k] +=
1194
2.38M
              ptr_sbr_dec->sbr_qmf_out_real[j][k];
1195
2.38M
          ptr_sbr_dec->mps_qmf_buf_imag[j][k] +=
1196
2.38M
              ptr_sbr_dec->sbr_qmf_out_imag[j][k];
1197
2.38M
        }
1198
59.9k
      }
1199
30.0k
    } else {
1200
30.0k
      err_code = ixheaacd_calc_sbrenvelope(
1201
30.0k
          &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env,
1202
30.0k
          ptr_header_data, ptr_frame_data, ptr_frame_data_prev,
1203
30.0k
          p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag,
1204
30.0k
          sbr_tables_ptr, pstr_common_tables,
1205
30.0k
          ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)),
1206
30.0k
          audio_object_type);
1207
30.0k
      if (err_code) return err_code;
1208
30.0k
    }
1209
1210
33.3k
    memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode,
1211
33.3k
           ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32));
1212
1213
33.3k
    ptr_frame_data_prev->coupling_mode = ptr_frame_data->coupling_mode;
1214
33.3k
    ptr_frame_data_prev->max_qmf_subband_aac =
1215
33.3k
        ptr_frame_data->max_qmf_subband_aac;
1216
33.3k
    ptr_frame_data_prev->end_position =
1217
33.3k
        border_vec[ptr_frame_data->str_frame_info_details.num_env];
1218
33.3k
    ptr_frame_data_prev->amp_res = ptr_frame_data->amp_res;
1219
33.3k
  } else {
1220
0
    ptr_sbr_dec->str_sbr_scale_fact.hb_scale = save_lb_scale;
1221
0
  }
1222
1223
33.3k
  if (!low_pow_flag) {
1224
100k
    for (i = 0; i < LPC_ORDER; i++) {
1225
66.7k
      WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0];
1226
66.7k
      WORD32 *p_loc_qmf_imag = &p_arr_qmf_buf_imag[no_bins - LPC_ORDER + i][0];
1227
66.7k
      WORD32 *plpc_filt_states_real =
1228
66.7k
          &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0];
1229
66.7k
      WORD32 *plpc_filt_states_imag =
1230
66.7k
          &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[i][0];
1231
1232
66.7k
      memcpy(plpc_filt_states_real, p_loc_qmf_real,
1233
66.7k
             sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
1234
66.7k
      memcpy(plpc_filt_states_imag, p_loc_qmf_imag,
1235
66.7k
             sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
1236
66.7k
    }
1237
33.3k
  } else {
1238
0
    for (i = 0; i < LPC_ORDER; i++) {
1239
0
      WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0];
1240
0
      WORD32 *plpc_filt_states_real =
1241
0
          &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0];
1242
0
      memcpy(plpc_filt_states_real, p_loc_qmf_real,
1243
0
             sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb));
1244
0
    }
1245
0
  }
1246
1247
33.3k
  if (apply_processing && ptr_header_data->channel_mode == PS_STEREO &&
1248
930
      ((audio_object_type != AOT_ER_AAC_ELD) &&
1249
0
       (audio_object_type != AOT_ER_AAC_LD))) {
1250
0
    WORD32 ps_scale;
1251
1252
0
    ixheaacd_init_ps_scale(ptr_ps_dec, &ptr_sbr_dec->str_sbr_scale_fact);
1253
1254
0
    ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
1255
0
                               ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag,
1256
0
                               &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data,
1257
0
                               &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec,
1258
0
                               1, 0, sbr_tables_ptr, pstr_common_tables, ch_fac,
1259
0
                               drc_on, drc_sbr_factors, audio_object_type);
1260
1261
0
    ps_scale = ptr_sbr_dec->str_sbr_scale_fact.ps_scale;
1262
0
    ptr_sbr_sf_r->ov_lb_scale = ps_scale;
1263
0
    ptr_sbr_sf_r->lb_scale = ps_scale;
1264
0
    ptr_sbr_sf_r->hb_scale = ps_scale;
1265
1266
0
    ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
1267
0
                               ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag,
1268
0
                               ptr_sbr_sf_r, ptr_time_data + 1,
1269
0
                               ptr_qmf_synth_bank_r, ptr_ps_dec, 0, 0,
1270
0
                               sbr_tables_ptr, pstr_common_tables, ch_fac,
1271
0
                               drc_on, drc_sbr_factors, audio_object_type);
1272
33.3k
  } else {
1273
33.3k
    ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay,
1274
33.3k
                               ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag,
1275
33.3k
                               &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data,
1276
33.3k
                               &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec,
1277
33.3k
                               0, low_pow_flag, sbr_tables_ptr,
1278
33.3k
                               pstr_common_tables, ch_fac, drc_on,
1279
33.3k
                               drc_sbr_factors, audio_object_type);
1280
33.3k
  }
1281
1282
33.3k
  {
1283
33.3k
    WORD32 num = op_delay;
1284
33.3k
    if (audio_object_type != AOT_ER_AAC_ELD) {
1285
0
      WORD32 *p_loc_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf;
1286
0
      WORD32 *p_loc_qmf_real_1 = &p_arr_qmf_buf_real[no_bins][0];
1287
0
      memcpy(p_loc_qmf_real, p_loc_qmf_real_1,
1288
0
             sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num);
1289
0
    }
1290
1291
33.3k
    if (!low_pow_flag) {
1292
33.3k
      num = num << 1;
1293
33.3k
    }
1294
1295
33.3k
    if (ldmps_present == 1) {
1296
3.36k
      memmove(&ptr_sbr_dec->mps_qmf_buf_real[0][0],
1297
3.36k
              &ptr_sbr_dec->mps_qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank
1298
3.36k
                                                 .num_time_slots][0],
1299
3.36k
              SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64);
1300
1301
3.36k
      memmove(&ptr_sbr_dec->mps_qmf_buf_imag[0][0],
1302
3.36k
              &ptr_sbr_dec->mps_qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank
1303
3.36k
                                                 .num_time_slots][0],
1304
3.36k
              SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64);
1305
3.36k
    }
1306
33.3k
  }
1307
1308
33.3k
  ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale;
1309
33.3k
  return 0;
1310
33.3k
}
1311
1312
WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec,
1313
                         ia_sbr_header_data_struct *ptr_header_data,
1314
                         ia_sbr_frame_info_data_struct *ptr_frame_data,
1315
                         FLAG apply_processing, FLAG low_pow_flag,
1316
17.9k
                         ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) {
1317
17.9k
  WORD32 i;
1318
17.9k
  WORD32 op_delay;
1319
1320
17.9k
  WORD32 codec_x_delay = 0;
1321
1322
17.9k
  FLOAT32 **pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real;
1323
17.9k
  FLOAT32 **pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag;
1324
1325
17.9k
  WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
1326
1327
17.9k
  WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
1328
17.9k
  WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx;
1329
17.9k
  WORD32 hbe_flag = ptr_header_data->hbe_flag;
1330
17.9k
  WORD32 sbr_mode = ptr_frame_data->sbr_mode;
1331
1332
17.9k
  op_delay = 6;
1333
17.9k
  if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
1334
8.60k
    op_delay = 2 * 6;
1335
8.60k
  }
1336
1337
17.9k
  ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0;
1338
17.9k
  {
1339
17.9k
    if (hbe_flag) {
1340
10.7k
      codec_x_delay = 32;
1341
10.7k
    }
1342
17.9k
    if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
1343
8.60k
      codec_x_delay = 2 * codec_x_delay;
1344
8.60k
    }
1345
1346
17.9k
    memmove(
1347
17.9k
        &ptr_sbr_dec->qmf_buf_real[0][0],
1348
17.9k
        &ptr_sbr_dec
1349
17.9k
             ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
1350
17.9k
        (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
1351
17.9k
    memmove(
1352
17.9k
        &ptr_sbr_dec->qmf_buf_imag[0][0],
1353
17.9k
        &ptr_sbr_dec
1354
17.9k
             ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0],
1355
17.9k
        (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64);
1356
1357
17.9k
    memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0],
1358
17.9k
            &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank
1359
17.9k
                                               .num_time_slots][0],
1360
17.9k
            (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
1361
17.9k
    memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0],
1362
17.9k
            &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank
1363
17.9k
                                               .num_time_slots][0],
1364
17.9k
            (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64);
1365
1366
17.9k
    if (hbe_flag) {
1367
10.7k
      memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0],
1368
10.7k
              &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank
1369
10.7k
                                                  .num_time_slots][0],
1370
10.7k
              64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
1371
10.7k
      memmove(ptr_sbr_dec->ph_vocod_qmf_imag,
1372
10.7k
              ptr_sbr_dec->ph_vocod_qmf_imag +
1373
10.7k
                  ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
1374
10.7k
              64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET));
1375
10.7k
    }
1376
17.9k
  }
1377
1378
17.9k
  ixheaacd_esbr_analysis_filt_block(
1379
17.9k
      ptr_sbr_dec, ptr_sbr_tables,
1380
17.9k
      op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET);
1381
1382
17.9k
  if (hbe_flag) {
1383
10.7k
    WORD32 err = ixheaacd_qmf_hbe_apply(
1384
10.7k
        ptr_sbr_dec->p_hbe_txposer,
1385
10.7k
        ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) +
1386
10.7k
            ESBR_HBE_DELAY_OFFSET,
1387
10.7k
        ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) +
1388
10.7k
            ESBR_HBE_DELAY_OFFSET,
1389
10.7k
        ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
1390
10.7k
        ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
1391
10.7k
        ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
1392
10.7k
        ptr_frame_data->pitch_in_bins, ptr_header_data);
1393
10.7k
    if (err) return err;
1394
1395
10.7k
    if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) {
1396
8.60k
      ixheaacd_hbe_repl_spec(
1397
8.60k
          &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0],
1398
8.60k
          ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET),
1399
8.60k
          ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET),
1400
8.60k
          ptr_sbr_dec->str_codec_qmf_bank.num_time_slots,
1401
8.60k
          ptr_sbr_dec->p_hbe_txposer->max_stretch);
1402
8.60k
    }
1403
10.7k
  }
1404
17.9k
  ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag);
1405
1406
1.16M
  for (i = 0; i < 64; i++) {
1407
1.14M
    memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32));
1408
1.14M
    memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32));
1409
1.14M
  }
1410
1411
17.9k
  ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
1412
1413
17.9k
  ixheaacd_esbr_synthesis_filt_block(
1414
17.9k
      ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing,
1415
17.9k
      pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables,
1416
17.9k
      mps_sbr_flag, ch_fac, 0, 0, NULL, 0, NULL);
1417
1418
17.9k
  ptr_frame_data->prev_sbr_mode = sbr_mode;
1419
17.9k
  return 0;
1420
17.9k
}
1421
1422
WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, VOID *p_sbr_frame,
1423
109k
                                 VOID *p_sbr_header, WORD32 ec_flag) {
1424
109k
  WORD32 i, k;
1425
109k
  ia_sbr_frame_info_data_struct *ptr_frame_data =
1426
109k
      (ia_sbr_frame_info_data_struct *)p_sbr_frame;
1427
109k
  ia_sbr_header_data_struct *ptr_header_data =
1428
109k
      (ia_sbr_header_data_struct *)p_sbr_header;
1429
109k
  ia_sbr_dec_struct *ptr_sbr_dec = (ia_sbr_dec_struct *)p_sbr_dec;
1430
109k
  ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1431
109k
  WORD32 no_bins;
1432
109k
  WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx;
1433
109k
  WORD32 op_delay = 6 + SBR_HF_ADJ_OFFSET;
1434
109k
  WORD32 num_anal_bands = 40;
1435
109k
  WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag;
1436
109k
  WORD32 err = 0;
1437
1438
109k
  if (ptr_header_data->is_usf_4) {
1439
27.2k
    op_delay += 6;
1440
27.2k
  }
1441
1442
109k
  num_anal_bands = num_anal_bands - (upsample_ratio_idx << 3);
1443
1444
109k
  if (!mps_sbr_flag) {
1445
54.4k
    return 0;
1446
54.6k
  } else {
1447
54.6k
    ptr_frame_data->cov_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels;
1448
54.6k
  }
1449
1450
54.6k
  no_bins = ptr_header_data->output_framesize / 64;
1451
1452
2.12M
  for (i = 0; i < no_bins; i++) {
1453
2.07M
    FLOAT32 *p_loc_mps_qmf_output =
1454
2.07M
        p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
1455
40.9M
    for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
1456
38.8M
      ptr_sbr_dec->mps_qmf_buf_real[op_delay + i][k] = *p_loc_mps_qmf_output++;
1457
38.8M
      ptr_sbr_dec->mps_qmf_buf_imag[op_delay + i][k] = *p_loc_mps_qmf_output++;
1458
1459
38.8M
      ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k] =
1460
38.8M
          ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1461
38.8M
      ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k] =
1462
38.8M
          ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1463
38.8M
    }
1464
2.07M
  }
1465
1466
54.6k
  if (ptr_frame_data->reset_flag) {
1467
13.5k
    WORD32 l;
1468
13.5k
    WORD32 start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev;
1469
13.5k
    WORD32 end_band = num_anal_bands;
1470
13.5k
    WORD32 start_slot =
1471
13.5k
        SBR_HF_ADJ_OFFSET + ptr_frame_data->rate * p_frame_info->border_vec[0];
1472
1473
106k
    for (l = start_slot; l < op_delay; l++) {
1474
732k
      for (k = start_band; k < end_band; k++) {
1475
639k
        ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0;
1476
639k
        ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0;
1477
639k
      }
1478
92.8k
    }
1479
1480
40.5k
    for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) {
1481
213k
      for (k = start_band; k < end_band; k++) {
1482
186k
        ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0;
1483
186k
        ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0;
1484
186k
      }
1485
27.0k
    }
1486
13.5k
  }
1487
54.6k
  ptr_header_data->pstr_freq_band_data->qmf_sb_prev =
1488
54.6k
      ptr_header_data->pstr_freq_band_data->sub_band_start;
1489
1490
54.6k
  err = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1491
54.6k
                             ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL,
1492
54.6k
                             ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1493
54.6k
                             ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
1494
54.6k
                             ptr_frame_data, ptr_header_data, 0,
1495
54.6k
                             ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag);
1496
54.6k
  if (err) return err;
1497
1498
54.6k
  ptr_frame_data->pstr_sbr_header = ptr_header_data;
1499
54.6k
  ptr_frame_data->sbr_mode = ORIG_SBR;
1500
54.6k
  ptr_frame_data->prev_sbr_mode = ORIG_SBR;
1501
54.6k
  err = ixheaacd_sbr_env_calc(
1502
54.6k
      ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1503
54.6k
      ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
1504
54.6k
      ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET,
1505
54.6k
      ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET,
1506
54.6k
      (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf,
1507
54.6k
      ptr_sbr_dec->scratch_buff, NULL, 0, ec_flag);
1508
1509
54.6k
  if (err) return err;
1510
2.12M
  for (i = 0; i < no_bins; i++) {
1511
2.07M
    FLOAT32 *p_loc_mps_qmf_output =
1512
2.07M
        p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2);
1513
40.9M
    for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) {
1514
38.8M
      *p_loc_mps_qmf_output++ =
1515
38.8M
          ptr_sbr_dec->mps_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1516
38.8M
      *p_loc_mps_qmf_output++ =
1517
38.8M
          ptr_sbr_dec->mps_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
1518
38.8M
    }
1519
95.7M
    for (k = ptr_header_data->pstr_freq_band_data->sub_band_start; k < 64;
1520
93.6M
         k++) {
1521
93.6M
      *p_loc_mps_qmf_output++ =
1522
93.6M
          ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k];
1523
93.6M
      *p_loc_mps_qmf_output++ =
1524
93.6M
          ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k];
1525
93.6M
    }
1526
2.07M
  }
1527
1528
552k
  for (i = 0; i < op_delay; i++) {
1529
497k
    memmove(ptr_sbr_dec->mps_qmf_buf_real[i],
1530
497k
            ptr_sbr_dec->mps_qmf_buf_real[no_bins + i], 64 * sizeof(FLOAT32));
1531
1532
497k
    memmove(ptr_sbr_dec->mps_qmf_buf_imag[i],
1533
497k
            ptr_sbr_dec->mps_qmf_buf_imag[no_bins + i], 64 * sizeof(FLOAT32));
1534
1535
497k
    memmove(ptr_sbr_dec->mps_sbr_qmf_buf_real[i],
1536
497k
            ptr_sbr_dec->mps_sbr_qmf_buf_real[no_bins + i],
1537
497k
            64 * sizeof(FLOAT32));
1538
1539
497k
    memmove(ptr_sbr_dec->mps_sbr_qmf_buf_imag[i],
1540
497k
            ptr_sbr_dec->mps_sbr_qmf_buf_imag[no_bins + i],
1541
497k
            64 * sizeof(FLOAT32));
1542
497k
  }
1543
1544
54.6k
  ptr_frame_data->reset_flag = 0;
1545
54.6k
  return err;
1546
54.6k
}