Coverage Report

Created: 2026-10-17 07:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_env_dec.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <string.h>
21
#include <math.h>
22
#include "ixheaacd_sbr_common.h"
23
#include "ixheaac_type_def.h"
24
#include "ixheaac_error_standards.h"
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops16.h"
28
#include "ixheaac_basic_ops40.h"
29
#include "ixheaac_basic_ops.h"
30
#include "ixheaac_basic_op.h"
31
#include "ixheaacd_intrinsics.h"
32
#include "ixheaacd_bitbuffer.h"
33
#include "ixheaacd_sbrdecsettings.h"
34
#include "ixheaacd_sbr_scale.h"
35
#include "ixheaacd_lpp_tran.h"
36
#include "ixheaacd_env_extr_part.h"
37
#include "ixheaacd_sbr_rom.h"
38
#include "ixheaacd_hybrid.h"
39
#include "ixheaacd_ps_dec.h"
40
#include "ixheaacd_env_extr.h"
41
#include "ixheaacd_common_rom.h"
42
#include "ixheaacd_env_dec.h"
43
#include "ixheaac_sbr_const.h"
44
#include "ixheaacd_basic_funcs.h"
45
#include "ixheaacd_audioobjtypes.h"
46
47
7.69M
#define add16_m(a, b) ((a) + (b))
48
1.67M
#define sub16_m(a, b) ((a) - (b))
49
50
#define mult16x16_16(a, b) ixheaac_mult16((a), (b))
51
52
static VOID ixheaacd_dequant_esbr_env_data(FLOAT32 *ptr_env_sf,
53
                                           WORD32 num_env_sf,
54
                                           WORD32 num_noise_fac, WORD32 amp_res,
55
147k
                                           FLOAT32 *ptr_noise_floor) {
56
147k
  WORD32 i;
57
147k
  const FLOAT32 array[2] = {0.5f, 1.0f};
58
147k
  FLOAT32 a_flt = array[amp_res];
59
60
1.59M
  for (i = 0; i < num_env_sf; i++) {
61
1.45M
    ptr_env_sf[i] = (FLOAT32)(pow(2, ptr_env_sf[i] * a_flt) * 64);
62
1.45M
  }
63
64
553k
  for (i = 0; i < num_noise_fac; i++) {
65
405k
    FLOAT32 temp = ptr_noise_floor[i];
66
67
405k
    temp = NOISE_FLOOR_OFFSET - temp;
68
405k
    temp = (FLOAT32)pow(2.0f, temp);
69
70
405k
    ptr_noise_floor[i] = temp;
71
405k
  }
72
147k
}
73
74
static VOID ixheaacd_dequant_pvc_env_data(WORD32 num_noise_fac,
75
112k
                                          FLOAT32 *ptr_noise_floor) {
76
112k
  WORD32 i;
77
78
659k
  for (i = 0; i < num_noise_fac; i++) {
79
546k
    FLOAT32 temp = ptr_noise_floor[i];
80
81
546k
    temp = NOISE_FLOOR_OFFSET - temp;
82
546k
    temp = (FLOAT32)pow(2.0f, temp);
83
84
546k
    ptr_noise_floor[i] = temp;
85
546k
  }
86
112k
}
87
88
VOID ixheaacd_map_res_energy(WORD16 curr_val, WORD16 *prev_data,
89
                             WORD32 ixheaacd_drc_offset, WORD32 index,
90
2.11M
                             WORD32 res) {
91
2.11M
  if (res == LOW) {
92
1.15M
    if (ixheaacd_drc_offset >= 0) {
93
1.15M
      if (index < ixheaacd_drc_offset) {
94
41.1k
        prev_data[index] = curr_val;
95
1.11M
      } else {
96
1.11M
        WORD32 index_2;
97
1.11M
        index_2 = ((index + index) - ixheaacd_drc_offset);
98
1.11M
        prev_data[index_2] = curr_val;
99
1.11M
        prev_data[index_2 + 1] = curr_val;
100
1.11M
      }
101
1.15M
    } else {
102
0
      ixheaacd_drc_offset = -(ixheaacd_drc_offset);
103
104
0
      if (index < ixheaacd_drc_offset) {
105
0
        WORD32 index_3;
106
0
        index_3 = ((index + index) + index);
107
0
        prev_data[index_3] = curr_val;
108
0
        prev_data[index_3 + 1] = curr_val;
109
0
        prev_data[index_3 + 2] = curr_val;
110
0
      } else {
111
0
        WORD32 index_2;
112
0
        index_2 = ((index + index) + ixheaacd_drc_offset);
113
0
        prev_data[index_2] = curr_val;
114
0
        prev_data[index_2 + 1] = curr_val;
115
0
      }
116
0
    }
117
1.15M
  } else {
118
953k
    prev_data[index] = curr_val;
119
953k
  }
120
2.11M
}
121
122
VOID ixheaacd_process_del_cod_env_data(
123
    ia_sbr_header_data_struct *ptr_header_data,
124
    ia_sbr_frame_info_data_struct *ptr_sbr_data,
125
270k
    ia_sbr_prev_frame_data_struct *ptr_prev_data) {
126
270k
  WORD32 i, dtdf_dir, num_sf_bands, band, freq_res;
127
270k
  WORD16 temp_val;
128
270k
  WORD16 *ptr_prev_env_sf = ptr_prev_data->sfb_nrg_prev;
129
270k
  WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
130
131
270k
  FLOAT32 *ptr_env_sf_float = ptr_sbr_data->flt_env_sf_arr;
132
133
270k
  WORD32 ixheaacd_drc_offset;
134
135
270k
  ixheaacd_drc_offset =
136
270k
      ((ptr_header_data->pstr_freq_band_data->num_sf_bands[LOW] << 1) -
137
270k
       ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]);
138
139
737k
  for (i = 0; i < ptr_sbr_data->str_frame_info_details.num_env; i++) {
140
466k
    dtdf_dir = ptr_sbr_data->del_cod_dir_arr[i];
141
466k
    freq_res = ptr_sbr_data->str_frame_info_details.freq_res[i];
142
143
466k
    num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands[freq_res];
144
466k
    band = num_sf_bands;
145
146
466k
    if (dtdf_dir == DTDF_DIR_FREQ) {
147
251k
      ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf, ixheaacd_drc_offset,
148
251k
                              0, freq_res);
149
251k
      ptr_env_sf++;
150
151
251k
      ptr_env_sf_float++;
152
153
2.11M
      for (band = 1; band < num_sf_bands; band++) {
154
1.86M
        *ptr_env_sf = *ptr_env_sf + *(ptr_env_sf - 1);
155
1.86M
        ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf,
156
1.86M
                                ixheaacd_drc_offset, band, freq_res);
157
158
1.86M
        *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
159
1.86M
        ptr_env_sf_float++;
160
161
1.86M
        ptr_env_sf++;
162
1.86M
      }
163
164
251k
    } else {
165
214k
      if (freq_res == LOW) {
166
65.4k
        if (ixheaacd_drc_offset < 0) {
167
0
          WORD32 tar, index_3;
168
0
          ixheaacd_drc_offset = -ixheaacd_drc_offset;
169
0
          tar = ixheaac_min32(ixheaacd_drc_offset, band);
170
171
0
          for (band = 0; band < tar; band++) {
172
0
            index_3 = ((band + band) + band);
173
0
            temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_3]);
174
175
0
            ptr_prev_env_sf[index_3] = temp_val;
176
0
            ptr_prev_env_sf[index_3 + 1] = temp_val;
177
0
            ptr_prev_env_sf[index_3 + 2] = temp_val;
178
0
            *ptr_env_sf++ = temp_val;
179
180
0
            *ptr_env_sf_float = (FLOAT32)temp_val;
181
0
            ptr_env_sf_float++;
182
0
          }
183
184
0
          for (; band < num_sf_bands; band++) {
185
0
            index_3 = (band << 1) + ixheaacd_drc_offset;
186
0
            temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_3]);
187
0
            ptr_prev_env_sf[index_3] = temp_val;
188
0
            ptr_prev_env_sf[index_3 + 1] = temp_val;
189
0
            *ptr_env_sf++ = temp_val;
190
0
            *ptr_env_sf_float = (FLOAT32)temp_val;
191
0
            ptr_env_sf_float++;
192
0
          }
193
65.4k
        } else {
194
65.4k
          WORD32 tar, index_2;
195
65.4k
          WORD16 *ptr2 = ptr_prev_env_sf;
196
65.4k
          tar = ixheaac_min32(ixheaacd_drc_offset, band);
197
80.8k
          for (band = 0; band < tar; band++) {
198
15.3k
            *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2);
199
15.3k
            *ptr2 = *ptr_env_sf;
200
201
15.3k
            *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
202
15.3k
            ptr_env_sf_float++;
203
204
15.3k
            ptr2++;
205
15.3k
            ptr_env_sf++;
206
15.3k
          }
207
208
390k
          for (; band < num_sf_bands; band++) {
209
325k
            index_2 = (band < ixheaacd_drc_offset)
210
325k
                          ? band
211
325k
                          : ((band << 1) - ixheaacd_drc_offset);
212
325k
            temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_2]);
213
325k
            ptr_prev_env_sf[index_2] = temp_val;
214
325k
            ptr_prev_env_sf[index_2 + 1] = temp_val;
215
325k
            *ptr_env_sf++ = temp_val;
216
217
325k
            *ptr_env_sf_float = (FLOAT32)temp_val;
218
325k
            ptr_env_sf_float++;
219
325k
          }
220
65.4k
        }
221
222
149k
      } else {
223
149k
        WORD16 *ptr2 = ptr_prev_env_sf;
224
1.69M
        for (band = num_sf_bands - 1; band >= 0; band--) {
225
1.54M
          *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2);
226
1.54M
          *ptr2 = *ptr_env_sf;
227
1.54M
          *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
228
1.54M
          ptr_env_sf_float++;
229
1.54M
          ptr2++;
230
1.54M
          ptr_env_sf++;
231
1.54M
        }
232
149k
        band = num_sf_bands;
233
149k
      }
234
214k
    }
235
466k
  }
236
270k
}
237
238
static PLATFORM_INLINE WORD32
239
ixheaacd_wrong_timing_compensate(ia_sbr_header_data_struct *ptr_header_data,
240
                                 ia_sbr_frame_info_data_struct *ptr_sbr_data,
241
                                 ia_sbr_prev_frame_data_struct *ptr_prev_data,
242
16.3k
                                 ixheaacd_misc_tables *pstr_common_tables) {
243
16.3k
  WORD32 i, num_env_sf;
244
16.3k
  ia_frame_info_struct *p_frame_info = &ptr_sbr_data->str_frame_info_details;
245
16.3k
  WORD16 *num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
246
16.3k
  WORD32 start_pos_est;
247
16.3k
  WORD32 ref_len, new_len, shift;
248
16.3k
  WORD16 delta_exp;
249
250
16.3k
  start_pos_est =
251
16.3k
      (ptr_prev_data->end_position - ptr_header_data->num_time_slots);
252
253
16.3k
  ref_len = (p_frame_info->border_vec[1] - p_frame_info->border_vec[0]);
254
255
16.3k
  new_len = (p_frame_info->border_vec[1] - start_pos_est);
256
257
16.3k
  if (new_len <= 0) {
258
513
    new_len = ref_len;
259
513
    start_pos_est = p_frame_info->border_vec[0];
260
513
  }
261
262
16.3k
  delta_exp = pstr_common_tables->log_dual_is_table[ref_len];
263
16.3k
  delta_exp -= pstr_common_tables->log_dual_is_table[new_len];
264
265
16.3k
  shift = (SHORT_BITS - ENV_EXP_FRACT - 3 - ptr_sbr_data->amp_res);
266
16.3k
  delta_exp = ixheaac_shr16(delta_exp, (WORD16)shift);
267
16.3k
  p_frame_info->border_vec[0] = start_pos_est;
268
16.3k
  p_frame_info->noise_border_vec[0] = start_pos_est;
269
270
16.3k
  if (start_pos_est < 0) return -1;
271
272
16.3k
  if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
273
12.0k
    num_env_sf =
274
12.0k
        ((p_frame_info->freq_res[0]) ? num_sf_bands[HIGH] : num_sf_bands[LOW]);
275
276
87.8k
    for (i = 0; i < num_env_sf; i++) {
277
75.8k
      ptr_sbr_data->int_env_sf_arr[i] =
278
75.8k
          add16_m(ptr_sbr_data->int_env_sf_arr[i], delta_exp);
279
75.8k
      ptr_sbr_data->flt_env_sf_arr[i] =
280
75.8k
          (FLOAT32)(ptr_sbr_data->int_env_sf_arr[i]);
281
75.8k
    }
282
12.0k
  }
283
284
16.3k
  return 0;
285
16.3k
}
286
287
WORD16 ixheaacd_check_env_data(ia_sbr_header_data_struct *ptr_header_data,
288
                               ia_sbr_frame_info_data_struct *ptr_sbr_data,
289
42.2k
                               ia_sbr_prev_frame_data_struct *ptr_prev_data) {
290
42.2k
  WORD16 *ptr_evn_sf = ptr_sbr_data->int_env_sf_arr;
291
42.2k
  FLOAT32 *ptr_evn_sf_float = ptr_sbr_data->flt_env_sf_arr;
292
42.2k
  WORD16 *ptr_prev_evn_sf = ptr_prev_data->sfb_nrg_prev;
293
42.2k
  WORD32 i;
294
42.2k
  FLAG error_code = 0;
295
42.2k
  WORD16 sbr_max_env_sf;
296
42.2k
  WORD32 amp_res = ptr_sbr_data->amp_res;
297
298
42.2k
  sbr_max_env_sf = (SBR_ENV_SF_MAX_VAL_1_5 >> amp_res);
299
300
1.01M
  for (i = 0; i < ptr_sbr_data->num_env_sfac; i++) {
301
968k
    if (ptr_evn_sf[i] > sbr_max_env_sf) {
302
191k
      error_code = 1;
303
191k
    }
304
968k
    if (ptr_evn_sf[i] < 0) {
305
156k
      ptr_evn_sf[i] = 0;
306
156k
      ptr_evn_sf_float[i] = 0;
307
156k
    }
308
968k
  }
309
310
527k
  for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
311
485k
       i++) {
312
485k
    if (ptr_prev_evn_sf[i] < 0) {
313
65.8k
      ptr_prev_evn_sf[i] = 0;
314
419k
    } else {
315
419k
      if (ptr_prev_evn_sf[i] > sbr_max_env_sf)
316
92.8k
        ptr_prev_evn_sf[i] = sbr_max_env_sf;
317
419k
    }
318
485k
  }
319
42.2k
  return (WORD16)(error_code);
320
42.2k
}
321
322
VOID ixheaacd_dequant_env_data(ia_sbr_frame_info_data_struct *ptr_sbr_data,
323
79.4k
                               WORD32 amp_res) {
324
79.4k
  WORD32 i;
325
79.4k
  WORD32 num_env_sf = ptr_sbr_data->num_env_sfac;
326
79.4k
  WORD32 mantissa;
327
79.4k
  WORD32 amp_res_1;
328
79.4k
  WORD32 exponent;
329
79.4k
  WORD32 exp_add = (7 + NRG_EXP_OFFSET);
330
79.4k
  WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
331
79.4k
  const WORD32 mant_arr[2] = {0x4000, 0x5a80};
332
333
79.4k
  amp_res_1 = (1 - amp_res);
334
335
1.19M
  for (i = num_env_sf - 1; i >= 0; i--) {
336
1.11M
    exponent = *ptr_env_sf;
337
1.11M
    mantissa = mant_arr[(exponent & amp_res_1)];
338
1.11M
    exponent = (exponent >> amp_res_1);
339
1.11M
    exponent = (exponent + exp_add);
340
1.11M
    *ptr_env_sf++ = (WORD16)(mantissa | (exponent & MASK_FOR_EXP));
341
1.11M
  }
342
79.4k
}
343
344
static PLATFORM_INLINE VOID
345
ixheaacd_limit_noise_floor_fac(ia_sbr_header_data_struct *ptr_header_data,
346
370k
                               ia_sbr_frame_info_data_struct *ptr_sbr_data) {
347
370k
  WORD32 i, tot_nf_bands;
348
370k
  WORD32 value;
349
370k
  WORD32 num_nf_bands;
350
370k
  WORD16 *ptr_noise_floor;
351
370k
  FLOAT32 *ptr_noise_floor_flt;
352
353
370k
  num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
354
355
370k
  tot_nf_bands =
356
370k
      ptr_sbr_data->str_frame_info_details.num_noise_env * num_nf_bands;
357
358
370k
  ptr_noise_floor = ptr_sbr_data->int_noise_floor;
359
360
370k
  ptr_noise_floor_flt = &ptr_sbr_data->flt_noise_floor[0];
361
362
1.66M
  for (i = tot_nf_bands - 1; i >= 0; i--) {
363
1.29M
    value = *ptr_noise_floor;
364
1.29M
    if (value > MAX_NOISE_FLOOR_FAC_VAL) {
365
33.4k
      *ptr_noise_floor = MAX_NOISE_FLOOR_FAC_VAL;
366
33.4k
      *ptr_noise_floor_flt = MAX_NOISE_FLOOR_FAC_VAL;
367
1.26M
    } else {
368
1.26M
      if (value < MIN_NOISE_FLOOR_FAC_VAL) {
369
47.0k
        *ptr_noise_floor = MIN_NOISE_FLOOR_FAC_VAL;
370
47.0k
        *ptr_noise_floor_flt = MIN_NOISE_FLOOR_FAC_VAL;
371
47.0k
      }
372
1.26M
    }
373
1.29M
    ptr_noise_floor++;
374
1.29M
    ptr_noise_floor_flt++;
375
1.29M
  }
376
370k
}
377
378
506k
VOID ixheaacd_add_arr(WORD16 *ptr1, WORD16 *ptr2, WORD32 num) {
379
506k
  WORD32 i;
380
1.45M
  for (i = num - 1; i >= 0; i--) {
381
947k
    *ptr2 = (*ptr2 + *ptr1);
382
947k
    ptr2++;
383
947k
    ptr1++;
384
947k
  }
385
506k
}
386
387
506k
VOID ixheaacd_add_farr(FLOAT32 *ptr1, FLOAT32 *ptr2, WORD32 num) {
388
506k
  WORD32 i;
389
1.45M
  for (i = num - 1; i >= 0; i--) {
390
947k
    *ptr2 = (*ptr2 + *ptr1);
391
947k
    ptr2++;
392
947k
    ptr1++;
393
947k
  }
394
506k
}
395
396
IA_ERRORCODE ixheaacd_calc_noise_floor(
397
    ia_sbr_header_data_struct *ptr_header_data,
398
    ia_sbr_frame_info_data_struct *ptr_sbr_data,
399
    ia_sbr_prev_frame_data_struct *ptr_prev_data,
400
370k
    WORD32 audio_object_type) {
401
370k
  WORD32 i;
402
370k
  WORD32 num_nf_bands;
403
370k
  WORD32 num_noise_env;
404
370k
  WORD32 ixheaacd_drc_offset;
405
370k
  WORD16 *ptr_noise_floor = ptr_sbr_data->int_noise_floor;
406
407
370k
  WORD16 *ptr_prev_noise_floor = ptr_prev_data->prev_noise_level;
408
370k
  WORD16 *ptr1, *ptr2;
409
370k
  FLOAT32 *f_ptr1, *f_ptr2;
410
370k
  WORD32 num;
411
370k
  FLOAT32 *ptr_noise_floor_float = ptr_sbr_data->flt_noise_floor;
412
413
370k
  num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
414
370k
  num_noise_env = ptr_sbr_data->str_frame_info_details.num_noise_env;
415
416
370k
  if (ptr_sbr_data->del_cod_dir_noise_arr[0] == DTDF_DIR_FREQ) {
417
263k
    ptr1 = ptr_noise_floor++;
418
263k
    ptr2 = ptr_noise_floor;
419
263k
    num = num_nf_bands - 1;
420
263k
    f_ptr1 = &ptr_noise_floor_float[0];
421
263k
    f_ptr2 = &ptr_noise_floor_float[1];
422
263k
  } else {
423
106k
    ptr1 = ptr_prev_noise_floor;
424
106k
    ptr2 = ptr_sbr_data->int_noise_floor;
425
106k
    f_ptr1 = &ptr_sbr_data->prev_noise_level[0];
426
106k
    f_ptr2 = &ptr_noise_floor_float[0];
427
106k
    num = num_nf_bands;
428
106k
  }
429
430
370k
  ixheaacd_add_arr(ptr1, ptr2, num);
431
370k
  ixheaacd_add_farr(f_ptr1, f_ptr2, num);
432
433
370k
  if (num_noise_env > 1) {
434
136k
    if (ptr_sbr_data->del_cod_dir_noise_arr[1] == DTDF_DIR_FREQ) {
435
90.3k
      ptr1 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
436
90.3k
      ptr2 = &ptr_sbr_data->int_noise_floor[(num_nf_bands + 1)];
437
90.3k
      f_ptr1 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
438
90.3k
      f_ptr2 = &ptr_sbr_data->flt_noise_floor[(num_nf_bands + 1)];
439
90.3k
      num = num_nf_bands - 1;
440
90.3k
    } else {
441
45.9k
      ptr1 = &ptr_sbr_data->int_noise_floor[0];
442
45.9k
      ptr2 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
443
45.9k
      f_ptr1 = &ptr_sbr_data->flt_noise_floor[0];
444
45.9k
      f_ptr2 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
445
45.9k
      num = num_nf_bands;
446
45.9k
    }
447
136k
    ixheaacd_add_arr(ptr1, ptr2, num);
448
136k
    ixheaacd_add_farr(f_ptr1, f_ptr2, num);
449
136k
  }
450
451
370k
  ixheaacd_limit_noise_floor_fac(ptr_header_data, ptr_sbr_data);
452
453
370k
  ixheaacd_drc_offset = num_nf_bands * (num_noise_env - 1);
454
370k
  if (ixheaacd_drc_offset < 0 || ixheaacd_drc_offset >= MAX_NUM_NOISE_VALUES)
455
27
    return IA_FATAL_ERROR;
456
370k
  ptr1 = &ptr_sbr_data->int_noise_floor[ixheaacd_drc_offset];
457
370k
  ptr2 = ptr_prev_noise_floor;
458
459
370k
  memcpy(ptr2, ptr1, sizeof(WORD16) * (num_nf_bands));
460
370k
  if (!ptr_header_data->usac_flag) {
461
287k
    for (i = 0; i < num_nf_bands; i++) {
462
192k
      ptr_sbr_data->prev_noise_level[i] = ptr_prev_noise_floor[i];
463
192k
    }
464
94.5k
  }
465
370k
  if (audio_object_type != AOT_ER_AAC_ELD && ptr_header_data->enh_sbr) {
466
295k
    WORD32 noise_floor_exp, tot_nf_bands;
467
468
295k
    tot_nf_bands = (num_nf_bands * num_noise_env);
469
295k
    ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
470
471
1.38M
    for (i = 0; i < tot_nf_bands; i++) {
472
1.08M
      noise_floor_exp =
473
1.08M
          (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
474
475
1.08M
      *ptr_noise_floor_float++ = *ptr_noise_floor;
476
1.08M
      *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
477
1.08M
    }
478
295k
  } else {
479
74.1k
    if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
480
61.1k
      WORD32 noise_floor_exp, tot_nf_bands;
481
482
61.1k
      tot_nf_bands = (num_nf_bands * num_noise_env);
483
61.1k
      ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
484
485
230k
      for (i = 0; i < tot_nf_bands; i++) {
486
169k
        noise_floor_exp =
487
169k
            (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
488
169k
        *ptr_noise_floor_float++ = *ptr_noise_floor;
489
169k
        *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
490
169k
      }
491
61.1k
    }
492
74.1k
  }
493
370k
  return IA_NO_ERROR;
494
370k
}
495
496
IA_ERRORCODE ixheaacd_dec_sbrdata_for_pvc(
497
    ia_sbr_header_data_struct *ptr_header_data,
498
    ia_sbr_frame_info_data_struct *ptr_sbr_data,
499
    ia_sbr_prev_frame_data_struct *ptr_prev_data,
500
117k
    WORD32 audio_object_type) {
501
117k
  WORD32 err = 0;
502
117k
  err = ixheaacd_calc_noise_floor(ptr_header_data, ptr_sbr_data, ptr_prev_data,
503
117k
                                  audio_object_type);
504
117k
  if (err) return err;
505
506
117k
  if (!ptr_sbr_data->coupling_mode) {
507
112k
    ptr_sbr_data->num_noise_sfac =
508
112k
        ptr_header_data->pstr_freq_band_data->num_nf_bands *
509
112k
        ptr_sbr_data->str_frame_info_details.num_noise_env;
510
112k
    ixheaacd_dequant_pvc_env_data(ptr_sbr_data->num_noise_sfac,
511
112k
                                  ptr_sbr_data->flt_noise_floor);
512
112k
  }
513
117k
  return IA_NO_ERROR;
514
117k
}
515
516
VOID ixheaacd_sbr_env_dequant_coup_fix(
517
    ia_sbr_header_data_struct *ptr_header_data,
518
    ia_sbr_frame_info_data_struct *ptr_data_left,
519
    ia_sbr_frame_info_data_struct *ptr_data_right,
520
30.7k
    ixheaacd_misc_tables *pstr_common_tables) {
521
30.7k
  WORD32 i;
522
30.7k
  WORD32 num_env_sf = ptr_data_left->num_env_sfac;
523
30.7k
  WORD16 temp_left_mant, temp_right_mant, temp_right_plus1_mant, new_left_mant,
524
30.7k
      new_right_mant;
525
30.7k
  WORD16 temp_left_exp, temp_right_exp, temp_rightplus1_exp, new_left_exp,
526
30.7k
      new_right_exp;
527
30.7k
  WORD32 i_end;
528
30.7k
  WORD16 *r_data = ptr_data_right->int_env_sf_arr;
529
30.7k
  WORD16 *l_data = ptr_data_left->int_env_sf_arr;
530
531
760k
  for (i = 0; i < num_env_sf; i++) {
532
729k
    temp_right_mant = (WORD16)(*r_data & MASK_M);
533
729k
    temp_right_exp = (WORD16)(*r_data & MASK_FOR_EXP);
534
535
729k
    temp_right_exp = sub16_m(temp_right_exp, add16_m(18, NRG_EXP_OFFSET));
536
729k
    temp_left_mant = (WORD16)(*l_data & MASK_M);
537
729k
    temp_left_exp = (WORD16)(*l_data & MASK_FOR_EXP);
538
539
729k
    temp_left_exp = sub16_m(temp_left_exp, NRG_EXP_OFFSET);
540
541
729k
    ixheaacd_fix_mant_exp_add(temp_right_mant, temp_right_exp, 0x4000, 1,
542
729k
                              &temp_right_plus1_mant, &temp_rightplus1_exp);
543
544
729k
    new_right_exp = ixheaacd_fix_mant_div(temp_left_mant, temp_right_plus1_mant,
545
729k
                                          &new_right_mant, pstr_common_tables);
546
547
729k
    new_right_exp += temp_left_exp - temp_rightplus1_exp + 2;
548
549
729k
    new_left_mant = ixheaac_mult16_shl(temp_right_mant, new_right_mant);
550
551
729k
    new_left_exp = add16_m(temp_right_exp, new_right_exp);
552
553
729k
    *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) +
554
729k
                         ((new_right_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP));
555
729k
    *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) +
556
729k
                         ((new_left_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP));
557
729k
  }
558
559
30.7k
  i_end = ptr_header_data->pstr_freq_band_data->num_nf_bands *
560
30.7k
          ptr_data_left->str_frame_info_details.num_noise_env;
561
30.7k
  r_data = ptr_data_right->int_noise_floor;
562
30.7k
  l_data = ptr_data_left->int_noise_floor;
563
564
138k
  for (i = i_end - 1; i >= 0; i--) {
565
107k
    temp_left_exp =
566
107k
        sub16_m((WORD16)(*l_data & (WORD16)MASK_FOR_EXP), NOISE_EXP_OFFSET);
567
107k
    temp_right_exp = sub16_m(*r_data, 12);
568
569
107k
    ixheaacd_fix_mant_exp_add(0x4000, ixheaac_add16(1, temp_right_exp), 0x4000,
570
107k
                              1, &temp_right_plus1_mant, &temp_rightplus1_exp);
571
572
107k
    new_right_exp = ixheaacd_fix_mant_div(0x4000, temp_right_plus1_mant,
573
107k
                                          &new_right_mant, pstr_common_tables);
574
575
107k
    new_right_exp += temp_left_exp - temp_rightplus1_exp + 2;
576
577
107k
    new_left_mant = new_right_mant;
578
107k
    new_left_exp = add16_m(new_right_exp, temp_right_exp);
579
107k
    *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) +
580
107k
                         ((new_right_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP));
581
107k
    *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) +
582
107k
                         ((new_left_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP));
583
107k
  }
584
30.7k
}
585
586
VOID ixheaacd_sbr_env_dequant_coup(
587
    ia_sbr_frame_info_data_struct *ptr_data_ch_0,
588
30.7k
    ia_sbr_frame_info_data_struct *ptr_data_ch_1) {
589
30.7k
  FLOAT32 *ptr_env_sf_left = ptr_data_ch_0->flt_env_sf_arr;
590
30.7k
  FLOAT32 *ptr_env_sf_right = ptr_data_ch_1->flt_env_sf_arr;
591
30.7k
  FLOAT32 *ptr_noise_floor_left = ptr_data_ch_0->flt_noise_floor;
592
30.7k
  FLOAT32 *ptr_noise_floor_right = ptr_data_ch_1->flt_noise_floor;
593
30.7k
  WORD32 num_env_sf = ptr_data_ch_0->num_env_sfac;
594
30.7k
  WORD32 num_noise_fac = ptr_data_ch_0->num_noise_sfac;
595
30.7k
  WORD32 amp_res = ptr_data_ch_0->amp_res;
596
597
30.7k
  WORD32 i;
598
30.7k
  FLOAT32 temp_l, temp_r;
599
30.7k
  const FLOAT32 pan_offset[2] = {24.0f, 12.0f};
600
30.7k
  const FLOAT32 a_arr[2] = {0.5f, 1.0f};
601
602
30.7k
  FLOAT32 a = a_arr[amp_res];
603
604
760k
  for (i = 0; i < num_env_sf; i++) {
605
729k
    temp_l = ptr_env_sf_left[i];
606
729k
    temp_r = ptr_env_sf_right[i];
607
608
729k
    ptr_env_sf_left[i] =
609
729k
        (FLOAT32)(64 * (pow(2, temp_l * a + 1) /
610
729k
                        (1 + pow(2, (pan_offset[amp_res] - temp_r) * a))));
611
729k
    ptr_env_sf_right[i] =
612
729k
        (FLOAT32)(64 * (pow(2, temp_l * a + 1) /
613
729k
                        (1 + pow(2, (temp_r - pan_offset[amp_res]) * a))));
614
729k
  }
615
616
138k
  for (i = 0; i < num_noise_fac; i++) {
617
107k
    temp_l = ptr_noise_floor_left[i];
618
107k
    temp_r = ptr_noise_floor_right[i];
619
620
107k
    ptr_noise_floor_left[i] =
621
107k
        (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) /
622
107k
                  (1 + pow(2, pan_offset[1] - temp_r)));
623
107k
    ptr_noise_floor_right[i] =
624
107k
        (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) /
625
107k
                  (1 + pow(2, temp_r - pan_offset[1])));
626
107k
  }
627
30.7k
}
628
IA_ERRORCODE ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0,
629
                                  ia_sbr_header_data_struct *ptr_header_data_ch_1,
630
                                  ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0,
631
                                  ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
632
                                  ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1,
633
                                  ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
634
                                  ixheaacd_misc_tables *ptr_common_tables, WORD32 ldmps_present,
635
171k
                                  WORD32 audio_object_type, WORD32 ec_flag) {
636
171k
  FLAG error_code;
637
171k
  WORD32 err = 0;
638
171k
  WORD16 temp_sfb_nrg_prev[MAX_FREQ_COEFFS];
639
171k
  WORD32 usac_flag = ptr_header_data_ch_0->usac_flag |
640
171k
                     ptr_header_data_ch_0->enh_sbr;
641
642
171k
  if (ec_flag) {
643
0
    memcpy(temp_sfb_nrg_prev, ptr_prev_data_ch_0->sfb_nrg_prev, MAX_FREQ_COEFFS * sizeof(WORD16));
644
0
  }
645
646
171k
  err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
647
171k
                              ptr_prev_data_ch_1, ptr_common_tables, audio_object_type, ec_flag);
648
649
171k
  if (err) return err;
650
651
171k
  err = ixheaacd_calc_noise_floor(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
652
171k
                                  ptr_prev_data_ch_0, audio_object_type);
653
171k
  if (err) return err;
654
171k
  if ((!ptr_sbr_data_ch_0->coupling_mode &&
655
142k
     ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) || ldmps_present) {
656
116k
    ptr_sbr_data_ch_0->num_noise_sfac =
657
116k
        ptr_header_data_ch_0->pstr_freq_band_data->num_nf_bands *
658
116k
        ptr_sbr_data_ch_0->str_frame_info_details.num_noise_env;
659
660
116k
    ixheaacd_dequant_esbr_env_data(
661
116k
        ptr_sbr_data_ch_0->flt_env_sf_arr, ptr_sbr_data_ch_0->num_env_sfac,
662
116k
        ptr_sbr_data_ch_0->num_noise_sfac, ptr_sbr_data_ch_0->amp_res,
663
116k
        ptr_sbr_data_ch_0->flt_noise_floor);
664
116k
  }
665
666
171k
  if (ptr_sbr_data_ch_1 != NULL) {
667
80.9k
    error_code = ptr_header_data_ch_0->err_flag;
668
80.9k
    err =
669
80.9k
        ixheaacd_dec_envelope(ptr_header_data_ch_1, ptr_sbr_data_ch_1, ptr_prev_data_ch_1,
670
80.9k
                              ptr_prev_data_ch_0, ptr_common_tables, audio_object_type, ec_flag);
671
672
80.9k
    if (err) return err;
673
674
80.9k
    err = ixheaacd_calc_noise_floor(ptr_header_data_ch_1, ptr_sbr_data_ch_1,
675
80.9k
                                    ptr_prev_data_ch_1, audio_object_type);
676
677
80.9k
    if (err) return err;
678
679
80.9k
    if (!ptr_sbr_data_ch_1->coupling_mode &&
680
50.2k
        ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) {
681
31.1k
      ptr_sbr_data_ch_1->num_noise_sfac =
682
31.1k
          ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
683
31.1k
          ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
684
685
31.1k
      ixheaacd_dequant_esbr_env_data(
686
31.1k
          ptr_sbr_data_ch_1->flt_env_sf_arr, ptr_sbr_data_ch_1->num_env_sfac,
687
31.1k
          ptr_sbr_data_ch_1->num_noise_sfac, ptr_sbr_data_ch_1->amp_res,
688
31.1k
          ptr_sbr_data_ch_1->flt_noise_floor);
689
31.1k
    }
690
80.9k
    if (ec_flag) {
691
0
      if ((!ptr_header_data_ch_0->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
692
0
        if (!error_code && ptr_header_data_ch_0->err_flag) {
693
0
          memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, temp_sfb_nrg_prev,
694
0
                 MAX_FREQ_COEFFS * sizeof(WORD16));
695
0
          err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
696
0
                                      ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
697
0
                                      ec_flag);
698
699
0
          if (err) return err;
700
0
        }
701
0
      }
702
80.9k
    } else {
703
80.9k
      if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
704
32.0k
        if (!error_code && ptr_header_data_ch_0->err_flag) {
705
5.22k
          err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
706
5.22k
                                      ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
707
5.22k
                                      ec_flag);
708
709
5.22k
          if (err) return err;
710
5.22k
        }
711
32.0k
      }
712
80.9k
    }
713
714
80.9k
    if (ptr_sbr_data_ch_0->coupling_mode) {
715
30.7k
      ptr_sbr_data_ch_0->num_noise_sfac =
716
30.7k
          ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
717
30.7k
          ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
718
30.7k
      ixheaacd_sbr_env_dequant_coup_fix(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
719
30.7k
                                        ptr_sbr_data_ch_1, ptr_common_tables);
720
721
30.7k
      ixheaacd_sbr_env_dequant_coup(ptr_sbr_data_ch_0, ptr_sbr_data_ch_1);
722
30.7k
    }
723
80.9k
  }
724
725
171k
  return 0;
726
171k
}
727
IA_ERRORCODE ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data,
728
                                   ia_sbr_frame_info_data_struct *ptr_sbr_data,
729
                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0,
730
                                   ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1,
731
                                   ixheaacd_misc_tables *pstr_common_tables,
732
270k
                                   WORD32 audio_object_type, WORD32 ec_flag) {
733
270k
  FLAG error_code;
734
270k
  WORD32 err;
735
270k
  WORD16 env_sf_local_arr[MAX_FREQ_COEFFS];
736
270k
  WORD32 enh_sbr = ptr_header_data->enh_sbr;
737
270k
  WORD32 usac_flag = enh_sbr | ptr_header_data->usac_flag;
738
270k
  WORD32 temp_1 =
739
270k
      ptr_prev_data_ch_0->end_position - ptr_header_data->num_time_slots;
740
741
270k
  if (temp_1 < 0) return IA_FATAL_ERROR;
742
270k
  temp_1 = ptr_sbr_data->str_frame_info_details.border_vec[0] - temp_1;
743
744
270k
  if ((!ptr_header_data->err_flag_prev) && (!ptr_header_data->err_flag) &&
745
159k
      (temp_1 != 0)) {
746
8.46k
    if (ptr_sbr_data->del_cod_dir_arr[0] == DTDF_DIR_TIME) {
747
2.00k
      ptr_header_data->err_flag = 1;
748
6.46k
    } else {
749
6.46k
      ptr_header_data->err_flag_prev = 1;
750
6.46k
    }
751
8.46k
  }
752
270k
  if (ec_flag) {
753
0
    if (ptr_header_data->err_flag_prev && (!ptr_header_data->err_flag)) {
754
0
      if (ptr_sbr_data->del_cod_dir_arr[0] != 0) {
755
0
        ptr_header_data->err_flag = 1;
756
0
      }
757
0
    }
758
0
  }
759
270k
  if (ec_flag && ptr_header_data->err_flag &&
760
0
      ((!ptr_header_data->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
761
0
    ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
762
763
0
    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
764
270k
  } else if (ptr_header_data->err_flag &&
765
90.6k
             ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
766
49.9k
    ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
767
768
49.9k
    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
769
220k
  } else {
770
220k
    WORD32 num = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
771
220k
    if (ptr_header_data->err_flag_prev && ((!usac_flag) ||
772
65.1k
        (audio_object_type == AOT_ER_AAC_ELD))) {
773
16.3k
      WORD16 *ptr1, *ptr2;
774
16.3k
      WORD32 i;
775
776
16.3k
      err = ixheaacd_wrong_timing_compensate(ptr_header_data, ptr_sbr_data,
777
16.3k
                                             ptr_prev_data_ch_0,
778
16.3k
                                             pstr_common_tables);
779
780
16.3k
      if (err) return err;
781
782
16.3k
      if (ptr_sbr_data->coupling_mode !=
783
16.3k
          (WORD16)ptr_prev_data_ch_0->coupling_mode) {
784
4.29k
        if (ptr_prev_data_ch_0->coupling_mode == COUPLING_BAL) {
785
327
          memcpy(ptr_prev_data_ch_0->sfb_nrg_prev,
786
327
                 ptr_prev_data_ch_1->sfb_nrg_prev, sizeof(WORD16) * num);
787
3.96k
        } else {
788
3.96k
          if (ptr_sbr_data->coupling_mode == COUPLING_LEVEL) {
789
2.31k
            ptr1 = ptr_prev_data_ch_0->sfb_nrg_prev;
790
2.31k
            ptr2 = ptr_prev_data_ch_1->sfb_nrg_prev;
791
792
29.4k
            for (i = 0; i < num; i++) {
793
27.1k
              *ptr1 = (add16_m(*ptr1, *ptr2) >> 1);
794
27.1k
              ptr2++;
795
27.1k
              ptr1++;
796
27.1k
            }
797
2.31k
          } else {
798
1.64k
            if (ptr_sbr_data->coupling_mode == COUPLING_BAL) {
799
1.12k
              memset(ptr_prev_data_ch_0->sfb_nrg_prev, SBR_ENERGY_PAN_OFFSET,
800
1.12k
                     sizeof(WORD16) * num);
801
1.12k
            }
802
1.64k
          }
803
3.96k
        }
804
4.29k
      }
805
16.3k
    }
806
807
220k
    memcpy(env_sf_local_arr, ptr_prev_data_ch_0->sfb_nrg_prev,
808
220k
           sizeof(WORD16) * MAX_FREQ_COEFFS);
809
810
220k
    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data,
811
220k
                                      ptr_prev_data_ch_0);
812
813
220k
    if ((!usac_flag)||(audio_object_type == AOT_ER_AAC_ELD)) {
814
42.2k
      error_code = ixheaacd_check_env_data(ptr_header_data, ptr_sbr_data,
815
42.2k
                                           ptr_prev_data_ch_0);
816
817
42.2k
      if (error_code) {
818
12.8k
        ptr_header_data->err_flag = 1;
819
820
12.8k
        memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, env_sf_local_arr,
821
12.8k
               sizeof(WORD16) * MAX_FREQ_COEFFS);
822
823
12.8k
        err = ixheaacd_dec_envelope(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0,
824
12.8k
                                    ptr_prev_data_ch_1, pstr_common_tables, audio_object_type,
825
12.8k
                                    ec_flag);
826
827
12.8k
        if (err) return err;
828
12.8k
        return 0;
829
12.8k
      }
830
42.2k
    }
831
220k
  }
832
257k
  if (ec_flag) {
833
0
    if ((!ptr_header_data->usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
834
0
      ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
835
0
    }
836
257k
  } else {
837
257k
    if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
838
79.4k
      ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
839
79.4k
    }
840
257k
  }
841
842
257k
  return 0;
843
270k
}
844
845
VOID ixheaacd_adj_timeslot(WORD32 *ptr_buf_real, WORD32 *ptr_buf_imag,
846
                           WORD16 *ptr_filt_buf, WORD16 *ptr_filt_buf_noise,
847
                           WORD16 *ptr_gain_buf, WORD16 *ptr_noise_floor,
848
                           WORD16 *ptr_sine_lvl_buf, WORD16 noise_floor_exp,
849
                           WORD16 *ptr_harm_index, WORD16 sub_band_start,
850
                           WORD16 num_sub_bands, WORD16 scale_change,
851
                           WORD16 smooth_ratio, FLAG num_noise_flg,
852
                           WORD16 *ptr_phase_index,
853
1.02M
                           ia_sbr_tables_struct *ptr_sbr_tables) {
854
1.02M
  WORD16 k;
855
1.02M
  WORD16 *ptr_smoothed_gain, *ptr_smoothed_noise;
856
1.02M
  WORD16 direct_ratio;
857
1.02M
  WORD32 index = *ptr_phase_index;
858
1.02M
  WORD32 harm_idx = *ptr_harm_index;
859
1.02M
  WORD32 freq_inv_flag;
860
1.02M
  const WORD32 *ptr_rand_ph_buf;
861
1.02M
  WORD32 factor = 0;
862
863
1.02M
  direct_ratio = ixheaac_sub16_sat(0x7fff, smooth_ratio);
864
1.02M
  freq_inv_flag = (sub_band_start & 1);
865
866
1.02M
  scale_change = scale_change - 1;
867
868
1.02M
  ptr_rand_ph_buf = &ptr_sbr_tables->sbr_rand_ph[index];
869
1.02M
  *ptr_phase_index =
870
1.02M
      (WORD16)((index + num_sub_bands) & (SBR_NF_NO_RANDOM_VAL - 1));
871
872
1.02M
  if (smooth_ratio) {
873
140k
    WORD16 *ptr_filt_buf_local = &ptr_filt_buf[0];
874
140k
    WORD16 *ptr_gain_buf_local = &ptr_gain_buf[0];
875
140k
    WORD16 *ptr_filt_noise_local = &ptr_filt_buf_noise[0];
876
140k
    WORD16 *ptr_noise_floor_local = &ptr_noise_floor[0];
877
878
140k
    WORD16 tmp, tmp1;
879
880
2.57M
    for (k = 0; k < num_sub_bands; k++) {
881
2.43M
      tmp = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_buf_local),
882
2.43M
                    mult16x16_16(direct_ratio, *ptr_gain_buf_local++));
883
884
2.43M
      ptr_gain_buf_local++;
885
886
2.43M
      tmp1 = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_noise_local),
887
2.43M
                     mult16x16_16(direct_ratio, *ptr_noise_floor_local++));
888
889
2.43M
      ptr_noise_floor_local++;
890
891
2.43M
      *ptr_filt_buf_local++ = tmp << 1;
892
2.43M
      ptr_filt_buf_local++;
893
2.43M
      *ptr_filt_noise_local++ = tmp1 << 1;
894
2.43M
    }
895
140k
    ptr_smoothed_gain = ptr_filt_buf;
896
140k
    ptr_smoothed_noise = ptr_filt_buf_noise;
897
140k
    factor = 1;
898
884k
  } else {
899
884k
    ptr_smoothed_gain = ptr_gain_buf;
900
884k
    ptr_smoothed_noise = ptr_noise_floor;
901
884k
    factor = 2;
902
884k
  }
903
904
1.02M
  switch (harm_idx) {
905
257k
    case 0:
906
513k
    case 2:
907
513k
      ixheaacd_harm_idx_zerotwo(num_noise_flg, num_sub_bands, ptr_buf_real,
908
513k
                                ptr_buf_imag, ptr_smoothed_gain,
909
513k
                                ptr_smoothed_noise, factor, ptr_gain_buf,
910
513k
                                scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf,
911
513k
                                noise_floor_exp, harm_idx);
912
513k
      break;
913
257k
    case 1:
914
511k
    case 3:
915
511k
      ixheaacd_harm_idx_onethree(
916
511k
          num_noise_flg, num_sub_bands, ptr_buf_real, ptr_buf_imag,
917
511k
          ptr_smoothed_gain, ptr_smoothed_noise, factor, ptr_gain_buf,
918
511k
          scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf, noise_floor_exp,
919
511k
          freq_inv_flag, harm_idx);
920
511k
      break;
921
1.02M
  }
922
1.02M
  *ptr_harm_index = (WORD16)((harm_idx + 1) & 3);
923
1.02M
}