Coverage Report

Created: 2026-08-13 06:34

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
8.26M
#define ABS(A) fabs(A)
47
48
1.71M
VOID ixheaacd_shellsort(WORD32 *in, WORD32 n) {
49
1.71M
  WORD32 i, j, v;
50
1.71M
  WORD32 inc = 1;
51
52
1.71M
  do
53
3.68M
    inc = 3 * inc + 1;
54
3.68M
  while (inc <= n);
55
56
3.68M
  do {
57
3.68M
    inc = inc / 3;
58
28.7M
    for (i = inc + 1; i <= n; i++) {
59
25.0M
      v = in[i - 1];
60
25.0M
      j = i;
61
33.5M
      while (in[j - inc - 1] > v) {
62
9.28M
        in[j - 1] = in[j - inc - 1];
63
9.28M
        j -= inc;
64
9.28M
        if (j <= inc) break;
65
9.28M
      }
66
25.0M
      in[j - 1] = v;
67
25.0M
    }
68
3.68M
  } while (inc > 1);
69
1.71M
}
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
298k
                             WORD32 ec_flag) {
76
298k
  IA_ERRORCODE err_code = IA_NO_ERROR;
77
298k
  WORD8 harmonics[64];
78
298k
  FLOAT32(*env_tmp)[48];
79
298k
  FLOAT32(*noise_level_pvc)[48];
80
298k
  FLOAT32(*nrg_est_pvc)[48];
81
298k
  FLOAT32(*nrg_ref_pvc)[48];
82
298k
  FLOAT32(*nrg_gain_pvc)[48];
83
298k
  FLOAT32(*nrg_tone_pvc)[48];
84
85
298k
  WORD32 n, c, li, ui, i, j, k = 0, l, m = 0, kk = 0, o, next = -1, ui2, flag,
86
298k
                             tmp, noise_absc_flag, smooth_length;
87
298k
  WORD32 upsamp_4_flag = frame_data->pstr_sbr_header->is_usf_4;
88
89
298k
  FLOAT32 *ptr_real_buf, *ptr_imag_buf, nrg = 0, p_ref, p_est, avg_gain, g_max,
90
298k
                                        p_adj, boost_gain, sb_gain, sb_noise,
91
298k
                                        temp[64];
92
93
298k
  WORD32 t;
94
298k
  WORD32 start_pos = 0;
95
298k
  WORD32 end_pos = 0;
96
97
298k
  WORD32 slot_idx;
98
99
298k
  FLOAT32 *prev_env_noise_level = frame_data->prev_noise_level;
100
298k
  FLOAT32 *nrg_tone = scratch_buff;
101
298k
  FLOAT32 *noise_level = scratch_buff + 64;
102
298k
  FLOAT32 *nrg_est = scratch_buff + 128;
103
298k
  FLOAT32 *nrg_ref = scratch_buff + 192;
104
298k
  FLOAT32 *nrg_gain = scratch_buff + 256;
105
106
298k
  const FLOAT32 *smooth_filt;
107
108
298k
  FLOAT32 *sfb_nrg = frame_data->flt_env_sf_arr;
109
298k
  FLOAT32 *noise_floor = frame_data->flt_noise_floor;
110
298k
  ia_frame_info_struct *p_frame_info = &frame_data->str_frame_info_details;
111
112
298k
  ia_frame_info_struct *pvc_frame_info = &frame_data->str_pvc_frame_info;
113
298k
  WORD32 smoothing_length = frame_data->pstr_sbr_header->smoothing_mode ? 0 : 4;
114
298k
  WORD32 int_mode = frame_data->pstr_sbr_header->interpol_freq;
115
298k
  WORD32 limiter_band = frame_data->pstr_sbr_header->limiter_bands;
116
298k
  WORD32 limiter_gains = frame_data->pstr_sbr_header->limiter_gains;
117
298k
  WORD32 *add_harmonics = frame_data->add_harmonics;
118
298k
  WORD32 sub_band_start =
119
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_start;
120
298k
  WORD32 sub_band_end =
121
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
122
298k
  WORD32 reset = frame_data->reset_flag;
123
298k
  WORD32 num_subbands = sub_band_end - sub_band_start;
124
298k
  WORD32 bs_num_env = p_frame_info->num_env;
125
298k
  WORD32 trans_env = p_frame_info->transient_env;
126
298k
  WORD32 sbr_mode = frame_data->sbr_mode;
127
298k
  WORD32 prev_sbr_mode = frame_data->prev_sbr_mode;
128
129
298k
  WORD16 *freq_band_table[2];
130
298k
  const WORD16 *num_sf_bands =
131
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->num_sf_bands;
132
298k
  WORD16 *freq_band_table_noise =
133
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_noise;
134
298k
  WORD32 num_nf_bands =
135
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->num_nf_bands;
136
137
298k
  WORD32 harm_index = frame_data->harm_index;
138
298k
  WORD32 phase_index = frame_data->phase_index;
139
298k
  WORD32 esbr_start_up = frame_data->pstr_sbr_header->esbr_start_up;
140
298k
  WORD32 esbr_start_up_pvc = frame_data->pstr_sbr_header->esbr_start_up_pvc;
141
298k
  WORD8(*harm_flag_prev)[64] = &frame_data->harm_flag_prev;
142
298k
  FLOAT32(*e_gain)[5][64] = &frame_data->e_gain;
143
298k
  FLOAT32(*noise_buf)[5][64] = &frame_data->noise_buf;
144
298k
  WORD32(*lim_table)[4][12 + 1] = &frame_data->lim_table;
145
298k
  WORD32(*gate_mode)[4] = &frame_data->gate_mode;
146
298k
  WORD32 freq_inv = 1;
147
148
298k
  WORD8(*harm_flag_varlen_prev)[64] = &frame_data->harm_flag_varlen_prev;
149
298k
  WORD8(*harm_flag_varlen)[64] = &frame_data->harm_flag_varlen;
150
298k
  WORD32 band_loop_end;
151
152
298k
  WORD32 rate = upsamp_4_flag ? 4 : 2;
153
298k
  FLOAT64 guard = 1e-17;
154
155
298k
  if (ldmps_present == 1) rate = 1;
156
157
298k
  env_tmp = frame_data->env_tmp;
158
298k
  noise_level_pvc = frame_data->noise_level_pvc;
159
298k
  nrg_est_pvc = frame_data->nrg_est_pvc;
160
298k
  nrg_ref_pvc = frame_data->nrg_ref_pvc;
161
298k
  nrg_gain_pvc = frame_data->nrg_gain_pvc;
162
298k
  nrg_tone_pvc = frame_data->nrg_tone_pvc;
163
164
298k
  freq_band_table[0] =
165
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[0];
166
298k
  freq_band_table[1] =
167
298k
      frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_table[1];
168
169
298k
  if (reset || (ldmps_present == 1)) {
170
50.9k
    esbr_start_up = 1;
171
50.9k
    esbr_start_up_pvc = 1;
172
50.9k
    if (reset) phase_index = 0;
173
50.9k
    if (ixheaacd_createlimiterbands(
174
50.9k
            (*lim_table), (*gate_mode),
175
50.9k
            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
176
50.9k
            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
177
50.9k
            ec_flag))
178
1
      return IA_FATAL_ERROR;
179
50.9k
  }
180
181
298k
  if (frame_data->sbr_patching_mode != frame_data->prev_sbr_patching_mode) {
182
46.9k
    if (ixheaacd_createlimiterbands(
183
46.9k
            (*lim_table), (*gate_mode),
184
46.9k
            frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, num_sf_bands[LOW],
185
46.9k
            x_over_qmf, frame_data->sbr_patching_mode, upsamp_4_flag, &frame_data->patch_param,
186
46.9k
            ec_flag))
187
0
      return IA_FATAL_ERROR;
188
189
46.9k
    frame_data->prev_sbr_patching_mode = frame_data->sbr_patching_mode;
190
46.9k
  }
191
192
298k
  memset(harmonics, 0, 64 * sizeof(WORD8));
193
194
298k
  if (sbr_mode == PVC_SBR) {
195
1.27M
    for (i = 0; i < num_sf_bands[HIGH]; i++) {
196
1.19M
      li =
197
1.19M
          frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i];
198
1.19M
      ui = frame_data->pstr_sbr_header->pstr_freq_band_data
199
1.19M
               ->freq_band_tbl_hi[i + 1];
200
1.19M
      tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
201
202
1.19M
      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.19M
      harmonics[tmp] = add_harmonics[i];
210
1.19M
    }
211
212
100k
    for (t = 0; t < p_frame_info->border_vec[0]; t++) {
213
1.38M
      for (c = 0; c < 64; c++) {
214
1.36M
        frame_data->qmapped_pvc[c][t] = frame_data->qmapped_pvc[c][t + 16];
215
1.36M
      }
216
21.3k
    }
217
218
207k
    for (i = 0; i < bs_num_env; i++) {
219
128k
      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
128k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
226
227
128k
      start_pos = p_frame_info->border_vec[i];
228
128k
      end_pos = p_frame_info->border_vec[i + 1];
229
128k
      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.39M
      for (t = start_pos; t < end_pos; t++) {
238
1.26M
        band_loop_end = num_sf_bands[p_frame_info->freq_res[i]];
239
240
10.9M
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
241
9.72M
          li = freq_band_table[p_frame_info->freq_res[i]][j];
242
9.72M
          ui = freq_band_table[p_frame_info->freq_res[i]][j + 1];
243
9.72M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
244
9.72M
                    ->freq_band_tbl_noise[o + 1];
245
246
51.6M
          for (k = 0; k < ui - li; k++) {
247
41.9M
            o = (k + li >= ui2) ? o + 1 : o;
248
41.9M
            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
41.9M
            ui2 = freq_band_table_noise[o + 1];
255
256
41.9M
            frame_data->qmapped_pvc[c][t] =
257
41.9M
                noise_floor[next * num_nf_bands + o];
258
41.9M
            c++;
259
41.9M
          }
260
9.72M
        }
261
1.26M
      }
262
128k
    }
263
264
79.1k
    kk = 0;
265
79.1k
    next = -1;
266
267
207k
    for (i = 0; i < bs_num_env; i++) {
268
128k
      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
128k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++;
275
276
128k
      start_pos = pvc_frame_info->border_vec[i];
277
128k
      end_pos = pvc_frame_info->border_vec[i + 1];
278
128k
      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.39M
      for (t = start_pos; t < end_pos; t++) {
286
82.2M
        for (c = 0; c < 64; c++) {
287
80.9M
          env_tmp[c][t] = env_out[64 * t + c];
288
80.9M
        }
289
1.26M
      }
290
291
128k
      noise_absc_flag =
292
128k
          (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0;
293
294
128k
      if (prev_sbr_mode == ORIG_SBR) noise_absc_flag = 0;
295
296
128k
      smooth_length = (noise_absc_flag ? 0 : smoothing_length);
297
128k
      smooth_filt = *ixheaac_fir_table[smooth_length];
298
299
141k
      for (t = start_pos; t < frame_data->sin_len_for_cur_top; t++) {
300
12.5k
        band_loop_end =
301
12.5k
            num_sf_bands[frame_data->str_frame_info_prev
302
12.5k
                             .freq_res[frame_data->var_len_id_prev]];
303
304
120k
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
305
107k
          double tmp;
306
307
107k
          li = freq_band_table[frame_data->str_frame_info_prev
308
107k
                                   .freq_res[frame_data->var_len_id_prev]][j];
309
107k
          ui = freq_band_table[frame_data->str_frame_info_prev
310
107k
                                   .freq_res[frame_data->var_len_id_prev]]
311
107k
                              [j + 1];
312
107k
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
313
107k
                    ->freq_band_tbl_noise[o + 1];
314
315
528k
          for (flag = 0, k = li; k < ui; k++) {
316
420k
            flag = ((*harm_flag_varlen)[c] &&
317
72.8k
                    (t >= frame_data->sin_start_for_cur_top ||
318
6.05k
                     (*harm_flag_varlen_prev)[c + sub_band_start]))
319
420k
                       ? 1
320
420k
                       : flag;
321
322
420k
            nrg_ref_pvc[c][t] = env_tmp[k][t];
323
1.27M
            for (nrg = 0, l = 0; l < rate; l++) {
324
853k
              nrg +=
325
853k
                  (input_real[rate * t + l][k] * input_real[rate * t + l][k]) +
326
853k
                  (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]);
327
853k
            }
328
420k
            nrg_est_pvc[c][t] = nrg / rate;
329
420k
            c++;
330
420k
          }
331
332
107k
          if (!int_mode && ui != li) {
333
45.7k
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
334
35.5k
              nrg += nrg_est_pvc[k][t];
335
35.5k
            }
336
10.2k
            nrg /= (ui - li);
337
97.6k
          } else {
338
97.6k
            nrg = 0;
339
97.6k
          }
340
107k
          c -= (ui - li);
341
342
528k
          for (k = 0; k < ui - li; k++) {
343
420k
            o = (k + li >= ui2) ? o + 1 : o;
344
420k
            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
420k
            ui2 = freq_band_table_noise[o + 1];
351
420k
            nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
352
420k
            nrg_tone_pvc[c][t] = 0.0f;
353
354
420k
            tmp = frame_data->qmapped_pvc[c][t] /
355
420k
                  (1 + frame_data->qmapped_pvc[c][t] + guard);
356
357
420k
            if (flag) {
358
264k
              nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
359
264k
                                                 (nrg_est_pvc[c][t] + 1));
360
361
264k
              nrg_tone_pvc[c][t] = (FLOAT32)(
362
264k
                  (harmonics[c] && (t >= frame_data->sine_position ||
363
24.1k
                                    (*harm_flag_prev)[c + sub_band_start]))
364
264k
                      ? sqrt(nrg_ref_pvc[c][t] * tmp /
365
28.8k
                             (frame_data->qmapped_pvc[c][t] + guard))
366
264k
                      : nrg_tone_pvc[c][t]);
367
368
264k
              nrg_tone_pvc[c][t] =
369
264k
                  (FLOAT32)(((*harm_flag_varlen)[c] &&
370
71.4k
                             (t >= frame_data->sin_start_for_cur_top ||
371
4.67k
                              (*harm_flag_varlen_prev)[c + sub_band_start]))
372
264k
                                ? sqrt(nrg_ref_pvc[c][t] * tmp /
373
71.3k
                                       (prev_env_noise_level[o] + guard))
374
264k
                                : nrg_tone_pvc[c][t]);
375
376
264k
            } else {
377
155k
              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
155k
              } else {
381
155k
                nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
382
155k
                    nrg_ref_pvc[c][t] * tmp /
383
155k
                    ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
384
155k
              }
385
155k
            }
386
387
420k
            noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp);
388
420k
            c++;
389
420k
          }
390
107k
        }
391
392
62.1k
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
393
49.6k
          p_ref = p_est = 0.0f;
394
49.6k
          p_adj = 0;
395
49.6k
          for (k = (*lim_table)[limiter_band][c];
396
469k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
397
420k
            p_ref += nrg_ref_pvc[k][t];
398
420k
            p_est += nrg_est_pvc[k][t];
399
420k
          }
400
49.6k
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
401
49.6k
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
402
49.6k
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
403
49.6k
          for (k = (*lim_table)[limiter_band][c];
404
469k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
405
420k
            if (g_max <= nrg_gain_pvc[k][t]) {
406
103k
              noise_level_pvc[k][t] =
407
103k
                  (FLOAT32)(noise_level_pvc[k][t] * (g_max / (nrg_gain_pvc[k][t] + guard)));
408
103k
              nrg_gain_pvc[k][t] = g_max;
409
103k
            }
410
411
420k
            p_adj +=
412
420k
                nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t];
413
414
420k
            if (nrg_tone_pvc[k][t]) {
415
71.5k
              p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t];
416
348k
            } else if (!noise_absc_flag) {
417
348k
              p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t];
418
348k
            }
419
420k
          }
420
49.6k
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
421
49.6k
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
422
423
49.6k
          for (k = (*lim_table)[limiter_band][c];
424
469k
               k < (*lim_table)[limiter_band][c + 1]; k++) {
425
420k
            nrg_gain_pvc[k][t] *= boost_gain;
426
420k
            noise_level_pvc[k][t] *= boost_gain;
427
420k
            nrg_tone_pvc[k][t] *= boost_gain;
428
420k
          }
429
49.6k
        }
430
12.5k
      }
431
432
1.38M
      for (; t < end_pos; t++) {
433
1.25M
        band_loop_end = num_sf_bands[pvc_frame_info->freq_res[i]];
434
435
10.8M
        for (c = 0, o = 0, j = 0; j < band_loop_end; j++) {
436
9.60M
          double tmp;
437
438
9.60M
          li = freq_band_table[pvc_frame_info->freq_res[i]][j];
439
9.60M
          ui = freq_band_table[pvc_frame_info->freq_res[i]][j + 1];
440
9.60M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
441
9.60M
                    ->freq_band_tbl_noise[o + 1];
442
443
51.0M
          for (flag = 0, k = li; k < ui; k++) {
444
41.4M
            flag = (harmonics[c] && (t >= frame_data->sine_position ||
445
1.17M
                                     (*harm_flag_prev)[c + sub_band_start]))
446
41.4M
                       ? 1
447
41.4M
                       : flag;
448
449
41.4M
            nrg_ref_pvc[c][t] = env_tmp[k][t];
450
130M
            for (nrg = 0, l = 0; l < rate; l++) {
451
88.6M
              nrg +=
452
88.6M
                  (input_real[rate * t + l][k] * input_real[rate * t + l][k]) +
453
88.6M
                  (input_imag[rate * t + l][k] * input_imag[rate * t + l][k]);
454
88.6M
            }
455
41.4M
            nrg_est_pvc[c][t] = nrg / rate;
456
41.4M
            c++;
457
41.4M
          }
458
459
9.60M
          if (!int_mode && ui != li) {
460
9.81M
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
461
8.30M
              nrg += nrg_est_pvc[k][t];
462
8.30M
            }
463
1.50M
            nrg /= (ui - li);
464
8.09M
          } else {
465
8.09M
            nrg = 0;
466
8.09M
          }
467
9.60M
          c -= (ui - li);
468
469
51.0M
          for (k = 0; k < ui - li; k++) {
470
41.4M
            o = (k + li >= ui2) ? o + 1 : o;
471
41.4M
            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
41.4M
            ui2 = freq_band_table_noise[o + 1];
478
41.4M
            nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t];
479
41.4M
            nrg_tone_pvc[c][t] = 0.0f;
480
481
41.4M
            tmp = frame_data->qmapped_pvc[c][t] /
482
41.4M
                  (1 + frame_data->qmapped_pvc[c][t] + guard);
483
484
41.4M
            if (flag) {
485
2.56M
              nrg_gain_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp /
486
2.56M
                                                 (nrg_est_pvc[c][t] + 1));
487
488
2.56M
              nrg_tone_pvc[c][t] = (FLOAT32)(
489
2.56M
                  (harmonics[c] && (t >= frame_data->sine_position ||
490
478k
                                    (*harm_flag_prev)[c + sub_band_start]))
491
2.56M
                      ? sqrt(nrg_ref_pvc[c][t] * tmp /
492
733k
                             (frame_data->qmapped_pvc[c][t] + guard))
493
2.56M
                      : nrg_tone_pvc[c][t]);
494
38.9M
            } else {
495
38.9M
              if (noise_absc_flag) {
496
68.8k
                nrg_gain_pvc[c][t] =
497
68.8k
                    (FLOAT32)sqrt(nrg_ref_pvc[c][t] / (nrg_est_pvc[c][t] + 1));
498
38.8M
              } else {
499
38.8M
                nrg_gain_pvc[c][t] = (FLOAT32)sqrt(
500
38.8M
                    nrg_ref_pvc[c][t] * tmp /
501
38.8M
                    ((nrg_est_pvc[c][t] + 1) * (frame_data->qmapped_pvc[c][t] + guard)));
502
38.8M
              }
503
38.9M
            }
504
505
41.4M
            noise_level_pvc[c][t] = (FLOAT32)sqrt(nrg_ref_pvc[c][t] * tmp);
506
41.4M
            c++;
507
41.4M
          }
508
9.60M
        }
509
510
6.38M
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
511
5.13M
          p_ref = p_est = 0.0f;
512
5.13M
          p_adj = 0;
513
5.13M
          for (k = (*lim_table)[limiter_band][c];
514
46.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
515
41.4M
            p_ref += nrg_ref_pvc[k][t];
516
41.4M
            p_est += nrg_est_pvc[k][t];
517
41.4M
          }
518
5.13M
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
519
5.13M
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
520
5.13M
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
521
522
5.13M
          for (k = (*lim_table)[limiter_band][c];
523
46.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
524
41.4M
            if (g_max <= nrg_gain_pvc[k][t]) {
525
4.02M
              noise_level_pvc[k][t] =
526
4.02M
                  (FLOAT32)(noise_level_pvc[k][t] *
527
4.02M
                            (g_max / (nrg_gain_pvc[k][t] + guard)));
528
4.02M
              nrg_gain_pvc[k][t] = g_max;
529
4.02M
            }
530
531
41.4M
            p_adj +=
532
41.4M
                nrg_gain_pvc[k][t] * nrg_gain_pvc[k][t] * nrg_est_pvc[k][t];
533
534
41.4M
            if (nrg_tone_pvc[k][t]) {
535
733k
              p_adj += nrg_tone_pvc[k][t] * nrg_tone_pvc[k][t];
536
40.6M
            } else if (!noise_absc_flag) {
537
40.6M
              p_adj += noise_level_pvc[k][t] * noise_level_pvc[k][t];
538
40.6M
            }
539
41.4M
          }
540
541
5.13M
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
542
5.13M
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
543
544
5.13M
          for (k = (*lim_table)[limiter_band][c];
545
46.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
546
41.4M
            nrg_gain_pvc[k][t] *= boost_gain;
547
41.4M
            noise_level_pvc[k][t] *= boost_gain;
548
41.4M
            nrg_tone_pvc[k][t] *= boost_gain;
549
41.4M
          }
550
5.13M
        }
551
1.25M
      }
552
553
128k
      if (esbr_start_up_pvc) {
554
60.8k
        for (n = 0; n < 4; n++) {
555
1.74M
          for (c = 0; c < num_subbands; c++) {
556
1.69M
            (*e_gain)[n][c] = nrg_gain_pvc[c][start_pos];
557
1.69M
            (*noise_buf)[n][c] = noise_level_pvc[c][start_pos];
558
1.69M
          }
559
48.7k
        }
560
12.1k
        esbr_start_up_pvc = 0;
561
12.1k
        esbr_start_up = 0;
562
12.1k
      }
563
128k
      for (l = rate * pvc_frame_info->border_vec[i];
564
2.95M
           l < rate * pvc_frame_info->border_vec[1 + i]; l++) {
565
2.82M
        ptr_real_buf = *(input_real + l) + sub_band_start;
566
2.82M
        ptr_imag_buf = *(input_imag + l) + sub_band_start;
567
568
2.82M
        slot_idx = (WORD32)l / rate;
569
2.82M
        if (sub_band_start & 1) {
570
1.00M
          freq_inv = -1;
571
1.82M
        } else {
572
1.82M
          freq_inv = 1;
573
1.82M
        }
574
575
92.2M
        for (k = 0; k < num_subbands; k++) {
576
89.4M
          (*e_gain)[4][k] = nrg_gain_pvc[k][slot_idx];
577
89.4M
          (*noise_buf)[4][k] = noise_level_pvc[k][slot_idx];
578
89.4M
          c = 0, sb_gain = 0, sb_noise = 0;
579
256M
          for (n = 4 - smooth_length; n <= 4; n++) {
580
166M
            sb_gain += (*e_gain)[n][k] * smooth_filt[c];
581
166M
            sb_noise += (*noise_buf)[n][k] * smooth_filt[c++];
582
166M
          }
583
89.4M
          phase_index = (phase_index + 1) & 511;
584
89.4M
          sb_noise = (nrg_tone_pvc[k][slot_idx] != 0 || noise_absc_flag)
585
89.4M
                         ? 0
586
89.4M
                         : sb_noise;
587
588
89.4M
          *ptr_real_buf =
589
89.4M
              *ptr_real_buf * sb_gain +
590
89.4M
              sb_noise * ixheaac_random_phase[phase_index][0] +
591
89.4M
              nrg_tone_pvc[k][slot_idx] * ixheaac_hphase_tbl[0][harm_index];
592
89.4M
          *ptr_imag_buf = *ptr_imag_buf * sb_gain +
593
89.4M
                          sb_noise * ixheaac_random_phase[phase_index][1] +
594
89.4M
                          nrg_tone_pvc[k][slot_idx] * freq_inv *
595
89.4M
                              ixheaac_hphase_tbl[1][harm_index];
596
597
89.4M
          ptr_real_buf++;
598
89.4M
          ptr_imag_buf++;
599
89.4M
          freq_inv = -freq_inv;
600
89.4M
        }
601
602
2.82M
        harm_index = (harm_index + 1) & 3;
603
604
2.82M
        memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
605
14.1M
        for (n = 0; n < 4; n++) {
606
11.3M
          memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32));
607
11.3M
        }
608
2.82M
        memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32));
609
610
2.82M
        memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32));
611
14.1M
        for (n = 0; n < 4; n++) {
612
11.3M
          memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32));
613
11.3M
        }
614
2.82M
        memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
615
2.82M
      }
616
128k
    }
617
219k
  } else {
618
3.27M
    for (i = 0; i < num_sf_bands[HIGH]; i++) {
619
3.05M
      li =
620
3.05M
          frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_hi[i];
621
3.05M
      ui = frame_data->pstr_sbr_header->pstr_freq_band_data
622
3.05M
               ->freq_band_tbl_hi[i + 1];
623
3.05M
      tmp = ((ui + li) - (sub_band_start << 1)) >> 1;
624
3.05M
      if ((tmp >= 64) || (tmp < 0)) return -1;
625
626
3.05M
      harmonics[tmp] = add_harmonics[i];
627
3.05M
    }
628
629
608k
    for (i = 0; i < bs_num_env; i++) {
630
389k
      if (kk > MAX_NOISE_ENVELOPES) {
631
6
        if (ec_flag)
632
0
          kk = MAX_NOISE_ENVELOPES;
633
6
        else
634
6
          return IA_FATAL_ERROR;
635
6
      }
636
637
389k
      if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk])
638
297k
        kk++, next++;
639
640
389k
      noise_absc_flag =
641
389k
          (i == trans_env || i == frame_data->env_short_flag_prev) ? 1 : 0;
642
643
389k
      smooth_length = (noise_absc_flag ? 0 : smoothing_length);
644
389k
      smooth_filt = *ixheaac_fir_table[smooth_length];
645
646
389k
      if (sbr_mode == ORIG_SBR) {
647
3.72M
        for (c = 0, o = 0, j = 0; j < num_sf_bands[p_frame_info->freq_res[i]];
648
3.33M
             j++) {
649
3.33M
          double tmp;
650
3.33M
          li = freq_band_table[p_frame_info->freq_res[i]][j];
651
3.33M
          ui = freq_band_table[p_frame_info->freq_res[i]][j + 1];
652
3.33M
          ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
653
3.33M
                    ->freq_band_tbl_noise[o + 1];
654
655
3.33M
          if (p_frame_info->border_vec[i] >= p_frame_info->border_vec[i + 1]) {
656
108k
            for (flag = 0, k = li; k < ui; k++) {
657
77.8k
              flag = (harmonics[c] &&
658
1.65k
                (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
659
77.8k
                ? 1
660
77.8k
                : flag;
661
77.8k
              nrg_est[c++] = 0;
662
77.8k
            }
663
3.30M
          } else {
664
12.5M
            for (flag = 0, k = li; k < ui; k++) {
665
9.24M
              for (nrg = 0, l = rate * p_frame_info->border_vec[i];
666
199M
                l < rate * p_frame_info->border_vec[i + 1]; l++) {
667
190M
                nrg += (input_real[l][k] * input_real[l][k]) +
668
190M
                  (input_imag[l][k] * input_imag[l][k]);
669
190M
              }
670
9.24M
              flag = (harmonics[c] &&
671
444k
                (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
672
9.24M
                ? 1
673
9.24M
                : flag;
674
9.24M
              nrg_est[c++] = nrg / (rate * p_frame_info->border_vec[i + 1] -
675
9.24M
                rate * p_frame_info->border_vec[i]);
676
9.24M
            }
677
3.30M
          }
678
3.33M
          if (!int_mode && ui != li) {
679
1.25M
            for (nrg = 0, k = c - (ui - li); k < c; k++) {
680
981k
              nrg += nrg_est[k];
681
981k
            }
682
269k
            nrg /= (ui - li);
683
3.06M
          } else {
684
3.06M
            nrg = 0;
685
3.06M
          }
686
3.33M
          c -= (ui - li);
687
688
12.6M
          for (k = 0; k < ui - li; k++) {
689
9.32M
            o = (k + li >= ui2) ? o + 1 : o;
690
9.32M
            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
9.32M
            ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data
697
9.32M
                      ->freq_band_tbl_noise[o + 1];
698
9.32M
            nrg_ref[c] = sfb_nrg[m];
699
9.32M
            nrg_est[c] = (!int_mode) ? nrg : nrg_est[c];
700
9.32M
            nrg_tone[c] = 0;
701
9.32M
            tmp = noise_floor[next * num_nf_bands + o] /
702
9.32M
                  (1 + noise_floor[next * num_nf_bands + o] + guard);
703
9.32M
            if (flag) {
704
842k
              nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp / (nrg_est[c] + 1));
705
842k
              nrg_tone[c] = (FLOAT32)(
706
842k
                  (harmonics[c] &&
707
396k
                   (i >= trans_env || (*harm_flag_prev)[c + sub_band_start]))
708
842k
                      ? sqrt(nrg_ref[c] * tmp /
709
395k
                             ABS(noise_floor[next * num_nf_bands + o] + guard))
710
842k
                      : nrg_tone[c]);
711
8.47M
            } else {
712
8.47M
              if (noise_absc_flag)
713
612k
                nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] / (nrg_est[c] + 1));
714
7.86M
              else
715
7.86M
                nrg_gain[c] = (FLOAT32)sqrt(
716
7.86M
                    nrg_ref[c] * tmp /
717
7.86M
                    ((nrg_est[c] + 1) *
718
7.86M
                     ABS(noise_floor[next * num_nf_bands + o] + guard)));
719
8.47M
            }
720
9.32M
            noise_level[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp);
721
9.32M
            c++;
722
9.32M
          }
723
3.33M
          m++;
724
3.33M
        }
725
726
1.59M
        for (c = 0; c < (*gate_mode)[limiter_band]; c++) {
727
1.20M
          p_ref = p_est = 0;
728
1.20M
          for (k = (*lim_table)[limiter_band][c];
729
10.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
730
9.32M
            p_ref += nrg_ref[k];
731
9.32M
            p_est += nrg_est[k];
732
9.32M
          }
733
1.20M
          avg_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_est + EPS));
734
1.20M
          g_max = avg_gain * ixheaac_g_lim_gains[limiter_gains];
735
1.20M
          g_max > 1.0e5f ? g_max = 1.0e5f : 0;
736
1.20M
          for (k = (*lim_table)[limiter_band][c];
737
10.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
738
9.32M
            if (g_max <= nrg_gain[k]) {
739
1.09M
              noise_level[k] = (FLOAT32)(noise_level[k] * (g_max / (nrg_gain[k] + guard)));
740
1.09M
              nrg_gain[k] = g_max;
741
1.09M
            }
742
9.32M
          }
743
1.20M
          p_adj = 0;
744
1.20M
          for (k = (*lim_table)[limiter_band][c];
745
10.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
746
9.32M
            p_adj += nrg_gain[k] * nrg_gain[k] * nrg_est[k];
747
9.32M
            if (nrg_tone[k])
748
363k
              p_adj += nrg_tone[k] * nrg_tone[k];
749
8.95M
            else if (!noise_absc_flag)
750
8.24M
              p_adj += noise_level[k] * noise_level[k];
751
9.32M
          }
752
1.20M
          boost_gain = (FLOAT32)sqrt((p_ref + EPS) / (p_adj + EPS));
753
1.20M
          boost_gain = boost_gain > 1.584893192f ? 1.584893192f : boost_gain;
754
1.20M
          for (k = (*lim_table)[limiter_band][c];
755
10.5M
               k < (*lim_table)[limiter_band][c + 1]; k++) {
756
9.32M
            nrg_gain[k] *= boost_gain;
757
9.32M
            noise_level[k] *= boost_gain;
758
9.32M
            nrg_tone[k] *= boost_gain;
759
9.32M
          }
760
1.20M
        }
761
762
389k
        if (esbr_start_up && (ldmps_present != 1)) {
763
158k
          for (n = 0; n < 4; n++) {
764
126k
            memcpy((*e_gain)[n], nrg_gain, num_subbands * sizeof(FLOAT32));
765
126k
            memcpy((*noise_buf)[n], noise_level,
766
126k
                   num_subbands * sizeof(FLOAT32));
767
126k
          }
768
31.6k
          esbr_start_up = 0;
769
31.6k
          esbr_start_up_pvc = 0;
770
31.6k
        }
771
772
389k
        for (l = rate * p_frame_info->border_vec[i];
773
7.72M
             l < rate * p_frame_info->border_vec[i + 1]; l++) {
774
7.33M
          ptr_real_buf = *(input_real + l) + sub_band_start;
775
7.33M
          ptr_imag_buf = *(input_imag + l) + sub_band_start;
776
777
7.33M
          freq_inv = 1;
778
7.33M
          if ((ldmps_present == 1) && (sub_band_start & 1)) freq_inv = -1;
779
780
197M
          for (k = 0; k < num_subbands; k++) {
781
190M
            (*e_gain)[4][k] = nrg_gain[k];
782
190M
            (*noise_buf)[4][k] = noise_level[k];
783
190M
            c = 0, sb_gain = 0, sb_noise = 0;
784
440M
            for (n = 4 - smooth_length; n <= 4; n++) {
785
249M
              sb_gain += (*e_gain)[n][k] * smooth_filt[c];
786
249M
              sb_noise += (*noise_buf)[n][k] * smooth_filt[c++];
787
249M
            }
788
789
190M
            phase_index = (phase_index + 1) & 511;
790
190M
            sb_noise = (nrg_tone[k] != 0 || noise_absc_flag) ? 0 : sb_noise;
791
792
190M
            if (ldmps_present == 1) {
793
3.09M
              *ptr_real_buf = *ptr_real_buf * sb_gain +
794
3.09M
                              sb_noise * ixheaac_random_phase[phase_index][0] +
795
3.09M
                              nrg_tone[k] * ixheaac_hphase_tbl[0][harm_index];
796
3.09M
              *ptr_imag_buf =
797
3.09M
                  *ptr_imag_buf * sb_gain +
798
3.09M
                  sb_noise * ixheaac_random_phase[phase_index][1] +
799
3.09M
                  nrg_tone[k] * freq_inv * ixheaac_hphase_tbl[1][harm_index];
800
801
3.09M
              freq_inv = -freq_inv;
802
187M
            } else {
803
187M
                *ptr_real_buf = *ptr_real_buf * sb_gain +
804
187M
                            sb_noise * ixheaac_random_phase[phase_index][0];
805
187M
                *ptr_imag_buf = *ptr_imag_buf * sb_gain +
806
187M
                            sb_noise * ixheaac_random_phase[phase_index][1];
807
187M
            }
808
809
190M
            ptr_real_buf++;
810
190M
            ptr_imag_buf++;
811
190M
          }
812
7.33M
          if (ldmps_present == 1) harm_index = (harm_index + 1) & 3;
813
814
7.33M
          memcpy(temp, (*e_gain)[0], 64 * sizeof(FLOAT32));
815
36.6M
          for (n = 0; n < 4; n++)
816
29.3M
            memcpy((*e_gain)[n], (*e_gain)[n + 1], 64 * sizeof(FLOAT32));
817
7.33M
          memcpy((*e_gain)[4], temp, 64 * sizeof(FLOAT32));
818
7.33M
          memcpy(temp, (*noise_buf)[0], 64 * sizeof(FLOAT32));
819
36.6M
          for (n = 0; n < 4; n++)
820
29.3M
            memcpy((*noise_buf)[n], (*noise_buf)[n + 1], 64 * sizeof(FLOAT32));
821
7.33M
          memcpy((*noise_buf)[4], temp, 64 * sizeof(FLOAT32));
822
7.33M
        }
823
824
389k
        if (ldmps_present != 1) {
825
381k
          err_code = ixheaacd_apply_inter_tes(
826
381k
              *(input_real1 + rate * p_frame_info->border_vec[i]),
827
381k
              *(input_imag1 + rate * p_frame_info->border_vec[i]),
828
381k
              *(input_real + rate * p_frame_info->border_vec[i]),
829
381k
              *(input_imag + rate * p_frame_info->border_vec[i]),
830
381k
              rate * p_frame_info->border_vec[i + 1] - rate * p_frame_info->border_vec[i],
831
381k
              sub_band_start, num_subbands, frame_data->inter_temp_shape_mode[i]);
832
381k
          if (err_code != 0) {
833
0
            return err_code;
834
0
          }
835
836
381k
        for (l = rate * p_frame_info->border_vec[i];
837
7.60M
             l < rate * p_frame_info->border_vec[i + 1]; l++) {
838
7.22M
          ptr_real_buf = *(input_real + l) + sub_band_start;
839
7.22M
          ptr_imag_buf = *(input_imag + l) + sub_band_start;
840
7.22M
          if (sub_band_start & 1) {
841
2.57M
            freq_inv = -1;
842
4.64M
          } else {
843
4.64M
            freq_inv = 1;
844
4.64M
          }
845
194M
          for (k = 0; k < num_subbands; k++) {
846
187M
            *ptr_real_buf += nrg_tone[k] * ixheaac_hphase_tbl[0][harm_index];
847
187M
            *ptr_imag_buf +=
848
187M
                nrg_tone[k] * freq_inv * ixheaac_hphase_tbl[1][harm_index];
849
850
187M
            ptr_real_buf++;
851
187M
            ptr_imag_buf++;
852
187M
            freq_inv = -freq_inv;
853
187M
          }
854
7.22M
          harm_index = (harm_index + 1) & 3;
855
7.22M
        }
856
381k
      }
857
389k
    }
858
389k
  }
859
219k
}
860
861
19.4M
  for (i = 0; i < 64; i++) {
862
19.1M
    (*harm_flag_varlen_prev)[i] = (*harm_flag_prev)[i];
863
19.1M
    (*harm_flag_varlen)[i] = harmonics[i];
864
19.1M
  }
865
866
298k
  memcpy(&((*harm_flag_prev)[0]) + sub_band_start, harmonics,
867
298k
         (64 - sub_band_start) * sizeof(WORD8));
868
869
298k
  if (trans_env == bs_num_env) {
870
10.5k
    frame_data->env_short_flag_prev = 0;
871
288k
  } else {
872
288k
    frame_data->env_short_flag_prev = -1;
873
288k
  }
874
875
298k
  if (ldmps_present != 1) {
876
291k
  memcpy((VOID *)&frame_data->str_frame_info_prev,
877
291k
         (VOID *)&frame_data->str_frame_info_details,
878
291k
         sizeof(ia_frame_info_struct));
879
880
291k
  if (frame_data->str_frame_info_details.num_env == 1) {
881
164k
    frame_data->var_len_id_prev = 0;
882
164k
  } else if (frame_data->str_frame_info_details.num_env == 2) {
883
73.6k
    frame_data->var_len_id_prev = 1;
884
73.6k
  }
885
886
291k
  if ((frame_data->str_frame_info_details.num_noise_env < 1) ||
887
291k
        (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.09M
  for (i = 0; i < num_nf_bands; i++) {
895
806k
    prev_env_noise_level[i] =
896
806k
        frame_data->flt_noise_floor
897
806k
            [(frame_data->str_frame_info_details.num_noise_env - 1) *
898
806k
                 num_nf_bands +
899
806k
             i];
900
806k
  }
901
291k
}
902
903
298k
  frame_data->harm_index = harm_index;
904
298k
  frame_data->phase_index = phase_index;
905
298k
  frame_data->pstr_sbr_header->esbr_start_up = esbr_start_up;
906
298k
  frame_data->pstr_sbr_header->esbr_start_up_pvc = esbr_start_up_pvc;
907
298k
  return 0;
908
298k
}
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
97.9k
                                         WORD32 ec_flag) {
916
97.9k
  WORD32 i, j, k, is_patch_border[2];
917
97.9k
  WORD32 patch_borders[MAX_NUM_PATCHES + 1];
918
97.9k
  WORD32 temp_limiter_band_calc[32 + MAX_NUM_PATCHES + 1];
919
920
97.9k
  double num_octave;
921
97.9k
  WORD32 num_patches;
922
923
97.9k
  WORD32 sub_band_start = freq_band_tbl[0];
924
97.9k
  WORD32 sub_band_end = freq_band_tbl[ixheaacd_num_bands];
925
926
97.9k
  const double log2 = log(2.0);
927
97.9k
  const double limbnd_per_oct[4] = {0, 1.2, 2.0, 3.0};
928
929
97.9k
  if (!b_patching_mode && (x_over_qmf != NULL)) {
930
36.3k
    num_patches = 0;
931
36.3k
    if (upsamp_4_flag) {
932
30.9k
      for (i = 1; i < MAX_NUM_PATCHES; i++)
933
25.7k
        if (x_over_qmf[i] != 0) num_patches++;
934
31.1k
    } else {
935
124k
      for (i = 1; i < 4; i++)
936
93.4k
        if (x_over_qmf[i] != 0) num_patches++;
937
31.1k
    }
938
123k
    for (i = 0; i < num_patches; i++) {
939
87.5k
      patch_borders[i] = x_over_qmf[i] - sub_band_start;
940
87.5k
    }
941
61.6k
  } else {
942
61.6k
    num_patches = patch_param->num_patches;
943
248k
    for (i = 0; i < num_patches; i++) {
944
186k
      patch_borders[i] = patch_param->start_subband[i] - sub_band_start;
945
186k
    }
946
61.6k
  }
947
97.9k
  patch_borders[i] = sub_band_end - sub_band_start;
948
949
97.9k
  lim_table[0][0] = freq_band_tbl[0] - sub_band_start;
950
97.9k
  lim_table[0][1] = freq_band_tbl[ixheaacd_num_bands] - sub_band_start;
951
97.9k
  gate_mode[0] = 1;
952
953
391k
  for (i = 1; i < 4; i++) {
954
2.71M
    for (k = 0; k <= ixheaacd_num_bands; k++) {
955
2.41M
      temp_limiter_band_calc[k] = freq_band_tbl[k] - sub_band_start;
956
2.41M
    }
957
958
823k
    for (k = 1; k < num_patches; k++) {
959
529k
      temp_limiter_band_calc[ixheaacd_num_bands + k] = patch_borders[k];
960
529k
    }
961
962
293k
    gate_mode[i] = ixheaacd_num_bands + num_patches - 1;
963
293k
    ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
964
965
2.94M
    for (j = 1; j <= gate_mode[i]; j++) {
966
2.65M
      num_octave = log((double)(temp_limiter_band_calc[j] + sub_band_start) /
967
2.65M
                       (temp_limiter_band_calc[j - 1] + sub_band_start)) /
968
2.65M
                   log2;
969
970
2.65M
      if (num_octave * limbnd_per_oct[i] < 0.49) {
971
1.57M
        if (temp_limiter_band_calc[j] == temp_limiter_band_calc[j - 1]) {
972
316k
          temp_limiter_band_calc[j] = sub_band_end;
973
316k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
974
316k
          gate_mode[i]--;
975
316k
          j--;
976
316k
          continue;
977
316k
        }
978
979
1.26M
        is_patch_border[0] = is_patch_border[1] = 0;
980
981
3.99M
        for (k = 0; k <= num_patches; k++) {
982
3.49M
          if (temp_limiter_band_calc[j - 1] == patch_borders[k]) {
983
764k
            is_patch_border[0] = 1;
984
764k
            break;
985
764k
          }
986
3.49M
        }
987
988
5.54M
        for (k = 0; k <= num_patches; k++) {
989
4.67M
          if (temp_limiter_band_calc[j] == patch_borders[k]) {
990
389k
            is_patch_border[1] = 1;
991
389k
            break;
992
389k
          }
993
4.67M
        }
994
995
1.26M
        if (!is_patch_border[1]) {
996
872k
          temp_limiter_band_calc[j] = sub_band_end;
997
872k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
998
872k
          gate_mode[i]--;
999
872k
          j--;
1000
872k
        } else if (!is_patch_border[0]) {
1001
232k
          temp_limiter_band_calc[j - 1] = sub_band_end;
1002
232k
          ixheaacd_shellsort(temp_limiter_band_calc, gate_mode[i] + 1);
1003
232k
          gate_mode[i]--;
1004
232k
          j--;
1005
232k
        }
1006
1.26M
      }
1007
2.65M
    }
1008
293k
    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.82M
    for (k = 0; k <= gate_mode[i]; k++) {
1015
1.52M
      lim_table[i][k] = temp_limiter_band_calc[k];
1016
1.52M
    }
1017
293k
  }
1018
97.9k
  return IA_NO_ERROR;
1019
97.9k
}
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
381k
                                WORD32 num_subband, WORD32 gamma_idx) {
1025
381k
  WORD32 sub_band_end = sub_band_start + num_subband;
1026
381k
  FLOAT32 subsample_power_high[TIMESLOT_BUFFER_SIZE],
1027
381k
      subsample_power_low[TIMESLOT_BUFFER_SIZE];
1028
381k
  FLOAT32 total_power_high = 0.0f;
1029
381k
  FLOAT32 total_power_low = 0.0f, total_power_high_after = 1.0e-6f;
1030
381k
  FLOAT32 gain[TIMESLOT_BUFFER_SIZE];
1031
381k
  FLOAT32 gain_adj, gain_adj_2;
1032
381k
  FLOAT32 gamma = ixheaac_q_gamma_table[gamma_idx];
1033
381k
  WORD32 i, j;
1034
1035
381k
  if (num_sample > TIMESLOT_BUFFER_SIZE)
1036
0
  {
1037
0
    return IA_FATAL_ERROR;
1038
0
  }
1039
381k
  if (gamma > 0) {
1040
189k
    for (i = 0; i < num_sample; i++) {
1041
178k
      memcpy(&qmf_real[64 * i], &qmf_real1[64 * i],
1042
178k
             sub_band_start * sizeof(FLOAT32));
1043
178k
      memcpy(&qmf_imag[64 * i], &qmf_imag1[64 * i],
1044
178k
             sub_band_start * sizeof(FLOAT32));
1045
178k
    }
1046
1047
189k
    for (i = 0; i < num_sample; i++) {
1048
178k
      subsample_power_low[i] = 0.0f;
1049
3.57M
      for (j = 0; j < sub_band_start; j++) {
1050
3.39M
        subsample_power_low[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j];
1051
3.39M
        subsample_power_low[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j];
1052
3.39M
      }
1053
178k
      subsample_power_high[i] = 0.0f;
1054
4.73M
      for (j = sub_band_start; j < sub_band_end; j++) {
1055
4.55M
        subsample_power_high[i] += qmf_real[64 * i + j] * qmf_real[64 * i + j];
1056
4.55M
        subsample_power_high[i] += qmf_imag[64 * i + j] * qmf_imag[64 * i + j];
1057
4.55M
      }
1058
178k
      total_power_low += subsample_power_low[i];
1059
178k
      total_power_high += subsample_power_high[i];
1060
178k
    }
1061
1062
189k
    for (i = 0; i < num_sample; i++) {
1063
178k
      gain[i] = (FLOAT32)(sqrt(subsample_power_low[i] * num_sample /
1064
178k
                               (total_power_low + 1.0e-6f)));
1065
178k
    }
1066
1067
189k
    for (i = 0; i < num_sample; i++) {
1068
178k
      gain[i] = (FLOAT32)(1.0f + gamma * (gain[i] - 1.0f));
1069
178k
    }
1070
1071
189k
    for (i = 0; i < num_sample; i++) {
1072
178k
      if (gain[i] < 0.2f) {
1073
128k
        gain[i] = 0.2f;
1074
128k
      }
1075
1076
178k
      subsample_power_high[i] *= gain[i] * gain[i];
1077
178k
      total_power_high_after += subsample_power_high[i];
1078
178k
    }
1079
1080
10.5k
    gain_adj_2 = total_power_high / total_power_high_after;
1081
10.5k
    gain_adj = (FLOAT32)(sqrt(gain_adj_2));
1082
1083
189k
    for (i = 0; i < num_sample; i++) {
1084
178k
      gain[i] *= gain_adj;
1085
1086
4.73M
      for (j = sub_band_start; j < sub_band_end; j++) {
1087
4.55M
        qmf_real[64 * i + j] *= gain[i];
1088
4.55M
        qmf_imag[64 * i + j] *= gain[i];
1089
4.55M
      }
1090
178k
    }
1091
10.5k
  }
1092
381k
  return 0;
1093
381k
}