Coverage Report

Created: 2025-08-03 06:57

/src/libxaac/encoder/ixheaace_sbr_env_est.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2023 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
21
#include <string.h>
22
#include <math.h>
23
#include <limits.h>
24
25
#include "ixheaac_type_def.h"
26
#include "ixheaac_constants.h"
27
#include "ixheaace_aac_constants.h"
28
#include "ixheaac_error_standards.h"
29
#include "ixheaace_error_codes.h"
30
#include "ixheaac_basic_ops32.h"
31
#include "ixheaac_basic_ops16.h"
32
#include "ixheaac_basic_ops40.h"
33
#include "ixheaac_basic_ops.h"
34
35
#include "ixheaace_sbr_header.h"
36
#include "ixheaace_sbr_def.h"
37
#include "ixheaace_resampler.h"
38
39
#include "ixheaace_sbr_rom.h"
40
#include "ixheaace_common_rom.h"
41
#include "ixheaace_sbr_hbe.h"
42
#include "ixheaace_sbr_qmf_enc.h"
43
#include "ixheaace_sbr_tran_det.h"
44
#include "ixheaace_sbr_frame_info_gen.h"
45
#include "ixheaace_sbr_env_est.h"
46
#include "ixheaace_sbr_code_envelope.h"
47
#include "ixheaace_sbr_main.h"
48
#include "ixheaace_sbr_missing_harmonics_det.h"
49
#include "ixheaace_sbr_inv_filtering_estimation.h"
50
#include "ixheaace_sbr_noise_floor_est.h"
51
52
#include "ixheaace_common_rom.h"
53
#include "ixheaace_sbr_ton_corr.h"
54
#include "iusace_esbr_pvc.h"
55
#include "iusace_esbr_inter_tes.h"
56
#include "ixheaace_sbr.h"
57
58
#include "ixheaace_bitbuffer.h"
59
60
#include "ixheaace_sbr_cmondata.h"
61
#include "ixheaace_sbr_write_bitstream.h"
62
63
#include "ixheaace_sbr_hybrid.h"
64
#include "ixheaace_sbr_ps_enc.h"
65
66
#include "ixheaace_common_utils.h"
67
68
#include "ixheaace_sbr_header.h"
69
#include "ixheaace_sbr_def.h"
70
#include "ixheaace_resampler.h"
71
#include "ixheaace_sbr_rom.h"
72
#include "ixheaace_common_rom.h"
73
#include "ixheaace_sbr_hbe.h"
74
#include "ixheaace_sbr_qmf_enc.h"
75
#include "ixheaace_sbr_tran_det.h"
76
#include "ixheaace_sbr_frame_info_gen.h"
77
#include "ixheaace_sbr_env_est.h"
78
#include "ixheaace_sbr_code_envelope.h"
79
#include "ixheaace_psy_const.h"
80
#include "ixheaace_tns.h"
81
#include "ixheaace_tns_params.h"
82
#include "ixheaace_rom.h"
83
#include "ixheaace_common_rom.h"
84
#include "ixheaace_bitbuffer.h"
85
86
#include "ixheaace_sbr_main.h"
87
#include "ixheaace_common_rom.h"
88
#include "ixheaace_sbr_missing_harmonics_det.h"
89
#include "ixheaace_sbr_inv_filtering_estimation.h"
90
#include "ixheaace_sbr_noise_floor_est.h"
91
#include "ixheaace_sbr_ton_corr.h"
92
#include "iusace_esbr_pvc.h"
93
#include "ixheaace_sbr.h"
94
95
#include "ixheaace_sbr_freq_scaling.h"
96
97
#include "ixheaace_bitbuffer.h"
98
99
#include "ixheaace_sbr_hybrid.h"
100
#include "ixheaace_sbr_ps_enc.h"
101
102
#include "ixheaace_sbr_crc.h"
103
#include "ixheaace_sbr_cmondata.h"
104
#include "ixheaace_sbr_enc_struct.h"
105
#include "ixheaace_sbr_write_bitstream.h"
106
107
#include "ixheaace_common_utils.h"
108
109
2.27M
static WORD32 ixheaace_map_panorama(WORD32 nrg_val, WORD32 amp_res, WORD32 *ptr_quant_error) {
110
2.27M
  WORD32 i = 0;
111
2.27M
  ;
112
2.27M
  WORD32 min_val, val;
113
2.27M
  WORD32 pan_tab[2][10] = {{0, 2, 4, 6, 8, 12, 16, 20, 24}, {0, 2, 4, 8, 12}};
114
2.27M
  WORD32 max_index[2] = {9, 5};
115
116
2.27M
  WORD32 pan_index;
117
2.27M
  WORD32 sign;
118
119
2.27M
  sign = nrg_val > 0 ? 1 : -1;
120
121
2.27M
  nrg_val = sign * nrg_val;
122
123
2.27M
  min_val = INT_MAX;
124
2.27M
  pan_index = 0;
125
126
15.3M
  while (i < max_index[amp_res]) {
127
13.0M
    val = ixheaac_abs32(nrg_val - pan_tab[amp_res][i]);
128
13.0M
    if (val < min_val) {
129
2.56M
      min_val = val;
130
2.56M
      pan_index = i;
131
2.56M
    }
132
13.0M
    i++;
133
13.0M
  }
134
135
2.27M
  *ptr_quant_error = min_val;
136
137
2.27M
  return pan_tab[amp_res][max_index[amp_res] - 1] + sign * pan_tab[amp_res][pan_index];
138
2.27M
}
139
140
static VOID ixheaace_sbr_noise_floor_levels_quantisation(WORD32 *ptr_noise_levels,
141
                                                         FLOAT32 *ptr_flt_noise_levels,
142
717k
                                                         WORD32 coupling) {
143
717k
  WORD32 i = 0;
144
717k
  WORD32 dummy;
145
146
7.88M
  while (i < MAXIMUM_NUM_NOISE_VALUES) {
147
7.17M
    WORD32 tmp;
148
149
7.17M
    tmp = ptr_flt_noise_levels[i] > 30.0f ? 30 : (WORD32)(ptr_flt_noise_levels[i] + 0.5f);
150
151
7.17M
    if (coupling) {
152
934k
      tmp = tmp < -30 ? -30 : tmp;
153
934k
      tmp = ixheaace_map_panorama(tmp, 1, &dummy);
154
934k
    }
155
7.17M
    ptr_noise_levels[i] = tmp;
156
157
7.17M
    i++;
158
7.17M
  }
159
717k
}
160
161
static VOID ixheaace_couple_noise_floor(FLOAT32 *ptr_noise_lvl_left,
162
93.4k
                                        FLOAT32 *ptr_noise_lvl_right) {
163
93.4k
  WORD32 i = 0;
164
165
1.02M
  while (i < MAXIMUM_NUM_NOISE_VALUES) {
166
934k
    FLOAT32 pow_left, pow_right;
167
168
934k
    pow_left = (FLOAT32)pow(2.0f, (SBR_NOISE_FLOOR_OFFSET - ptr_noise_lvl_left[i]));
169
934k
    pow_right = (FLOAT32)pow(2.0f, (SBR_NOISE_FLOOR_OFFSET - ptr_noise_lvl_right[i]));
170
171
934k
    ptr_noise_lvl_right[i] -= ptr_noise_lvl_left[i];
172
934k
    ptr_noise_lvl_left[i] =
173
934k
        (FLOAT32)(SBR_NOISE_FLOOR_OFFSET - log((pow_left * pow_right) / 2) * SBR_INV_LOG_2);
174
934k
    i++;
175
934k
  }
176
93.4k
}
177
178
static IA_ERRORCODE ixheaace_calculate_sbr_envelope(
179
    FLOAT32 **ptr_y_buf_left, FLOAT32 **ptr_y_buf_right,
180
    const ixheaace_str_frame_info_sbr *pstr_const_frame_info, WORD32 *ptr_sfb_ene_l,
181
    WORD32 *ptr_sfb_ene_r, ixheaace_pstr_sbr_config_data pstr_sbr_cfg,
182
    ixheaace_pstr_enc_channel pstr_sbr, ixheaace_sbr_stereo_mode stereo_mode,
183
623k
    WORD32 *ptr_max_quant_err) {
184
623k
  WORD32 i, j, k, l, count, m = 0;
185
623k
  WORD32 num_bands, start_pos, stop_pos, li, ui;
186
623k
  ixheaace_freq_res freq_res;
187
188
623k
  WORD32 ca = 2 - pstr_sbr->enc_env_data.init_sbr_amp_res;
189
623k
  WORD32 n_envelopes = pstr_const_frame_info->n_envelopes;
190
623k
  WORD32 short_env = pstr_const_frame_info->short_env - 1;
191
623k
  WORD32 time_step = pstr_sbr->str_sbr_extract_env.time_step;
192
623k
  WORD32 missing_harmonic = 0;
193
194
623k
  if ((ca != 1) && (ca != 2)) {
195
0
    return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_AMP_RES;
196
0
  }
197
198
623k
  if (stereo_mode == SBR_COUPLING) {
199
93.4k
    *ptr_max_quant_err = 0;
200
93.4k
  }
201
202
623k
  i = 0;
203
1.59M
  while (i < n_envelopes) {
204
968k
    start_pos = pstr_const_frame_info->borders[i];
205
968k
    stop_pos = pstr_const_frame_info->borders[i + 1];
206
968k
    freq_res = pstr_const_frame_info->freq_res[i];
207
968k
    num_bands = pstr_sbr_cfg->num_scf[freq_res];
208
209
968k
    if (i == short_env) {
210
125k
      if (pstr_sbr_cfg->is_ld_sbr) {
211
43.1k
        WORD32 temp = 2;
212
43.1k
        if (temp < time_step) {
213
0
          temp = time_step;
214
0
        }
215
43.1k
        if (stop_pos - start_pos > temp) {
216
42.3k
          stop_pos = stop_pos - temp;
217
42.3k
        }
218
82.5k
      } else {
219
82.5k
        stop_pos = stop_pos - 1;
220
82.5k
      }
221
125k
    }
222
11.0M
    for (j = 0; j < num_bands; j++) {
223
10.1M
      FLOAT32 energy_left = 0, energy_right = 0, tmp_ene_l = 0, tmp_ene_r = 0;
224
10.1M
      li = pstr_sbr_cfg->ptr_freq_band_tab[freq_res][j];
225
10.1M
      ui = pstr_sbr_cfg->ptr_freq_band_tab[freq_res][j + 1];
226
227
10.1M
      if ((freq_res == FREQ_RES_HIGH) && (j == 0 && ui - li > 1)) {
228
98.5k
        li++;
229
10.0M
      } else {
230
10.0M
        if (j == 0 && ui - li > 2) {
231
93.3k
          li++;
232
93.3k
        }
233
10.0M
      }
234
235
10.1M
      missing_harmonic = 0;
236
237
10.1M
      if (pstr_sbr->enc_env_data.add_harmonic_flag) {
238
5.26M
        if (freq_res == FREQ_RES_HIGH) {
239
3.73M
          if (pstr_sbr->enc_env_data.add_harmonic[j]) {
240
1.06M
            missing_harmonic = 1;
241
1.06M
          }
242
3.73M
        } else {
243
1.53M
          WORD32 band;
244
1.53M
          WORD32 start_band_high = 0;
245
1.53M
          WORD32 stop_band_high = 0;
246
247
9.59M
          while (pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_HIGH][start_band_high] <
248
9.59M
                 pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_LOW][j]) {
249
8.06M
            start_band_high++;
250
8.06M
          }
251
252
12.6M
          while (pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_HIGH][stop_band_high] <
253
12.6M
                 pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_LOW][j + 1]) {
254
11.1M
            stop_band_high++;
255
11.1M
          }
256
257
4.59M
          for (band = start_band_high; band < stop_band_high; band++) {
258
3.06M
            if (pstr_sbr->enc_env_data.add_harmonic[band]) {
259
780k
              missing_harmonic = 1;
260
780k
            }
261
3.06M
          }
262
1.53M
        }
263
5.26M
      }
264
265
10.1M
      if (missing_harmonic) {
266
1.77M
        count = stop_pos - start_pos;
267
17.8M
        for (l = start_pos; l < stop_pos; l++) {
268
16.0M
          if (pstr_sbr_cfg->is_ld_sbr) {
269
1.70M
            energy_left += ptr_y_buf_left[l >> 1][li];
270
14.3M
          } else {
271
14.3M
            energy_left += ptr_y_buf_left[l][li];
272
14.3M
          }
273
16.0M
        }
274
275
1.77M
        k = li + 1;
276
4.64M
        while (k < ui) {
277
2.87M
          tmp_ene_l = 0.0f;
278
24.6M
          for (l = start_pos; l < stop_pos; l++) {
279
21.7M
            if (pstr_sbr_cfg->is_ld_sbr) {
280
3.46M
              tmp_ene_l += ptr_y_buf_left[l >> 1][k];
281
18.2M
            } else {
282
18.2M
              tmp_ene_l += ptr_y_buf_left[l][k];
283
18.2M
            }
284
21.7M
          }
285
286
2.87M
          if (tmp_ene_l > energy_left) {
287
595k
            energy_left = tmp_ene_l;
288
595k
          }
289
2.87M
          k++;
290
2.87M
        }
291
292
1.77M
        if (ui - li > 2) {
293
662k
          energy_left = energy_left * 0.398107267f;
294
1.10M
        } else {
295
1.10M
          if (ui - li > 1) {
296
786k
            energy_left = energy_left * 0.5f;
297
786k
          }
298
1.10M
        }
299
300
1.77M
        if (stereo_mode == SBR_COUPLING) {
301
2.38M
          for (l = start_pos; l < stop_pos; l++) {
302
2.13M
            if (pstr_sbr_cfg->is_ld_sbr) {
303
334k
              energy_right += ptr_y_buf_right[l >> 1][li];
304
1.79M
            } else {
305
1.79M
              energy_right += ptr_y_buf_right[l][li];
306
1.79M
            }
307
2.13M
          }
308
309
249k
          k = li + 1;
310
680k
          while (k < ui) {
311
430k
            tmp_ene_r = 0.0f;
312
3.69M
            for (l = start_pos; l < stop_pos; l++) {
313
3.26M
              if (pstr_sbr_cfg->is_ld_sbr) {
314
715k
                tmp_ene_r += ptr_y_buf_right[l >> 1][k];
315
2.54M
              } else {
316
2.54M
                tmp_ene_r += ptr_y_buf_right[l][k];
317
2.54M
              }
318
3.26M
            }
319
320
430k
            if (tmp_ene_r > energy_right) {
321
76.6k
              energy_right = tmp_ene_r;
322
76.6k
            }
323
430k
            k++;
324
430k
          }
325
326
249k
          if (ui - li > 2) {
327
100k
            energy_right = energy_right * 0.398107267f;
328
148k
          } else {
329
148k
            if (ui - li > 1) {
330
111k
              energy_right = energy_right * 0.5f;
331
111k
            }
332
148k
          }
333
249k
          tmp_ene_l = energy_left;
334
249k
          energy_left = (energy_left + energy_right) * 0.5f;
335
249k
          energy_right = ((tmp_ene_l * time_step) + 1) / ((energy_right * time_step) + 1);
336
249k
        }
337
8.34M
      } else {
338
8.34M
        count = (stop_pos - start_pos) * (ui - li);
339
340
8.34M
        k = li;
341
29.6M
        while (k < ui) {
342
252M
          for (l = start_pos; l < stop_pos; l++) {
343
231M
            energy_left += ptr_y_buf_left[l][k];
344
231M
          }
345
21.2M
          k++;
346
21.2M
        }
347
348
8.34M
        if (stereo_mode == SBR_COUPLING) {
349
1.08M
          k = li;
350
3.86M
          while (k < ui) {
351
32.2M
            for (l = start_pos; l < stop_pos; l++) {
352
29.4M
              if (pstr_sbr_cfg->is_ld_sbr) {
353
10.3M
                energy_right += ptr_y_buf_right[l >> 1][k];
354
19.1M
              } else {
355
19.1M
                energy_right += ptr_y_buf_right[l][k];
356
19.1M
              }
357
29.4M
            }
358
2.77M
            k++;
359
2.77M
          }
360
1.08M
          tmp_ene_l = energy_left;
361
1.08M
          energy_left = (energy_left + energy_right) * 0.5f;
362
1.08M
          energy_right = ((tmp_ene_l * time_step) + 1) / ((energy_right * time_step) + 1);
363
1.08M
        }
364
8.34M
      }
365
366
10.1M
      energy_left = (FLOAT32)(log((energy_left / (count * 64)) + EPS) * SBR_INV_LOG_2);
367
368
10.1M
      if (energy_left < 0.0f) {
369
3.48M
        energy_left = 0.0f;
370
3.48M
      }
371
372
10.1M
      ptr_sfb_ene_l[m] = (WORD32)(ca * energy_left + 0.5);
373
374
10.1M
      if (stereo_mode == SBR_COUPLING) {
375
1.33M
        WORD32 quant_err;
376
1.33M
        energy_right = (FLOAT32)(log(energy_right) * SBR_INV_LOG_2);
377
1.33M
        ptr_sfb_ene_r[m] =
378
1.33M
            ixheaace_map_panorama((WORD32)((FLOAT32)ca * energy_right),
379
1.33M
                                  pstr_sbr->enc_env_data.init_sbr_amp_res, &quant_err);
380
1.33M
        if (quant_err > *ptr_max_quant_err) {
381
21.6k
          *ptr_max_quant_err = quant_err;
382
21.6k
        }
383
1.33M
      }
384
10.1M
      m++;
385
10.1M
    }
386
387
968k
    if (pstr_sbr_cfg->use_parametric_coding) {
388
726k
      m -= num_bands;
389
390
9.28M
      for (j = 0; j < num_bands; j++) {
391
8.55M
        if (freq_res == FREQ_RES_HIGH && pstr_sbr->str_sbr_extract_env.envelope_compensation[j]) {
392
405k
          ptr_sfb_ene_l[m] -=
393
405k
              (WORD32)(ca *
394
405k
                       ixheaac_abs32(pstr_sbr->str_sbr_extract_env.envelope_compensation[j]));
395
405k
        }
396
397
8.55M
        if (ptr_sfb_ene_l[m] < 0) {
398
185k
          ptr_sfb_ene_l[m] = 0;
399
185k
        }
400
8.55M
        m++;
401
8.55M
      }
402
726k
    }
403
968k
    i++;
404
968k
  }
405
623k
  return IA_NO_ERROR;
406
623k
}
407
static WORD32 ixheaace_get_pitch_bin_deint(FLOAT32 *ptr_fft_data_real, FLOAT32 *ptr_fft_data_im,
408
47.9k
                                           const WORD32 *ptr_sfb_tab, WORD32 is_4_1) {
409
47.9k
  WORD32 i, j = 0, k = 0;
410
47.9k
  WORD32 bin = -1;
411
47.9k
  FLOAT32 tmp, prev_val = 0.0f;
412
413
219k
  while (ptr_sfb_tab[j] != -1) {
414
214k
    WORD32 size = ptr_sfb_tab[j];
415
214k
    tmp = 0;
416
417
7.53M
    for (i = 0; i < size; i++) {
418
7.32M
      tmp += ptr_fft_data_real[k / 2] * ptr_fft_data_real[k / 2];
419
7.32M
      tmp += ptr_fft_data_im[k / 2] * ptr_fft_data_im[k / 2];
420
7.32M
      k += 2;
421
7.32M
    }
422
423
214k
    tmp = (FLOAT32)log(max(MIN_FLT_VAL, (tmp / (FLOAT32)size)));
424
214k
    if (j != 0) {
425
166k
      if (fabs(tmp - prev_val) >= 3.0f) {
426
42.3k
        if (1 == is_4_1) {
427
42.3k
          bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 8;
428
42.3k
        } else {
429
0
          bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 4;
430
0
        }
431
42.3k
        if (bin > 127) {
432
444
          bin = -1;
433
444
        }
434
42.3k
        break;
435
42.3k
      }
436
166k
    }
437
171k
    prev_val = tmp;
438
171k
    j++;
439
171k
  }
440
441
47.9k
  return bin;
442
47.9k
}
443
static WORD32 ixheaace_get_pitch_bin(FLOAT32 *fft_data, const WORD32 *ptr_sfb_tab,
444
156k
                                     WORD32 is_4_1) {
445
156k
  WORD32 i, j = 0, k = 0;
446
156k
  WORD32 bin = -1;
447
156k
  FLOAT32 tmp, prev_val = 0;
448
449
926k
  while (ptr_sfb_tab[j] != -1) {
450
900k
    WORD32 size = ptr_sfb_tab[j];
451
900k
    tmp = 0;
452
453
31.1M
    for (i = 0; i < size; i++) {
454
30.2M
      tmp += fft_data[k] * fft_data[k];
455
30.2M
      tmp += fft_data[k + 1] * fft_data[k + 1];
456
30.2M
      k += 2;
457
30.2M
    }
458
459
900k
    tmp = (FLOAT32)log(MAX(MIN_FLT_VAL, (tmp / (FLOAT32)size)));
460
900k
    if (j != 0) {
461
743k
      if (fabs(tmp - prev_val) >= 3.0f) {
462
130k
        if (1 == is_4_1) {
463
0
          bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 8;
464
130k
        } else {
465
130k
          bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 4;
466
130k
        }
467
130k
        if (bin > 127) {
468
2.04k
          bin = -1;
469
2.04k
        }
470
130k
        break;
471
130k
      }
472
743k
    }
473
769k
    prev_val = tmp;
474
769k
    j++;
475
769k
  }
476
477
156k
  return bin;
478
156k
}
479
static IA_ERRORCODE ixheaace_hbe_get_pitch_bins(FLOAT32 *ptr_time_in,
480
                                                ixheaace_pstr_sbr_config_data pstr_sbr_cfg,
481
                                                FLOAT32 *ptr_esbr_scr,
482
                                                ixheaace_str_sbr_tabs *ptr_sbr_tab,
483
                                                WORD32 time_sn_stride, WORD32 num_samples,
484
91.4k
                                                WORD32 *bin1, WORD32 *bin2) {
485
91.4k
  const WORD32 *ptr_sbr_table = NULL;
486
91.4k
  FLOAT32 *ptr_esbr_inp = ptr_esbr_scr;
487
91.4k
  ptr_esbr_scr += num_samples * 2;
488
91.4k
  FLOAT32 *ptr_esbr_inp_i = ptr_esbr_inp + num_samples;
489
91.4k
  FLOAT32 *ptr_scratch_fft = ptr_esbr_scr;
490
91.4k
  WORD32 idx, sf, is_4_1 = 0;
491
492
91.4k
  sf = pstr_sbr_cfg->sample_freq;
493
91.4k
  if (IXHEAACE_MAX_NUM_SAMPLES == num_samples) {
494
37.2k
    sf = sf >> 1;
495
37.2k
    is_4_1 = 1;
496
37.2k
  }
497
498
91.4k
  switch (sf) {
499
6.43k
    case 16000:
500
6.43k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_8k;
501
6.43k
      break;
502
13.8k
    case 22050:
503
13.8k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_11k;
504
13.8k
      break;
505
21.5k
    case 24000:
506
21.5k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_12k;
507
21.5k
      break;
508
13.3k
    case 32000:
509
13.3k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_16k;
510
13.3k
      break;
511
12.5k
    case 44100:
512
12.5k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_22k;
513
12.5k
      break;
514
22.7k
    case 48000:
515
22.7k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_24k;
516
22.7k
      break;
517
1.00k
    default:
518
1.00k
      return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_SAMP_FREQ;
519
91.4k
  }
520
90.4k
  if (1 == pstr_sbr_cfg->num_ch) {
521
62.2k
    if (num_samples == 2048) {
522
36.6M
      for (idx = 0; idx < num_samples; idx += 2) {
523
36.6M
        ptr_esbr_inp[idx] = ptr_time_in[time_sn_stride * idx];
524
36.6M
        ptr_esbr_inp[idx + 1] = 0;
525
36.6M
        ptr_esbr_inp[num_samples + idx] = ptr_time_in[time_sn_stride * (idx + 1)];
526
36.6M
        ptr_esbr_inp[num_samples + idx + 1] = 0;
527
36.6M
      }
528
35.8k
      iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
529
35.8k
      *bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1);
530
35.8k
    } else if (num_samples == IXHEAACE_MAX_NUM_SAMPLES) {
531
26.4k
      memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0]));
532
54.2M
      for (idx = 0; idx < num_samples; idx += 2) {
533
54.2M
        ptr_esbr_inp[idx / 2] = ptr_time_in[time_sn_stride * idx];
534
54.2M
        ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[time_sn_stride * (idx + 1)];
535
54.2M
      }
536
26.4k
      iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft);
537
26.4k
      *bin1 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1);
538
26.4k
    }
539
62.2k
  } else {
540
28.2k
    if (num_samples == 2048) {
541
17.9M
      for (idx = 0; idx < num_samples; idx += 2) {
542
17.8M
        ptr_esbr_inp[idx] = ptr_time_in[2 * idx];
543
17.8M
        ptr_esbr_inp[idx + 1] = 0;
544
17.8M
        ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 2];
545
17.8M
        ptr_esbr_inp[num_samples + idx + 1] = 0;
546
17.8M
      }
547
17.4k
      iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
548
17.4k
      *bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1);
549
550
17.9M
      for (idx = 0; idx < num_samples; idx += 2) {
551
17.8M
        ptr_esbr_inp[idx] = ptr_time_in[2 * idx + 1];
552
17.8M
        ptr_esbr_inp[idx + 1] = 0;
553
17.8M
        ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 3];
554
17.8M
        ptr_esbr_inp[num_samples + idx + 1] = 0;
555
17.8M
      }
556
17.4k
      iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
557
17.4k
      *bin2 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1);
558
17.4k
    } else if (num_samples == IXHEAACE_MAX_NUM_SAMPLES) {
559
10.7k
      memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0]));
560
21.9M
      for (idx = 0; idx < num_samples; idx += 2) {
561
21.9M
        ptr_esbr_inp[idx / 2] = ptr_time_in[2 * idx];
562
21.9M
        ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[2 * idx + 2];
563
21.9M
      }
564
10.7k
      iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft);
565
10.7k
      *bin1 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1);
566
567
10.7k
      memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0]));
568
21.9M
      for (idx = 0; idx < num_samples; idx += 2) {
569
21.9M
        ptr_esbr_inp[idx / 2] = ptr_time_in[2 * idx + 1];
570
21.9M
        ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[2 * idx + 3];
571
21.9M
      }
572
10.7k
      iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft);
573
10.7k
      *bin2 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1);
574
10.7k
    }
575
28.2k
  }
576
90.4k
  return IA_NO_ERROR;
577
91.4k
}
578
static IA_ERRORCODE ixheaace_update_esbr_ext_data(
579
    FLOAT32 *ptr_time_in, ixheaace_pstr_sbr_config_data pstr_sbr_cfg, FLOAT32 *ptr_esbr_scr,
580
    ixheaace_str_esbr_bs_data *pstr_esbr, WORD32 transient_info[][3],
581
    ixheaace_str_sbr_tabs *ptr_sbr_tab, WORD32 coupling, WORD32 time_sn_stride,
582
60.2k
    WORD32 num_samples) {
583
60.2k
  WORD32 bin, bin1;
584
60.2k
  const WORD32 *ptr_sbr_table = NULL;
585
60.2k
  FLOAT32 *ptr_esbr_inp = ptr_esbr_scr;
586
60.2k
  ptr_esbr_scr += num_samples * 2;
587
60.2k
  FLOAT32 *ptr_scratch_fft = ptr_esbr_scr;
588
60.2k
  WORD32 idx;
589
60.2k
  switch (pstr_sbr_cfg->sample_freq) {
590
0
    case 16000:
591
0
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_8k;
592
0
      break;
593
0
    case 22050:
594
0
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_11k;
595
0
      break;
596
0
    case 24000:
597
0
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_12k;
598
0
      break;
599
16.1k
    case 32000:
600
16.1k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_16k;
601
16.1k
      break;
602
20.0k
    case 44100:
603
20.0k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_22k;
604
20.0k
      break;
605
24.0k
    case 48000:
606
24.0k
      ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_24k;
607
24.0k
      break;
608
0
    default:
609
0
      return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_SAMP_FREQ;
610
60.2k
  }
611
60.2k
  if (1 == pstr_sbr_cfg->num_ch) {
612
35.5M
    for (idx = 0; idx < num_samples; idx += 2) {
613
35.5M
      ptr_esbr_inp[idx] = ptr_time_in[time_sn_stride * idx];
614
35.5M
      ptr_esbr_inp[idx + 1] = 0;
615
35.5M
      ptr_esbr_inp[num_samples + idx] = ptr_time_in[time_sn_stride * (idx + 1)];
616
35.5M
      ptr_esbr_inp[num_samples + idx + 1] = 0;
617
35.5M
    }
618
34.6k
    iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
619
34.6k
    bin = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0);
620
34.6k
    pstr_esbr->sbr_num_chan = 1;
621
34.6k
    if (transient_info[0][1] != 0) {
622
7.29k
      pstr_esbr->sbr_preprocessing = 1;
623
27.3k
    } else {
624
27.3k
      pstr_esbr->sbr_preprocessing = 0;
625
27.3k
    }
626
627
34.6k
    if (transient_info[0][1] != 0 && bin != -1) {
628
6.08k
      pstr_esbr->sbr_oversampling_flag[0] = 1;
629
6.08k
      pstr_esbr->sbr_patching_mode[0] = 0;
630
6.08k
      pstr_esbr->sbr_pitchin_flags[0] = 1;
631
6.08k
      pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
632
28.5k
    } else if (bin != -1) {
633
20.9k
      pstr_esbr->sbr_oversampling_flag[0] = 0;
634
20.9k
      pstr_esbr->sbr_patching_mode[0] = 0;
635
20.9k
      pstr_esbr->sbr_pitchin_flags[0] = 1;
636
20.9k
      pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
637
20.9k
    } else if (transient_info[0][1] != 0) {
638
1.21k
      pstr_esbr->sbr_oversampling_flag[0] = 1;
639
1.21k
      pstr_esbr->sbr_patching_mode[0] = 0;
640
1.21k
      pstr_esbr->sbr_pitchin_flags[0] = 0;
641
6.40k
    } else {
642
6.40k
      pstr_esbr->sbr_patching_mode[0] = 1;
643
6.40k
    }
644
34.6k
  } else {
645
25.5k
    pstr_esbr->sbr_num_chan = 2;
646
25.5k
    pstr_esbr->sbr_coupling = coupling;
647
26.2M
    for (idx = 0; idx < num_samples; idx += 2) {
648
26.2M
      ptr_esbr_inp[idx] = ptr_time_in[2 * idx];
649
26.2M
      ptr_esbr_inp[idx + 1] = 0;
650
26.2M
      ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 2];
651
26.2M
      ptr_esbr_inp[num_samples + idx + 1] = 0;
652
26.2M
    }
653
25.5k
    iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
654
25.5k
    bin = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0);
655
26.2M
    for (idx = 0; idx < num_samples; idx += 2) {
656
26.2M
      ptr_esbr_inp[idx] = ptr_time_in[2 * idx + 1];
657
26.2M
      ptr_esbr_inp[idx + 1] = 0;
658
26.2M
      ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 3];
659
26.2M
      ptr_esbr_inp[num_samples + idx + 1] = 0;
660
26.2M
    }
661
25.5k
    iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft);
662
25.5k
    bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0);
663
664
25.5k
    if (coupling) {
665
20.0k
      if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
666
4.92k
        pstr_esbr->sbr_preprocessing = 1;
667
15.0k
      } else {
668
15.0k
        pstr_esbr->sbr_preprocessing = 0;
669
15.0k
      }
670
20.0k
      if ((transient_info[0][1] != 0 || transient_info[1][1] != 0) && bin != -1) {
671
4.29k
        pstr_esbr->sbr_oversampling_flag[0] = 1;
672
4.29k
        pstr_esbr->sbr_patching_mode[0] = 0;
673
4.29k
        pstr_esbr->sbr_pitchin_flags[0] = 1;
674
4.29k
        bin = MIN(bin, bin1);
675
4.29k
        pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
676
15.7k
      } else if (bin != -1) {
677
12.4k
        pstr_esbr->sbr_oversampling_flag[0] = 0;
678
12.4k
        pstr_esbr->sbr_patching_mode[0] = 0;
679
12.4k
        pstr_esbr->sbr_pitchin_flags[0] = 1;
680
12.4k
        bin = MIN(bin, bin1);
681
12.4k
        pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
682
12.4k
      } else if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
683
633
        pstr_esbr->sbr_oversampling_flag[0] = 1;
684
633
        pstr_esbr->sbr_patching_mode[0] = 0;
685
633
        pstr_esbr->sbr_pitchin_flags[0] = 0;
686
2.67k
      } else {
687
2.67k
        pstr_esbr->sbr_patching_mode[0] = 1;
688
2.67k
      }
689
20.0k
    } else {
690
5.57k
      pstr_esbr->sbr_preprocessing = 0;
691
5.57k
      if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
692
1.70k
        pstr_esbr->sbr_preprocessing = 1;
693
1.70k
      }
694
695
5.57k
      if (transient_info[0][1] != 0 && bin != -1) {
696
1.21k
        pstr_esbr->sbr_oversampling_flag[0] = 1;
697
1.21k
        pstr_esbr->sbr_patching_mode[0] = 0;
698
1.21k
        pstr_esbr->sbr_pitchin_flags[0] = 1;
699
1.21k
        bin = MIN(bin, bin1);
700
1.21k
        pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
701
4.35k
      } else if (bin != -1) {
702
2.25k
        pstr_esbr->sbr_oversampling_flag[0] = 0;
703
2.25k
        pstr_esbr->sbr_patching_mode[0] = 0;
704
2.25k
        pstr_esbr->sbr_pitchin_flags[0] = 1;
705
2.25k
        pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127);
706
2.25k
      } else if (transient_info[0][1] != 0) {
707
347
        pstr_esbr->sbr_oversampling_flag[0] = 1;
708
347
        pstr_esbr->sbr_patching_mode[0] = 0;
709
347
        pstr_esbr->sbr_pitchin_flags[0] = 0;
710
1.75k
      } else {
711
1.75k
        pstr_esbr->sbr_patching_mode[0] = 1;
712
1.75k
      }
713
714
5.57k
      if (transient_info[1][1] != 0 && bin1 != -1) {
715
1.20k
        pstr_esbr->sbr_oversampling_flag[1] = 1;
716
1.20k
        pstr_esbr->sbr_patching_mode[1] = 0;
717
1.20k
        pstr_esbr->sbr_pitchin_flags[1] = 1;
718
1.20k
        pstr_esbr->sbr_pitchin_bins[1] = (UWORD8)MIN(bin1, 127);
719
4.36k
      } else if (bin1 != -1) {
720
2.25k
        pstr_esbr->sbr_oversampling_flag[1] = 0;
721
2.25k
        pstr_esbr->sbr_patching_mode[1] = 0;
722
2.25k
        pstr_esbr->sbr_pitchin_flags[1] = 1;
723
2.25k
        pstr_esbr->sbr_pitchin_bins[1] = (UWORD8)MIN(bin1, 127);
724
2.25k
      } else if (transient_info[1][1] != 0) {
725
365
        pstr_esbr->sbr_oversampling_flag[1] = 1;
726
365
        pstr_esbr->sbr_patching_mode[1] = 0;
727
365
        pstr_esbr->sbr_pitchin_flags[1] = 0;
728
1.75k
      } else {
729
1.75k
        pstr_esbr->sbr_patching_mode[1] = 1;
730
1.75k
      }
731
5.57k
    }
732
25.5k
  }
733
60.2k
  return IA_NO_ERROR;
734
60.2k
}
735
736
static VOID ixheaace_update_harmonic_sbr_data(
737
    WORD32 transient_info[][3], WORD32 coupling,
738
81.3k
    ixheaace_pstr_enc_channel *pstr_enc_ch, WORD32 num_channels) {
739
81.3k
  WORD32 bin, bin1;
740
81.3k
  struct ixheaace_str_sbr_env_data *pstr_sbr_env_left = NULL;
741
81.3k
  struct ixheaace_str_sbr_env_data *pstr_sbr_env_right = NULL;
742
81.3k
  if (1 == num_channels) {
743
56.7k
    pstr_sbr_env_left = &pstr_enc_ch[0]->enc_env_data;
744
56.7k
    bin = pstr_sbr_env_left->sbr_pitchin_bins;
745
56.7k
    if (transient_info[0][1] != 0) {
746
0
      pstr_sbr_env_left->sbr_preprocessing = 1;
747
56.7k
    } else {
748
56.7k
      pstr_sbr_env_left->sbr_preprocessing = 0;
749
56.7k
    }
750
751
56.7k
    if (transient_info[0][1] != 0 && bin != -1) {
752
0
      pstr_sbr_env_left->sbr_oversampling_flag = 1;
753
0
      pstr_sbr_env_left->sbr_patching_mode = 0;
754
0
      pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
755
0
      pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
756
56.7k
    } else if (bin != -1) {
757
48.9k
      pstr_sbr_env_left->sbr_oversampling_flag = 0;
758
48.9k
      pstr_sbr_env_left->sbr_patching_mode = 0;
759
48.9k
      pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
760
48.9k
      pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
761
48.9k
    } else if (transient_info[0][1] != 0) {
762
0
      pstr_sbr_env_left->sbr_oversampling_flag = 1;
763
0
      pstr_sbr_env_left->sbr_patching_mode = 0;
764
0
      pstr_sbr_env_left->sbr_pitchin_bins = 0;
765
7.82k
    } else {
766
7.82k
      pstr_sbr_env_left->sbr_patching_mode = 1;
767
7.82k
    }
768
56.7k
  } else {
769
24.6k
    pstr_sbr_env_left = &pstr_enc_ch[0]->enc_env_data;
770
24.6k
    pstr_sbr_env_right = &pstr_enc_ch[1]->enc_env_data;
771
24.6k
    pstr_sbr_env_left->sbr_coupling = coupling;
772
24.6k
    pstr_sbr_env_right->sbr_coupling = coupling;
773
24.6k
    bin = pstr_sbr_env_left->sbr_pitchin_bins;
774
775
24.6k
    bin1 = pstr_sbr_env_right->sbr_pitchin_bins;
776
777
24.6k
    if (coupling) {
778
16.2k
      pstr_sbr_env_right->sbr_preprocessing = 1;
779
16.2k
      if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
780
0
        pstr_sbr_env_left->sbr_preprocessing = 1;
781
16.2k
      } else {
782
16.2k
        pstr_sbr_env_left->sbr_preprocessing = 0;
783
16.2k
      }
784
16.2k
      if ((transient_info[0][1] != 0 || transient_info[1][1] != 0) && bin != -1) {
785
0
        pstr_sbr_env_left->sbr_oversampling_flag = 1;
786
0
        pstr_sbr_env_left->sbr_patching_mode = 0;
787
0
        pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
788
0
        bin = min(bin, bin1);
789
0
        pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
790
16.2k
      } else if (bin != -1) {
791
14.8k
        pstr_sbr_env_left->sbr_oversampling_flag = 0;
792
14.8k
        pstr_sbr_env_left->sbr_patching_mode = 0;
793
14.8k
        pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
794
14.8k
        bin = min(bin, bin1);
795
14.8k
        pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
796
14.8k
      } else if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
797
0
        pstr_sbr_env_left->sbr_oversampling_flag = 1;
798
0
        pstr_sbr_env_left->sbr_patching_mode = 0;
799
0
        pstr_sbr_env_left->sbr_pitchin_bins_flag = 0;
800
1.39k
      } else {
801
1.39k
        pstr_sbr_env_left->sbr_patching_mode = 1;
802
1.39k
      }
803
16.2k
    } else {
804
8.36k
      pstr_sbr_env_left->sbr_preprocessing = 0;
805
8.36k
      pstr_sbr_env_right->sbr_preprocessing = 0;
806
8.36k
      if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) {
807
0
        pstr_sbr_env_left->sbr_preprocessing = 1;
808
0
        pstr_sbr_env_right->sbr_preprocessing = 1;
809
0
      }
810
811
8.36k
      if (transient_info[0][1] != 0 && bin != -1) {
812
0
        pstr_sbr_env_left->sbr_oversampling_flag = 1;
813
0
        pstr_sbr_env_left->sbr_patching_mode = 0;
814
0
        pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
815
0
        bin = min(bin, bin1);
816
0
        pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
817
8.36k
      } else if (bin != -1) {
818
7.42k
        pstr_sbr_env_left->sbr_oversampling_flag = 0;
819
7.42k
        pstr_sbr_env_left->sbr_patching_mode = 0;
820
7.42k
        pstr_sbr_env_left->sbr_pitchin_bins_flag = 1;
821
7.42k
        pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127);
822
7.42k
      } else if (transient_info[0][1] != 0) {
823
0
        pstr_sbr_env_left->sbr_oversampling_flag = 1;
824
0
        pstr_sbr_env_left->sbr_patching_mode = 0;
825
0
        pstr_sbr_env_left->sbr_pitchin_bins_flag = 0;
826
942
      } else {
827
942
        pstr_sbr_env_left->sbr_patching_mode = 1;
828
942
      }
829
830
8.36k
      if (transient_info[1][1] != 0 && bin1 != -1) {
831
0
        pstr_sbr_env_right->sbr_oversampling_flag = 1;
832
0
        pstr_sbr_env_right->sbr_patching_mode = 0;
833
0
        pstr_sbr_env_right->sbr_pitchin_bins_flag = 1;
834
0
        pstr_sbr_env_right->sbr_pitchin_bins = bin1 < 127 ? bin1 : 127;
835
8.36k
      } else if (bin1 != -1) {
836
7.40k
        pstr_sbr_env_right->sbr_oversampling_flag = 0;
837
7.40k
        pstr_sbr_env_right->sbr_patching_mode = 0;
838
7.40k
        pstr_sbr_env_right->sbr_pitchin_bins_flag = 1;
839
7.40k
        pstr_sbr_env_right->sbr_pitchin_bins = bin1 < 127 ? bin1 : 127;
840
7.40k
      } else if (transient_info[1][1] != 0) {
841
0
        pstr_sbr_env_right->sbr_oversampling_flag = 1;
842
0
        pstr_sbr_env_right->sbr_patching_mode = 0;
843
0
        pstr_sbr_env_right->sbr_pitchin_bins_flag = 0;
844
962
      } else {
845
962
        pstr_sbr_env_right->sbr_patching_mode = 1;
846
962
      }
847
8.36k
    }
848
24.6k
  }
849
81.3k
}
850
851
VOID ixheaace_esbr_qmf_init(ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank,
852
1.85k
                            WORD32 sbr_ratio_idx, WORD32 output_frame_size) {
853
1.85k
  pstr_codec_qmf_bank->pstr_qmf_dec_tabs =
854
1.85k
      (ixheaace_str_qmf_dec_tabs_struct *)&ixheaace_str_aac_qmf_tabs;
855
1.85k
  memset(
856
1.85k
      pstr_codec_qmf_bank->anal_filter_states_32, 0,
857
1.85k
      sizeof(pstr_codec_qmf_bank->anal_filter_states_32[0]) * IXHEAACE_QMF_FILTER_STATE_ANA_SIZE);
858
1.85k
  pstr_codec_qmf_bank->num_time_slots = (WORD16)(output_frame_size / 64);
859
1.85k
  pstr_codec_qmf_bank->ptr_filter_pos_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c;
860
1.85k
  pstr_codec_qmf_bank->ptr_state_new_samples_pos_low_32 =
861
1.85k
      pstr_codec_qmf_bank->anal_filter_states_32;
862
1.85k
  pstr_codec_qmf_bank->ptr_ana_win_coeff_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c;
863
864
1.85k
  switch (sbr_ratio_idx) {
865
1.42k
    case USAC_SBR_RATIO_INDEX_2_1:
866
1.42k
      pstr_codec_qmf_bank->no_channels = 32;
867
1.42k
      pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
868
1.42k
          ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l32;
869
1.42k
      pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
870
1.42k
          ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l32;
871
1.42k
      pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l32;
872
1.42k
      break;
873
0
    case USAC_SBR_RATIO_INDEX_8_3:
874
0
      pstr_codec_qmf_bank->no_channels = 24;
875
0
      pstr_codec_qmf_bank->ptr_filter_pos_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c_24;
876
0
      pstr_codec_qmf_bank->ptr_ana_win_coeff_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c_24;
877
0
      pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
878
0
          ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l24;
879
0
      pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
880
0
          ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l24;
881
0
      pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l24;
882
0
      break;
883
426
    case USAC_SBR_RATIO_INDEX_4_1:
884
426
      pstr_codec_qmf_bank->no_channels = 16;
885
426
      pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
886
426
          ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l16;
887
426
      pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
888
426
          ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l16;
889
426
      pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l16;
890
426
      break;
891
0
    default:
892
0
      pstr_codec_qmf_bank->no_channels = 32;
893
0
      pstr_codec_qmf_bank->ptr_esbr_cos_twiddle =
894
0
          ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l32;
895
0
      pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle =
896
0
          ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l32;
897
0
      pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l32;
898
0
      break;
899
1.85k
  }
900
1.85k
}
901
VOID ixheaace_esbr_qmfanal32_winadd(FLOAT32 *ptr_inp1, FLOAT32 *ptr_inp2, FLOAT32 *ptr_qmf1,
902
                                    FLOAT32 *ptr_qmf2, FLOAT32 *ptr_out,
903
3.95M
                                    WORD32 num_band_anal_qmf) {
904
3.95M
  WORD32 n;
905
3.95M
  FLOAT32 accu;
906
907
3.95M
  switch (num_band_anal_qmf) {
908
1.37M
    case 32: {
909
1.37M
      n = 0;
910
23.3M
      while (n < num_band_anal_qmf) {
911
21.9M
        accu = (ptr_inp1[n + 0] * ptr_qmf1[2 * (n + 0)]);
912
21.9M
        accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 2 * num_band_anal_qmf)]);
913
21.9M
        accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 4 * num_band_anal_qmf)]);
914
21.9M
        accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 6 * num_band_anal_qmf)]);
915
21.9M
        accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 8 * num_band_anal_qmf)]);
916
21.9M
        ptr_out[n] = 2 * accu;
917
918
21.9M
        accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[2 * (n + 1 + 0)]);
919
21.9M
        accu += (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] *
920
21.9M
                 ptr_qmf1[2 * (n + 1 + 2 * num_band_anal_qmf)]);
921
21.9M
        accu += (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] *
922
21.9M
                 ptr_qmf1[2 * (n + 1 + 4 * num_band_anal_qmf)]);
923
21.9M
        accu += (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] *
924
21.9M
                 ptr_qmf1[2 * (n + 1 + 6 * num_band_anal_qmf)]);
925
21.9M
        accu += (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] *
926
21.9M
                 ptr_qmf1[2 * (n + 1 + 8 * num_band_anal_qmf)]);
927
21.9M
        ptr_out[n + 1] = 2 * accu;
928
929
21.9M
        accu = (ptr_inp2[n + 0] * ptr_qmf2[2 * (n + 0)]);
930
21.9M
        accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 2 * num_band_anal_qmf)]);
931
21.9M
        accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 4 * num_band_anal_qmf)]);
932
21.9M
        accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 6 * num_band_anal_qmf)]);
933
21.9M
        accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 8 * num_band_anal_qmf)]);
934
21.9M
        ptr_out[n + num_band_anal_qmf] = 2 * accu;
935
936
21.9M
        accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[2 * (n + 1 + 0)]);
937
21.9M
        accu += (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] *
938
21.9M
                 ptr_qmf2[2 * (n + 1 + 2 * num_band_anal_qmf)]);
939
21.9M
        accu += (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] *
940
21.9M
                 ptr_qmf2[2 * (n + 1 + 4 * num_band_anal_qmf)]);
941
21.9M
        accu += (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] *
942
21.9M
                 ptr_qmf2[2 * (n + 1 + 6 * num_band_anal_qmf)]);
943
21.9M
        accu += (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] *
944
21.9M
                 ptr_qmf2[2 * (n + 1 + 8 * num_band_anal_qmf)]);
945
21.9M
        ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu;
946
947
21.9M
        n += 2;
948
21.9M
      }
949
1.37M
      break;
950
0
    }
951
0
    case 24: {
952
0
      n = 0;
953
0
      while (n < num_band_anal_qmf) {
954
0
        accu = (ptr_inp1[n + 0] * ptr_qmf1[(n + 0)]);
955
0
        accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[(n + 2 * num_band_anal_qmf)]);
956
0
        accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[(n + 4 * num_band_anal_qmf)]);
957
0
        accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[(n + 6 * num_band_anal_qmf)]);
958
0
        accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[(n + 8 * num_band_anal_qmf)]);
959
0
        ptr_out[n] = 2 * accu;
960
961
0
        accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[(n + 1 + 0)]);
962
0
        accu +=
963
0
            (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 2 * num_band_anal_qmf)]);
964
0
        accu +=
965
0
            (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 4 * num_band_anal_qmf)]);
966
0
        accu +=
967
0
            (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 6 * num_band_anal_qmf)]);
968
0
        accu +=
969
0
            (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 8 * num_band_anal_qmf)]);
970
0
        ptr_out[n + 1] = 2 * accu;
971
972
0
        accu = (ptr_inp2[n + 0] * ptr_qmf2[(n + 0)]);
973
0
        accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[(n + 2 * num_band_anal_qmf)]);
974
0
        accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[(n + 4 * num_band_anal_qmf)]);
975
0
        accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[(n + 6 * num_band_anal_qmf)]);
976
0
        accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[(n + 8 * num_band_anal_qmf)]);
977
0
        ptr_out[n + num_band_anal_qmf] = 2 * accu;
978
979
0
        accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[(n + 1 + 0)]);
980
0
        accu +=
981
0
            (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 2 * num_band_anal_qmf)]);
982
0
        accu +=
983
0
            (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 4 * num_band_anal_qmf)]);
984
0
        accu +=
985
0
            (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 6 * num_band_anal_qmf)]);
986
0
        accu +=
987
0
            (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 8 * num_band_anal_qmf)]);
988
0
        ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu;
989
0
        n += 2;
990
0
      }
991
0
      break;
992
0
    }
993
2.58M
    default: {
994
2.58M
      n = 0;
995
23.2M
      while (n < num_band_anal_qmf) {
996
20.6M
        accu = (ptr_inp1[n + 0] * ptr_qmf1[4 * (n + 0)]);
997
20.6M
        accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 2 * num_band_anal_qmf)]);
998
20.6M
        accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 4 * num_band_anal_qmf)]);
999
20.6M
        accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 6 * num_band_anal_qmf)]);
1000
20.6M
        accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 8 * num_band_anal_qmf)]);
1001
20.6M
        ptr_out[n] = 2 * accu;
1002
1003
20.6M
        accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[4 * (n + 1 + 0)]);
1004
20.6M
        accu += (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] *
1005
20.6M
                 ptr_qmf1[4 * (n + 1 + 2 * num_band_anal_qmf)]);
1006
20.6M
        accu += (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] *
1007
20.6M
                 ptr_qmf1[4 * (n + 1 + 4 * num_band_anal_qmf)]);
1008
20.6M
        accu += (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] *
1009
20.6M
                 ptr_qmf1[4 * (n + 1 + 6 * num_band_anal_qmf)]);
1010
20.6M
        accu += (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] *
1011
20.6M
                 ptr_qmf1[4 * (n + 1 + 8 * num_band_anal_qmf)]);
1012
20.6M
        ptr_out[n + 1] = 2 * accu;
1013
1014
20.6M
        accu = (ptr_inp2[n + 0] * ptr_qmf2[4 * (n + 0)]);
1015
20.6M
        accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 2 * num_band_anal_qmf)]);
1016
20.6M
        accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 4 * num_band_anal_qmf)]);
1017
20.6M
        accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 6 * num_band_anal_qmf)]);
1018
20.6M
        accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 8 * num_band_anal_qmf)]);
1019
20.6M
        ptr_out[n + num_band_anal_qmf] = 2 * accu;
1020
1021
20.6M
        accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[4 * (n + 1 + 0)]);
1022
20.6M
        accu += (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] *
1023
20.6M
                 ptr_qmf2[4 * (n + 1 + 2 * num_band_anal_qmf)]);
1024
20.6M
        accu += (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] *
1025
20.6M
                 ptr_qmf2[4 * (n + 1 + 4 * num_band_anal_qmf)]);
1026
20.6M
        accu += (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] *
1027
20.6M
                 ptr_qmf2[4 * (n + 1 + 6 * num_band_anal_qmf)]);
1028
20.6M
        accu += (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] *
1029
20.6M
                 ptr_qmf2[4 * (n + 1 + 8 * num_band_anal_qmf)]);
1030
20.6M
        ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu;
1031
20.6M
        n += 2;
1032
20.6M
      }
1033
2.58M
      break;
1034
0
    }
1035
3.95M
  }
1036
3.95M
}
1037
1038
VOID ixheaace_esbr_radix4bfly(const FLOAT32 *ptr_w_in, FLOAT32 *ptr_x, WORD32 index1,
1039
2.74M
                              WORD32 index) {
1040
2.74M
  int i;
1041
2.74M
  WORD32 l1, l2, h2, fft_jmp;
1042
2.74M
  FLOAT32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0;
1043
2.74M
  FLOAT32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0;
1044
2.74M
  FLOAT32 x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1;
1045
2.74M
  FLOAT32 x_h2_0, x_h2_1;
1046
2.74M
  FLOAT32 si10, si20, si30, co10, co20, co30;
1047
1048
2.74M
  FLOAT32 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6;
1049
2.74M
  FLOAT32 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12;
1050
1051
2.74M
  const FLOAT32 *ptr_w = ptr_w_in;
1052
2.74M
  WORD32 i1;
1053
1054
2.74M
  h2 = index << 1;
1055
2.74M
  l1 = index << 2;
1056
2.74M
  l2 = (index << 2) + (index << 1);
1057
1058
2.74M
  fft_jmp = 6 * (index);
1059
1060
2.74M
  i1 = 0;
1061
5.49M
  while (i1 < index1) {
1062
13.7M
    for (i = 0; i < index; i++) {
1063
10.9M
      si10 = (*ptr_w++);
1064
10.9M
      co10 = (*ptr_w++);
1065
10.9M
      si20 = (*ptr_w++);
1066
10.9M
      co20 = (*ptr_w++);
1067
10.9M
      si30 = (*ptr_w++);
1068
10.9M
      co30 = (*ptr_w++);
1069
1070
10.9M
      x_0 = ptr_x[0];
1071
10.9M
      x_h2_0 = ptr_x[h2];
1072
10.9M
      x_l1_0 = ptr_x[l1];
1073
10.9M
      x_l2_0 = ptr_x[l2];
1074
1075
10.9M
      xh0_0 = (x_0 + x_l1_0);
1076
10.9M
      xl0_0 = (x_0 - x_l1_0);
1077
1078
10.9M
      xh20_0 = (x_h2_0 + x_l2_0);
1079
10.9M
      xl20_0 = (x_h2_0 - x_l2_0);
1080
1081
10.9M
      ptr_x[0] = (xh0_0 + xh20_0);
1082
10.9M
      xt0_0 = (xh0_0 - xh20_0);
1083
1084
10.9M
      x_1 = ptr_x[1];
1085
10.9M
      x_h2_1 = ptr_x[h2 + 1];
1086
10.9M
      x_l1_1 = ptr_x[l1 + 1];
1087
10.9M
      x_l2_1 = ptr_x[l2 + 1];
1088
1089
10.9M
      xh1_0 = (x_1 + x_l1_1);
1090
10.9M
      xl1_0 = (x_1 - x_l1_1);
1091
1092
10.9M
      xh21_0 = (x_h2_1 + x_l2_1);
1093
10.9M
      xl21_0 = (x_h2_1 - x_l2_1);
1094
1095
10.9M
      ptr_x[1] = (xh1_0 + xh21_0);
1096
10.9M
      yt0_0 = (xh1_0 - xh21_0);
1097
1098
10.9M
      xt1_0 = (xl0_0 + xl21_0);
1099
10.9M
      xt2_0 = (xl0_0 - xl21_0);
1100
1101
10.9M
      yt2_0 = (xl1_0 + xl20_0);
1102
10.9M
      yt1_0 = (xl1_0 - xl20_0);
1103
1104
10.9M
      mul_11 = (xt2_0 * co30);
1105
10.9M
      mul_3 = (yt2_0 * si30);
1106
10.9M
      ptr_x[l2] = 2 * (mul_3 + mul_11);
1107
1108
10.9M
      mul_5 = (xt2_0 * si30);
1109
10.9M
      mul_9 = (yt2_0 * co30);
1110
10.9M
      ptr_x[l2 + 1] = 2 * (mul_9 - mul_5);
1111
1112
10.9M
      mul_12 = (xt0_0 * co20);
1113
10.9M
      mul_2 = (yt0_0 * si20);
1114
10.9M
      ptr_x[l1] = 2 * (mul_2 + mul_12);
1115
1116
10.9M
      mul_6 = (xt0_0 * si20);
1117
10.9M
      mul_8 = (yt0_0 * co20);
1118
10.9M
      ptr_x[l1 + 1] = 2 * (mul_8 - mul_6);
1119
1120
10.9M
      mul_4 = (xt1_0 * co10);
1121
10.9M
      mul_1 = (yt1_0 * si10);
1122
10.9M
      ptr_x[h2] = 2 * (mul_1 + mul_4);
1123
1124
10.9M
      mul_10 = (xt1_0 * si10);
1125
10.9M
      mul_7 = (yt1_0 * co10);
1126
10.9M
      ptr_x[h2 + 1] = 2 * (mul_7 - mul_10);
1127
1128
10.9M
      ptr_x += 2;
1129
10.9M
    }
1130
2.74M
    ptr_x += fft_jmp;
1131
2.74M
    ptr_w = ptr_w - fft_jmp;
1132
2.74M
    i1++;
1133
2.74M
  }
1134
2.74M
}
1135
1136
VOID ixheaace_esbr_postradixcompute2(FLOAT32 *ptr_y, FLOAT32 *ptr_x,
1137
0
                                     const FLOAT32 *ptr_dig_rev_tbl, WORD32 npoints) {
1138
0
  WORD32 i, k;
1139
0
  WORD32 h2;
1140
0
  FLOAT32 x_0, x_1, x_2, x_3;
1141
0
  FLOAT32 x_4, x_5, x_6, x_7;
1142
0
  FLOAT32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
1143
0
  FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31;
1144
0
  FLOAT32 n02, n12, n22, n32, n03, n13, n23, n33;
1145
1146
0
  FLOAT32 *ptr_x2, *ptr_x0;
1147
0
  FLOAT32 *ptr_y0, *ptr_y1, *ptr_y2, *ptr_y3;
1148
1149
0
  ptr_y0 = ptr_y;
1150
0
  ptr_y2 = ptr_y + (WORD32)npoints;
1151
0
  ptr_x0 = ptr_x;
1152
0
  ptr_x2 = ptr_x + (WORD32)(npoints >> 1);
1153
1154
0
  ptr_y1 = ptr_y0 + (WORD32)(npoints >> 2);
1155
0
  ptr_y3 = ptr_y2 + (WORD32)(npoints >> 2);
1156
1157
0
  for (k = 0; k < 2; k++) {
1158
0
    for (i = 0; i<npoints>> 1; i += 8) {
1159
0
      h2 = (WORD32)*ptr_dig_rev_tbl++ / 4;
1160
1161
0
      x_0 = *ptr_x0++;
1162
0
      x_1 = *ptr_x0++;
1163
0
      x_2 = *ptr_x0++;
1164
0
      x_3 = *ptr_x0++;
1165
0
      x_4 = *ptr_x0++;
1166
0
      x_5 = *ptr_x0++;
1167
0
      x_6 = *ptr_x0++;
1168
0
      x_7 = *ptr_x0++;
1169
1170
0
      n00 = (x_0 + x_2);
1171
0
      n01 = (x_1 + x_3);
1172
1173
0
      n20 = (x_0 - x_2);
1174
0
      n21 = (x_1 - x_3);
1175
1176
0
      n10 = (x_4 + x_6);
1177
0
      n11 = (x_5 + x_7);
1178
1179
0
      n30 = (x_4 - x_6);
1180
0
      n31 = (x_5 - x_7);
1181
1182
0
      ptr_y0[h2] = n00;
1183
0
      ptr_y0[h2 + 1] = n01;
1184
0
      ptr_y1[h2] = n10;
1185
0
      ptr_y1[h2 + 1] = n11;
1186
0
      ptr_y2[h2] = n20;
1187
0
      ptr_y2[h2 + 1] = n21;
1188
0
      ptr_y3[h2] = n30;
1189
0
      ptr_y3[h2 + 1] = n31;
1190
1191
0
      x_8 = *ptr_x2++;
1192
0
      x_9 = *ptr_x2++;
1193
0
      x_a = *ptr_x2++;
1194
0
      x_b = *ptr_x2++;
1195
0
      x_c = *ptr_x2++;
1196
0
      x_d = *ptr_x2++;
1197
0
      x_e = *ptr_x2++;
1198
0
      x_f = *ptr_x2++;
1199
1200
0
      n02 = (x_8 + x_a);
1201
0
      n03 = (x_9 + x_b);
1202
1203
0
      n22 = (x_8 - x_a);
1204
0
      n23 = (x_9 - x_b);
1205
1206
0
      n12 = (x_c + x_e);
1207
0
      n13 = (x_d + x_f);
1208
1209
0
      n32 = (x_c - x_e);
1210
0
      n33 = (x_d - x_f);
1211
1212
0
      ptr_y0[h2 + 2] = n02;
1213
0
      ptr_y0[h2 + 3] = n03;
1214
0
      ptr_y1[h2 + 2] = n12;
1215
0
      ptr_y1[h2 + 3] = n13;
1216
0
      ptr_y2[h2 + 2] = n22;
1217
0
      ptr_y2[h2 + 3] = n23;
1218
0
      ptr_y3[h2 + 2] = n32;
1219
0
      ptr_y3[h2 + 3] = n33;
1220
0
    }
1221
0
    ptr_x0 += (WORD32)npoints >> 1;
1222
0
    ptr_x2 += (WORD32)npoints >> 1;
1223
0
  }
1224
0
}
1225
1226
VOID ixheaace_esbr_postradixcompute4(FLOAT32 *ptr_y, FLOAT32 *ptr_x,
1227
2.74M
                                     const FLOAT32 *ptr_dig_rev_tbl, WORD32 npoints) {
1228
2.74M
  WORD32 i, k;
1229
2.74M
  WORD32 h2;
1230
2.74M
  FLOAT32 xh0_0, xh1_0, xl0_0, xl1_0;
1231
2.74M
  FLOAT32 xh0_1, xh1_1, xl0_1, xl1_1;
1232
2.74M
  FLOAT32 x_0, x_1, x_2, x_3;
1233
2.74M
  FLOAT32 xh0_2, xh1_2, xl0_2, xl1_2, xh0_3, xh1_3, xl0_3, xl1_3;
1234
2.74M
  FLOAT32 x_4, x_5, x_6, x_7;
1235
2.74M
  FLOAT32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f;
1236
2.74M
  FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31;
1237
2.74M
  FLOAT32 n02, n12, n22, n32, n03, n13, n23, n33;
1238
1239
2.74M
  FLOAT32 *ptr_x2, *ptr_x0;
1240
2.74M
  FLOAT32 *ptr_y0, *ptr_y1, *ptr_y2, *ptr_y3;
1241
1242
2.74M
  ptr_y0 = ptr_y;
1243
2.74M
  ptr_y2 = ptr_y + npoints;
1244
2.74M
  ptr_x0 = ptr_x;
1245
2.74M
  ptr_x2 = ptr_x + (WORD32)(npoints >> 1);
1246
1247
2.74M
  ptr_y1 = ptr_y0 + (WORD32)(npoints >> 1);
1248
2.74M
  ptr_y3 = ptr_y2 + (WORD32)(npoints >> 1);
1249
1250
8.23M
  for (k = 0; k < 2; k++) {
1251
10.9M
    for (i = 0; i<npoints>> 1; i += 8) {
1252
5.49M
      h2 = (WORD32)*ptr_dig_rev_tbl++ / 4;
1253
5.49M
      x_0 = *ptr_x0++;
1254
5.49M
      x_1 = *ptr_x0++;
1255
5.49M
      x_2 = *ptr_x0++;
1256
5.49M
      x_3 = *ptr_x0++;
1257
5.49M
      x_4 = *ptr_x0++;
1258
5.49M
      x_5 = *ptr_x0++;
1259
5.49M
      x_6 = *ptr_x0++;
1260
5.49M
      x_7 = *ptr_x0++;
1261
1262
5.49M
      xh0_0 = (x_0 + x_4);
1263
5.49M
      xh1_0 = (x_1 + x_5);
1264
1265
5.49M
      xl0_0 = (x_0 - x_4);
1266
5.49M
      xl1_0 = (x_1 - x_5);
1267
1268
5.49M
      xh0_1 = (x_2 + x_6);
1269
5.49M
      xh1_1 = (x_3 + x_7);
1270
1271
5.49M
      xl0_1 = (x_2 - x_6);
1272
5.49M
      xl1_1 = (x_3 - x_7);
1273
1274
5.49M
      n00 = (xh0_0 + xh0_1);
1275
5.49M
      n01 = (xh1_0 + xh1_1);
1276
5.49M
      n10 = (xl0_0 + xl1_1);
1277
1278
5.49M
      n11 = (xl1_0 - xl0_1);
1279
5.49M
      n20 = (xh0_0 - xh0_1);
1280
5.49M
      n21 = (xh1_0 - xh1_1);
1281
5.49M
      n30 = (xl0_0 - xl1_1);
1282
1283
5.49M
      n31 = (xl1_0 + xl0_1);
1284
1285
5.49M
      ptr_y0[h2] = n00;
1286
5.49M
      ptr_y0[h2 + 1] = n01;
1287
5.49M
      ptr_y1[h2] = n10;
1288
5.49M
      ptr_y1[h2 + 1] = n11;
1289
5.49M
      ptr_y2[h2] = n20;
1290
5.49M
      ptr_y2[h2 + 1] = n21;
1291
5.49M
      ptr_y3[h2] = n30;
1292
5.49M
      ptr_y3[h2 + 1] = n31;
1293
1294
5.49M
      x_8 = *ptr_x2++;
1295
5.49M
      x_9 = *ptr_x2++;
1296
5.49M
      x_a = *ptr_x2++;
1297
5.49M
      x_b = *ptr_x2++;
1298
5.49M
      x_c = *ptr_x2++;
1299
5.49M
      x_d = *ptr_x2++;
1300
5.49M
      x_e = *ptr_x2++;
1301
5.49M
      x_f = *ptr_x2++;
1302
1303
5.49M
      xh0_2 = (x_8 + x_c);
1304
5.49M
      xh1_2 = (x_9 + x_d);
1305
1306
5.49M
      xl0_2 = (x_8 - x_c);
1307
5.49M
      xl1_2 = (x_9 - x_d);
1308
1309
5.49M
      xh0_3 = (x_a + x_e);
1310
5.49M
      xh1_3 = (x_b + x_f);
1311
1312
5.49M
      xl0_3 = (x_a - x_e);
1313
5.49M
      xl1_3 = (x_b - x_f);
1314
1315
5.49M
      n02 = (xh0_2 + xh0_3);
1316
5.49M
      n03 = (xh1_2 + xh1_3);
1317
5.49M
      n12 = (xl0_2 + xl1_3);
1318
1319
5.49M
      n13 = (xl1_2 - xl0_3);
1320
5.49M
      n22 = (xh0_2 - xh0_3);
1321
5.49M
      n23 = (xh1_2 - xh1_3);
1322
5.49M
      n32 = (xl0_2 - xl1_3);
1323
1324
5.49M
      n33 = (xl1_2 + xl0_3);
1325
1326
5.49M
      ptr_y0[h2 + 2] = n02;
1327
5.49M
      ptr_y0[h2 + 3] = n03;
1328
5.49M
      ptr_y1[h2 + 2] = n12;
1329
5.49M
      ptr_y1[h2 + 3] = n13;
1330
5.49M
      ptr_y2[h2 + 2] = n22;
1331
5.49M
      ptr_y2[h2 + 3] = n23;
1332
5.49M
      ptr_y3[h2 + 2] = n32;
1333
5.49M
      ptr_y3[h2 + 3] = n33;
1334
5.49M
    }
1335
5.49M
    ptr_x0 += (WORD32)npoints >> 1;
1336
5.49M
    ptr_x2 += (WORD32)npoints >> 1;
1337
5.49M
  }
1338
2.74M
}
1339
1340
VOID ixheaace_esbr_cos_sin_mod(FLOAT32 *subband, ia_sbr_qmf_filter_bank_struct *pstr_qmf_bank,
1341
3.95M
                               FLOAT32 *ptr_twiddle, FLOAT32 *ptr_dig_rev_tbl) {
1342
3.95M
  WORD32 z;
1343
3.95M
  FLOAT32 temp[128] = {0};
1344
1345
3.95M
  FLOAT32 re2, re3;
1346
3.95M
  FLOAT32 wim, wre;
1347
1348
3.95M
  WORD32 i, M_2;
1349
3.95M
  WORD32 M = pstr_qmf_bank->no_channels / 2;
1350
1351
3.95M
  const FLOAT32 *ptr_sin;
1352
3.95M
  const FLOAT32 *ptr_sin_cos;
1353
1354
3.95M
  FLOAT32 subband_tmp[128] = {0};
1355
3.95M
  FLOAT32 re;
1356
3.95M
  FLOAT32 im;
1357
3.95M
  FLOAT32 *ptr_subband, *ptr_subband1;
1358
3.95M
  FLOAT32 *ptr_subband_t, *ptr_subband1_t;
1359
3.95M
  FLOAT32 *ptr_subband2, *ptr_subband12;
1360
3.95M
  FLOAT32 *ptr_subband_t2, *ptr_subband1_t2;
1361
1362
3.95M
  M_2 = M / 2;
1363
1364
3.95M
  ptr_sin_cos = pstr_qmf_bank->ptr_esbr_cos_twiddle;
1365
1366
3.95M
  ptr_subband = &subband[0];
1367
3.95M
  ptr_subband1 = &subband[2 * M - 1];
1368
3.95M
  ptr_subband_t = subband_tmp;
1369
3.95M
  ptr_subband1_t = &subband_tmp[2 * M - 1];
1370
1371
3.95M
  ptr_subband2 = &subband[64];
1372
3.95M
  ptr_subband12 = &subband[2 * M - 1 + 64];
1373
3.95M
  ptr_subband_t2 = &subband_tmp[64];
1374
3.95M
  ptr_subband1_t2 = &subband_tmp[2 * M - 1 + 64];
1375
1376
3.95M
  i = (M_2 >> 1) - 1;
1377
14.6M
  while (i >= 0) {
1378
10.6M
    re = *ptr_subband++;
1379
10.6M
    im = *ptr_subband1--;
1380
1381
10.6M
    wim = *ptr_sin_cos++;
1382
10.6M
    wre = *ptr_sin_cos++;
1383
1384
10.6M
    *ptr_subband_t++ = (re * wre) + (im * wim);
1385
10.6M
    *ptr_subband_t++ = (im * wre) - (re * wim);
1386
1387
10.6M
    re = *ptr_subband2++;
1388
10.6M
    im = *ptr_subband12--;
1389
1390
10.6M
    *ptr_subband_t2++ = (im * wim) - (re * wre);
1391
10.6M
    *ptr_subband_t2++ = (re * wim) + (im * wre);
1392
1393
10.6M
    re = *ptr_subband1--;
1394
10.6M
    im = *ptr_subband++;
1395
1396
10.6M
    wim = *ptr_sin_cos++;
1397
10.6M
    wre = *ptr_sin_cos++;
1398
1399
10.6M
    *ptr_subband1_t-- = (im * wre) - (re * wim);
1400
10.6M
    *ptr_subband1_t-- = (re * wre) + (im * wim);
1401
1402
10.6M
    re = *ptr_subband12--;
1403
10.6M
    im = *ptr_subband2++;
1404
1405
10.6M
    *ptr_subband1_t2-- = (re * wim) + (im * wre);
1406
10.6M
    *ptr_subband1_t2-- = (im * wim) - (re * wre);
1407
1408
10.6M
    re = *ptr_subband++;
1409
10.6M
    im = *ptr_subband1--;
1410
1411
10.6M
    wim = *ptr_sin_cos++;
1412
10.6M
    wre = *ptr_sin_cos++;
1413
1414
10.6M
    *ptr_subband_t++ = (re * wre) + (im * wim);
1415
10.6M
    *ptr_subband_t++ = (im * wre) - (re * wim);
1416
1417
10.6M
    re = *ptr_subband2++;
1418
10.6M
    im = *ptr_subband12--;
1419
1420
10.6M
    *ptr_subband_t2++ = (im * wim) - (re * wre);
1421
10.6M
    *ptr_subband_t2++ = (re * wim) + (im * wre);
1422
1423
10.6M
    re = *ptr_subband1--;
1424
10.6M
    im = *ptr_subband++;
1425
1426
10.6M
    wim = *ptr_sin_cos++;
1427
10.6M
    wre = *ptr_sin_cos++;
1428
1429
10.6M
    *ptr_subband1_t-- = (im * wre) - (re * wim);
1430
10.6M
    *ptr_subband1_t-- = (re * wre) + (im * wim);
1431
1432
10.6M
    re = *ptr_subband12--;
1433
10.6M
    im = *ptr_subband2++;
1434
1435
10.6M
    *ptr_subband1_t2-- = (re * wim) + (im * wre);
1436
10.6M
    *ptr_subband1_t2-- = (im * wim) - (re * wre);
1437
1438
10.6M
    i--;
1439
10.6M
  }
1440
1441
3.95M
  switch (M) {
1442
0
    case M_32:
1443
0
      ixheaace_esbr_radix4bfly(ptr_twiddle, subband_tmp, 1, 8);
1444
0
      ixheaace_esbr_radix4bfly(ptr_twiddle + 48, subband_tmp, 4, 2);
1445
0
      ixheaace_esbr_postradixcompute2(subband, subband_tmp, ptr_dig_rev_tbl, 32);
1446
1447
0
      ixheaace_esbr_radix4bfly(ptr_twiddle, &subband_tmp[64], 1, 8);
1448
0
      ixheaace_esbr_radix4bfly(ptr_twiddle + 48, &subband_tmp[64], 4, 2);
1449
0
      ixheaace_esbr_postradixcompute2(&subband[64], &subband_tmp[64], ptr_dig_rev_tbl, 32);
1450
0
      break;
1451
1452
1.37M
    case M_16:
1453
1.37M
      ixheaace_esbr_radix4bfly(ptr_twiddle, subband_tmp, 1, 4);
1454
1.37M
      ixheaace_esbr_postradixcompute4(subband, subband_tmp, ptr_dig_rev_tbl, 16);
1455
1456
1.37M
      ixheaace_esbr_radix4bfly(ptr_twiddle, &subband_tmp[64], 1, 4);
1457
1.37M
      ixheaace_esbr_postradixcompute4(&subband[64], &subband_tmp[64], ptr_dig_rev_tbl, 16);
1458
1.37M
      break;
1459
1460
0
    case M_12:
1461
1462
0
      for (z = 0; z < (pstr_qmf_bank->no_channels >> 1); z++) {
1463
0
        temp[z] = subband_tmp[2 * z];
1464
0
        temp[12 + z] = subband_tmp[2 * z + 1];
1465
0
      }
1466
1467
      // convert re and im data to interleave
1468
0
      FLOAT32 intermediate[24];
1469
0
      WORD32 cnt = 0;
1470
0
      while (cnt < M_12) {
1471
0
        intermediate[2 * cnt] = temp[cnt];
1472
0
        intermediate[2 * cnt + 1] = temp[12 + cnt];
1473
0
        cnt++;
1474
0
      }
1475
1476
0
      iusace_complex_fft_p3_no_scratch(intermediate, 12);
1477
      // de-interleave
1478
0
      for (cnt = 0; cnt < 12; cnt++) {
1479
0
        temp[cnt] = intermediate[2 * cnt];
1480
0
        temp[12 + cnt] = intermediate[2 * cnt + 1];
1481
0
      }
1482
1483
0
      z = 0;
1484
0
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1485
0
        subband[2 * z] = temp[z];
1486
0
        subband[2 * z + 1] = temp[z + 12];
1487
0
        z++;
1488
0
      }
1489
1490
0
      z = 0;
1491
0
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1492
0
        temp[z] = subband_tmp[64 + 2 * z];
1493
0
        temp[12 + z] = subband_tmp[64 + 2 * z + 1];
1494
0
        z++;
1495
0
      }
1496
1497
      // convert re and im data to interleave
1498
0
      cnt = 0;
1499
0
      while (cnt < 12) {
1500
0
        intermediate[2 * cnt] = temp[cnt];
1501
0
        intermediate[2 * cnt + 1] = temp[12 + cnt];
1502
0
        cnt++;
1503
0
      }
1504
0
      iusace_complex_fft_p3_no_scratch(intermediate, 12);
1505
      // de-interleave
1506
1507
0
      cnt = 0;
1508
0
      while (cnt < 12) {
1509
0
        temp[cnt] = intermediate[2 * cnt];
1510
0
        temp[12 + cnt] = intermediate[2 * cnt + 1];
1511
0
        cnt++;
1512
0
      }
1513
1514
0
      z = 0;
1515
0
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1516
0
        subband[64 + 2 * z] = temp[z];
1517
0
        subband[64 + 2 * z + 1] = temp[z + 12];
1518
0
        z++;
1519
0
      }
1520
0
      break;
1521
1522
2.58M
    default:
1523
2.58M
      z = 0;
1524
23.2M
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1525
20.6M
        temp[z] = subband_tmp[2 * z];
1526
20.6M
        temp[8 + z] = subband_tmp[2 * z + 1];
1527
20.6M
        z++;
1528
20.6M
      }
1529
1530
2.58M
      FLOAT32 scratch[1024];
1531
2.58M
      cnt = 0;
1532
23.2M
      while (cnt < 8) {
1533
20.6M
        intermediate[2 * cnt] = temp[cnt];
1534
20.6M
        intermediate[2 * cnt + 1] = temp[8 + cnt];
1535
20.6M
        cnt++;
1536
20.6M
      }
1537
1538
2.58M
      iusace_complex_fft_p2(intermediate, 8, scratch);
1539
      // de-interleave
1540
2.58M
      cnt = 0;
1541
23.2M
      while (cnt < 8) {
1542
20.6M
        temp[cnt] = intermediate[2 * cnt];
1543
20.6M
        temp[8 + cnt] = intermediate[2 * cnt + 1];
1544
20.6M
        cnt++;
1545
20.6M
      }
1546
1547
2.58M
      z = 0;
1548
23.2M
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1549
20.6M
        subband[2 * z] = temp[z];
1550
20.6M
        subband[2 * z + 1] = temp[z + 8];
1551
20.6M
        z++;
1552
20.6M
      }
1553
2.58M
      z = 0;
1554
23.2M
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1555
20.6M
        temp[z] = subband_tmp[64 + 2 * z];
1556
20.6M
        temp[8 + z] = subband_tmp[64 + 2 * z + 1];
1557
20.6M
        z++;
1558
20.6M
      }
1559
1560
      // convert re and im data to interleave
1561
2.58M
      cnt = 0;
1562
23.2M
      while (cnt < 8) {
1563
20.6M
        intermediate[2 * cnt] = temp[cnt];
1564
20.6M
        intermediate[2 * cnt + 1] = temp[8 + cnt];
1565
20.6M
        cnt++;
1566
20.6M
      }
1567
1568
2.58M
      iusace_complex_fft_p2(intermediate, 8, scratch);
1569
1570
      // de-interleave
1571
2.58M
      cnt = 0;
1572
23.2M
      while (cnt < 8) {
1573
20.6M
        temp[cnt] = intermediate[2 * cnt];
1574
20.6M
        temp[8 + cnt] = intermediate[2 * cnt + 1];
1575
20.6M
        cnt++;
1576
20.6M
      }
1577
1578
2.58M
      z = 0;
1579
23.2M
      while (z < (pstr_qmf_bank->no_channels >> 1)) {
1580
20.6M
        subband[64 + 2 * z] = temp[z];
1581
20.6M
        subband[64 + 2 * z + 1] = temp[8 + z];
1582
20.6M
        z++;
1583
20.6M
      }
1584
2.58M
      break;
1585
3.95M
  }
1586
1587
3.95M
  ptr_subband = &subband[0];
1588
3.95M
  ptr_subband1 = &subband[2 * M - 1];
1589
1590
3.95M
  re = *ptr_subband1;
1591
1592
3.95M
  *ptr_subband = *ptr_subband / 2;
1593
3.95M
  ptr_subband++;
1594
3.95M
  *ptr_subband1 = -(*ptr_subband / 2);
1595
3.95M
  ptr_subband1--;
1596
1597
3.95M
  ptr_sin = pstr_qmf_bank->ptr_esbr_alt_sin_twiddle;
1598
1599
3.95M
  wim = *ptr_sin++;
1600
3.95M
  wre = *ptr_sin++;
1601
1602
3.95M
  im = *ptr_subband1;
1603
1604
3.95M
  *ptr_subband1-- = (re * wre) + (im * wim);
1605
3.95M
  *ptr_subband++ = (im * wre) - (re * wim);
1606
1607
3.95M
  ptr_subband2 = &subband[64];
1608
3.95M
  ptr_subband12 = &subband[2 * M - 1 + 64];
1609
1610
3.95M
  re = *ptr_subband12;
1611
1612
3.95M
  *ptr_subband12-- = -(*ptr_subband2 / 2);
1613
1614
3.95M
  *ptr_subband2 = ptr_subband2[1] / 2;
1615
1616
3.95M
  ptr_subband2++;
1617
1618
3.95M
  im = *ptr_subband12;
1619
1620
3.95M
  *ptr_subband2++ = -((re * wre) + (im * wim));
1621
3.95M
  *ptr_subband12-- = (re * wim) - (im * wre);
1622
1623
3.95M
  i = (M_2 - 2);
1624
21.3M
  while (i >= 0) {
1625
17.3M
    im = ptr_subband[0];
1626
1627
17.3M
    re = ptr_subband[1];
1628
1629
17.3M
    re2 = *ptr_subband1;
1630
1631
17.3M
    *ptr_subband++ = (re * wim) + (im * wre);
1632
17.3M
    *ptr_subband1-- = (im * wim) - (re * wre);
1633
1634
17.3M
    im = ptr_subband2[0];
1635
1636
17.3M
    re = ptr_subband2[1];
1637
1638
17.3M
    re3 = *ptr_subband12;
1639
1640
17.3M
    *ptr_subband12-- = -((re * wim) + (im * wre));
1641
17.3M
    *ptr_subband2++ = (re * wre) - (im * wim);
1642
1643
17.3M
    wim = *ptr_sin++;
1644
17.3M
    wre = *ptr_sin++;
1645
17.3M
    im = ptr_subband1[0];
1646
1647
17.3M
    *ptr_subband1-- = (re2 * wre) + (im * wim);
1648
17.3M
    *ptr_subband++ = (im * wre) - (re2 * wim);
1649
1650
17.3M
    im = ptr_subband12[0];
1651
1652
17.3M
    *ptr_subband2++ = -((re3 * wre) + (im * wim));
1653
17.3M
    *ptr_subband12-- = (re3 * wim) - (im * wre);
1654
17.3M
    i--;
1655
17.3M
  }
1656
3.95M
}
1657
1658
static VOID ixheaace_esbr_fwd_modulation(const FLOAT32 *ptr_time_sample_buf,
1659
                                         FLOAT32 *ptr_in_real_subband,
1660
                                         FLOAT32 *ptr_in_imag_subband,
1661
                                         ia_sbr_qmf_filter_bank_struct *pstr_qmf_bank,
1662
3.95M
                                         ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs) {
1663
3.95M
  WORD32 i;
1664
3.95M
  const FLOAT32 *ptr_time_sample_buf1 = &ptr_time_sample_buf[2 * pstr_qmf_bank->no_channels - 1];
1665
3.95M
  FLOAT32 temp1, temp2;
1666
3.95M
  FLOAT32 *ptr_real_subband = ptr_in_real_subband;
1667
3.95M
  FLOAT32 *ptr_imag_subband = ptr_in_imag_subband;
1668
3.95M
  const FLOAT32 *ptr_cos;
1669
1670
89.2M
  for (i = pstr_qmf_bank->no_channels - 1; i >= 0; i--) {
1671
85.3M
    temp1 = *ptr_time_sample_buf++ / 16.0f;
1672
85.3M
    temp2 = *ptr_time_sample_buf1-- / 16.0f;
1673
85.3M
    *ptr_real_subband++ = (temp1 - temp2);
1674
85.3M
    *ptr_imag_subband++ = (temp1 + temp2);
1675
85.3M
  }
1676
1677
3.95M
  ixheaace_esbr_cos_sin_mod(ptr_in_real_subband, pstr_qmf_bank, pstr_qmf_dec_tabs->esbr_w_16,
1678
3.95M
                            pstr_qmf_dec_tabs->dig_rev_tab_4_16);
1679
1680
3.95M
  ptr_cos = pstr_qmf_bank->ptr_esbr_t_cos;
1681
1682
3.95M
  i = (pstr_qmf_bank->usb - pstr_qmf_bank->lsb - 1);
1683
89.2M
  while (i >= 0) {
1684
85.3M
    FLOAT32 cosh, sinh;
1685
85.3M
    FLOAT32 re, im;
1686
1687
85.3M
    re = *ptr_in_real_subband;
1688
85.3M
    im = *ptr_in_imag_subband;
1689
85.3M
    cosh = *ptr_cos++;
1690
85.3M
    sinh = *ptr_cos++;
1691
85.3M
    *ptr_in_real_subband++ = 2 * ((re * cosh) + (im * sinh));
1692
85.3M
    *ptr_in_imag_subband++ = 2 * ((im * cosh) - (re * sinh));
1693
85.3M
    i--;
1694
85.3M
  }
1695
3.95M
}
1696
1697
VOID ixheaace_esbr_analysis_filt_block(
1698
    ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank,
1699
    ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs, FLOAT32 *ptr_core_coder_samples,
1700
    FLOAT32 qmf_buf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS],
1701
    FLOAT32 qmf_buf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS],
1702
83.3k
    WORD32 op_delay) {
1703
83.3k
  FLOAT32 *ptr_filt_states;
1704
83.3k
  FLOAT32 *ptr_filt_states_1;
1705
83.3k
  FLOAT32 *ptr_filt_states_2;
1706
83.3k
  FLOAT32 *ptr_temp;
1707
83.3k
  FLOAT32 *ptr_win_coeffs_1;
1708
83.3k
  FLOAT32 *ptr_win_coeffs_2;
1709
83.3k
  FLOAT32 *ptr_win_coeffs;
1710
83.3k
  FLOAT32 *ptr_loc_qmf_buf_real;
1711
83.3k
  FLOAT32 *ptr_loc_qmf_buf_imag;
1712
83.3k
  FLOAT32 local_qmf_buffer[128] = {0};
1713
83.3k
  FLOAT32 anal_buf[2 * 32] = {0};
1714
83.3k
  WORD32 idx, z;
1715
83.3k
  WORD32 core_syn_ch_index;
1716
83.3k
  FLOAT32 gain;
1717
83.3k
  WORD32 filt_offset;
1718
83.3k
  WORD32 num_columns;
1719
1720
83.3k
  ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank = pstr_codec_qmf_bank;
1721
83.3k
  ptr_filt_states = pstr_qmf_anal_bank->ptr_state_new_samples_pos_low_32;
1722
83.3k
  ptr_win_coeffs_1 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_filter_pos_32;
1723
83.3k
  num_columns = pstr_qmf_anal_bank->no_channels;
1724
1725
83.3k
  switch (num_columns) {
1726
40.4k
    case 16:
1727
40.4k
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
1728
40.4k
      gain = 128.0f;
1729
40.4k
      filt_offset = 64;
1730
40.4k
      break;
1731
0
    case 24:
1732
0
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24;
1733
0
      gain = 12.0f;
1734
0
      filt_offset = 24;
1735
0
      break;
1736
42.9k
    case 32:
1737
42.9k
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
1738
42.9k
      gain = 256.0f;
1739
42.9k
      filt_offset = 64;
1740
42.9k
      break;
1741
0
    default:
1742
0
      ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64;
1743
0
      gain = 256.0f;
1744
0
      filt_offset = 64;
1745
0
      break;
1746
83.3k
  }
1747
83.3k
  gain = 1.0f / gain;
1748
1749
83.3k
  pstr_qmf_anal_bank->usb = (WORD16)num_columns;
1750
1751
83.3k
  ptr_loc_qmf_buf_real = &local_qmf_buffer[0];
1752
83.3k
  ptr_loc_qmf_buf_imag = &local_qmf_buffer[64];
1753
1754
83.3k
  ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32;
1755
83.3k
  ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns;
1756
1757
83.3k
  idx = 0;
1758
4.04M
  while (idx < pstr_codec_qmf_bank->num_time_slots) {
1759
89.2M
    for (z = 0; z < num_columns; z++) {
1760
85.3M
      ptr_filt_states[num_columns - 1 - z] = ptr_core_coder_samples[z];
1761
85.3M
    }
1762
1763
3.95M
    ixheaace_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2, ptr_win_coeffs_1,
1764
3.95M
                                   ptr_win_coeffs_2, anal_buf, num_columns);
1765
1766
3.95M
    ptr_core_coder_samples += num_columns;
1767
1768
3.95M
    ptr_filt_states -= num_columns;
1769
3.95M
    if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) {
1770
396k
      ptr_filt_states =
1771
396k
          pstr_qmf_anal_bank->anal_filter_states_32 + 10 * num_columns - num_columns;
1772
396k
    }
1773
1774
3.95M
    ptr_temp = ptr_filt_states_1;
1775
3.95M
    ptr_filt_states_1 = ptr_filt_states_2;
1776
3.95M
    ptr_filt_states_2 = ptr_temp;
1777
1778
3.95M
    ptr_win_coeffs_1 += filt_offset;
1779
3.95M
    ptr_win_coeffs_2 += filt_offset;
1780
1781
3.95M
    ptr_win_coeffs = ptr_win_coeffs_1;
1782
3.95M
    ptr_win_coeffs_1 = ptr_win_coeffs_2;
1783
3.95M
    ptr_win_coeffs_2 = ptr_win_coeffs;
1784
1785
3.95M
    if (ptr_win_coeffs_2 > (pstr_qmf_anal_bank->ptr_ana_win_coeff_32 + filt_offset * 10)) {
1786
395k
      ptr_win_coeffs_1 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_ana_win_coeff_32;
1787
395k
      ptr_win_coeffs_2 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_ana_win_coeff_32 + filt_offset;
1788
395k
    }
1789
1790
3.95M
    ixheaace_esbr_fwd_modulation(anal_buf, &ptr_loc_qmf_buf_real[0], &ptr_loc_qmf_buf_imag[0],
1791
3.95M
                                 pstr_qmf_anal_bank, pstr_qmf_dec_tabs);
1792
1793
3.95M
    core_syn_ch_index = num_columns;
1794
1795
89.2M
    for (z = 0; z < core_syn_ch_index; z++) {
1796
85.3M
      qmf_buf_real[op_delay + idx][z] = ((FLOAT32)ptr_loc_qmf_buf_real[z] * gain);
1797
85.3M
      qmf_buf_imag[op_delay + idx][z] = ((FLOAT32)ptr_loc_qmf_buf_imag[z] * gain);
1798
85.3M
    }
1799
1800
3.95M
    idx++;
1801
3.95M
  }
1802
1803
83.3k
  pstr_qmf_anal_bank->ptr_filter_pos_32 = ptr_win_coeffs_1;
1804
83.3k
  pstr_qmf_anal_bank->ptr_state_new_samples_pos_low_32 = ptr_filt_states;
1805
83.3k
}
1806
IA_ERRORCODE ixheaace_extract_sbr_envelope(FLOAT32 *ptr_in_time, FLOAT32 *ptr_core_buf,
1807
                                           UWORD32 time_sn_stride,
1808
                                           ixheaace_pstr_sbr_enc pstr_env_enc,
1809
                                           ixheaace_str_sbr_tabs *ptr_sbr_tab,
1810
                                           ixheaace_comm_tables *pstr_com_tab,
1811
374k
                                           WORD32 flag_framelength_small) {
1812
374k
  IA_ERRORCODE err_code = IA_NO_ERROR;
1813
374k
  WORD32 ch, i, j, c;
1814
374k
  WORD32 n_envelopes[IXHEAACE_MAX_CH_IN_BS_ELE];
1815
374k
  WORD32 transient_info[IXHEAACE_MAX_CH_IN_BS_ELE][3];
1816
374k
  const ixheaace_str_frame_info_sbr *pstr_const_frame_info[IXHEAACE_MAX_CH_IN_BS_ELE];
1817
374k
  ixheaace_str_frame_info_sbr *pstr_frame_info = NULL;
1818
1819
374k
  ixheaace_pstr_sbr_config_data pstr_sbr_cfg = &pstr_env_enc->str_sbr_cfg;
1820
374k
  ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr = &pstr_env_enc->str_sbr_hdr;
1821
374k
  ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs = &pstr_env_enc->str_sbr_bs;
1822
374k
  struct ixheaace_ps_enc *pstr_ps_enc = pstr_env_enc->pstr_ps_enc;
1823
374k
  ixheaace_pstr_sbr_qmf_filter_bank pstr_synthesis_qmf_bank =
1824
374k
      pstr_env_enc->pstr_synthesis_qmf_bank;
1825
374k
  ixheaace_pstr_common_data pstr_com_data = &pstr_env_enc->str_cmon_data;
1826
374k
  WORD8 *ptr_sbr_scratch = pstr_env_enc->ptr_sbr_enc_scr->sbr_scratch;
1827
374k
  ixheaace_pstr_enc_channel pstr_env_ch[IXHEAACE_MAX_CH_IN_BS_ELE];
1828
374k
  pstr_env_ch[0] = pstr_env_enc->pstr_env_channel[0];
1829
374k
  pstr_env_ch[1] = pstr_env_enc->pstr_env_channel[1];
1830
1831
374k
  WORD32 num_channels = pstr_sbr_cfg->num_ch;
1832
374k
  WORD32 n_in_channels = (pstr_ps_enc) ? 2 : num_channels;
1833
1834
374k
  ixheaace_sbr_stereo_mode stereo_mode = pstr_sbr_cfg->stereo_mode;
1835
374k
  struct ixheaace_str_sbr_env_data *pstr_env_0 = &(pstr_env_ch[0]->enc_env_data);
1836
374k
  struct ixheaace_str_sbr_env_data *pstr_env_1 = NULL;
1837
1838
374k
  if (num_channels > 1) {
1839
170k
    pstr_env_1 = &(pstr_env_ch[1]->enc_env_data);
1840
170k
  }
1841
374k
  ixheaace_freq_res res[MAXIMUM_NUM_NOISE_VALUES];
1842
374k
  WORD32 *ptr_v_tuning;
1843
374k
  WORD32 v_tuning_lc_sbr[6] = {0, 2, 4, 0, 0, 0};
1844
374k
  WORD32 v_tuning_ld_sbr[6] = {0, 2, 3, 0, 0, 0};
1845
374k
  if (pstr_sbr_cfg->is_ld_sbr) {
1846
89.5k
    ptr_v_tuning = v_tuning_ld_sbr;
1847
285k
  } else {
1848
285k
    ptr_v_tuning = v_tuning_lc_sbr;
1849
285k
  }
1850
374k
  FLOAT32 *ptr_noise_floor[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL};
1851
374k
  WORD32 *ptr_scale_factor_band_nrg[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL};
1852
374k
  WORD32 *ptr_noise_level[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL};
1853
1854
374k
  WORD32 *ptr_sfb_nrg_coupling[IXHEAACE_MAX_CH_IN_BS_ELE];
1855
374k
  WORD32 *ptr_noise_lvl_coupling[IXHEAACE_MAX_CH_IN_BS_ELE];
1856
374k
  WORD32 *ptr_frame_splitter_scratch =
1857
374k
      (WORD32 *)pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0];
1858
1859
374k
  WORD32 max_quant_error;
1860
374k
  ixheaace_str_esbr_bs_data str_esbr = {0};
1861
374k
  WORD32 samp_ratio_fac = DOWNSAMPLE_FAC_2_1;
1862
374k
  if ((pstr_env_enc->str_sbr_cfg.sbr_codec == USAC_SBR) &&
1863
374k
      (pstr_env_enc->str_sbr_cfg.sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1)) {
1864
52.0k
    samp_ratio_fac = DOWNSAMPLE_FAC_4_1;
1865
52.0k
  }
1866
374k
  if ((n_in_channels > IXHEAACE_MAX_CH_IN_BS_ELE) || (n_in_channels < num_channels) ||
1867
374k
      (n_in_channels <= 0) || (num_channels <= 0)) {
1868
0
    return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_IN_CHANNELS;
1869
0
  }
1870
374k
  ch = 0;
1871
942k
  while (ch < n_in_channels) {
1872
567k
    ptr_sfb_nrg_coupling[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_r_buffer[0];
1873
567k
    ptr_noise_lvl_coupling[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0];
1874
567k
    ptr_scale_factor_band_nrg[ch] =
1875
567k
        (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_r_buffer[0] +
1876
567k
        IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES;
1877
567k
    ptr_noise_level[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0] +
1878
567k
                          IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES;
1879
567k
    ptr_noise_floor[ch] = pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0] +
1880
567k
                          IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES * 2;
1881
567k
    ch++;
1882
567k
  }
1883
374k
  if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) {
1884
91.4k
    WORD32 num_sbr_samples = 2048;
1885
91.4k
    if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
1886
37.2k
      num_sbr_samples = IXHEAACE_MAX_NUM_SAMPLES;
1887
37.2k
    }
1888
91.4k
    err_code = ixheaace_hbe_get_pitch_bins(
1889
91.4k
        ptr_in_time, pstr_sbr_cfg, pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0],
1890
91.4k
        ptr_sbr_tab, time_sn_stride, num_sbr_samples, &pstr_env_0->sbr_pitchin_bins,
1891
91.4k
        n_in_channels == 1 ? NULL : &pstr_env_1->sbr_pitchin_bins);
1892
91.4k
    if (err_code) return err_code;
1893
1894
90.4k
    WORD32 op_delay, codec_x_delay, num_time_slots;
1895
90.4k
    op_delay = IXHEAACE_OP_DELAY_OFFSET;
1896
90.4k
    codec_x_delay = IXHEAACE_ESBR_HBE_DELAY_OFFSET;
1897
90.4k
    if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
1898
37.2k
      op_delay = 2 * op_delay;
1899
37.2k
      codec_x_delay = 2 * codec_x_delay;
1900
37.2k
    }
1901
1902
90.4k
    WORD32 eff_offset = op_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
1903
90.4k
    WORD32 memmove_sz1 = (eff_offset + codec_x_delay) *
1904
90.4k
                         sizeof(pstr_env_ch[0]->pstr_hbe_enc->qmf_buf_real[0][0]) *
1905
90.4k
                         MAX_QMF_TIME_SLOTS;
1906
90.4k
    WORD32 memmove_sz2 = eff_offset *
1907
90.4k
                         sizeof(pstr_env_ch[0]->pstr_hbe_enc->ph_vocod_qmf_real[0][0]) *
1908
90.4k
                         MAX_QMF_TIME_SLOTS;
1909
1910
209k
    for (ch = 0; ch < n_in_channels; ch++) {
1911
118k
      ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc;
1912
118k
      num_time_slots =
1913
118k
          pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate;
1914
1915
118k
      memmove(pstr_hbe_enc->qmf_buf_real[0], pstr_hbe_enc->qmf_buf_real[num_time_slots],
1916
118k
              memmove_sz1);
1917
118k
      memmove(pstr_hbe_enc->qmf_buf_imag[0], pstr_hbe_enc->qmf_buf_imag[num_time_slots],
1918
118k
              memmove_sz1);
1919
118k
      memmove(pstr_hbe_enc->ph_vocod_qmf_real[0], pstr_hbe_enc->ph_vocod_qmf_real[num_time_slots],
1920
118k
              memmove_sz2);
1921
118k
      memmove(pstr_hbe_enc->ph_vocod_qmf_imag, pstr_hbe_enc->ph_vocod_qmf_imag + num_time_slots,
1922
118k
              memmove_sz2);
1923
118k
    }
1924
90.4k
  }
1925
373k
  i = 0;
1926
4.11M
  while (i < MAXIMUM_NUM_NOISE_VALUES) {
1927
3.73M
    res[i] = FREQ_RES_HIGH;
1928
3.73M
    i++;
1929
3.73M
  }
1930
1931
373k
  memset(transient_info, 0, sizeof(transient_info));
1932
1933
373k
  ch = 0;
1934
939k
  while (ch < n_in_channels) {
1935
565k
    ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
1936
1937
565k
    ixheaace_sbr_analysis_filtering(
1938
565k
        ptr_in_time ? ptr_in_time + ch : NULL, time_sn_stride,
1939
565k
        pstr_sbr_extract_env->ptr_r_buffer, pstr_sbr_extract_env->ptr_i_buffer,
1940
565k
        &pstr_env_ch[ch]->str_sbr_qmf, ptr_sbr_tab->ptr_qmf_tab,
1941
565k
        pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate,
1942
565k
        pstr_sbr_cfg->is_ld_sbr, (FLOAT32 *)ptr_sbr_scratch,
1943
565k
        (pstr_ps_enc != NULL && flag_framelength_small));
1944
1945
565k
    if ((1 == n_in_channels) && (USAC_SBR == pstr_sbr_cfg->sbr_codec) &&
1946
565k
        (pstr_sbr_hdr->sbr_pvc_active)) {
1947
63.2k
      ixheaace_pvc_scratch *pstr_pvc_scr = (ixheaace_pvc_scratch *)ptr_sbr_scratch;
1948
63.2k
      WORD32 ts, bd;
1949
63.2k
      FLOAT32 nrg_0, nrg_1;
1950
63.2k
      FLOAT32 *ptr_r_0, *ptr_r_1, *ptr_i_0, *ptr_i_1;
1951
63.2k
      FLOAT32 *ptr_r_2, *ptr_r_3, *ptr_i_2, *ptr_i_3, nrg_2, nrg_3;
1952
63.2k
      WORD32 pvc_rate = pstr_env_enc->pstr_pvc_enc->pvc_param.pvc_rate;
1953
1954
      // update header_active to send SBR header when previous PVC mode is different from
1955
      // current frame's
1956
63.2k
      if (pstr_env_enc->str_sbr_hdr.sbr_pvc_mode !=
1957
63.2k
          pstr_env_enc->pstr_pvc_enc->pvc_param.pvc_mode) {
1958
1.25k
        pstr_sbr_bs->header_active = 1;
1959
1.25k
      }
1960
1961
63.2k
      switch (pvc_rate) {
1962
46.6k
        case 2: {
1963
793k
          for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
1964
747k
            ptr_r_0 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts];
1965
747k
            ptr_r_1 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 1];
1966
747k
            ptr_i_0 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts];
1967
747k
            ptr_i_1 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 1];
1968
1969
48.5M
            for (bd = 0; bd < MAX_QMF_TIME_SLOTS; bd++) {
1970
47.8M
              nrg_0 = ptr_r_0[bd] * ptr_r_0[bd] + ptr_i_0[bd] * ptr_i_0[bd];
1971
47.8M
              nrg_1 = ptr_r_1[bd] * ptr_r_1[bd] + ptr_i_1[bd] * ptr_i_1[bd];
1972
47.8M
              pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd] =
1973
47.8M
                  (nrg_0 + nrg_1) / 2.0f;
1974
47.8M
            }
1975
747k
            WORD32 num_low_bands = MAX_QMF_TIME_SLOTS >> 1;
1976
24.6M
            for (bd = 0; bd < num_low_bands; bd++) {
1977
23.9M
              pstr_pvc_scr->pvc_qmf_low[ts * num_low_bands + bd] =
1978
23.9M
                  pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd];
1979
23.9M
            }
1980
747k
          }
1981
46.6k
          break;
1982
0
        }
1983
16.5k
        case 4: {
1984
281k
          for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) {
1985
265k
            ptr_r_0 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts];
1986
265k
            ptr_r_1 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 1];
1987
265k
            ptr_r_2 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 2];
1988
265k
            ptr_r_3 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 3];
1989
265k
            ptr_i_0 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts];
1990
265k
            ptr_i_1 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 1];
1991
265k
            ptr_i_2 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 2];
1992
265k
            ptr_i_3 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 3];
1993
1994
17.2M
            for (bd = 0; bd < MAX_QMF_TIME_SLOTS; bd++) {
1995
16.9M
              nrg_0 = ptr_r_0[bd] * ptr_r_0[bd] + ptr_i_0[bd] * ptr_i_0[bd];
1996
16.9M
              nrg_1 = ptr_r_1[bd] * ptr_r_1[bd] + ptr_i_1[bd] * ptr_i_1[bd];
1997
16.9M
              nrg_2 = ptr_r_2[bd] * ptr_r_2[bd] + ptr_i_2[bd] * ptr_i_2[bd];
1998
16.9M
              nrg_3 = ptr_r_3[bd] * ptr_r_3[bd] + ptr_i_3[bd] * ptr_i_3[bd];
1999
16.9M
              pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd] =
2000
16.9M
                  (nrg_0 + nrg_1 + nrg_2 + nrg_3) / 4.0f;
2001
16.9M
            }
2002
265k
            WORD32 num_low_bands = (MAX_QMF_TIME_SLOTS >> 2);
2003
4.51M
            for (bd = 0; bd < num_low_bands; bd++) {
2004
4.24M
              pstr_pvc_scr->pvc_qmf_low[ts * num_low_bands + bd] =
2005
4.24M
                  pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd];
2006
4.24M
            }
2007
265k
          }
2008
16.5k
          break;
2009
0
        }
2010
63.2k
      }
2011
63.2k
      pstr_env_enc->pstr_pvc_enc->pvc_param.usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2012
63.2k
      err_code = ixheaace_pvc_encode_frame(
2013
63.2k
          pstr_env_enc->pstr_pvc_enc, (UWORD8)pstr_env_enc->str_sbr_hdr.sbr_pvc_mode,
2014
63.2k
          pstr_pvc_scr->pvc_qmf_low, pstr_pvc_scr->pvc_qmf_high,
2015
63.2k
          pstr_sbr_cfg->ptr_v_k_master[0],
2016
63.2k
          pstr_sbr_cfg->ptr_v_k_master[pstr_sbr_cfg->num_master] - 1);
2017
63.2k
      if (err_code) {
2018
0
        return err_code;
2019
0
      }
2020
2021
63.2k
      memcpy(&pstr_env_ch[ch]->enc_env_data.pvc_info, &pstr_env_enc->pstr_pvc_enc->pvc_bs_info,
2022
63.2k
             sizeof(ixheaace_pvc_bs_info));
2023
63.2k
    }
2024
2025
    // COPY generated spectrum for inter-TES encoder
2026
565k
    if ((USAC_SBR == pstr_sbr_cfg->sbr_codec) && (1 == pstr_sbr_hdr->sbr_inter_tes_active)) {
2027
124k
      WORD32 ts, num_ts, delay;
2028
124k
      num_ts = pstr_env_ch[ch]->str_sbr_qmf.num_time_slots;
2029
2030
124k
      ixheaace_str_inter_tes_params *pstr_tes_enc = &pstr_env_ch[ch]->str_inter_tes_enc;
2031
124k
      delay = pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
2032
124k
      ts = 0;
2033
2.11M
      while (ts < num_ts) {
2034
1.98M
        memcpy(pstr_tes_enc->qmf_buf_real[delay + ts], pstr_sbr_extract_env->ptr_r_buffer[ts],
2035
1.98M
               IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0]));
2036
1.98M
        memcpy(pstr_tes_enc->qmf_buf_imag[delay + ts], pstr_sbr_extract_env->ptr_i_buffer[ts],
2037
1.98M
               IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_imag[0][0]));
2038
1.98M
        ts++;
2039
1.98M
      }
2040
124k
    }
2041
2042
565k
    ch++;
2043
565k
  }
2044
373k
  if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) {
2045
90.4k
    WORD32 dft_hbe_flag = 0;
2046
90.4k
    WORD32 op_delay, codec_x_delay, num_time_slots;
2047
90.4k
    WORD32 esbr_hbe_delay_offsets = IXHEAACE_ESBR_HBE_DELAY_OFFSET;
2048
90.4k
    WORD32 oversampling_flag = 0;
2049
90.4k
    op_delay = IXHEAACE_OP_DELAY_OFFSET;
2050
90.4k
    codec_x_delay = IXHEAACE_ESBR_HBE_DELAY_OFFSET;
2051
90.4k
    if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
2052
37.2k
      op_delay = 2 * IXHEAACE_OP_DELAY_OFFSET;
2053
37.2k
      codec_x_delay = 2 * codec_x_delay;
2054
37.2k
      oversampling_flag = 1;
2055
37.2k
    }
2056
90.4k
    WORD32 eff_offset = op_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
2057
90.4k
    dft_hbe_flag = pstr_sbr_hdr->hq_esbr;
2058
90.4k
    ch = 0;
2059
196k
    while (ch < n_in_channels) {
2060
115k
      ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc;
2061
115k
      pstr_hbe_enc->pstr_hbe_txposer->oversampling_flag = oversampling_flag;
2062
115k
      num_time_slots =
2063
115k
          pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate;
2064
2065
115k
      if (dft_hbe_flag == 1) {
2066
31.8k
        err_code = ixheaace_dft_hbe_apply(
2067
31.8k
            pstr_hbe_enc->pstr_hbe_txposer,
2068
31.8k
            pstr_hbe_enc->qmf_buf_real + eff_offset + esbr_hbe_delay_offsets,
2069
31.8k
            pstr_hbe_enc->qmf_buf_imag + eff_offset + esbr_hbe_delay_offsets, num_time_slots,
2070
31.8k
            pstr_hbe_enc->ph_vocod_qmf_real + eff_offset,
2071
31.8k
            pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset,
2072
31.8k
            pstr_env_ch[ch]->enc_env_data.sbr_pitchin_bins, (FLOAT32 *)ptr_sbr_scratch);
2073
31.8k
        if (err_code) {
2074
9.02k
          return err_code;
2075
9.02k
        }
2076
83.3k
      } else {
2077
        // size 4096 samples
2078
83.3k
        FLOAT32 *ptr_time_data = (FLOAT32 *)ptr_sbr_scratch;
2079
83.3k
        int cnt = 0;
2080
83.3k
        if (0 == ch) {
2081
274M
          while (cnt < IXHEAACE_MAX_NUM_SAMPLES) {
2082
274M
            ptr_time_data[cnt] = pstr_env_enc->ptr_hbe_resample_buf[2 * cnt];
2083
274M
            cnt++;
2084
274M
          }
2085
66.9k
        } else {
2086
67.1M
          while (cnt < IXHEAACE_MAX_NUM_SAMPLES) {
2087
67.1M
            ptr_time_data[cnt] = pstr_env_enc->ptr_hbe_resample_buf[2 * cnt + 1];
2088
67.1M
            cnt++;
2089
67.1M
          }
2090
16.4k
        }
2091
2092
83.3k
        ixheaace_esbr_analysis_filt_block(&(pstr_hbe_enc->str_codec_qmf_bank),
2093
83.3k
                                          pstr_hbe_enc->str_codec_qmf_bank.pstr_qmf_dec_tabs,
2094
83.3k
                                          ptr_time_data, pstr_hbe_enc->qmf_buf_real,
2095
83.3k
                                          pstr_hbe_enc->qmf_buf_imag,
2096
83.3k
                                          op_delay + codec_x_delay + IXHEAACE_SBR_HF_ADJ_OFFSET);
2097
2098
83.3k
        err_code = ixheaace_qmf_hbe_apply(
2099
83.3k
            pstr_hbe_enc->pstr_hbe_txposer,
2100
83.3k
            pstr_hbe_enc->qmf_buf_real + eff_offset + esbr_hbe_delay_offsets,
2101
83.3k
            pstr_hbe_enc->qmf_buf_imag + eff_offset + esbr_hbe_delay_offsets, num_time_slots,
2102
83.3k
            pstr_hbe_enc->ph_vocod_qmf_real + eff_offset,
2103
83.3k
            pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset,
2104
83.3k
            pstr_env_ch[ch]->enc_env_data.sbr_pitchin_bins);
2105
83.3k
        if (err_code) {
2106
0
          return err_code;
2107
0
        }
2108
2109
83.3k
        if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) {
2110
40.4k
          ixheaace_hbe_repl_spec(&pstr_hbe_enc->pstr_hbe_txposer->x_over_qmf[0],
2111
40.4k
                                 pstr_hbe_enc->ph_vocod_qmf_real + eff_offset,
2112
40.4k
                                 pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset, num_time_slots,
2113
40.4k
                                 pstr_hbe_enc->pstr_hbe_txposer->max_stretch);
2114
40.4k
        }
2115
83.3k
      }
2116
106k
      ch++;
2117
106k
    }
2118
90.4k
  }
2119
364k
  if (pstr_ps_enc && pstr_synthesis_qmf_bank) {
2120
22.9k
    err_code = ixheaace_encode_ps_frame(
2121
22.9k
        pstr_ps_enc, pstr_env_ch[0]->str_sbr_extract_env.ptr_i_buffer,
2122
22.9k
        pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer,
2123
22.9k
        pstr_env_ch[1]->str_sbr_extract_env.ptr_i_buffer,
2124
22.9k
        pstr_env_ch[1]->str_sbr_extract_env.ptr_r_buffer, ptr_sbr_tab->ptr_ps_tab, pstr_com_tab);
2125
22.9k
    if (err_code) {
2126
0
      return err_code;
2127
0
    }
2128
22.9k
    ixheaace_enc_synthesis_qmf_filtering(
2129
22.9k
        pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer,
2130
22.9k
        pstr_env_ch[0]->str_sbr_extract_env.ptr_i_buffer, ptr_core_buf,
2131
22.9k
        (ixheaace_pstr_sbr_qmf_filter_bank)pstr_synthesis_qmf_bank);
2132
22.9k
  }
2133
2134
364k
  ch = 0;
2135
895k
  while (ch < num_channels) {
2136
530k
    ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc;
2137
530k
    ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
2138
2139
530k
    ixheaace_get_energy_from_cplx_qmf(
2140
530k
        pstr_sbr_extract_env->ptr_y_buffer + pstr_sbr_extract_env->y_buffer_write_offset,
2141
530k
        pstr_sbr_extract_env->ptr_r_buffer, pstr_sbr_extract_env->ptr_i_buffer,
2142
530k
        pstr_sbr_cfg->is_ld_sbr, pstr_env_ch[ch]->str_sbr_qmf.num_time_slots, samp_ratio_fac,
2143
530k
        pstr_hbe_enc,
2144
530k
        (IXHEAACE_OP_DELAY_OFFSET + IXHEAACE_ESBR_HBE_DELAY_OFFSET + IXHEAACE_SBR_HF_ADJ_OFFSET),
2145
530k
        pstr_sbr_hdr->sbr_harmonic);
2146
2147
530k
    ixheaace_calculate_tonality_quotas(
2148
530k
        &pstr_env_ch[ch]->str_ton_corr, pstr_sbr_extract_env->ptr_r_buffer,
2149
530k
        pstr_sbr_extract_env->ptr_i_buffer,
2150
530k
        pstr_sbr_cfg->ptr_freq_band_tab[HI][pstr_sbr_cfg->num_scf[HI]],
2151
530k
        pstr_env_ch[ch]->str_sbr_qmf.num_time_slots, pstr_sbr_extract_env->time_step);
2152
530k
    if (pstr_sbr_cfg->is_ld_sbr) {
2153
129k
      ixheaace_detect_transient_eld(pstr_sbr_extract_env->ptr_y_buffer,
2154
129k
                                    &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch]);
2155
400k
    } else if (pstr_sbr_extract_env->time_step == 4) {
2156
61.5k
      ixheaace_detect_transient_4_1(pstr_sbr_extract_env->ptr_y_buffer,
2157
61.5k
                                    &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch],
2158
61.5k
                                    pstr_sbr_extract_env->time_step);
2159
338k
    } else {
2160
338k
      ixheaace_detect_transient(pstr_sbr_extract_env->ptr_y_buffer,
2161
338k
                                &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch],
2162
338k
                                pstr_sbr_extract_env->time_step, pstr_sbr_cfg->sbr_codec);
2163
338k
    }
2164
530k
    if (transient_info[ch][1] == 0) {
2165
426k
      if (pstr_sbr_cfg->is_ld_sbr) {
2166
94.9k
        err_code = ixheaace_frame_splitter(
2167
94.9k
            pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector,
2168
94.9k
            pstr_sbr_cfg->ptr_freq_band_tab[1], pstr_sbr_cfg->num_scf[1],
2169
94.9k
            pstr_sbr_extract_env->time_step, pstr_sbr_extract_env->time_slots, transient_info[ch],
2170
94.9k
            (FLOAT32 *)ptr_frame_splitter_scratch, pstr_sbr_cfg->is_ld_sbr);
2171
331k
      } else {
2172
331k
        err_code = ixheaace_frame_splitter(
2173
331k
            pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector,
2174
331k
            pstr_sbr_cfg->ptr_freq_band_tab[1], pstr_sbr_cfg->num_scf[1],
2175
331k
            pstr_sbr_extract_env->time_step, pstr_sbr_extract_env->no_cols, transient_info[ch],
2176
331k
            (FLOAT32 *)ptr_frame_splitter_scratch, pstr_sbr_cfg->is_ld_sbr);
2177
331k
      }
2178
426k
      if (err_code) {
2179
0
        return err_code;
2180
0
      }
2181
426k
    }
2182
530k
    ch++;
2183
530k
  }
2184
2185
364k
  if (stereo_mode == SBR_COUPLING) {
2186
0
    if (transient_info[0][1] && transient_info[1][1]) {
2187
0
      transient_info[0][0] = ixheaac_min32(transient_info[1][0], transient_info[0][0]);
2188
2189
0
      transient_info[1][0] = transient_info[0][0];
2190
0
    } else if (transient_info[0][1] && !transient_info[1][1]) {
2191
0
      transient_info[1][0] = transient_info[0][0];
2192
0
    } else if (!transient_info[0][1] && transient_info[1][1]) {
2193
0
      transient_info[0][0] = transient_info[1][0];
2194
0
    } else {
2195
0
      transient_info[0][0] = ixheaac_max32(transient_info[1][0], transient_info[0][0]);
2196
2197
0
      transient_info[1][0] = transient_info[0][0];
2198
0
    }
2199
0
  }
2200
2201
364k
  err_code = ixheaace_frame_info_generator(
2202
364k
      &pstr_env_ch[0]->str_sbr_env_frame, pstr_env_ch[0]->str_sbr_extract_env.pre_transient_info,
2203
364k
      transient_info[0], ptr_v_tuning, ptr_sbr_tab->ptr_qmf_tab,
2204
364k
      pstr_env_ch[0]->str_sbr_qmf.num_time_slots, pstr_sbr_cfg->is_ld_sbr, &pstr_frame_info,
2205
364k
      flag_framelength_small);
2206
364k
  if (pstr_sbr_cfg->is_ld_sbr && transient_info[0][2]) {
2207
1.03k
    pstr_frame_info->short_env = pstr_frame_info->n_envelopes;
2208
1.03k
  }
2209
364k
  pstr_const_frame_info[0] = pstr_frame_info;
2210
364k
  if (err_code) {
2211
0
    return err_code;
2212
0
  }
2213
2214
364k
  pstr_env_0->pstr_sbr_bs_grid = &pstr_env_ch[0]->str_sbr_env_frame.sbr_grid;
2215
2216
895k
  for (ch = 0; ch < num_channels; ch++) {
2217
530k
    memset(
2218
530k
        ptr_noise_floor[ch], 0,
2219
530k
        IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES * sizeof(ptr_noise_floor[0][0]));
2220
530k
  }
2221
2222
364k
  switch (stereo_mode) {
2223
68.7k
    case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2224
165k
    case IXHEAACE_SBR_MODE_SWITCH_LRC:
2225
2226
165k
      err_code = ixheaace_frame_info_generator(
2227
165k
          &pstr_env_ch[1]->str_sbr_env_frame,
2228
165k
          pstr_env_ch[1]->str_sbr_extract_env.pre_transient_info, transient_info[1], ptr_v_tuning,
2229
165k
          ptr_sbr_tab->ptr_qmf_tab, pstr_env_ch[1]->str_sbr_qmf.num_time_slots,
2230
165k
          pstr_sbr_cfg->is_ld_sbr, &pstr_frame_info, flag_framelength_small);
2231
2232
165k
      if (pstr_sbr_cfg->is_ld_sbr && transient_info[1][2]) {
2233
579
        pstr_frame_info->short_env = pstr_frame_info->n_envelopes;
2234
579
      }
2235
165k
      pstr_const_frame_info[1] = pstr_frame_info;
2236
165k
      if (err_code) {
2237
0
        return err_code;
2238
0
      }
2239
2240
165k
      pstr_env_1->pstr_sbr_bs_grid = &pstr_env_ch[1]->str_sbr_env_frame.sbr_grid;
2241
2242
165k
      if (pstr_const_frame_info[0]->n_envelopes != pstr_const_frame_info[1]->n_envelopes) {
2243
3.34k
        stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2244
162k
      } else {
2245
576k
        for (i = 0; i < pstr_const_frame_info[0]->n_envelopes + 1; i++) {
2246
416k
          if (pstr_const_frame_info[0]->borders[i] != pstr_const_frame_info[1]->borders[i]) {
2247
2.05k
            stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2248
2.05k
            break;
2249
2.05k
          }
2250
416k
        }
2251
2252
419k
        for (i = 0; i < pstr_const_frame_info[0]->n_envelopes; i++) {
2253
258k
          if (pstr_const_frame_info[0]->freq_res[i] != pstr_const_frame_info[1]->freq_res[i]) {
2254
371
            stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2255
371
            break;
2256
371
          }
2257
258k
        }
2258
2259
162k
        if (pstr_const_frame_info[0]->short_env != pstr_const_frame_info[1]->short_env) {
2260
487
          stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT;
2261
487
        }
2262
162k
      }
2263
165k
      break;
2264
0
    case SBR_COUPLING:
2265
2266
0
      pstr_const_frame_info[1] = pstr_const_frame_info[0];
2267
2268
0
      pstr_env_1->pstr_sbr_bs_grid = &pstr_env_ch[0]->str_sbr_env_frame.sbr_grid;
2269
0
      break;
2270
199k
    case IXHEAACE_SBR_MODE_MONO:
2271
199k
      break;
2272
364k
  }
2273
2274
895k
  for (ch = 0; ch < num_channels; ch++) {
2275
530k
    ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
2276
2277
530k
    pstr_sbr_extract_env->pre_transient_info[0] = transient_info[ch][0];
2278
530k
    pstr_sbr_extract_env->pre_transient_info[1] = transient_info[ch][1];
2279
530k
    pstr_env_ch[ch]->enc_env_data.no_of_envelopes = n_envelopes[ch] =
2280
530k
        pstr_const_frame_info[ch]->n_envelopes;
2281
2282
1.34M
    for (i = 0; i < n_envelopes[ch]; i++) {
2283
818k
      pstr_env_ch[ch]->enc_env_data.no_scf_bands[i] =
2284
818k
          (pstr_const_frame_info[ch]->freq_res[i] == FREQ_RES_HIGH
2285
818k
               ? pstr_sbr_cfg->num_scf[FREQ_RES_HIGH]
2286
818k
               : pstr_sbr_cfg->num_scf[FREQ_RES_LOW]);
2287
818k
    }
2288
2289
530k
    if ((pstr_env_ch[ch]->enc_env_data.pstr_sbr_bs_grid->frame_type == IXHEAACE_FIXFIX) &&
2290
530k
        (n_envelopes[ch] == 1)) {
2291
366k
      if (pstr_sbr_cfg->is_ld_sbr) {
2292
92.4k
        pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res = IXHEAACE_SBR_AMP_RES_3_0;
2293
273k
      } else {
2294
273k
        pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res = IXHEAACE_SBR_AMP_RES_1_5;
2295
273k
      }
2296
366k
      if (pstr_env_ch[ch]->enc_env_data.init_sbr_amp_res !=
2297
366k
          pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res) {
2298
33.9k
        err_code = ixheaace_init_sbr_huffman_tabs(
2299
33.9k
            &pstr_env_ch[ch]->enc_env_data, &pstr_env_ch[ch]->str_sbr_code_env,
2300
33.9k
            &pstr_env_ch[ch]->str_sbr_code_noise_floor, IXHEAACE_SBR_AMP_RES_1_5,
2301
33.9k
            ptr_sbr_tab->ptr_sbr_huff_tab);
2302
33.9k
        if (err_code) {
2303
0
          return err_code;
2304
0
        }
2305
33.9k
        pstr_env_ch[ch]->sbr_amp_res_init = IXHEAACE_SBR_AMP_RES_1_5;
2306
33.9k
      }
2307
366k
    } else {
2308
164k
      if (pstr_sbr_hdr->sbr_amp_res != pstr_env_ch[ch]->enc_env_data.init_sbr_amp_res) {
2309
30.2k
        err_code = ixheaace_init_sbr_huffman_tabs(
2310
30.2k
            &pstr_env_ch[ch]->enc_env_data, &pstr_env_ch[ch]->str_sbr_code_env,
2311
30.2k
            &pstr_env_ch[ch]->str_sbr_code_noise_floor, pstr_sbr_hdr->sbr_amp_res,
2312
30.2k
            ptr_sbr_tab->ptr_sbr_huff_tab);
2313
30.2k
        if (err_code) {
2314
0
          return err_code;
2315
0
        }
2316
30.2k
        pstr_env_ch[ch]->sbr_amp_res_init = pstr_sbr_hdr->sbr_amp_res;
2317
30.2k
      }
2318
164k
    }
2319
2320
530k
    ixheaace_ton_corr_param_extr(
2321
530k
        &pstr_env_ch[ch]->str_ton_corr, pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec,
2322
530k
        ptr_noise_floor[ch], &pstr_env_ch[ch]->enc_env_data.add_harmonic_flag,
2323
530k
        pstr_env_ch[ch]->enc_env_data.add_harmonic, pstr_sbr_extract_env->envelope_compensation,
2324
530k
        pstr_const_frame_info[ch], transient_info[ch], pstr_sbr_cfg->ptr_freq_band_tab[HI],
2325
530k
        pstr_sbr_cfg->num_scf[HI], pstr_env_ch[ch]->enc_env_data.sbr_xpos_mode, ptr_sbr_scratch,
2326
530k
        pstr_sbr_cfg->is_ld_sbr);
2327
2328
530k
    pstr_env_ch[ch]->enc_env_data.sbr_invf_mode =
2329
530k
        pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec[0];
2330
530k
    pstr_env_ch[ch]->enc_env_data.noise_band_count =
2331
530k
        pstr_env_ch[ch]->str_ton_corr.sbr_noise_floor_est.num_of_noise_bands;
2332
530k
  }
2333
2334
364k
  switch (stereo_mode) {
2335
199k
    case IXHEAACE_SBR_MODE_MONO:
2336
199k
      err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2337
199k
                                                 NULL, pstr_const_frame_info[0],
2338
199k
                                                 ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg,
2339
199k
                                                 pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL);
2340
2341
199k
      if (err_code) {
2342
0
        return err_code;
2343
0
      }
2344
199k
      break;
2345
2346
199k
    case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2347
2348
72.0k
      err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2349
72.0k
                                                 NULL, pstr_const_frame_info[0],
2350
72.0k
                                                 ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg,
2351
72.0k
                                                 pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL);
2352
72.0k
      if (err_code) {
2353
0
        return err_code;
2354
0
      }
2355
2356
72.0k
      err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer,
2357
72.0k
                                                 NULL, pstr_const_frame_info[1],
2358
72.0k
                                                 ptr_scale_factor_band_nrg[1], NULL, pstr_sbr_cfg,
2359
72.0k
                                                 pstr_env_ch[1], IXHEAACE_SBR_MODE_MONO, NULL);
2360
2361
72.0k
      if (err_code) {
2362
0
        return err_code;
2363
0
      }
2364
2365
72.0k
      break;
2366
2367
72.0k
    case SBR_COUPLING:
2368
2369
0
      err_code = ixheaace_calculate_sbr_envelope(
2370
0
          pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2371
0
          pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, pstr_const_frame_info[0],
2372
0
          ptr_scale_factor_band_nrg[0], ptr_scale_factor_band_nrg[1], pstr_sbr_cfg,
2373
0
          pstr_env_ch[0], SBR_COUPLING, &max_quant_error);
2374
0
      if (err_code) {
2375
0
        return err_code;
2376
0
      }
2377
0
      break;
2378
2379
93.4k
    case IXHEAACE_SBR_MODE_SWITCH_LRC:
2380
93.4k
      err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2381
93.4k
                                                 NULL, pstr_const_frame_info[0],
2382
93.4k
                                                 ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg,
2383
93.4k
                                                 pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL);
2384
93.4k
      if (err_code) {
2385
0
        return err_code;
2386
0
      }
2387
2388
93.4k
      err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer,
2389
93.4k
                                                 NULL, pstr_const_frame_info[1],
2390
93.4k
                                                 ptr_scale_factor_band_nrg[1], NULL, pstr_sbr_cfg,
2391
93.4k
                                                 pstr_env_ch[1], IXHEAACE_SBR_MODE_MONO, NULL);
2392
93.4k
      if (err_code) {
2393
0
        return err_code;
2394
0
      }
2395
2396
93.4k
      err_code = ixheaace_calculate_sbr_envelope(
2397
93.4k
          pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer,
2398
93.4k
          pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, pstr_const_frame_info[0],
2399
93.4k
          ptr_sfb_nrg_coupling[0], ptr_sfb_nrg_coupling[1], pstr_sbr_cfg, pstr_env_ch[0],
2400
93.4k
          SBR_COUPLING, &max_quant_error);
2401
93.4k
      if (err_code) {
2402
0
        return err_code;
2403
0
      }
2404
93.4k
      break;
2405
364k
  }
2406
2407
364k
  switch (stereo_mode) {
2408
199k
    case IXHEAACE_SBR_MODE_MONO:
2409
2410
199k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2411
2412
199k
      err_code = ixheaace_code_envelope(
2413
199k
          ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2414
199k
          pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2415
199k
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2416
199k
      if (err_code) {
2417
0
        return err_code;
2418
0
      }
2419
2420
199k
      break;
2421
2422
199k
    case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2423
      // We have a error checks for Number of channels to ensure memory is assigned to
2424
      // ptr_noise_floor[]. However, MSVS static analysis is marking this as a potential error.
2425
      // So, suppressed this in source
2426
72.0k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2427
2428
72.0k
      err_code = ixheaace_code_envelope(
2429
72.0k
          ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2430
72.0k
          pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2431
72.0k
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2432
72.0k
      if (err_code) {
2433
0
        return err_code;
2434
0
      }
2435
2436
72.0k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 0);
2437
2438
72.0k
      err_code = ixheaace_code_envelope(
2439
72.0k
          ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2440
72.0k
          pstr_env_1->domain_vec_noise, 0, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 0,
2441
72.0k
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2442
72.0k
      if (err_code) {
2443
0
        return err_code;
2444
0
      }
2445
2446
72.0k
      break;
2447
2448
72.0k
    case SBR_COUPLING:
2449
0
      ixheaace_couple_noise_floor(ptr_noise_floor[0], ptr_noise_floor[1]);
2450
2451
0
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2452
2453
0
      err_code = ixheaace_code_envelope(
2454
0
          ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2455
0
          pstr_env_0->domain_vec_noise, 1, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2456
0
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2457
0
      if (err_code) {
2458
0
        return err_code;
2459
0
      }
2460
2461
0
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 1);
2462
2463
0
      err_code = ixheaace_code_envelope(
2464
0
          ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2465
0
          pstr_env_1->domain_vec_noise, 1, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 1,
2466
0
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2467
0
      if (err_code) {
2468
0
        return err_code;
2469
0
      }
2470
2471
0
      break;
2472
2473
93.4k
    case IXHEAACE_SBR_MODE_SWITCH_LRC:
2474
2475
93.4k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0);
2476
2477
93.4k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 0);
2478
2479
93.4k
      ixheaace_couple_noise_floor(ptr_noise_floor[0], ptr_noise_floor[1]);
2480
2481
93.4k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_lvl_coupling[0], ptr_noise_floor[0],
2482
93.4k
                                                   0);
2483
2484
93.4k
      ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_lvl_coupling[1], ptr_noise_floor[1],
2485
93.4k
                                                   1);
2486
93.4k
      break;
2487
364k
  }
2488
2489
364k
  switch (stereo_mode) {
2490
199k
    case IXHEAACE_SBR_MODE_MONO:
2491
2492
199k
      pstr_sbr_hdr->coupling = 0;
2493
199k
      pstr_env_0->balance = 0;
2494
2495
199k
      err_code = ixheaace_code_envelope(
2496
199k
          ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2497
199k
          &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling,
2498
199k
          pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2499
199k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2500
199k
      if (err_code) {
2501
0
        return err_code;
2502
0
      }
2503
199k
      break;
2504
2505
199k
    case IXHEAACE_SBR_MODE_LEFT_RIGHT:
2506
2507
72.0k
      pstr_sbr_hdr->coupling = 0;
2508
2509
72.0k
      pstr_env_0->balance = 0;
2510
72.0k
      pstr_env_1->balance = 0;
2511
2512
72.0k
      err_code = ixheaace_code_envelope(
2513
72.0k
          ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2514
72.0k
          &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling,
2515
72.0k
          pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2516
72.0k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2517
72.0k
      if (err_code) {
2518
0
        return err_code;
2519
0
      }
2520
2521
72.0k
      err_code = ixheaace_code_envelope(
2522
72.0k
          ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res,
2523
72.0k
          &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, pstr_sbr_hdr->coupling,
2524
72.0k
          pstr_const_frame_info[1]->n_envelopes, 0, pstr_sbr_bs->header_active,
2525
72.0k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2526
72.0k
      if (err_code) {
2527
0
        return err_code;
2528
0
      }
2529
72.0k
      break;
2530
2531
72.0k
    case SBR_COUPLING:
2532
2533
0
      pstr_sbr_hdr->coupling = 1;
2534
0
      pstr_env_0->balance = 0;
2535
0
      pstr_env_1->balance = 1;
2536
2537
0
      err_code = ixheaace_code_envelope(
2538
0
          ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2539
0
          &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling,
2540
0
          pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2541
0
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2542
0
      if (err_code) {
2543
0
        return err_code;
2544
0
      }
2545
2546
0
      err_code = ixheaace_code_envelope(
2547
0
          ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res,
2548
0
          &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, pstr_sbr_hdr->coupling,
2549
0
          pstr_const_frame_info[1]->n_envelopes, 1, pstr_sbr_bs->header_active,
2550
0
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2551
0
      if (err_code) {
2552
0
        return err_code;
2553
0
      }
2554
0
      break;
2555
2556
93.4k
    case IXHEAACE_SBR_MODE_SWITCH_LRC: {
2557
93.4k
      WORD32 payloadbits_lr;
2558
93.4k
      WORD32 payloadbits_coupling;
2559
2560
93.4k
      WORD32 scale_factor_band_nrg_prev_temp[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_FREQ_COEFFS];
2561
93.4k
      WORD32 noise_prev_temp[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_NUM_NOISE_COEFFS];
2562
93.4k
      WORD32 up_date_nrg_temp[IXHEAACE_MAX_CH_IN_BS_ELE];
2563
93.4k
      WORD32 up_date_noise_temp[IXHEAACE_MAX_CH_IN_BS_ELE];
2564
93.4k
      WORD32 domain_vec_temp[IXHEAACE_MAX_CH_IN_BS_ELE][IXHEAACE_MAX_ENV];
2565
93.4k
      WORD32 domain_vec_noise_temp[IXHEAACE_MAX_CH_IN_BS_ELE][IXHEAACE_MAX_ENV];
2566
2567
93.4k
      WORD32 temp_flag_right = 0;
2568
93.4k
      WORD32 temp_flag_left = 0;
2569
2570
93.4k
      ch = 0;
2571
280k
      while (ch < num_channels) {
2572
186k
        memcpy(scale_factor_band_nrg_prev_temp[ch],
2573
186k
               pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev,
2574
186k
               MAXIMUM_FREQ_COEFFS * sizeof(scale_factor_band_nrg_prev_temp[0][0]));
2575
2576
186k
        memcpy(noise_prev_temp[ch], pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev,
2577
186k
               MAXIMUM_NUM_NOISE_COEFFS * sizeof(noise_prev_temp[0][0]));
2578
2579
186k
        up_date_nrg_temp[ch] = pstr_env_ch[ch]->str_sbr_code_env.update;
2580
186k
        up_date_noise_temp[ch] = pstr_env_ch[ch]->str_sbr_code_noise_floor.update;
2581
2582
186k
        if (pstr_sbr_hdr->prev_coupling) {
2583
179k
          pstr_env_ch[ch]->str_sbr_code_env.update = 0;
2584
179k
          pstr_env_ch[ch]->str_sbr_code_noise_floor.update = 0;
2585
179k
        }
2586
186k
        ch++;
2587
186k
      }
2588
2589
93.4k
      err_code = ixheaace_code_envelope(
2590
93.4k
          ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res,
2591
93.4k
          &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, 0,
2592
93.4k
          pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2593
93.4k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2594
93.4k
      if (err_code) {
2595
0
        return err_code;
2596
0
      }
2597
2598
93.4k
      err_code = ixheaace_code_envelope(
2599
93.4k
          ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res,
2600
93.4k
          &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, 0,
2601
93.4k
          pstr_const_frame_info[1]->n_envelopes, 0, pstr_sbr_bs->header_active,
2602
93.4k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2603
93.4k
      if (err_code) {
2604
0
        return err_code;
2605
0
      }
2606
2607
93.4k
      c = 0;
2608
93.4k
      i = 0;
2609
243k
      while (i < n_envelopes[0]) {
2610
1.48M
        for (j = 0; j < pstr_env_0->no_scf_bands[i]; j++) {
2611
1.33M
          pstr_env_0->ienvelope[i][j] = ptr_scale_factor_band_nrg[0][c];
2612
1.33M
          pstr_env_1->ienvelope[i][j] = ptr_scale_factor_band_nrg[1][c];
2613
2614
1.33M
          c++;
2615
1.33M
        }
2616
149k
        i++;
2617
149k
      }
2618
2619
93.4k
      err_code = ixheaace_code_envelope(
2620
93.4k
          ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2621
93.4k
          pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2622
93.4k
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2623
93.4k
      if (err_code) {
2624
0
        return err_code;
2625
0
      }
2626
2627
93.4k
      i = 0;
2628
1.02M
      while (i < MAXIMUM_NUM_NOISE_VALUES) {
2629
934k
        pstr_env_0->noise_level[i] = ptr_noise_level[0][i];
2630
934k
        i++;
2631
934k
      }
2632
2633
93.4k
      err_code = ixheaace_code_envelope(
2634
93.4k
          ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2635
93.4k
          pstr_env_1->domain_vec_noise, 0, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 0,
2636
93.4k
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2637
93.4k
      if (err_code) {
2638
0
        return err_code;
2639
0
      }
2640
2641
93.4k
      i = 0;
2642
1.02M
      while (i < MAXIMUM_NUM_NOISE_VALUES) {
2643
934k
        pstr_env_1->noise_level[i] = ptr_noise_level[1][i];
2644
934k
        i++;
2645
934k
      }
2646
2647
93.4k
      pstr_sbr_hdr->coupling = 0;
2648
93.4k
      pstr_env_0->balance = 0;
2649
93.4k
      pstr_env_1->balance = 0;
2650
2651
93.4k
      err_code = ixheaace_count_sbr_channel_pair_element(
2652
93.4k
          pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data,
2653
93.4k
          pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr,
2654
93.4k
          &payloadbits_lr);
2655
93.4k
      if (err_code) {
2656
397
        return err_code;
2657
397
      }
2658
2659
279k
      for (ch = 0; ch < num_channels; ch++) {
2660
186k
        WORD32 itmp;
2661
2662
10.6M
        for (i = 0; i < MAXIMUM_FREQ_COEFFS; i++) {
2663
10.4M
          itmp = pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev[i];
2664
10.4M
          pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev[i] =
2665
10.4M
              scale_factor_band_nrg_prev_temp[ch][i];
2666
10.4M
          scale_factor_band_nrg_prev_temp[ch][i] = itmp;
2667
10.4M
        }
2668
2669
1.11M
        for (i = 0; i < MAXIMUM_NUM_NOISE_COEFFS; i++) {
2670
930k
          itmp = pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev[i];
2671
930k
          pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev[i] = noise_prev_temp[ch][i];
2672
930k
          noise_prev_temp[ch][i] = itmp;
2673
930k
        }
2674
2675
186k
        itmp = pstr_env_ch[ch]->str_sbr_code_env.update;
2676
186k
        pstr_env_ch[ch]->str_sbr_code_env.update = up_date_nrg_temp[ch];
2677
186k
        up_date_nrg_temp[ch] = itmp;
2678
2679
186k
        itmp = pstr_env_ch[ch]->str_sbr_code_noise_floor.update;
2680
186k
        pstr_env_ch[ch]->str_sbr_code_noise_floor.update = up_date_noise_temp[ch];
2681
186k
        up_date_noise_temp[ch] = itmp;
2682
2683
186k
        memcpy(domain_vec_temp[ch], pstr_env_ch[ch]->enc_env_data.domain_vec,
2684
186k
               sizeof(domain_vec_temp[0][0]) * IXHEAACE_MAX_ENV);
2685
2686
186k
        memcpy(domain_vec_noise_temp[ch], pstr_env_ch[ch]->enc_env_data.domain_vec_noise,
2687
186k
               sizeof(domain_vec_noise_temp[0][0]) * IXHEAACE_MAX_ENV);
2688
2689
186k
        if (!pstr_sbr_hdr->prev_coupling) {
2690
7.55k
          pstr_env_ch[ch]->str_sbr_code_env.update = 0;
2691
7.55k
          pstr_env_ch[ch]->str_sbr_code_noise_floor.update = 0;
2692
7.55k
        }
2693
186k
      }
2694
2695
93.0k
      err_code = ixheaace_code_envelope(
2696
93.0k
          ptr_sfb_nrg_coupling[0], pstr_const_frame_info[0]->freq_res,
2697
93.0k
          &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, 1,
2698
93.0k
          pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active,
2699
93.0k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2700
93.0k
      if (err_code) {
2701
283
        return err_code;
2702
283
      }
2703
2704
92.7k
      err_code = ixheaace_code_envelope(
2705
92.7k
          ptr_sfb_nrg_coupling[1], pstr_const_frame_info[1]->freq_res,
2706
92.7k
          &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, 1,
2707
92.7k
          pstr_const_frame_info[1]->n_envelopes, 1, pstr_sbr_bs->header_active,
2708
92.7k
          pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2709
92.7k
      if (err_code) {
2710
549
        return err_code;
2711
549
      }
2712
2713
92.2k
      c = 0;
2714
92.2k
      i = 0;
2715
238k
      while (i < n_envelopes[0]) {
2716
1.45M
        for (j = 0; j < pstr_env_0->no_scf_bands[i]; j++) {
2717
1.31M
          pstr_env_0->ienvelope[i][j] = ptr_sfb_nrg_coupling[0][c];
2718
1.31M
          pstr_env_1->ienvelope[i][j] = ptr_sfb_nrg_coupling[1][c];
2719
1.31M
          c++;
2720
1.31M
        }
2721
146k
        i++;
2722
146k
      }
2723
2724
92.2k
      err_code = ixheaace_code_envelope(
2725
92.2k
          ptr_noise_lvl_coupling[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor,
2726
92.2k
          pstr_env_0->domain_vec_noise, 1, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0,
2727
92.2k
          pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2728
92.2k
      if (err_code) {
2729
0
        return err_code;
2730
0
      }
2731
2732
1.01M
      for (i = 0; i < MAXIMUM_NUM_NOISE_VALUES; i++) {
2733
922k
        pstr_env_0->noise_level[i] = ptr_noise_lvl_coupling[0][i];
2734
922k
      }
2735
2736
92.2k
      err_code = ixheaace_code_envelope(
2737
92.2k
          ptr_noise_lvl_coupling[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor,
2738
92.2k
          pstr_env_1->domain_vec_noise, 1, ((pstr_const_frame_info[1]->n_envelopes > 1) ? 2 : 1),
2739
92.2k
          1, pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr);
2740
92.2k
      if (err_code) {
2741
0
        return err_code;
2742
0
      }
2743
2744
1.01M
      for (i = 0; i < MAXIMUM_NUM_NOISE_VALUES; i++) {
2745
922k
        pstr_env_1->noise_level[i] = ptr_noise_lvl_coupling[1][i];
2746
922k
      }
2747
2748
92.2k
      pstr_sbr_hdr->coupling = 1;
2749
2750
92.2k
      pstr_env_0->balance = 0;
2751
92.2k
      pstr_env_1->balance = 1;
2752
2753
92.2k
      temp_flag_left = pstr_env_0->add_harmonic_flag;
2754
92.2k
      temp_flag_right = pstr_env_1->add_harmonic_flag;
2755
2756
92.2k
      err_code = ixheaace_count_sbr_channel_pair_element(
2757
92.2k
          pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data,
2758
92.2k
          pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr,
2759
92.2k
          &payloadbits_coupling);
2760
92.2k
      if (err_code) {
2761
0
        return err_code;
2762
0
      }
2763
2764
92.2k
      pstr_env_0->add_harmonic_flag = temp_flag_left;
2765
92.2k
      pstr_env_1->add_harmonic_flag = temp_flag_right;
2766
2767
92.2k
      if (payloadbits_coupling < payloadbits_lr) {
2768
91.7k
        ch = 0;
2769
275k
        while (ch < num_channels) {
2770
183k
          memcpy(ptr_scale_factor_band_nrg[ch], ptr_sfb_nrg_coupling[ch],
2771
183k
                 MAXIMUM_NUM_ENVELOPE_VALUES * sizeof(ptr_scale_factor_band_nrg[0][0]));
2772
2773
183k
          memcpy(ptr_noise_level[ch], ptr_noise_lvl_coupling[ch],
2774
183k
                 MAXIMUM_NUM_NOISE_VALUES * sizeof(ptr_noise_level[0][0]));
2775
183k
          ch++;
2776
183k
        }
2777
2778
91.7k
        pstr_sbr_hdr->coupling = 1;
2779
91.7k
        pstr_env_0->balance = 0;
2780
91.7k
        pstr_env_1->balance = 1;
2781
91.7k
      } else {
2782
509
        ch = 0;
2783
1.52k
        while (ch < num_channels) {
2784
1.01k
          memcpy(pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev,
2785
1.01k
                 scale_factor_band_nrg_prev_temp[ch],
2786
1.01k
                 MAXIMUM_FREQ_COEFFS * sizeof(scale_factor_band_nrg_prev_temp[0][0]));
2787
2788
1.01k
          pstr_env_ch[ch]->str_sbr_code_env.update = up_date_nrg_temp[ch];
2789
2790
1.01k
          memcpy(pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev, noise_prev_temp[ch],
2791
1.01k
                 MAXIMUM_NUM_NOISE_COEFFS * sizeof(noise_prev_temp[0][0]));
2792
2793
1.01k
          memcpy(pstr_env_ch[ch]->enc_env_data.domain_vec, domain_vec_temp[ch],
2794
1.01k
                 sizeof(domain_vec_temp[0][0]) * IXHEAACE_MAX_ENV);
2795
2796
1.01k
          memcpy(pstr_env_ch[ch]->enc_env_data.domain_vec_noise, domain_vec_noise_temp[ch],
2797
1.01k
                 sizeof(domain_vec_noise_temp[0][0]) * IXHEAACE_MAX_ENV);
2798
2799
1.01k
          pstr_env_ch[ch]->str_sbr_code_noise_floor.update = up_date_noise_temp[ch];
2800
1.01k
          ch++;
2801
1.01k
        }
2802
2803
509
        pstr_sbr_hdr->coupling = 0;
2804
509
        pstr_env_0->balance = 0;
2805
509
        pstr_env_1->balance = 0;
2806
509
      }
2807
92.2k
    } break;
2808
364k
  }
2809
2810
363k
  if (num_channels == 1) {
2811
199k
    if (pstr_env_0->domain_vec[0] == TIME) {
2812
49.5k
      pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac++;
2813
149k
    } else {
2814
149k
      pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac = 0;
2815
149k
    }
2816
199k
  } else {
2817
164k
    if (pstr_env_0->domain_vec[0] == TIME || pstr_env_1->domain_vec[0] == TIME) {
2818
62.6k
      pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac++;
2819
62.6k
      pstr_env_ch[1]->str_sbr_code_env.df_edge_incr_fac++;
2820
101k
    } else {
2821
101k
      pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac = 0;
2822
101k
      pstr_env_ch[1]->str_sbr_code_env.df_edge_incr_fac = 0;
2823
101k
    }
2824
164k
  }
2825
2826
891k
  for (ch = 0; ch < num_channels; ch++) {
2827
527k
    c = 0;
2828
527k
    i = 0;
2829
2830
1.33M
    while (i < n_envelopes[ch]) {
2831
9.54M
      for (j = 0; j < pstr_env_ch[ch]->enc_env_data.no_scf_bands[i]; j++) {
2832
8.72M
        pstr_env_ch[ch]->enc_env_data.ienvelope[i][j] = ptr_scale_factor_band_nrg[ch][c];
2833
8.72M
        c++;
2834
8.72M
      }
2835
810k
      i++;
2836
810k
    }
2837
2838
527k
    i = 0;
2839
5.80M
    while (i < MAXIMUM_NUM_NOISE_VALUES) {
2840
5.27M
      pstr_env_ch[ch]->enc_env_data.noise_level[i] = ptr_noise_level[ch][i];
2841
5.27M
      i++;
2842
5.27M
    }
2843
527k
  }
2844
363k
  if ((USAC_SBR == pstr_sbr_cfg->sbr_codec) && (1 == pstr_sbr_hdr->sbr_inter_tes_active)) {
2845
    // inter-TES encoder
2846
74.5k
    WORD32 idx;
2847
192k
    for (ch = 0; ch < num_channels; ch++) {
2848
118k
      ixheaace_str_inter_tes_params *pstr_tes_enc = &pstr_env_ch[ch]->str_inter_tes_enc;
2849
2850
118k
      pstr_tes_enc->num_if_bands = pstr_env_ch[ch]->enc_env_data.noise_band_count;
2851
118k
      pstr_tes_enc->sub_band_start = pstr_sbr_cfg->ptr_freq_band_tab[LO][0];
2852
118k
      pstr_tes_enc->sub_band_end = pstr_sbr_cfg->ptr_freq_band_tab[LO][pstr_sbr_cfg->num_scf[LO]];
2853
118k
      pstr_tes_enc->num_mf_bands = pstr_sbr_cfg->num_master;
2854
118k
      pstr_tes_enc->out_fs = pstr_sbr_cfg->sample_freq;
2855
118k
      pstr_tes_enc->num_env = pstr_env_ch[ch]->str_sbr_env_frame.sbr_grid.bs_num_env;
2856
2857
1.18M
      for (idx = 0; idx < (IXHEAACE_MAX_ENV + 1); idx++) {
2858
1.06M
        pstr_tes_enc->border_vec[idx] = (WORD16)pstr_const_frame_info[ch]->borders[idx];
2859
1.06M
      }
2860
2861
6.89M
      for (idx = 0; idx < (MAXIMUM_FREQ_COEFFS + 1); idx++) {
2862
6.77M
        pstr_tes_enc->f_master_tbl[idx] = (WORD16)((UWORD16)pstr_sbr_cfg->ptr_v_k_master[idx]);
2863
6.77M
      }
2864
2865
1.30M
      for (idx = 0; idx < MAXIMUM_NUM_NOISE_VALUES; idx++) {
2866
1.18M
        pstr_tes_enc->inv_filt_mode[idx] =
2867
1.18M
            (WORD32)pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec[idx];
2868
1.18M
        pstr_tes_enc->invf_band_tbl[idx] =
2869
1.18M
            (WORD16)pstr_env_ch[ch]->str_ton_corr.sbr_noise_floor_est.s_freq_qmf_band_tbl[idx];
2870
1.18M
      }
2871
118k
      pstr_tes_enc->invf_band_tbl[MAXIMUM_NUM_NOISE_VALUES] =
2872
118k
          (WORD16)pstr_env_ch[ch]
2873
118k
              ->str_ton_corr.sbr_noise_floor_est.s_freq_qmf_band_tbl[MAXIMUM_NUM_NOISE_VALUES];
2874
2875
118k
      err_code = ixheaace_process_inter_tes(pstr_tes_enc, ptr_sbr_scratch);
2876
118k
      if (err_code) {
2877
1.26k
        return err_code;
2878
1.26k
      }
2879
2880
117k
      WORD32 ts, num_ts, delay;
2881
117k
      num_ts = pstr_env_ch[ch]->str_sbr_qmf.num_time_slots;
2882
2883
117k
      delay = pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET;
2884
2885
3.31M
      for (ts = 0; ts < delay; ts++) {
2886
3.19M
        memcpy(pstr_tes_enc->qmf_buf_real[ts], pstr_tes_enc->qmf_buf_real[num_ts + ts],
2887
3.19M
               IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0]));
2888
3.19M
        memcpy(pstr_tes_enc->qmf_buf_imag[ts], pstr_tes_enc->qmf_buf_imag[num_ts + ts],
2889
3.19M
               IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_imag[0][0]));
2890
3.19M
      }
2891
117k
    }
2892
74.5k
  }
2893
  // Pitch detection, pre-processing detection and oversampling decision making
2894
362k
  if ((1 == pstr_sbr_cfg->is_esbr) && (pstr_sbr_cfg->sbr_codec == HEAAC_SBR)) {
2895
60.2k
    err_code = ixheaace_update_esbr_ext_data(
2896
60.2k
        ptr_in_time, pstr_sbr_cfg, pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0], &str_esbr,
2897
60.2k
        transient_info, ptr_sbr_tab, pstr_sbr_hdr->coupling, time_sn_stride, 2048);
2898
60.2k
    if (err_code) return err_code;
2899
60.2k
  }
2900
2901
362k
  if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) {
2902
81.3k
    ixheaace_update_harmonic_sbr_data(transient_info, pstr_sbr_hdr->coupling,
2903
81.3k
                                      &pstr_env_ch[0], num_channels);
2904
81.3k
  }
2905
362k
  if (num_channels == 2) {
2906
163k
    WORD32 num_bits;
2907
163k
    pstr_env_0->usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2908
163k
    pstr_env_1->usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2909
163k
    err_code = ixheaace_write_env_channel_pair_element(
2910
163k
        pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data,
2911
163k
        pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr,
2912
163k
        &num_bits);
2913
163k
    if (err_code) {
2914
50
      return err_code;
2915
50
    }
2916
199k
  } else {
2917
199k
    WORD32 num_bits;
2918
199k
    pstr_env_0->sbr_pvc_mode = pstr_sbr_hdr->sbr_pvc_mode;
2919
199k
    pstr_env_0->sbr_sinusoidal_pos_flag = 0;
2920
199k
    pstr_env_0->usac_indep_flag = pstr_sbr_bs->usac_indep_flag;
2921
2922
199k
    err_code = ixheaace_write_env_single_channel_element(
2923
199k
        pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, pstr_ps_enc, pstr_com_data,
2924
199k
        ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr, &num_bits);
2925
199k
    if (err_code) {
2926
19
      return err_code;
2927
19
    }
2928
199k
  }
2929
2930
362k
  ch = 0;
2931
887k
  while (ch < num_channels) {
2932
525k
    ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env);
2933
7.83M
    for (i = 0; i < pstr_sbr_extract_env->y_buffer_write_offset; i++) {
2934
7.31M
      FLOAT32 *ptr_tmp;
2935
7.31M
      ptr_tmp = pstr_sbr_extract_env->ptr_y_buffer[i];
2936
7.31M
      pstr_sbr_extract_env->ptr_y_buffer[i] =
2937
7.31M
          pstr_sbr_extract_env->ptr_y_buffer[i + pstr_sbr_extract_env->time_slots];
2938
7.31M
      pstr_sbr_extract_env->ptr_y_buffer[i + pstr_sbr_extract_env->time_slots] = ptr_tmp;
2939
7.31M
    }
2940
2941
525k
    pstr_sbr_extract_env->buffer_flag ^= 1;
2942
525k
    ch++;
2943
525k
  }
2944
2945
362k
  pstr_sbr_hdr->prev_coupling = pstr_sbr_hdr->coupling;
2946
2947
362k
  return err_code;
2948
362k
}