Coverage Report

Created: 2025-07-11 06:38

/src/libxaac/decoder/ixheaacd_esbr_envcal.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <stdlib.h>
21
#include <math.h>
22
#include <string.h>
23
24
#include "ixheaac_type_def.h"
25
#include "ixheaac_error_standards.h"
26
#include "ixheaac_sbr_const.h"
27
#include "ixheaacd_sbrdecsettings.h"
28
#include "ixheaacd_bitbuffer.h"
29
#include "ixheaacd_sbr_common.h"
30
#include "ixheaacd_drc_data_struct.h"
31
#include "ixheaacd_drc_dec.h"
32
#include "ixheaacd_sbrdecoder.h"
33
#include "ixheaacd_bitbuffer.h"
34
#include "ixheaacd_env_extr_part.h"
35
#include "ixheaacd_sbr_rom.h"
36
#include "ixheaacd_common_rom.h"
37
#include "ixheaacd_hybrid.h"
38
#include "ixheaacd_sbr_scale.h"
39
#include "ixheaacd_ps_dec.h"
40
#include "ixheaacd_freq_sca.h"
41
#include "ixheaacd_lpp_tran.h"
42
#include "ixheaacd_env_extr.h"
43
44
#include "ixheaac_esbr_rom.h"
45
46
6.69M
#define ABS(A) fabs(A)
47
48
1.23M
VOID ixheaacd_shellsort(WORD32 *in, WORD32 n) {
49
1.23M
  WORD32 i, j, v;
50
1.23M
  WORD32 inc = 1;
51
52
1.23M
  do
53
2.62M
    inc = 3 * inc + 1;
54
2.62M
  while (inc <= n);
55
56
2.62M
  do {
57
2.62M
    inc = inc / 3;
58
19.9M
    for (i = inc + 1; i <= n; i++) {
59
17.3M
      v = in[i - 1];
60
17.3M
      j = i;
61
23.2M
      while (in[j - inc - 1] > v) {
62
6.51M
        in[j - 1] = in[j - inc - 1];
63
6.51M
        j -= inc;
64
6.51M
        if (j <= inc) break;
65
6.51M
      }
66
17.3M
      in[j - 1] = v;
67
17.3M
    }
68
2.62M
  } while (inc > 1);
69
1.23M
}
70
71
WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 input_real[][64],
72
                             FLOAT32 input_imag[][64], FLOAT32 input_real1[][64],
73
                             FLOAT32 input_imag1[][64], WORD32 x_over_qmf[MAX_NUM_PATCHES],
74
                             FLOAT32 *scratch_buff, FLOAT32 *env_out, WORD32 ldmps_present,
75
307k
                             WORD32 ec_flag) {
76
307k
  IA_ERRORCODE err_code = IA_NO_ERROR;
77
307k
  WORD8 harmonics[64];
78
307k
  FLOAT32(*env_tmp)[48];
79
307k
  FLOAT32(*noise_level_pvc)[48];
80
307k
  FLOAT32(*nrg_est_pvc)[48];
81
307k
  FLOAT32(*nrg_ref_pvc)[48];
82
307k
  FLOAT32(*nrg_gain_pvc)[48];
83
307k
  FLOAT32(*nrg_tone_pvc)[48];
84
85
307k
  WORD32 n, c, li, ui, i, j, k = 0, l, m = 0, kk = 0, o, next = -1, ui2, flag,
86
307k
                             tmp, noise_absc_flag, smooth_length;
87
307k
  WORD32 upsamp_4_flag = frame_data->pstr_sbr_header->is_usf_4;
88
89
307k
  FLOAT32 *ptr_real_buf, *ptr_imag_buf, nrg = 0, p_ref, p_est, avg_gain, g_max,
90
307k
                                        p_adj, boost_gain, sb_gain, sb_noise,
91
307k
                                        temp[64];
92
93
307k
  WORD32 t;
94
307k
  WORD32 start_pos = 0;
95
307k
  WORD32 end_pos = 0;
96
97
307k
  WORD32 slot_idx;
98
99
307k
  FLOAT32 *prev_env_noise_level = frame_data->prev_noise_level;
100
307k
  FLOAT32 *nrg_tone = scratch_buff;
101
307k
  FLOAT32 *noise_level = scratch_buff + 64;
102
307k
  FLOAT32 *nrg_est = scratch_buff + 128;
103
307k
  FLOAT32 *nrg_ref = scratch_buff + 192;
104
307k
  FLOAT32 *nrg_gain = scratch_buff + 256;
105
106
307k
  const FLOAT32 *smooth_filt;
107
108
307k
  FLOAT32 *sfb_nrg = frame_data->flt_env_sf_arr;
109
307k
  FLOAT32 *noise_floor = frame_data->flt_noise_floor;
110
307k
  ia_frame_info_struct *p_frame_info = &frame_data->str_frame_info_details;
111
112
307k
  ia_frame_info_struct *pvc_frame_info = &frame_data->str_pvc_frame_info;
113
307k
  WORD32 smoothing_length = frame_data->pstr_sbr_header->smoothing_mode ? 0 : 4;
114
307k
  WORD32 int_mode = frame_data->pstr_sbr_header->interpol_freq;
115
307k
  WORD32 limiter_band = frame_data->pstr_sbr_header->limiter_bands;
116
307k
  WORD32 limiter_gains = frame_data->pstr_sbr_header->limiter_gains;
117
307k
  WORD32 *add_harmonics = frame_data->add_harmonics;
118
307k
  WORD32 sub_band_start =
119
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_start;
120
307k
  WORD32 sub_band_end =
121
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
122
307k
  WORD32 reset = frame_data->reset_flag;
123
307k
  WORD32 num_subbands = sub_band_end - sub_band_start;
124
307k
  WORD32 bs_num_env = p_frame_info->num_env;
125
307k
  WORD32 trans_env = p_frame_info->transient_env;
126
307k
  WORD32 sbr_mode = frame_data->sbr_mode;
127
307k
  WORD32 prev_sbr_mode = frame_data->prev_sbr_mode;
128
129
307k
  WORD16 *freq_band_table[2];
130
307k
  const WORD16 *num_sf_bands =
131
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->num_sf_bands;
132
307k
  WORD16 *freq_band_table_noise =
133
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_noise;
134
307k
  WORD32 num_nf_bands =
135
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->num_nf_bands;
136
137
307k
  WORD32 harm_index = frame_data->harm_index;
138
307k
  WORD32 phase_index = frame_data->phase_index;
139
307k
  WORD32 esbr_start_up = frame_data->pstr_sbr_header->esbr_start_up;
140
307k
  WORD32 esbr_start_up_pvc = frame_data->pstr_sbr_header->esbr_start_up_pvc;
141
307k
  WORD8(*harm_flag_prev)[64] = &frame_data->harm_flag_prev;
142
307k
  FLOAT32(*e_gain)[5][64] = &frame_data->e_gain;
143
307k
  FLOAT32(*noise_buf)[5][64] = &frame_data->noise_buf;
144
307k
  WORD32(*lim_table)[4][12 + 1] = &frame_data->lim_table;
145
307k
  WORD32(*gate_mode)[4] = &frame_data->gate_mode;
146
307k
  WORD32 freq_inv = 1;
147
148
307k
  WORD8(*harm_flag_varlen_prev)[64] = &frame_data->harm_flag_varlen_prev;
149
307k
  WORD8(*harm_flag_varlen)[64] = &frame_data->harm_flag_varlen;
150
307k
  WORD32 band_loop_end;
151
152
307k
  WORD32 rate = upsamp_4_flag ? 4 : 2;
153
307k
  FLOAT64 guard = 1e-17;
154
155
307k
  if (ldmps_present == 1) rate = 1;
156
157
307k
  env_tmp = frame_data->env_tmp;
158
307k
  noise_level_pvc = frame_data->noise_level_pvc;
159
307k
  nrg_est_pvc = frame_data->nrg_est_pvc;
160
307k
  nrg_ref_pvc = frame_data->nrg_ref_pvc;
161
307k
  nrg_gain_pvc = frame_data->nrg_gain_pvc;
162
307k
  nrg_tone_pvc = frame_data->nrg_tone_pvc;
163
164
307k
  freq_band_table[0] =
165
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[0];
166
307k
  freq_band_table[1] =
167
307k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[1];
168
169
307k
  if (reset || (ldmps_present == 1)) {
170
45.7k
    esbr_start_up = 1;
171
45.7k
    esbr_start_up_pvc = 1;
172
45.7k
    if (reset) phase_index = 0;
173
45.7k
    if (ixheaacd_createlimiterbands(
174
45.7k
            (*lim_table), (*gate_mode),
175
45.7k
            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
176
45.7k
            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
177
45.7k
            ec_flag))
178
1
      return IA_FATAL_ERROR;
179
45.7k
  }
180
181
307k
  if (frame_data->sbr_patching_mode != frame_data->prev_sbr_patching_mode) {
182
29.6k
    if (ixheaacd_createlimiterbands(
183
29.6k
            (*lim_table), (*gate_mode),
184
29.6k
            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
185
29.6k
            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
186
29.6k
            ec_flag))
187
0
      return IA_FATAL_ERROR;
188
189
29.6k
    frame_data->prev_sbr_patching_mode = frame_data->sbr_patching_mode;
190
29.6k
  }
191
192
307k
  memset(harmonics, 0, 64 * sizeof(WORD8));
193
194
307k
  if (sbr_mode == PVC_SBR) {
195
1.66M
    for (i = 0; i < num_sf_bands[HIGH]; i++) {
196
1.55M
      li =
197
1.55M
          frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i];
198
1.55M
      ui = frame_data->pstr_sbr_header->pstr_freq_band_data
199
1.55M
               ->freq_band_tbl_hi[i + 1];
200
1.55M
      tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
201
202
1.55M
      if ((tmp >= 64) || (tmp < 0)) {
203
0
        if (ec_flag)
204
0
          tmp = 0;
205
0
        else
206
0
          return -1;
207
0
      }
208
209
1.55M
      harmonics[tmp] = add_harmonics[i];
210
1.55M
    }
211
212
135k
    for (t = 0; t < p_frame_info->border_vec[0]; t++) {
213
2.00M
      for (c = 0; c < 64; c++) {
214
1.97M
        frame_data->qmapped_pvc[c][t] = frame_data->qmapped_pvc[c][t + 16];
215
1.97M
      }
216
30.8k
    }
217
218
257k
    for (i = 0; i < bs_num_env; i++) {
219
153k
      if (kk > MAX_NOISE_ENVELOPES) {
220
0
        if (ec_flag)
221
0
          kk = MAX_NOISE_ENVELOPES;
222
0
        else
223
0
          return IA_FATAL_ERROR;
224
0
      }
225
153k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
226
227
153k
      start_pos = p_frame_info->border_vec[i];
228
153k
      end_pos = p_frame_info->border_vec[i + 1];
229
153k
      if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR)) {
230
0
        if (ec_flag) {
231
0
          start_pos = 0;
232
0
          end_pos = MAX_FREQ_COEFFS_SBR;
233
0
        } else
234
0
          return IA_FATAL_ERROR;
235
0
      }
236
237
1.82M
      for (t = start_pos; t < end_pos; t++) {
238
1.67M
        band_loop_end = num_sf_bands[p_frame_info->freq_res[i]];
239
240
14.2M
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
241
12.5M
          li = freq_band_table[p_frame_info->freq_res[i]][j];
242
12.5M
          ui = freq_band_table[p_frame_info->freq_res[i]][j + 1];
243
12.5M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
244
12.5M
                    ->freq_band_tbl_noise[o + 1];
245
246
52.1M
          for (k = 0; k < ui - li; k++) {
247
39.5M
            o = (k + li >= ui2) ? o + 1 : o;
248
39.5M
            if (o >= MAX_NOISE_COEFFS) {
249
0
              if (ec_flag)
250
0
                o = MAX_NOISE_COEFFS - 1;
251
0
              else
252
0
                return IA_FATAL_ERROR;
253
0
            }
254
39.5M
            ui2 = freq_band_table_noise[o + 1];
255
256
39.5M
            frame_data->qmapped_pvc[c][t] =
257
39.5M
                noise_floor[next * num_nf_bands + o];
258
39.5M
            c++;
259
39.5M
          }
260
12.5M
        }
261
1.67M
      }
262
153k
    }
263
264
104k
    kk = 0;
265
104k
    next = -1;
266
267
257k
    for (i = 0; i < bs_num_env; i++) {
268
153k
      if (kk > MAX_NOISE_ENVELOPES) {
269
0
        if (ec_flag)
270
0
          kk = MAX_NOISE_ENVELOPES;
271
0
        else
272
0
          return IA_FATAL_ERROR;
273
0
      }
274
153k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
275
276
153k
      start_pos = pvc_frame_info->border_vec[i];
277
153k
      end_pos = pvc_frame_info->border_vec[i + 1];
278
153k
      if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR)) {
279
0
        if (ec_flag) {
280
0
          start_pos = 0;
281
0
          end_pos = MAX_FREQ_COEFFS_SBR;
282
0
        } else
283
0
          return IA_FATAL_ERROR;
284
0
      }
285
1.82M
      for (t = start_pos; t < end_pos; t++) {
286
108M
        for (c = 0; c < 64; c++) {
287
107M
          env_tmp[c][t] = env_out[64 * t + c];
288
107M
        }
289
1.67M
      }
290
291
153k
      noise_absc_flag =
292
153k
          (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0;
293
294
153k
      if (prev_sbr_mode == ORIG_SBR) noise_absc_flag = 0;
295
296
153k
      smooth_length = (noise_absc_flag ? 0 : smoothing_length);
297
153k
      smooth_filt = *ixheaac_fir_table[smooth_length];
298
299
169k
      for (t = start_pos; t < frame_data->sin_len_for_cur_top; t++) {
300
16.6k
        band_loop_end =
301
16.6k
            num_sf_bands[frame_data->str_frame_info_prev
302
16.6k
                             .freq_res[frame_data->var_len_id_prev]];
303
304
154k
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
305
137k
          double tmp;
306
307
137k
          li = freq_band_table[frame_data->str_frame_info_prev
308
137k
                                   .freq_res[frame_data->var_len_id_prev]][j];
309
137k
          ui = freq_band_table[frame_data->str_frame_info_prev
310
137k
                                   .freq_res[frame_data->var_len_id_prev]]
311
137k
                              [j + 1];
312
137k
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
313
137k
                    ->freq_band_tbl_noise[o + 1];
314
315
471k
          for (flag = 0, k = li; k < ui; k++) {
316
333k
            flag = ((*harm_flag_varlen)[c] &&
317
333k
                    (t >= frame_data->sin_start_for_cur_top ||
318
92.9k
                     (*harm_flag_varlen_prev)[c + sub_band_start]))
319
333k
                       ? 1
320
333k
                       : flag;
321
322
333k
            nrg_ref_pvc[c][t] = env_tmp[k][t];
323
1.01M
            for (nrg = 0, l = 0; l < rate; l++) {
324
684k
              nrg +=
325
684k
                  (input_real[rate * t + l][k] * input_real[rate * t + l][k]) +
326
684k
                  (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]);
327
684k
            }
328
333k
            nrg_est_pvc[c][t] = nrg / rate;
329
333k
            c++;
330
333k
          }
331
332
137k
          if (!int_mode && ui != li) {
333
262k
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
334
183k
              nrg += nrg_est_pvc[k][t];
335
183k
            }
336
79.5k
            nrg /= (ui - li);
337
79.5k
          } else {
338
58.2k
            nrg = 0;
339
58.2k
          }
340
137k
          c -= (ui - li);
341
342
471k
          for (k = 0; k < ui - li; k++) {
343
333k
            o = (k + li >= ui2) ? o + 1 : o;
344
333k
            if (o >= MAX_NOISE_COEFFS) {
345
0
              if (ec_flag)
346
0
                o = MAX_NOISE_COEFFS - 1;
347
0
              else
348
0
                return IA_FATAL_ERROR;
349
0
            }
350
333k
            ui2 = freq_band_table_noise[o + 1];
351
333k
            nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
352
333k
            nrg_tone_pvc[c][t] = 0.0f;
353
354
333k
            tmp = frame_data->qmapped_pvc[c][t] /
355
333k
                  (1 + frame_data->qmapped_pvc[c][t] + guard);
356
357
333k
            if (flag) {
358
235k
              nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
359
235k
                                                 (nrg_est_pvc[c][t] + 1));
360
361
235k
              nrg_tone_pvc[c][t] = (FLOAT32)(
362
235k
                  (harmonics[c] && (t >= frame_data->sine_position ||
363
61.4k
                                    (*harm_flag_prev)[c + sub_band_start]))
364
235k
                      ? sqrt(nrg_ref_pvc[c][t] * tmp /
365
47.6k
                             (frame_data->qmapped_pvc[c][t] + guard))
366
235k
                      : nrg_tone_pvc[c][t]);
367
368
235k
              nrg_tone_pvc[c][t] =
369
235k
                  (FLOAT32)(((*harm_flag_varlen)[c] &&
370
235k
                             (t >= frame_data->sin_start_for_cur_top ||
371
92.5k
                              (*harm_flag_varlen_prev)[c + sub_band_start]))
372
235k
                                ? sqrt(nrg_ref_pvc[c][t] * tmp /
373
92.3k
                                       (prev_env_noise_level[o] + guard))
374
235k
                                : nrg_tone_pvc[c][t]);
375
376
235k
            } else {
377
98.9k
              if (noise_absc_flag) {
378
0
                nrg_gain_pvc[c][t] =
379
0
                    (FLOAT32)sqrt(nrg_ref_pvc[c][t] / (nrg_est_pvc[c][t] + 1));
380
98.9k
              } else {
381
98.9k
                nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
382
98.9k
                    nrg_ref_pvc[c][t] * tmp /
383
98.9k
                    ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
384
98.9k
              }
385
98.9k
            }
386
387
333k
            noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp);
388
333k
            c++;
389
333k
          }
390
137k
        }
391
392
65.4k
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
393
48.8k
          p_ref = p_est = 0.0f;
394
48.8k
          p_adj = 0;
395
48.8k
          for (k = (*lim_table)[limiter_band][c];
396
381k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
397
332k
            p_ref += nrg_ref_pvc[k][t];
398
332k
            p_est += nrg_est_pvc[k][t];
399
332k
          }
400
48.8k
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
401
48.8k
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
402
48.8k
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
403
48.8k
          for (k = (*lim_table)[limiter_band][c];
404
381k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
405
332k
            if (g_max <= nrg_gain_pvc[k][t]) {
406
80.4k
              noise_level_pvc[k][t] =
407
80.4k
                  (FLOAT32)(noise_level_pvc[k][t] * (g_max / (nrg_gain_pvc[k][t] + guard)));
408
80.4k
              nrg_gain_pvc[k][t] = g_max;
409
80.4k
            }
410
411
332k
            p_adj +=
412
332k
                nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t];
413
414
332k
            if (nrg_tone_pvc[k][t]) {
415
101k
              p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t];
416
231k
            } else if (!noise_absc_flag) {
417
231k
              p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t];
418
231k
            }
419
332k
          }
420
48.8k
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
421
48.8k
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
422
423
48.8k
          for (k = (*lim_table)[limiter_band][c];
424
381k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
425
332k
            nrg_gain_pvc[k][t] *= boost_gain;
426
332k
            noise_level_pvc[k][t] *= boost_gain;
427
332k
            nrg_tone_pvc[k][t] *= boost_gain;
428
332k
          }
429
48.8k
        }
430
16.6k
      }
431
432
1.81M
      for (; t < end_pos; t++) {
433
1.65M
        band_loop_end = num_sf_bands[pvc_frame_info->freq_res[i]];
434
435
14.1M
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
436
12.4M
          double tmp;
437
438
12.4M
          li = freq_band_table[pvc_frame_info->freq_res[i]][j];
439
12.4M
          ui = freq_band_table[pvc_frame_info->freq_res[i]][j + 1];
440
12.4M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
441
12.4M
                    ->freq_band_tbl_noise[o + 1];
442
443
51.6M
          for (flag = 0, k = li; k < ui; k++) {
444
39.1M
            flag = (harmonics[c] && (t >= frame_data->sine_position ||
445
1.48M
                                     (*harm_flag_prev)[c + sub_band_start]))
446
39.1M
                       ? 1
447
39.1M
                       : flag;
448
449
39.1M
            nrg_ref_pvc[c][t] = env_tmp[k][t];
450
124M
            for (nrg = 0, l = 0; l < rate; l++) {
451
85.0M
              nrg +=
452
85.0M
                  (input_real[rate * t + l][k] * input_real[rate * t + l][k]) +
453
85.0M
                  (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]);
454
85.0M
            }
455
39.1M
            nrg_est_pvc[c][t] = nrg / rate;
456
39.1M
            c++;
457
39.1M
          }
458
459
12.4M
          if (!int_mode && ui != li) {
460
8.18M
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
461
6.05M
              nrg += nrg_est_pvc[k][t];
462
6.05M
            }
463
2.13M
            nrg /= (ui - li);
464
10.3M
          } else {
465
10.3M
            nrg = 0;
466
10.3M
          }
467
12.4M
          c -= (ui - li);
468
469
51.6M
          for (k = 0; k < ui - li; k++) {
470
39.1M
            o = (k + li >= ui2) ? o + 1 : o;
471
39.1M
            if (o >= MAX_NOISE_COEFFS) {
472
0
              if (ec_flag)
473
0
                o = MAX_NOISE_COEFFS - 1;
474
0
              else
475
0
                return IA_FATAL_ERROR;
476
0
            }
477
39.1M
            ui2 = freq_band_table_noise[o + 1];
478
39.1M
            nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
479
39.1M
            nrg_tone_pvc[c][t] = 0.0f;
480
481
39.1M
            tmp = frame_data->qmapped_pvc[c][t] /
482
39.1M
                  (1 + frame_data->qmapped_pvc[c][t] + guard);
483
484
39.1M
            if (flag) {
485
2.27M
              nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
486
2.27M
                                                 (nrg_est_pvc[c][t] + 1));
487
488
2.27M
              nrg_tone_pvc[c][t] = (FLOAT32)(
489
2.27M
                  (harmonics[c] && (t >= frame_data->sine_position ||
490
875k
                                    (*harm_flag_prev)[c + sub_band_start]))
491
2.27M
                      ? sqrt(nrg_ref_pvc[c][t] * tmp /
492
872k
                             (frame_data->qmapped_pvc[c][t] + guard))
493
2.27M
                      : nrg_tone_pvc[c][t]);
494
36.9M
            } else {
495
36.9M
              if (noise_absc_flag) {
496
76.7k
                nrg_gain_pvc[c][t] =
497
76.7k
                    (FLOAT32)sqrt(nrg_ref_pvc[c][t] / (nrg_est_pvc[c][t] + 1));
498
36.8M
              } else {
499
36.8M
                nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
500
36.8M
                    nrg_ref_pvc[c][t] * tmp /
501
36.8M
                    ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
502
36.8M
              }
503
36.9M
            }
504
505
39.1M
            noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp);
506
39.1M
            c++;
507
39.1M
          }
508
12.4M
        }
509
510
8.05M
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
511
6.39M
          p_ref = p_est = 0.0f;
512
6.39M
          p_adj = 0;
513
6.39M
          for (k = (*lim_table)[limiter_band][c];
514
45.4M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
515
39.0M
            p_ref += nrg_ref_pvc[k][t];
516
39.0M
            p_est += nrg_est_pvc[k][t];
517
39.0M
          }
518
6.39M
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
519
6.39M
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
520
6.39M
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
521
522
6.39M
          for (k = (*lim_table)[limiter_band][c];
523
45.4M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
524
39.0M
            if (g_max <= nrg_gain_pvc[k][t]) {
525
3.23M
              noise_level_pvc[k][t] =
526
3.23M
                  (FLOAT32)(noise_level_pvc[k][t] *
527
3.23M
                            (g_max / (nrg_gain_pvc[k][t] + guard)));
528
3.23M
              nrg_gain_pvc[k][t] = g_max;
529
3.23M
            }
530
531
39.0M
            p_adj +=
532
39.0M
                nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t];
533
534
39.0M
            if (nrg_tone_pvc[k][t]) {
535
871k
              p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t];
536
38.2M
            } else if (!noise_absc_flag) {
537
38.1M
              p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t];
538
38.1M
            }
539
39.0M
          }
540
541
6.39M
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
542
6.39M
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
543
544
6.39M
          for (k = (*lim_table)[limiter_band][c];
545
45.4M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
546
39.0M
            nrg_gain_pvc[k][t] *= boost_gain;
547
39.0M
            noise_level_pvc[k][t] *= boost_gain;
548
39.0M
            nrg_tone_pvc[k][t] *= boost_gain;
549
39.0M
          }
550
6.39M
        }
551
1.65M
      }
552
553
153k
      if (esbr_start_up_pvc) {
554
43.0k
        for (n = 0; n < 4; n++) {
555
777k
          for (c = 0; c < num_subbands; c++) {
556
742k
            (*e_gain)[n][c] = nrg_gain_pvc[c][start_pos];
557
742k
            (*noise_buf)[n][c] = noise_level_pvc[c][start_pos];
558
742k
          }
559
34.4k
        }
560
8.61k
        esbr_start_up_pvc = 0;
561
8.61k
        esbr_start_up = 0;
562
8.61k
      }
563
153k
      for (l = rate * pvc_frame_info->border_vec[i];
564
3.92M
           l < rate * pvc_frame_info->border_vec[1 + i]; l++) {
565
3.76M
        ptr_real_buf = *(input_real + l) + sub_band_start;
566
3.76M
        ptr_imag_buf = *(input_imag + l) + sub_band_start;
567
568
3.76M
        slot_idx = (WORD32)l / rate;
569
3.76M
        if (sub_band_start & 1) {
570
939k
          freq_inv = -1;
571
2.82M
        } else {
572
2.82M
          freq_inv = 1;
573
2.82M
        }
574
575
89.4M
        for (k = 0; k < num_subbands; k++) {
576
85.7M
          (*e_gain)[4][k] = nrg_gain_pvc[k][slot_idx];
577
85.7M
          (*noise_buf)[4][k] = noise_level_pvc[k][slot_idx];
578
85.7M
          c = 0, sb_gain = 0, sb_noise = 0;
579
220M
          for (n = 4 - smooth_length; n <= 4; n++) {
580
135M
            sb_gain += (*e_gain)[n][k] * smooth_filt[c];
581
135M
            sb_noise += (*noise_buf)[n][k] * smooth_filt[c++];
582
135M
          }
583
85.7M
          phase_index = (phase_index + 1) & 511;
584
85.7M
          sb_noise = (nrg_tone_pvc[k][slot_idx] != 0 || noise_absc_flag)
585
85.7M
                         ? 0
586
85.7M
                         : sb_noise;
587
588
85.7M
          *ptr_real_buf =
589
85.7M
              *ptr_real_buf * sb_gain +
590
85.7M
              sb_noise * ixheaac_random_phase[phase_index][0] +
591
85.7M
              nrg_tone_pvc[k][slot_idx] * ixheaac_hphase_tbl[0][harm_index];
592
85.7M
          *ptr_imag_buf = *ptr_imag_buf * sb_gain +
593
85.7M
                          sb_noise * ixheaac_random_phase[phase_index][1] +
594
85.7M
                          nrg_tone_pvc[k][slot_idx] * freq_inv *
595
85.7M
                              ixheaac_hphase_tbl[1][harm_index];
596
597
85.7M
          ptr_real_buf++;
598
85.7M
          ptr_imag_buf++;
599
85.7M
          freq_inv = -freq_inv;
600
85.7M
        }
601
602
3.76M
        harm_index = (harm_index + 1) & 3;
603
604
3.76M
        memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
605
18.8M
        for (n = 0; n < 4; n++) {
606
15.0M
          memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32));
607
15.0M
        }
608
3.76M
        memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32));
609
610
3.76M
        memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32));
611
18.8M
        for (n = 0; n < 4; n++) {
612
15.0M
          memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32));
613
15.0M
        }
614
3.76M
        memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
615
3.76M
      }
616
153k
    }
617
202k
  } else {
618
2.81M
    for (i = 0; i < num_sf_bands[HIGH]; i++) {
619
2.60M
      li =
620
2.60M
          frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i];
621
2.60M
      ui = frame_data->pstr_sbr_header->pstr_freq_band_data
622
2.60M
               ->freq_band_tbl_hi[i + 1];
623
2.60M
      tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
624
2.60M
      if ((tmp >= 64) || (tmp < 0)) return -1;
625
626
2.60M
      harmonics[tmp] = add_harmonics[i];
627
2.60M
    }
628
629
568k
    for (i = 0; i < bs_num_env; i++) {
630
365k
      if (kk > MAX_NOISE_ENVELOPES) {
631
8
        if (ec_flag)
632
0
          kk = MAX_NOISE_ENVELOPES;
633
8
        else
634
8
          return IA_FATAL_ERROR;
635
8
      }
636
637
365k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk])
638
280k
        kk++, next++;
639
640
365k
      noise_absc_flag =
641
365k
          (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0;
642
643
365k
      smooth_length = (noise_absc_flag ? 0 : smoothing_length);
644
365k
      smooth_filt = *ixheaac_fir_table[smooth_length];
645
646
365k
      if (sbr_mode == ORIG_SBR) {
647
3.16M
        for (c = 0, o = 0, j = 0; j < num_sf_bands[p_frame_info->freq_res[i]];
648
2.79M
             j++) {
649
2.79M
          double tmp;
650
2.79M
          li = freq_band_table[p_frame_info->freq_res[i]][j];
651
2.79M
          ui = freq_band_table[p_frame_info->freq_res[i]][j + 1];
652
2.79M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
653
2.79M
                    ->freq_band_tbl_noise[o + 1];
654
655
2.79M
          if (p_frame_info->border_vec[i] >= p_frame_info->border_vec[i + 1]) {
656
49.0k
            for (flag = 0, k = li; k < ui; k++) {
657
33.4k
              flag = (harmonics[c] &&
658
33.4k
                (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
659
33.4k
                ? 1
660
33.4k
                : flag;
661
33.4k
              nrg_est[c++] = 0;
662
33.4k
            }
663
2.78M
          } else {
664
10.5M
            for (flag = 0, k = li; k < ui; k++) {
665
7.77M
              for (nrg = 0, l = rate * p_frame_info->border_vec[i];
666
173M
                l < rate * p_frame_info->border_vec[i + 1]; l++) {
667
165M
                nrg += (input_real[l][k] * input_real[l][k]) +
668
165M
                  (input_imag[l][k] * input_imag[l][k]);
669
165M
              }
670
7.77M
              flag = (harmonics[c] &&
671
7.77M
                (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
672
7.77M
                ? 1
673
7.77M
                : flag;
674
7.77M
              nrg_est[c++] = nrg / (rate * p_frame_info->border_vec[i + 1] -
675
7.77M
                rate * p_frame_info->border_vec[i]);
676
7.77M
            }
677
2.78M
          }
678
2.79M
          if (!int_mode && ui != li) {
679
639k
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
680
487k
              nrg += nrg_est[k];
681
487k
            }
682
151k
            nrg /= (ui - li);
683
2.64M
          } else {
684
2.64M
            nrg = 0;
685
2.64M
          }
686
2.79M
          c -= (ui - li);
687
688
10.6M
          for (k = 0; k < ui - li; k++) {
689
7.81M
            o = (k + li >= ui2) ? o + 1 : o;
690
7.81M
            if (o >= MAX_NOISE_COEFFS) {
691
0
              if (ec_flag)
692
0
                o = MAX_NOISE_COEFFS - 1;
693
0
              else
694
0
                return IA_FATAL_ERROR;
695
0
            }
696
7.81M
            ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
697
7.81M
                      ->freq_band_tbl_noise[o + 1];
698
7.81M
            nrg_ref[c] = sfb_nrg[m];
699
7.81M
            nrg_est[c] = (!int_mode) ? nrg : nrg_est[c];
700
7.81M
            nrg_tone[c] = 0;
701
7.81M
            tmp = noise_floor[next * num_nf_bands + o] /
702
7.81M
                  (1 + noise_floor[next * num_nf_bands + o] + guard);
703
7.81M
            if (flag) {
704
883k
              nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp / (nrg_est[c] + 1));
705
883k
              nrg_tone[c] = (FLOAT32)(
706
883k
                  (harmonics[c] &&
707
883k
                   (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
708
883k
                      ? sqrt(nrg_ref[c] * tmp /
709
422k
                             ABS(noise_floor[next * num_nf_bands + o] + guard))
710
883k
                      : nrg_tone[c]);
711
6.92M
            } else {
712
6.92M
              if (noise_absc_flag)
713
657k
                nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] / (nrg_est[c] + 1));
714
6.27M
              else
715
6.27M
                nrg_gain[c] = (FLOAT32)sqrt(
716
6.27M
                    nrg_ref[c] * tmp /
717
6.27M
                    ((nrg_est[c] + 1) *
718
6.27M
                     ABS(noise_floor[next * num_nf_bands + o] + guard)));
719
6.92M
            }
720
7.81M
            noise_level[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp);
721
7.81M
            c++;
722
7.81M
          }
723
2.79M
          m++;
724
2.79M
        }
725
726
1.46M
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
727
1.10M
          p_ref = p_est = 0;
728
1.10M
          for (k = (*lim_table)[limiter_band][c];
729
8.91M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
730
7.81M
            p_ref += nrg_ref[k];
731
7.81M
            p_est += nrg_est[k];
732
7.81M
          }
733
1.10M
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
734
1.10M
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
735
1.10M
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
736
1.10M
          for (k = (*lim_table)[limiter_band][c];
737
8.91M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
738
7.81M
            if (g_max <= nrg_gain[k]) {
739
1.14M
              noise_level[k] = (FLOAT32)(noise_level[k] * (g_max / (nrg_gain[k] + guard)));
740
1.14M
              nrg_gain[k] = g_max;
741
1.14M
            }
742
7.81M
          }
743
1.10M
          p_adj = 0;
744
1.10M
          for (k = (*lim_table)[limiter_band][c];
745
8.91M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
746
7.81M
            p_adj += nrg_gain[k] * nrg_gain[k] * nrg_est[k];
747
7.81M
            if (nrg_tone[k])
748
391k
              p_adj += nrg_tone[k] * nrg_tone[k];
749
7.41M
            else if (!noise_absc_flag)
750
6.64M
              p_adj += noise_level[k] * noise_level[k];
751
7.81M
          }
752
1.10M
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
753
1.10M
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
754
1.10M
          for (k = (*lim_table)[limiter_band][c];
755
8.91M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
756
7.81M
            nrg_gain[k] *= boost_gain;
757
7.81M
            noise_level[k] *= boost_gain;
758
7.81M
            nrg_tone[k] *= boost_gain;
759
7.81M
          }
760
1.10M
        }
761
762
365k
        if (esbr_start_up && (ldmps_present != 1)) {
763
162k
          for (n = 0; n < 4; n++) {
764
130k
            memcpy((*e_gain)[n], nrg_gain, num_subbands * sizeof(FLOAT32));
765
130k
            memcpy((*noise_buf)[n], noise_level,
766
130k
                   num_subbands * sizeof(FLOAT32));
767
130k
          }
768
32.5k
          esbr_start_up = 0;
769
32.5k
          esbr_start_up_pvc = 0;
770
32.5k
        }
771
772
365k
        for (l = rate * p_frame_info->border_vec[i];
773
7.31M
             l < rate * p_frame_info->border_vec[i + 1]; l++) {
774
6.95M
          ptr_real_buf = *(input_real + l) + sub_band_start;
775
6.95M
          ptr_imag_buf = *(input_imag + l) + sub_band_start;
776
777
6.95M
          freq_inv = 1;
778
6.95M
          if ((ldmps_present == 1) && (sub_band_start & 1)) freq_inv = -1;
779
780
172M
          for (k = 0; k < num_subbands; k++) {
781
165M
            (*e_gain)[4][k] = nrg_gain[k];
782
165M
            (*noise_buf)[4][k] = noise_level[k];
783
165M
            c = 0, sb_gain = 0, sb_noise = 0;
784
357M
            for (n = 4 - smooth_length; n <= 4; n++) {
785
191M
              sb_gain += (*e_gain)[n][k] * smooth_filt[c];
786
191M
              sb_noise += (*noise_buf)[n][k] * smooth_filt[c++];
787
191M
            }
788
789
165M
            phase_index = (phase_index + 1) & 511;
790
165M
            sb_noise = (nrg_tone[k] != 0 || noise_absc_flag) ? 0 : sb_noise;
791
792
165M
            if (ldmps_present == 1) {
793
1.97M
              *ptr_real_buf = *ptr_real_buf * sb_gain +
794
1.97M
                              sb_noise * ixheaac_random_phase[phase_index][0] +
795
1.97M
                              nrg_tone[k] * ixheaac_hphase_tbl[0][harm_index];
796
1.97M
              *ptr_imag_buf =
797
1.97M
                  *ptr_imag_buf * sb_gain +
798
1.97M
                  sb_noise * ixheaac_random_phase[phase_index][1] +
799
1.97M
                  nrg_tone[k] * freq_inv * ixheaac_hphase_tbl[1][harm_index];
800
801
1.97M
              freq_inv = -freq_inv;
802
163M
            } else {
803
163M
                *ptr_real_buf = *ptr_real_buf * sb_gain +
804
163M
                            sb_noise * ixheaac_random_phase[phase_index][0];
805
163M
                *ptr_imag_buf = *ptr_imag_buf * sb_gain +
806
163M
                            sb_noise * ixheaac_random_phase[phase_index][1];
807
163M
            }
808
809
165M
            ptr_real_buf++;
810
165M
            ptr_imag_buf++;
811
165M
          }
812
6.95M
          if (ldmps_present == 1) harm_index = (harm_index + 1) & 3;
813
814
6.95M
          memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
815
34.7M
          for (n = 0; n < 4; n++)
816
27.8M
            memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32));
817
6.95M
          memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32));
818
6.95M
          memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32));
819
34.7M
          for (n = 0; n < 4; n++)
820
27.8M
            memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32));
821
6.95M
          memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
822
6.95M
        }
823
824
365k
        if (ldmps_present != 1) {
825
360k
          err_code = ixheaacd_apply_inter_tes(
826
360k
              *(input_real1 + rate * p_frame_info->border_vec[i]),
827
360k
              *(input_imag1 + rate * p_frame_info->border_vec[i]),
828
360k
              *(input_real + rate * p_frame_info->border_vec[i]),
829
360k
              *(input_imag + rate * p_frame_info->border_vec[i]),
830
360k
              rate * p_frame_info->border_vec[i + 1] - rate * p_frame_info->border_vec[i],
831
360k
              sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]);
832
360k
          if (err_code != 0) {
833
0
            return err_code;
834
0
          }
835
836
360k
        for (l = rate * p_frame_info->border_vec[i];
837
7.24M
             l < rate * p_frame_info->border_vec[i + 1]; l++) {
838
6.88M
          ptr_real_buf = *(input_real + l) + sub_band_start;
839
6.88M
          ptr_imag_buf = *(input_imag + l) + sub_band_start;
840
6.88M
          if (sub_band_start & 1) {
841
2.53M
            freq_inv = -1;
842
4.34M
          } else {
843
4.34M
            freq_inv = 1;
844
4.34M
          }
845
170M
          for (k = 0; k < num_subbands; k++) {
846
163M
            *ptr_real_buf += nrg_tone[k] * ixheaac_hphase_tbl[0][harm_index];
847
163M
            *ptr_imag_buf +=
848
163M
                nrg_tone[k] * freq_inv * ixheaac_hphase_tbl[1][harm_index];
849
850
163M
            ptr_real_buf++;
851
163M
            ptr_imag_buf++;
852
163M
            freq_inv = -freq_inv;
853
163M
          }
854
6.88M
          harm_index = (harm_index + 1) & 3;
855
6.88M
        }
856
360k
      }
857
365k
    }
858
365k
  }
859
202k
}
860
861
19.9M
  for (i = 0; i < 64; i++) {
862
19.6M
    (*harm_flag_varlen_prev)[i] = (*harm_flag_prev)[i];
863
19.6M
    (*harm_flag_varlen)[i] = harmonics[i];
864
19.6M
  }
865
866
307k
  memcpy(&((*harm_flag_prev)[0]) + sub_band_start, harmonics,
867
307k
         (64 - sub_band_start) * sizeof(WORD8));
868
869
307k
  if (trans_env == bs_num_env) {
870
8.37k
    frame_data->env_short_flag_prev = 0;
871
298k
  } else {
872
298k
    frame_data->env_short_flag_prev = -1;
873
298k
  }
874
875
307k
  if (ldmps_present != 1) {
876
302k
  memcpy((VOID *)&frame_data->str_frame_info_prev,
877
302k
         (VOID *)&frame_data->str_frame_info_details,
878
302k
         sizeof(ia_frame_info_struct));
879
880
302k
  if (frame_data->str_frame_info_details.num_env == 1) {
881
176k
    frame_data->var_len_id_prev = 0;
882
176k
  } else if (frame_data->str_frame_info_details.num_env == 2) {
883
75.9k
    frame_data->var_len_id_prev = 1;
884
75.9k
  }
885
886
302k
  if ((frame_data->str_frame_info_details.num_noise_env < 1) ||
887
302k
        (frame_data->str_frame_info_details.num_noise_env > 2)) {
888
0
      if (ec_flag)
889
0
        frame_data->str_frame_info_details.num_noise_env = 1;
890
0
      else
891
0
        return IA_FATAL_ERROR;
892
0
    }
893
894
1.15M
  for (i = 0; i < num_nf_bands; i++) {
895
855k
    prev_env_noise_level[i] =
896
855k
        frame_data->flt_noise_floor
897
855k
            [(frame_data->str_frame_info_details.num_noise_env - 1) *
898
855k
                 num_nf_bands +
899
855k
             i];
900
855k
  }
901
302k
}
902
903
307k
  frame_data->harm_index = harm_index;
904
307k
  frame_data->phase_index = phase_index;
905
307k
  frame_data->pstr_sbr_header->esbr_start_up = esbr_start_up;
906
307k
  frame_data->pstr_sbr_header->esbr_start_up_pvc = esbr_start_up_pvc;
907
307k
  return 0;
908
307k
}
909
910
IA_ERRORCODE ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4],
911
                                         WORD16 *freq_band_tbl, WORD32 ixheaacd_num_bands,
912
                                         WORD32 x_over_qmf[MAX_NUM_PATCHES],
913
                                         WORD32 b_patching_mode, WORD32 upsamp_4_flag,
914
                                         struct ixheaacd_lpp_trans_patch *patch_param,
915
75.3k
                                         WORD32 ec_flag) {
916
75.3k
  WORD32 i, j, k, is_patch_border[2];
917
75.3k
  WORD32 patch_borders[MAX_NUM_PATCHES + 1];
918
75.3k
  WORD32 temp_limiter_band_calc[32 + MAX_NUM_PATCHES + 1];
919
920
75.3k
  double num_octave;
921
75.3k
  WORD32 num_patches;
922
923
75.3k
  WORD32 sub_band_start = freq_band_tbl[0];
924
75.3k
  WORD32 sub_band_end = freq_band_tbl[ixheaacd_num_bands];
925
926
75.3k
  const double log2 = log(2.0);
927
75.3k
  const double limbnd_per_oct[4] = {0, 1.2, 2.0, 3.0};
928
929
75.3k
  if (!b_patching_mode && (x_over_qmf != NULL)) {
930
23.3k
    num_patches = 0;
931
23.3k
    if (upsamp_4_flag) {
932
29.8k
      for (i = 1; i < MAX_NUM_PATCHES; i++)
933
24.9k
        if (x_over_qmf[i] != 0) num_patches++;
934
18.3k
    } else {
935
73.4k
      for (i = 1; i < 4; i++)
936
55.0k
        if (x_over_qmf[i] != 0) num_patches++;
937
18.3k
    }
938
77.7k
    for (i = 0; i < num_patches; i++) {
939
54.3k
      patch_borders[i] = x_over_qmf[i] - sub_band_start;
940
54.3k
    }
941
52.0k
  } else {
942
52.0k
    num_patches = patch_param->num_patches;
943
201k
    for (i = 0; i < num_patches; i++) {
944
149k
      patch_borders[i] = patch_param->start_subband[i] - sub_band_start;
945
149k
    }
946
52.0k
  }
947
75.3k
  patch_borders[i] = sub_band_end - sub_band_start;
948
949
75.3k
  lim_table[0][0] = freq_band_tbl[0] - sub_band_start;
950
75.3k
  lim_table[0][1] = freq_band_tbl[ixheaacd_num_bands] - sub_band_start;
951
75.3k
  gate_mode[0] = 1;
952
953
301k
  for (i = 1; i < 4; i++) {
954
1.95M
    for (k = 0; k <= ixheaacd_num_bands; k++) {
955
1.73M
      temp_limiter_band_calc[k] = freq_band_tbl[k] - sub_band_start;
956
1.73M
    }
957
958
613k
    for (k = 1; k < num_patches; k++) {
959
387k
      temp_limiter_band_calc[ixheaacd_num_bands + k] = patch_borders[k];
960
387k
    }
961
962
226k
    gate_mode[i] = ixheaacd_num_bands + num_patches - 1;
963
226k
    ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
964
965
2.12M
    for (j = 1; j <= gate_mode[i]; j++) {
966
1.89M
      num_octave = log((double)(temp_limiter_band_calc[j] + sub_band_start) /
967
1.89M
                       (temp_limiter_band_calc[j - 1] + sub_band_start)) /
968
1.89M
                   log2;
969
970
1.89M
      if (num_octave * limbnd_per_oct[i] < 0.49) {
971
1.12M
        if (temp_limiter_band_calc[j] == temp_limiter_band_calc[j - 1]) {
972
232k
          temp_limiter_band_calc[j] = sub_band_end;
973
232k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
974
232k
          gate_mode[i]--;
975
232k
          j--;
976
232k
          continue;
977
232k
        }
978
979
893k
        is_patch_border[0] = is_patch_border[1] = 0;
980
981
2.79M
        for (k = 0; k <= num_patches; k++) {
982
2.45M
          if (temp_limiter_band_calc[j - 1] == patch_borders[k]) {
983
554k
            is_patch_border[0] = 1;
984
554k
            break;
985
554k
          }
986
2.45M
        }
987
988
3.93M
        for (k = 0; k <= num_patches; k++) {
989
3.31M
          if (temp_limiter_band_calc[j] == patch_borders[k]) {
990
276k
            is_patch_border[1] = 1;
991
276k
            break;
992
276k
          }
993
3.31M
        }
994
995
893k
        if (!is_patch_border[1]) {
996
617k
          temp_limiter_band_calc[j] = sub_band_end;
997
617k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
998
617k
          gate_mode[i]--;
999
617k
          j--;
1000
617k
        } else if (!is_patch_border[0]) {
1001
161k
          temp_limiter_band_calc[j - 1] = sub_band_end;
1002
161k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
1003
161k
          gate_mode[i]--;
1004
161k
          j--;
1005
161k
        }
1006
893k
      }
1007
1.89M
    }
1008
226k
    if (gate_mode[i] > 12) {
1009
1
      if (ec_flag)
1010
0
        gate_mode[i] = 12;
1011
1
      else
1012
1
        return IA_FATAL_ERROR;
1013
1
    }
1014
1.33M
    for (k = 0; k <= gate_mode[i]; k++) {
1015
1.10M
      lim_table[i][k] = temp_limiter_band_calc[k];
1016
1.10M
    }
1017
226k
  }
1018
75.3k
  return IA_NO_ERROR;
1019
75.3k
}
1020
1021
WORD32 ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
1022
                                FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
1023
                                WORD32 num_sample, WORD32 sub_band_start,
1024
360k
                                WORD32 num_subband, WORD32 gamma_idx) {
1025
360k
  WORD32 sub_band_end = sub_band_start + num_subband;
1026
360k
  FLOAT32 subsample_power_high[TIMESLOT_BUFFER_SIZE],
1027
360k
      subsample_power_low[TIMESLOT_BUFFER_SIZE];
1028
360k
  FLOAT32 total_power_high = 0.0f;
1029
360k
  FLOAT32 total_power_low = 0.0f, total_power_high_after = 1.0e-6f;
1030
360k
  FLOAT32 gain[TIMESLOT_BUFFER_SIZE];
1031
360k
  FLOAT32 gain_adj, gain_adj_2;
1032
360k
  FLOAT32 gamma = ixheaac_q_gamma_table[gamma_idx];
1033
360k
  WORD32 i, j;
1034
1035
360k
  if (num_sample > TIMESLOT_BUFFER_SIZE)
1036
0
  {
1037
0
    return IA_FATAL_ERROR;
1038
0
  }
1039
360k
  if (gamma > 0) {
1040
192k
    for (i = 0; i < num_sample; i++) {
1041
181k
      memcpy(&qmf_real[64 * i], &qmf_real1[64 * i],
1042
181k
             sub_band_start * sizeof(FLOAT32));
1043
181k
      memcpy(&qmf_imag[64 * i], &qmf_imag1[64 * i],
1044
181k
             sub_band_start * sizeof(FLOAT32));
1045
181k
    }
1046
1047
192k
    for (i = 0; i < num_sample; i++) {
1048
181k
      subsample_power_low[i] = 0.0f;
1049
3.48M
      for (j = 0; j < sub_band_start; j++) {
1050
3.29M
        subsample_power_low[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j];
1051
3.29M
        subsample_power_low[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j];
1052
3.29M
      }
1053
181k
      subsample_power_high[i] = 0.0f;
1054
5.41M
      for (j = sub_band_start; j < sub_band_end; j++) {
1055
5.23M
        subsample_power_high[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j];
1056
5.23M
        subsample_power_high[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j];
1057
5.23M
      }
1058
181k
      total_power_low += subsample_power_low[i];
1059
181k
      total_power_high += subsample_power_high[i];
1060
181k
    }
1061
1062
192k
    for (i = 0; i < num_sample; i++) {
1063
181k
      gain[i] = (FLOAT32)(sqrt(subsample_power_low[i] * num_sample /
1064
181k
                               (total_power_low + 1.0e-6f)));
1065
181k
    }
1066
1067
192k
    for (i = 0; i < num_sample; i++) {
1068
181k
      gain[i] = (FLOAT32)(1.0f + gamma * (gain[i] - 1.0f));
1069
181k
    }
1070
1071
192k
    for (i = 0; i < num_sample; i++) {
1072
181k
      if (gain[i] < 0.2f) {
1073
117k
        gain[i] = 0.2f;
1074
117k
      }
1075
1076
181k
      subsample_power_high[i] *= gain[i] * gain[i];
1077
181k
      total_power_high_after += subsample_power_high[i];
1078
181k
    }
1079
1080
10.4k
    gain_adj_2 = total_power_high / total_power_high_after;
1081
10.4k
    gain_adj = (FLOAT32)(sqrt(gain_adj_2));
1082
1083
192k
    for (i = 0; i < num_sample; i++) {
1084
181k
      gain[i] *= gain_adj;
1085
1086
5.41M
      for (j = sub_band_start; j < sub_band_end; j++) {
1087
5.23M
        qmf_real[64 * i + j] *= gain[i];
1088
5.23M
        qmf_imag[64 * i + j] *= gain[i];
1089
5.23M
      }
1090
181k
    }
1091
10.4k
  }
1092
360k
  return 0;
1093
360k
}