Coverage Report

Created: 2026-06-10 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_esbr_envcal.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <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
5.48M
#define ABS(A) fabs(A)
47
48
1.35M
VOID ixheaacd_shellsort(WORD32 *in, WORD32 n) {
49
1.35M
  WORD32 i, j, v;
50
1.35M
  WORD32 inc = 1;
51
52
1.35M
  do
53
2.91M
    inc = 3 * inc + 1;
54
2.91M
  while (inc <= n);
55
56
2.91M
  do {
57
2.91M
    inc = inc / 3;
58
22.5M
    for (i = inc + 1; i <= n; i++) {
59
19.5M
      v = in[i - 1];
60
19.5M
      j = i;
61
26.1M
      while (in[j - inc - 1] > v) {
62
7.25M
        in[j - 1] = in[j - inc - 1];
63
7.25M
        j -= inc;
64
7.25M
        if (j <= inc) break;
65
7.25M
      }
66
19.5M
      in[j - 1] = v;
67
19.5M
    }
68
2.91M
  } while (inc > 1);
69
1.35M
}
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
222k
                             WORD32 ec_flag) {
76
222k
  IA_ERRORCODE err_code = IA_NO_ERROR;
77
222k
  WORD8 harmonics[64];
78
222k
  FLOAT32(*env_tmp)[48];
79
222k
  FLOAT32(*noise_level_pvc)[48];
80
222k
  FLOAT32(*nrg_est_pvc)[48];
81
222k
  FLOAT32(*nrg_ref_pvc)[48];
82
222k
  FLOAT32(*nrg_gain_pvc)[48];
83
222k
  FLOAT32(*nrg_tone_pvc)[48];
84
85
222k
  WORD32 n, c, li, ui, i, j, k = 0, l, m = 0, kk = 0, o, next = -1, ui2, flag,
86
222k
                             tmp, noise_absc_flag, smooth_length;
87
222k
  WORD32 upsamp_4_flag = frame_data->pstr_sbr_header->is_usf_4;
88
89
222k
  FLOAT32 *ptr_real_buf, *ptr_imag_buf, nrg = 0, p_ref, p_est, avg_gain, g_max,
90
222k
                                        p_adj, boost_gain, sb_gain, sb_noise,
91
222k
                                        temp[64];
92
93
222k
  WORD32 t;
94
222k
  WORD32 start_pos = 0;
95
222k
  WORD32 end_pos = 0;
96
97
222k
  WORD32 slot_idx;
98
99
222k
  FLOAT32 *prev_env_noise_level = frame_data->prev_noise_level;
100
222k
  FLOAT32 *nrg_tone = scratch_buff;
101
222k
  FLOAT32 *noise_level = scratch_buff + 64;
102
222k
  FLOAT32 *nrg_est = scratch_buff + 128;
103
222k
  FLOAT32 *nrg_ref = scratch_buff + 192;
104
222k
  FLOAT32 *nrg_gain = scratch_buff + 256;
105
106
222k
  const FLOAT32 *smooth_filt;
107
108
222k
  FLOAT32 *sfb_nrg = frame_data->flt_env_sf_arr;
109
222k
  FLOAT32 *noise_floor = frame_data->flt_noise_floor;
110
222k
  ia_frame_info_struct *p_frame_info = &frame_data->str_frame_info_details;
111
112
222k
  ia_frame_info_struct *pvc_frame_info = &frame_data->str_pvc_frame_info;
113
222k
  WORD32 smoothing_length = frame_data->pstr_sbr_header->smoothing_mode ? 0 : 4;
114
222k
  WORD32 int_mode = frame_data->pstr_sbr_header->interpol_freq;
115
222k
  WORD32 limiter_band = frame_data->pstr_sbr_header->limiter_bands;
116
222k
  WORD32 limiter_gains = frame_data->pstr_sbr_header->limiter_gains;
117
222k
  WORD32 *add_harmonics = frame_data->add_harmonics;
118
222k
  WORD32 sub_band_start =
119
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_start;
120
222k
  WORD32 sub_band_end =
121
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
122
222k
  WORD32 reset = frame_data->reset_flag;
123
222k
  WORD32 num_subbands = sub_band_end - sub_band_start;
124
222k
  WORD32 bs_num_env = p_frame_info->num_env;
125
222k
  WORD32 trans_env = p_frame_info->transient_env;
126
222k
  WORD32 sbr_mode = frame_data->sbr_mode;
127
222k
  WORD32 prev_sbr_mode = frame_data->prev_sbr_mode;
128
129
222k
  WORD16 *freq_band_table[2];
130
222k
  const WORD16 *num_sf_bands =
131
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->num_sf_bands;
132
222k
  WORD16 *freq_band_table_noise =
133
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_noise;
134
222k
  WORD32 num_nf_bands =
135
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->num_nf_bands;
136
137
222k
  WORD32 harm_index = frame_data->harm_index;
138
222k
  WORD32 phase_index = frame_data->phase_index;
139
222k
  WORD32 esbr_start_up = frame_data->pstr_sbr_header->esbr_start_up;
140
222k
  WORD32 esbr_start_up_pvc = frame_data->pstr_sbr_header->esbr_start_up_pvc;
141
222k
  WORD8(*harm_flag_prev)[64] = &frame_data->harm_flag_prev;
142
222k
  FLOAT32(*e_gain)[5][64] = &frame_data->e_gain;
143
222k
  FLOAT32(*noise_buf)[5][64] = &frame_data->noise_buf;
144
222k
  WORD32(*lim_table)[4][12 + 1] = &frame_data->lim_table;
145
222k
  WORD32(*gate_mode)[4] = &frame_data->gate_mode;
146
222k
  WORD32 freq_inv = 1;
147
148
222k
  WORD8(*harm_flag_varlen_prev)[64] = &frame_data->harm_flag_varlen_prev;
149
222k
  WORD8(*harm_flag_varlen)[64] = &frame_data->harm_flag_varlen;
150
222k
  WORD32 band_loop_end;
151
152
222k
  WORD32 rate = upsamp_4_flag ? 4 : 2;
153
222k
  FLOAT64 guard = 1e-17;
154
155
222k
  if (ldmps_present == 1) rate = 1;
156
157
222k
  env_tmp = frame_data->env_tmp;
158
222k
  noise_level_pvc = frame_data->noise_level_pvc;
159
222k
  nrg_est_pvc = frame_data->nrg_est_pvc;
160
222k
  nrg_ref_pvc = frame_data->nrg_ref_pvc;
161
222k
  nrg_gain_pvc = frame_data->nrg_gain_pvc;
162
222k
  nrg_tone_pvc = frame_data->nrg_tone_pvc;
163
164
222k
  freq_band_table[0] =
165
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[0];
166
222k
  freq_band_table[1] =
167
222k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[1];
168
169
222k
  if (reset || (ldmps_present == 1)) {
170
42.1k
    esbr_start_up = 1;
171
42.1k
    esbr_start_up_pvc = 1;
172
42.1k
    if (reset) phase_index = 0;
173
42.1k
    if (ixheaacd_createlimiterbands(
174
42.1k
            (*lim_table), (*gate_mode),
175
42.1k
            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
176
42.1k
            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
177
42.1k
            ec_flag))
178
1
      return IA_FATAL_ERROR;
179
42.1k
  }
180
181
222k
  if (frame_data->sbr_patching_mode != frame_data->prev_sbr_patching_mode) {
182
36.1k
    if (ixheaacd_createlimiterbands(
183
36.1k
            (*lim_table), (*gate_mode),
184
36.1k
            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
185
36.1k
            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
186
36.1k
            ec_flag))
187
0
      return IA_FATAL_ERROR;
188
189
36.1k
    frame_data->prev_sbr_patching_mode = frame_data->sbr_patching_mode;
190
36.1k
  }
191
192
222k
  memset(harmonics, 0, 64 * sizeof(WORD8));
193
194
222k
  if (sbr_mode == PVC_SBR) {
195
998k
    for (i = 0; i < num_sf_bands[HIGH]; i++) {
196
934k
      li =
197
934k
          frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i];
198
934k
      ui = frame_data->pstr_sbr_header->pstr_freq_band_data
199
934k
               ->freq_band_tbl_hi[i + 1];
200
934k
      tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
201
202
934k
      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
934k
      harmonics[tmp] = add_harmonics[i];
210
934k
    }
211
212
76.1k
    for (t = 0; t < p_frame_info->border_vec[0]; t++) {
213
828k
      for (c = 0; c < 64; c++) {
214
815k
        frame_data->qmapped_pvc[c][t] = frame_data->qmapped_pvc[c][t + 16];
215
815k
      }
216
12.7k
    }
217
218
168k
    for (i = 0; i < bs_num_env; i++) {
219
105k
      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
105k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
226
227
105k
      start_pos = p_frame_info->border_vec[i];
228
105k
      end_pos = p_frame_info->border_vec[i + 1];
229
105k
      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.12M
      for (t = start_pos; t < end_pos; t++) {
238
1.01M
        band_loop_end = num_sf_bands[p_frame_info->freq_res[i]];
239
240
8.58M
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
241
7.57M
          li = freq_band_table[p_frame_info->freq_res[i]][j];
242
7.57M
          ui = freq_band_table[p_frame_info->freq_res[i]][j + 1];
243
7.57M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
244
7.57M
                    ->freq_band_tbl_noise[o + 1];
245
246
37.1M
          for (k = 0; k < ui - li; k++) {
247
29.6M
            o = (k + li >= ui2) ? o + 1 : o;
248
29.6M
            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
29.6M
            ui2 = freq_band_table_noise[o + 1];
255
256
29.6M
            frame_data->qmapped_pvc[c][t] =
257
29.6M
                noise_floor[next * num_nf_bands + o];
258
29.6M
            c++;
259
29.6M
          }
260
7.57M
        }
261
1.01M
      }
262
105k
    }
263
264
63.3k
    kk = 0;
265
63.3k
    next = -1;
266
267
168k
    for (i = 0; i < bs_num_env; i++) {
268
105k
      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
105k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
275
276
105k
      start_pos = pvc_frame_info->border_vec[i];
277
105k
      end_pos = pvc_frame_info->border_vec[i + 1];
278
105k
      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.11M
      for (t = start_pos; t < end_pos; t++) {
286
65.8M
        for (c = 0; c < 64; c++) {
287
64.8M
          env_tmp[c][t] = env_out[64 * t + c];
288
64.8M
        }
289
1.01M
      }
290
291
105k
      noise_absc_flag =
292
105k
          (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0;
293
294
105k
      if (prev_sbr_mode == ORIG_SBR) noise_absc_flag = 0;
295
296
105k
      smooth_length = (noise_absc_flag ? 0 : smoothing_length);
297
105k
      smooth_filt = *ixheaac_fir_table[smooth_length];
298
299
112k
      for (t = start_pos; t < frame_data->sin_len_for_cur_top; t++) {
300
7.58k
        band_loop_end =
301
7.58k
            num_sf_bands[frame_data->str_frame_info_prev
302
7.58k
                             .freq_res[frame_data->var_len_id_prev]];
303
304
64.3k
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
305
56.7k
          double tmp;
306
307
56.7k
          li = freq_band_table[frame_data->str_frame_info_prev
308
56.7k
                                   .freq_res[frame_data->var_len_id_prev]][j];
309
56.7k
          ui = freq_band_table[frame_data->str_frame_info_prev
310
56.7k
                                   .freq_res[frame_data->var_len_id_prev]]
311
56.7k
                              [j + 1];
312
56.7k
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
313
56.7k
                    ->freq_band_tbl_noise[o + 1];
314
315
271k
          for (flag = 0, k = li; k < ui; k++) {
316
214k
            flag = ((*harm_flag_varlen)[c] &&
317
36.0k
                    (t >= frame_data->sin_start_for_cur_top ||
318
3.89k
                     (*harm_flag_varlen_prev)[c + sub_band_start]))
319
214k
                       ? 1
320
214k
                       : flag;
321
322
214k
            nrg_ref_pvc[c][t] = env_tmp[k][t];
323
646k
            for (nrg = 0, l = 0; l < rate; l++) {
324
431k
              nrg +=
325
431k
                  (input_real[rate * t + l][k] * input_real[rate * t + l][k]) +
326
431k
                  (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]);
327
431k
            }
328
214k
            nrg_est_pvc[c][t] = nrg / rate;
329
214k
            c++;
330
214k
          }
331
332
56.7k
          if (!int_mode && ui != li) {
333
52.3k
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
334
43.0k
              nrg += nrg_est_pvc[k][t];
335
43.0k
            }
336
9.33k
            nrg /= (ui - li);
337
47.4k
          } else {
338
47.4k
            nrg = 0;
339
47.4k
          }
340
56.7k
          c -= (ui - li);
341
342
271k
          for (k = 0; k < ui - li; k++) {
343
214k
            o = (k + li >= ui2) ? o + 1 : o;
344
214k
            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
214k
            ui2 = freq_band_table_noise[o + 1];
351
214k
            nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
352
214k
            nrg_tone_pvc[c][t] = 0.0f;
353
354
214k
            tmp = frame_data->qmapped_pvc[c][t] /
355
214k
                  (1 + frame_data->qmapped_pvc[c][t] + guard);
356
357
214k
            if (flag) {
358
127k
              nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
359
127k
                                                 (nrg_est_pvc[c][t] + 1));
360
361
127k
              nrg_tone_pvc[c][t] = (FLOAT32)(
362
127k
                  (harmonics[c] && (t >= frame_data->sine_position ||
363
9.02k
                                    (*harm_flag_prev)[c + sub_band_start]))
364
127k
                      ? sqrt(nrg_ref_pvc[c][t] * tmp /
365
11.0k
                             (frame_data->qmapped_pvc[c][t] + guard))
366
127k
                      : nrg_tone_pvc[c][t]);
367
368
127k
              nrg_tone_pvc[c][t] =
369
127k
                  (FLOAT32)(((*harm_flag_varlen)[c] &&
370
35.2k
                             (t >= frame_data->sin_start_for_cur_top ||
371
3.10k
                              (*harm_flag_varlen_prev)[c + sub_band_start]))
372
127k
                                ? sqrt(nrg_ref_pvc[c][t] * tmp /
373
35.1k
                                       (prev_env_noise_level[o] + guard))
374
127k
                                : nrg_tone_pvc[c][t]);
375
376
127k
            } else {
377
86.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
86.9k
              } else {
381
86.9k
                nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
382
86.9k
                    nrg_ref_pvc[c][t] * tmp /
383
86.9k
                    ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
384
86.9k
              }
385
86.9k
            }
386
387
214k
            noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp);
388
214k
            c++;
389
214k
          }
390
56.7k
        }
391
392
33.7k
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
393
26.2k
          p_ref = p_est = 0.0f;
394
26.2k
          p_adj = 0;
395
26.2k
          for (k = (*lim_table)[limiter_band][c];
396
240k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
397
214k
            p_ref += nrg_ref_pvc[k][t];
398
214k
            p_est += nrg_est_pvc[k][t];
399
214k
          }
400
26.2k
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
401
26.2k
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
402
26.2k
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
403
26.2k
          for (k = (*lim_table)[limiter_band][c];
404
240k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
405
214k
            if (g_max <= nrg_gain_pvc[k][t]) {
406
49.2k
              noise_level_pvc[k][t] =
407
49.2k
                  (FLOAT32)(noise_level_pvc[k][t] * (g_max / (nrg_gain_pvc[k][t] + guard)));
408
49.2k
              nrg_gain_pvc[k][t] = g_max;
409
49.2k
            }
410
411
214k
            p_adj +=
412
214k
                nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t];
413
414
214k
            if (nrg_tone_pvc[k][t]) {
415
35.1k
              p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t];
416
179k
            } else if (!noise_absc_flag) {
417
179k
              p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t];
418
179k
            }
419
214k
          }
420
26.2k
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
421
26.2k
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
422
423
26.2k
          for (k = (*lim_table)[limiter_band][c];
424
240k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
425
214k
            nrg_gain_pvc[k][t] *= boost_gain;
426
214k
            noise_level_pvc[k][t] *= boost_gain;
427
214k
            nrg_tone_pvc[k][t] *= boost_gain;
428
214k
          }
429
26.2k
        }
430
7.58k
      }
431
432
1.11M
      for (; t < end_pos; t++) {
433
1.00M
        band_loop_end = num_sf_bands[pvc_frame_info->freq_res[i]];
434
435
8.51M
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
436
7.50M
          double tmp;
437
438
7.50M
          li = freq_band_table[pvc_frame_info->freq_res[i]][j];
439
7.50M
          ui = freq_band_table[pvc_frame_info->freq_res[i]][j + 1];
440
7.50M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
441
7.50M
                    ->freq_band_tbl_noise[o + 1];
442
443
36.8M
          for (flag = 0, k = li; k < ui; k++) {
444
29.3M
            flag = (harmonics[c] && (t >= frame_data->sine_position ||
445
1.03M
                                     (*harm_flag_prev)[c + sub_band_start]))
446
29.3M
                       ? 1
447
29.3M
                       : flag;
448
449
29.3M
            nrg_ref_pvc[c][t] = env_tmp[k][t];
450
91.9M
            for (nrg = 0, l = 0; l < rate; l++) {
451
62.5M
              nrg +=
452
62.5M
                  (input_real[rate * t + l][k] * input_real[rate * t + l][k]) +
453
62.5M
                  (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]);
454
62.5M
            }
455
29.3M
            nrg_est_pvc[c][t] = nrg / rate;
456
29.3M
            c++;
457
29.3M
          }
458
459
7.50M
          if (!int_mode && ui != li) {
460
6.72M
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
461
5.68M
              nrg += nrg_est_pvc[k][t];
462
5.68M
            }
463
1.04M
            nrg /= (ui - li);
464
6.45M
          } else {
465
6.45M
            nrg = 0;
466
6.45M
          }
467
7.50M
          c -= (ui - li);
468
469
36.8M
          for (k = 0; k < ui - li; k++) {
470
29.3M
            o = (k + li >= ui2) ? o + 1 : o;
471
29.3M
            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
29.3M
            ui2 = freq_band_table_noise[o + 1];
478
29.3M
            nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
479
29.3M
            nrg_tone_pvc[c][t] = 0.0f;
480
481
29.3M
            tmp = frame_data->qmapped_pvc[c][t] /
482
29.3M
                  (1 + frame_data->qmapped_pvc[c][t] + guard);
483
484
29.3M
            if (flag) {
485
1.99M
              nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
486
1.99M
                                                 (nrg_est_pvc[c][t] + 1));
487
488
1.99M
              nrg_tone_pvc[c][t] = (FLOAT32)(
489
1.99M
                  (harmonics[c] && (t >= frame_data->sine_position ||
490
415k
                                    (*harm_flag_prev)[c + sub_band_start]))
491
1.99M
                      ? sqrt(nrg_ref_pvc[c][t] * tmp /
492
625k
                             (frame_data->qmapped_pvc[c][t] + guard))
493
1.99M
                      : nrg_tone_pvc[c][t]);
494
27.3M
            } else {
495
27.3M
              if (noise_absc_flag) {
496
46.1k
                nrg_gain_pvc[c][t] =
497
46.1k
                    (FLOAT32)sqrt(nrg_ref_pvc[c][t] / (nrg_est_pvc[c][t] + 1));
498
27.3M
              } else {
499
27.3M
                nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
500
27.3M
                    nrg_ref_pvc[c][t] * tmp /
501
27.3M
                    ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
502
27.3M
              }
503
27.3M
            }
504
505
29.3M
            noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp);
506
29.3M
            c++;
507
29.3M
          }
508
7.50M
        }
509
510
5.21M
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
511
4.20M
          p_ref = p_est = 0.0f;
512
4.20M
          p_adj = 0;
513
4.20M
          for (k = (*lim_table)[limiter_band][c];
514
33.4M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
515
29.2M
            p_ref += nrg_ref_pvc[k][t];
516
29.2M
            p_est += nrg_est_pvc[k][t];
517
29.2M
          }
518
4.20M
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
519
4.20M
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
520
4.20M
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
521
522
4.20M
          for (k = (*lim_table)[limiter_band][c];
523
33.4M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
524
29.2M
            if (g_max <= nrg_gain_pvc[k][t]) {
525
3.01M
              noise_level_pvc[k][t] =
526
3.01M
                  (FLOAT32)(noise_level_pvc[k][t] *
527
3.01M
                            (g_max / (nrg_gain_pvc[k][t] + guard)));
528
3.01M
              nrg_gain_pvc[k][t] = g_max;
529
3.01M
            }
530
531
29.2M
            p_adj +=
532
29.2M
                nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t];
533
534
29.2M
            if (nrg_tone_pvc[k][t]) {
535
625k
              p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t];
536
28.6M
            } else if (!noise_absc_flag) {
537
28.6M
              p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t];
538
28.6M
            }
539
29.2M
          }
540
541
4.20M
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
542
4.20M
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
543
544
4.20M
          for (k = (*lim_table)[limiter_band][c];
545
33.4M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
546
29.2M
            nrg_gain_pvc[k][t] *= boost_gain;
547
29.2M
            noise_level_pvc[k][t] *= boost_gain;
548
29.2M
            nrg_tone_pvc[k][t] *= boost_gain;
549
29.2M
          }
550
4.20M
        }
551
1.00M
      }
552
553
105k
      if (esbr_start_up_pvc) {
554
46.0k
        for (n = 0; n < 4; n++) {
555
1.14M
          for (c = 0; c < num_subbands; c++) {
556
1.10M
            (*e_gain)[n][c] = nrg_gain_pvc[c][start_pos];
557
1.10M
            (*noise_buf)[n][c] = noise_level_pvc[c][start_pos];
558
1.10M
          }
559
36.8k
        }
560
9.20k
        esbr_start_up_pvc = 0;
561
9.20k
        esbr_start_up = 0;
562
9.20k
      }
563
105k
      for (l = rate * pvc_frame_info->border_vec[i];
564
2.33M
           l < rate * pvc_frame_info->border_vec[1 + i]; l++) {
565
2.23M
        ptr_real_buf = *(input_real + l) + sub_band_start;
566
2.23M
        ptr_imag_buf = *(input_imag + l) + sub_band_start;
567
568
2.23M
        slot_idx = (WORD32)l / rate;
569
2.23M
        if (sub_band_start & 1) {
570
685k
          freq_inv = -1;
571
1.54M
        } else {
572
1.54M
          freq_inv = 1;
573
1.54M
        }
574
575
65.1M
        for (k = 0; k < num_subbands; k++) {
576
62.9M
          (*e_gain)[4][k] = nrg_gain_pvc[k][slot_idx];
577
62.9M
          (*noise_buf)[4][k] = noise_level_pvc[k][slot_idx];
578
62.9M
          c = 0, sb_gain = 0, sb_noise = 0;
579
173M
          for (n = 4 - smooth_length; n <= 4; n++) {
580
110M
            sb_gain += (*e_gain)[n][k] * smooth_filt[c];
581
110M
            sb_noise += (*noise_buf)[n][k] * smooth_filt[c++];
582
110M
          }
583
62.9M
          phase_index = (phase_index + 1) & 511;
584
62.9M
          sb_noise = (nrg_tone_pvc[k][slot_idx] != 0 || noise_absc_flag)
585
62.9M
                         ? 0
586
62.9M
                         : sb_noise;
587
588
62.9M
          *ptr_real_buf =
589
62.9M
              *ptr_real_buf * sb_gain +
590
62.9M
              sb_noise * ixheaac_random_phase[phase_index][0] +
591
62.9M
              nrg_tone_pvc[k][slot_idx] * ixheaac_hphase_tbl[0][harm_index];
592
62.9M
          *ptr_imag_buf = *ptr_imag_buf * sb_gain +
593
62.9M
                          sb_noise * ixheaac_random_phase[phase_index][1] +
594
62.9M
                          nrg_tone_pvc[k][slot_idx] * freq_inv *
595
62.9M
                              ixheaac_hphase_tbl[1][harm_index];
596
597
62.9M
          ptr_real_buf++;
598
62.9M
          ptr_imag_buf++;
599
62.9M
          freq_inv = -freq_inv;
600
62.9M
        }
601
602
2.23M
        harm_index = (harm_index + 1) & 3;
603
604
2.23M
        memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
605
11.1M
        for (n = 0; n < 4; n++) {
606
8.93M
          memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32));
607
8.93M
        }
608
2.23M
        memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32));
609
610
2.23M
        memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32));
611
11.1M
        for (n = 0; n < 4; n++) {
612
8.93M
          memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32));
613
8.93M
        }
614
2.23M
        memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
615
2.23M
      }
616
105k
    }
617
159k
  } else {
618
2.36M
    for (i = 0; i < num_sf_bands[HIGH]; i++) {
619
2.20M
      li =
620
2.20M
          frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i];
621
2.20M
      ui = frame_data->pstr_sbr_header->pstr_freq_band_data
622
2.20M
               ->freq_band_tbl_hi[i + 1];
623
2.20M
      tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
624
2.20M
      if ((tmp >= 64) || (tmp < 0)) return -1;
625
626
2.20M
      harmonics[tmp] = add_harmonics[i];
627
2.20M
    }
628
629
458k
    for (i = 0; i < bs_num_env; i++) {
630
299k
      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
299k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk])
638
228k
        kk++, next++;
639
640
299k
      noise_absc_flag =
641
299k
          (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0;
642
643
299k
      smooth_length = (noise_absc_flag ? 0 : smoothing_length);
644
299k
      smooth_filt = *ixheaac_fir_table[smooth_length];
645
646
299k
      if (sbr_mode == ORIG_SBR) {
647
3.03M
        for (c = 0, o = 0, j = 0; j < num_sf_bands[p_frame_info->freq_res[i]];
648
2.74M
             j++) {
649
2.74M
          double tmp;
650
2.74M
          li = freq_band_table[p_frame_info->freq_res[i]][j];
651
2.74M
          ui = freq_band_table[p_frame_info->freq_res[i]][j + 1];
652
2.74M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
653
2.74M
                    ->freq_band_tbl_noise[o + 1];
654
655
2.74M
          if (p_frame_info->border_vec[i] >= p_frame_info->border_vec[i + 1]) {
656
141k
            for (flag = 0, k = li; k < ui; k++) {
657
101k
              flag = (harmonics[c] &&
658
1.24k
                (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
659
101k
                ? 1
660
101k
                : flag;
661
101k
              nrg_est[c++] = 0;
662
101k
            }
663
2.70M
          } else {
664
8.89M
            for (flag = 0, k = li; k < ui; k++) {
665
6.19M
              for (nrg = 0, l = rate * p_frame_info->border_vec[i];
666
130M
                l < rate * p_frame_info->border_vec[i + 1]; l++) {
667
124M
                nrg += (input_real[l][k] * input_real[l][k]) +
668
124M
                  (input_imag[l][k] * input_imag[l][k]);
669
124M
              }
670
6.19M
              flag = (harmonics[c] &&
671
451k
                (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
672
6.19M
                ? 1
673
6.19M
                : flag;
674
6.19M
              nrg_est[c++] = nrg / (rate * p_frame_info->border_vec[i + 1] -
675
6.19M
                rate * p_frame_info->border_vec[i]);
676
6.19M
            }
677
2.70M
          }
678
2.74M
          if (!int_mode && ui != li) {
679
532k
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
680
411k
              nrg += nrg_est[k];
681
411k
            }
682
121k
            nrg /= (ui - li);
683
2.61M
          } else {
684
2.61M
            nrg = 0;
685
2.61M
          }
686
2.74M
          c -= (ui - li);
687
688
9.03M
          for (k = 0; k < ui - li; k++) {
689
6.29M
            o = (k + li >= ui2) ? o + 1 : o;
690
6.29M
            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
6.29M
            ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
697
6.29M
                      ->freq_band_tbl_noise[o + 1];
698
6.29M
            nrg_ref[c] = sfb_nrg[m];
699
6.29M
            nrg_est[c] = (!int_mode) ? nrg : nrg_est[c];
700
6.29M
            nrg_tone[c] = 0;
701
6.29M
            tmp = noise_floor[next * num_nf_bands + o] /
702
6.29M
                  (1 + noise_floor[next * num_nf_bands + o] + guard);
703
6.29M
            if (flag) {
704
774k
              nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp / (nrg_est[c] + 1));
705
774k
              nrg_tone[c] = (FLOAT32)(
706
774k
                  (harmonics[c] &&
707
414k
                   (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
708
774k
                      ? sqrt(nrg_ref[c] * tmp /
709
413k
                             ABS(noise_floor[next * num_nf_bands + o] + guard))
710
774k
                      : nrg_tone[c]);
711
5.52M
            } else {
712
5.52M
              if (noise_absc_flag)
713
455k
                nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] / (nrg_est[c] + 1));
714
5.06M
              else
715
5.06M
                nrg_gain[c] = (FLOAT32)sqrt(
716
5.06M
                    nrg_ref[c] * tmp /
717
5.06M
                    ((nrg_est[c] + 1) *
718
5.06M
                     ABS(noise_floor[next * num_nf_bands + o] + guard)));
719
5.52M
            }
720
6.29M
            noise_level[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp);
721
6.29M
            c++;
722
6.29M
          }
723
2.74M
          m++;
724
2.74M
        }
725
726
1.16M
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
727
869k
          p_ref = p_est = 0;
728
869k
          for (k = (*lim_table)[limiter_band][c];
729
7.16M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
730
6.29M
            p_ref += nrg_ref[k];
731
6.29M
            p_est += nrg_est[k];
732
6.29M
          }
733
869k
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
734
869k
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
735
869k
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
736
869k
          for (k = (*lim_table)[limiter_band][c];
737
7.16M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
738
6.29M
            if (g_max <= nrg_gain[k]) {
739
863k
              noise_level[k] = (FLOAT32)(noise_level[k] * (g_max / (nrg_gain[k] + guard)));
740
863k
              nrg_gain[k] = g_max;
741
863k
            }
742
6.29M
          }
743
869k
          p_adj = 0;
744
869k
          for (k = (*lim_table)[limiter_band][c];
745
7.16M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
746
6.29M
            p_adj += nrg_gain[k] * nrg_gain[k] * nrg_est[k];
747
6.29M
            if (nrg_tone[k])
748
382k
              p_adj += nrg_tone[k] * nrg_tone[k];
749
5.91M
            else if (!noise_absc_flag)
750
5.37M
              p_adj += noise_level[k] * noise_level[k];
751
6.29M
          }
752
869k
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
753
869k
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
754
869k
          for (k = (*lim_table)[limiter_band][c];
755
7.16M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
756
6.29M
            nrg_gain[k] *= boost_gain;
757
6.29M
            noise_level[k] *= boost_gain;
758
6.29M
            nrg_tone[k] *= boost_gain;
759
6.29M
          }
760
869k
        }
761
762
299k
        if (esbr_start_up && (ldmps_present != 1)) {
763
144k
          for (n = 0; n < 4; n++) {
764
115k
            memcpy((*e_gain)[n], nrg_gain, num_subbands * sizeof(FLOAT32));
765
115k
            memcpy((*noise_buf)[n], noise_level,
766
115k
                   num_subbands * sizeof(FLOAT32));
767
115k
          }
768
28.8k
          esbr_start_up = 0;
769
28.8k
          esbr_start_up_pvc = 0;
770
28.8k
        }
771
772
299k
        for (l = rate * p_frame_info->border_vec[i];
773
5.80M
             l < rate * p_frame_info->border_vec[i + 1]; l++) {
774
5.50M
          ptr_real_buf = *(input_real + l) + sub_band_start;
775
5.50M
          ptr_imag_buf = *(input_imag + l) + sub_band_start;
776
777
5.50M
          freq_inv = 1;
778
5.50M
          if ((ldmps_present == 1) && (sub_band_start & 1)) freq_inv = -1;
779
780
130M
          for (k = 0; k < num_subbands; k++) {
781
124M
            (*e_gain)[4][k] = nrg_gain[k];
782
124M
            (*noise_buf)[4][k] = noise_level[k];
783
124M
            c = 0, sb_gain = 0, sb_noise = 0;
784
282M
            for (n = 4 - smooth_length; n <= 4; n++) {
785
157M
              sb_gain += (*e_gain)[n][k] * smooth_filt[c];
786
157M
              sb_noise += (*noise_buf)[n][k] * smooth_filt[c++];
787
157M
            }
788
789
124M
            phase_index = (phase_index + 1) & 511;
790
124M
            sb_noise = (nrg_tone[k] != 0 || noise_absc_flag) ? 0 : sb_noise;
791
792
124M
            if (ldmps_present == 1) {
793
1.73M
              *ptr_real_buf = *ptr_real_buf * sb_gain +
794
1.73M
                              sb_noise * ixheaac_random_phase[phase_index][0] +
795
1.73M
                              nrg_tone[k] * ixheaac_hphase_tbl[0][harm_index];
796
1.73M
              *ptr_imag_buf =
797
1.73M
                  *ptr_imag_buf * sb_gain +
798
1.73M
                  sb_noise * ixheaac_random_phase[phase_index][1] +
799
1.73M
                  nrg_tone[k] * freq_inv * ixheaac_hphase_tbl[1][harm_index];
800
801
1.73M
              freq_inv = -freq_inv;
802
122M
            } else {
803
122M
                *ptr_real_buf = *ptr_real_buf * sb_gain +
804
122M
                            sb_noise * ixheaac_random_phase[phase_index][0];
805
122M
                *ptr_imag_buf = *ptr_imag_buf * sb_gain +
806
122M
                            sb_noise * ixheaac_random_phase[phase_index][1];
807
122M
            }
808
809
124M
            ptr_real_buf++;
810
124M
            ptr_imag_buf++;
811
124M
          }
812
5.50M
          if (ldmps_present == 1) harm_index = (harm_index + 1) & 3;
813
814
5.50M
          memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
815
27.5M
          for (n = 0; n < 4; n++)
816
22.0M
            memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32));
817
5.50M
          memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32));
818
5.50M
          memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32));
819
27.5M
          for (n = 0; n < 4; n++)
820
22.0M
            memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32));
821
5.50M
          memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
822
5.50M
        }
823
824
299k
        if (ldmps_present != 1) {
825
295k
          err_code = ixheaacd_apply_inter_tes(
826
295k
              *(input_real1 + rate * p_frame_info->border_vec[i]),
827
295k
              *(input_imag1 + rate * p_frame_info->border_vec[i]),
828
295k
              *(input_real + rate * p_frame_info->border_vec[i]),
829
295k
              *(input_imag + rate * p_frame_info->border_vec[i]),
830
295k
              rate * p_frame_info->border_vec[i + 1] - rate * p_frame_info->border_vec[i],
831
295k
              sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]);
832
295k
          if (err_code != 0) {
833
0
            return err_code;
834
0
          }
835
836
295k
        for (l = rate * p_frame_info->border_vec[i];
837
5.73M
             l < rate * p_frame_info->border_vec[i + 1]; l++) {
838
5.43M
          ptr_real_buf = *(input_real + l) + sub_band_start;
839
5.43M
          ptr_imag_buf = *(input_imag + l) + sub_band_start;
840
5.43M
          if (sub_band_start & 1) {
841
2.40M
            freq_inv = -1;
842
3.02M
          } else {
843
3.02M
            freq_inv = 1;
844
3.02M
          }
845
128M
          for (k = 0; k < num_subbands; k++) {
846
122M
            *ptr_real_buf += nrg_tone[k] * ixheaac_hphase_tbl[0][harm_index];
847
122M
            *ptr_imag_buf +=
848
122M
                nrg_tone[k] * freq_inv * ixheaac_hphase_tbl[1][harm_index];
849
850
122M
            ptr_real_buf++;
851
122M
            ptr_imag_buf++;
852
122M
            freq_inv = -freq_inv;
853
122M
          }
854
5.43M
          harm_index = (harm_index + 1) & 3;
855
5.43M
        }
856
295k
      }
857
299k
    }
858
299k
  }
859
159k
}
860
861
14.4M
  for (i = 0; i < 64; i++) {
862
14.2M
    (*harm_flag_varlen_prev)[i] = (*harm_flag_prev)[i];
863
14.2M
    (*harm_flag_varlen)[i] = harmonics[i];
864
14.2M
  }
865
866
222k
  memcpy(&((*harm_flag_prev)[0]) + sub_band_start, harmonics,
867
222k
         (64 - sub_band_start) * sizeof(WORD8));
868
869
222k
  if (trans_env == bs_num_env) {
870
7.63k
    frame_data->env_short_flag_prev = 0;
871
214k
  } else {
872
214k
    frame_data->env_short_flag_prev = -1;
873
214k
  }
874
875
222k
  if (ldmps_present != 1) {
876
218k
  memcpy((VOID *)&frame_data->str_frame_info_prev,
877
218k
         (VOID *)&frame_data->str_frame_info_details,
878
218k
         sizeof(ia_frame_info_struct));
879
880
218k
  if (frame_data->str_frame_info_details.num_env == 1) {
881
107k
    frame_data->var_len_id_prev = 0;
882
110k
  } else if (frame_data->str_frame_info_details.num_env == 2) {
883
66.3k
    frame_data->var_len_id_prev = 1;
884
66.3k
  }
885
886
218k
  if ((frame_data->str_frame_info_details.num_noise_env < 1) ||
887
218k
        (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
796k
  for (i = 0; i < num_nf_bands; i++) {
895
578k
    prev_env_noise_level[i] =
896
578k
        frame_data->flt_noise_floor
897
578k
            [(frame_data->str_frame_info_details.num_noise_env - 1) *
898
578k
                 num_nf_bands +
899
578k
             i];
900
578k
  }
901
218k
}
902
903
222k
  frame_data->harm_index = harm_index;
904
222k
  frame_data->phase_index = phase_index;
905
222k
  frame_data->pstr_sbr_header->esbr_start_up = esbr_start_up;
906
222k
  frame_data->pstr_sbr_header->esbr_start_up_pvc = esbr_start_up_pvc;
907
222k
  return 0;
908
222k
}
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
78.3k
                                         WORD32 ec_flag) {
916
78.3k
  WORD32 i, j, k, is_patch_border[2];
917
78.3k
  WORD32 patch_borders[MAX_NUM_PATCHES + 1];
918
78.3k
  WORD32 temp_limiter_band_calc[32 + MAX_NUM_PATCHES + 1];
919
920
78.3k
  double num_octave;
921
78.3k
  WORD32 num_patches;
922
923
78.3k
  WORD32 sub_band_start = freq_band_tbl[0];
924
78.3k
  WORD32 sub_band_end = freq_band_tbl[ixheaacd_num_bands];
925
926
78.3k
  const double log2 = log(2.0);
927
78.3k
  const double limbnd_per_oct[4] = {0, 1.2, 2.0, 3.0};
928
929
78.3k
  if (!b_patching_mode && (x_over_qmf != NULL)) {
930
28.2k
    num_patches = 0;
931
28.2k
    if (upsamp_4_flag) {
932
31.1k
      for (i = 1; i < MAX_NUM_PATCHES; i++)
933
25.9k
        if (x_over_qmf[i] != 0) num_patches++;
934
23.0k
    } else {
935
92.1k
      for (i = 1; i < 4; i++)
936
69.0k
        if (x_over_qmf[i] != 0) num_patches++;
937
23.0k
    }
938
95.1k
    for (i = 0; i < num_patches; i++) {
939
66.8k
      patch_borders[i] = x_over_qmf[i] - sub_band_start;
940
66.8k
    }
941
50.0k
  } else {
942
50.0k
    num_patches = patch_param->num_patches;
943
195k
    for (i = 0; i < num_patches; i++) {
944
145k
      patch_borders[i] = patch_param->start_subband[i] - sub_band_start;
945
145k
    }
946
50.0k
  }
947
78.3k
  patch_borders[i] = sub_band_end - sub_band_start;
948
949
78.3k
  lim_table[0][0] = freq_band_tbl[0] - sub_band_start;
950
78.3k
  lim_table[0][1] = freq_band_tbl[ixheaacd_num_bands] - sub_band_start;
951
78.3k
  gate_mode[0] = 1;
952
953
313k
  for (i = 1; i < 4; i++) {
954
2.14M
    for (k = 0; k <= ixheaacd_num_bands; k++) {
955
1.90M
      temp_limiter_band_calc[k] = freq_band_tbl[k] - sub_band_start;
956
1.90M
    }
957
958
638k
    for (k = 1; k < num_patches; k++) {
959
403k
      temp_limiter_band_calc[ixheaacd_num_bands + k] = patch_borders[k];
960
403k
    }
961
962
234k
    gate_mode[i] = ixheaacd_num_bands + num_patches - 1;
963
234k
    ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
964
965
2.31M
    for (j = 1; j <= gate_mode[i]; j++) {
966
2.07M
      num_octave = log((double)(temp_limiter_band_calc[j] + sub_band_start) /
967
2.07M
                       (temp_limiter_band_calc[j - 1] + sub_band_start)) /
968
2.07M
                   log2;
969
970
2.07M
      if (num_octave * limbnd_per_oct[i] < 0.49) {
971
1.23M
        if (temp_limiter_band_calc[j] == temp_limiter_band_calc[j - 1]) {
972
255k
          temp_limiter_band_calc[j] = sub_band_end;
973
255k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
974
255k
          gate_mode[i]--;
975
255k
          j--;
976
255k
          continue;
977
255k
        }
978
979
984k
        is_patch_border[0] = is_patch_border[1] = 0;
980
981
3.03M
        for (k = 0; k <= num_patches; k++) {
982
2.62M
          if (temp_limiter_band_calc[j - 1] == patch_borders[k]) {
983
570k
            is_patch_border[0] = 1;
984
570k
            break;
985
570k
          }
986
2.62M
        }
987
988
4.16M
        for (k = 0; k <= num_patches; k++) {
989
3.46M
          if (temp_limiter_band_calc[j] == patch_borders[k]) {
990
286k
            is_patch_border[1] = 1;
991
286k
            break;
992
286k
          }
993
3.46M
        }
994
995
984k
        if (!is_patch_border[1]) {
996
697k
          temp_limiter_band_calc[j] = sub_band_end;
997
697k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
998
697k
          gate_mode[i]--;
999
697k
          j--;
1000
697k
        } else if (!is_patch_border[0]) {
1001
171k
          temp_limiter_band_calc[j - 1] = sub_band_end;
1002
171k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
1003
171k
          gate_mode[i]--;
1004
171k
          j--;
1005
171k
        }
1006
984k
      }
1007
2.07M
    }
1008
234k
    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.42M
    for (k = 0; k <= gate_mode[i]; k++) {
1015
1.18M
      lim_table[i][k] = temp_limiter_band_calc[k];
1016
1.18M
    }
1017
234k
  }
1018
78.3k
  return IA_NO_ERROR;
1019
78.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
295k
                                WORD32 num_subband, WORD32 gamma_idx) {
1025
295k
  WORD32 sub_band_end = sub_band_start + num_subband;
1026
295k
  FLOAT32 subsample_power_high[TIMESLOT_BUFFER_SIZE],
1027
295k
      subsample_power_low[TIMESLOT_BUFFER_SIZE];
1028
295k
  FLOAT32 total_power_high = 0.0f;
1029
295k
  FLOAT32 total_power_low = 0.0f, total_power_high_after = 1.0e-6f;
1030
295k
  FLOAT32 gain[TIMESLOT_BUFFER_SIZE];
1031
295k
  FLOAT32 gain_adj, gain_adj_2;
1032
295k
  FLOAT32 gamma = ixheaac_q_gamma_table[gamma_idx];
1033
295k
  WORD32 i, j;
1034
1035
295k
  if (num_sample > TIMESLOT_BUFFER_SIZE)
1036
0
  {
1037
0
    return IA_FATAL_ERROR;
1038
0
  }
1039
295k
  if (gamma > 0) {
1040
146k
    for (i = 0; i < num_sample; i++) {
1041
138k
      memcpy(&qmf_real[64 * i], &qmf_real1[64 * i],
1042
138k
             sub_band_start * sizeof(FLOAT32));
1043
138k
      memcpy(&qmf_imag[64 * i], &qmf_imag1[64 * i],
1044
138k
             sub_band_start * sizeof(FLOAT32));
1045
138k
    }
1046
1047
146k
    for (i = 0; i < num_sample; i++) {
1048
138k
      subsample_power_low[i] = 0.0f;
1049
2.63M
      for (j = 0; j < sub_band_start; j++) {
1050
2.49M
        subsample_power_low[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j];
1051
2.49M
        subsample_power_low[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j];
1052
2.49M
      }
1053
138k
      subsample_power_high[i] = 0.0f;
1054
4.25M
      for (j = sub_band_start; j < sub_band_end; j++) {
1055
4.11M
        subsample_power_high[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j];
1056
4.11M
        subsample_power_high[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j];
1057
4.11M
      }
1058
138k
      total_power_low += subsample_power_low[i];
1059
138k
      total_power_high += subsample_power_high[i];
1060
138k
    }
1061
1062
146k
    for (i = 0; i < num_sample; i++) {
1063
138k
      gain[i] = (FLOAT32)(sqrt(subsample_power_low[i] * num_sample /
1064
138k
                               (total_power_low + 1.0e-6f)));
1065
138k
    }
1066
1067
146k
    for (i = 0; i < num_sample; i++) {
1068
138k
      gain[i] = (FLOAT32)(1.0f + gamma * (gain[i] - 1.0f));
1069
138k
    }
1070
1071
146k
    for (i = 0; i < num_sample; i++) {
1072
138k
      if (gain[i] < 0.2f) {
1073
92.8k
        gain[i] = 0.2f;
1074
92.8k
      }
1075
1076
138k
      subsample_power_high[i] *= gain[i] * gain[i];
1077
138k
      total_power_high_after += subsample_power_high[i];
1078
138k
    }
1079
1080
7.91k
    gain_adj_2 = total_power_high / total_power_high_after;
1081
7.91k
    gain_adj = (FLOAT32)(sqrt(gain_adj_2));
1082
1083
146k
    for (i = 0; i < num_sample; i++) {
1084
138k
      gain[i] *= gain_adj;
1085
1086
4.25M
      for (j = sub_band_start; j < sub_band_end; j++) {
1087
4.11M
        qmf_real[64 * i + j] *= gain[i];
1088
4.11M
        qmf_imag[64 * i + j] *= gain[i];
1089
4.11M
      }
1090
138k
    }
1091
7.91k
  }
1092
295k
  return 0;
1093
295k
}