Coverage Report

Created: 2025-07-18 06:38

/src/libxaac/decoder/ixheaacd_env_dec.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <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
5.68M
#define add16_m(a, b) ((a) + (b))
48
1.23M
#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
153k
                                           FLOAT32 *ptr_noise_floor) {
56
153k
  WORD32 i;
57
153k
  const FLOAT32 array[2] = {0.5f, 1.0f};
58
153k
  FLOAT32 a_flt = array[amp_res];
59
60
1.67M
  for (i = 0; i < num_env_sf; i++) {
61
1.52M
    ptr_env_sf[i] = (FLOAT32)(pow(2, ptr_env_sf[i] * a_flt) * 64);
62
1.52M
  }
63
64
612k
  for (i = 0; i < num_noise_fac; i++) {
65
459k
    FLOAT32 temp = ptr_noise_floor[i];
66
67
459k
    temp = NOISE_FLOOR_OFFSET - temp;
68
459k
    temp = (FLOAT32)pow(2.0f, temp);
69
70
459k
    ptr_noise_floor[i] = temp;
71
459k
  }
72
153k
}
73
74
static VOID ixheaacd_dequant_pvc_env_data(WORD32 num_noise_fac,
75
122k
                                          FLOAT32 *ptr_noise_floor) {
76
122k
  WORD32 i;
77
78
744k
  for (i = 0; i < num_noise_fac; i++) {
79
621k
    FLOAT32 temp = ptr_noise_floor[i];
80
81
621k
    temp = NOISE_FLOOR_OFFSET - temp;
82
621k
    temp = (FLOAT32)pow(2.0f, temp);
83
84
621k
    ptr_noise_floor[i] = temp;
85
621k
  }
86
122k
}
87
88
VOID ixheaacd_map_res_energy(WORD16 curr_val, WORD16 *prev_data,
89
                             WORD32 ixheaacd_drc_offset, WORD32 index,
90
1.83M
                             WORD32 res) {
91
1.83M
  if (res == LOW) {
92
1.08M
    if (ixheaacd_drc_offset >= 0) {
93
1.08M
      if (index < ixheaacd_drc_offset) {
94
32.6k
        prev_data[index] = curr_val;
95
1.04M
      } else {
96
1.04M
        WORD32 index_2;
97
1.04M
        index_2 = ((index + index) - ixheaacd_drc_offset);
98
1.04M
        prev_data[index_2] = curr_val;
99
1.04M
        prev_data[index_2 + 1] = curr_val;
100
1.04M
      }
101
1.08M
    } 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.08M
  } else {
118
758k
    prev_data[index] = curr_val;
119
758k
  }
120
1.83M
}
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
251k
    ia_sbr_prev_frame_data_struct *ptr_prev_data) {
126
251k
  WORD32 i, dtdf_dir, num_sf_bands, band, freq_res;
127
251k
  WORD16 temp_val;
128
251k
  WORD16 *ptr_prev_env_sf = ptr_prev_data->sfb_nrg_prev;
129
251k
  WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
130
131
251k
  FLOAT32 *ptr_env_sf_float = ptr_sbr_data->flt_env_sf_arr;
132
133
251k
  WORD32 ixheaacd_drc_offset;
134
251k
  band = 0;
135
136
251k
  ixheaacd_drc_offset =
137
251k
      ((ptr_header_data->pstr_freq_band_data->num_sf_bands[LOW] << 1) -
138
251k
       ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]);
139
140
658k
  for (i = 0; i < ptr_sbr_data->str_frame_info_details.num_env; i++) {
141
406k
    dtdf_dir = ptr_sbr_data->del_cod_dir_arr[i];
142
406k
    freq_res = ptr_sbr_data->str_frame_info_details.freq_res[i];
143
144
406k
    num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands[freq_res];
145
146
406k
    if (dtdf_dir == DTDF_DIR_FREQ) {
147
223k
      ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf, ixheaacd_drc_offset,
148
223k
                              0, freq_res);
149
223k
      ptr_env_sf++;
150
151
223k
      ptr_env_sf_float++;
152
153
1.83M
      for (band = 1; band < num_sf_bands; band++) {
154
1.61M
        *ptr_env_sf = *ptr_env_sf + *(ptr_env_sf - 1);
155
1.61M
        ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf,
156
1.61M
                                ixheaacd_drc_offset, band, freq_res);
157
158
1.61M
        *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
159
1.61M
        ptr_env_sf_float++;
160
161
1.61M
        ptr_env_sf++;
162
1.61M
      }
163
164
223k
    } else {
165
183k
      if (freq_res == LOW) {
166
60.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
60.4k
        } else {
194
60.4k
          WORD32 tar, index_2;
195
60.4k
          WORD16 *ptr2 = ptr_prev_env_sf;
196
60.4k
          tar = ixheaac_min32(ixheaacd_drc_offset, band);
197
67.0k
          for (band = 0; band < tar; band++) {
198
6.60k
            *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2);
199
6.60k
            *ptr2 = *ptr_env_sf;
200
201
6.60k
            *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
202
6.60k
            ptr_env_sf_float++;
203
204
6.60k
            ptr2++;
205
6.60k
            ptr_env_sf++;
206
6.60k
          }
207
208
395k
          for (; band < num_sf_bands; band++) {
209
335k
            index_2 = (band < ixheaacd_drc_offset)
210
335k
                          ? band
211
335k
                          : ((band << 1) - ixheaacd_drc_offset);
212
335k
            temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_2]);
213
335k
            ptr_prev_env_sf[index_2] = temp_val;
214
335k
            ptr_prev_env_sf[index_2 + 1] = temp_val;
215
335k
            *ptr_env_sf++ = temp_val;
216
217
335k
            *ptr_env_sf_float = (FLOAT32)temp_val;
218
335k
            ptr_env_sf_float++;
219
335k
          }
220
60.4k
        }
221
222
122k
      } else {
223
122k
        WORD16 *ptr2 = ptr_prev_env_sf;
224
1.31M
        for (band = num_sf_bands - 1; band >= 0; band--) {
225
1.19M
          *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2);
226
1.19M
          *ptr2 = *ptr_env_sf;
227
1.19M
          *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf);
228
1.19M
          ptr_env_sf_float++;
229
1.19M
          ptr2++;
230
1.19M
          ptr_env_sf++;
231
1.19M
        }
232
122k
        band = num_sf_bands;
233
122k
      }
234
183k
    }
235
406k
  }
236
251k
}
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
7.84k
                                 ixheaacd_misc_tables *pstr_common_tables) {
243
7.84k
  WORD32 i, num_env_sf;
244
7.84k
  ia_frame_info_struct *p_frame_info = &ptr_sbr_data->str_frame_info_details;
245
7.84k
  WORD16 *num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
246
7.84k
  WORD32 start_pos_est;
247
7.84k
  WORD32 ref_len, new_len, shift;
248
7.84k
  WORD16 delta_exp;
249
250
7.84k
  start_pos_est =
251
7.84k
      (ptr_prev_data->end_position - ptr_header_data->num_time_slots);
252
253
7.84k
  ref_len = (p_frame_info->border_vec[1] - p_frame_info->border_vec[0]);
254
255
7.84k
  new_len = (p_frame_info->border_vec[1] - start_pos_est);
256
257
7.84k
  if (new_len <= 0) {
258
462
    new_len = ref_len;
259
462
    start_pos_est = p_frame_info->border_vec[0];
260
462
  }
261
262
7.84k
  delta_exp = pstr_common_tables->log_dual_is_table[ref_len];
263
7.84k
  delta_exp -= pstr_common_tables->log_dual_is_table[new_len];
264
265
7.84k
  shift = (SHORT_BITS - ENV_EXP_FRACT - 3 - ptr_sbr_data->amp_res);
266
7.84k
  delta_exp = ixheaac_shr16(delta_exp, (WORD16)shift);
267
7.84k
  p_frame_info->border_vec[0] = start_pos_est;
268
7.84k
  p_frame_info->noise_border_vec[0] = start_pos_est;
269
270
7.84k
  if (start_pos_est < 0) return -1;
271
272
7.84k
  if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
273
7.06k
    num_env_sf =
274
7.06k
        ((p_frame_info->freq_res[0]) ? num_sf_bands[HIGH] : num_sf_bands[LOW]);
275
276
63.2k
    for (i = 0; i < num_env_sf; i++) {
277
56.2k
      ptr_sbr_data->int_env_sf_arr[i] =
278
56.2k
          add16_m(ptr_sbr_data->int_env_sf_arr[i], delta_exp);
279
56.2k
      ptr_sbr_data->flt_env_sf_arr[i] =
280
56.2k
          (FLOAT32)(ptr_sbr_data->int_env_sf_arr[i]);
281
56.2k
    }
282
7.06k
  }
283
284
7.84k
  return 0;
285
7.84k
}
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
26.1k
                               ia_sbr_prev_frame_data_struct *ptr_prev_data) {
290
26.1k
  WORD16 *ptr_evn_sf = ptr_sbr_data->int_env_sf_arr;
291
26.1k
  FLOAT32 *ptr_evn_sf_float = ptr_sbr_data->flt_env_sf_arr;
292
26.1k
  WORD16 *ptr_prev_evn_sf = ptr_prev_data->sfb_nrg_prev;
293
26.1k
  WORD32 i;
294
26.1k
  FLAG error_code = 0;
295
26.1k
  WORD16 sbr_max_env_sf;
296
26.1k
  WORD32 amp_res = ptr_sbr_data->amp_res;
297
298
26.1k
  sbr_max_env_sf = (SBR_ENV_SF_MAX_VAL_1_5 >> amp_res);
299
300
536k
  for (i = 0; i < ptr_sbr_data->num_env_sfac; i++) {
301
510k
    if (ptr_evn_sf[i] > sbr_max_env_sf) {
302
80.3k
      error_code = 1;
303
80.3k
    }
304
510k
    if (ptr_evn_sf[i] < 0) {
305
79.7k
      ptr_evn_sf[i] = 0;
306
79.7k
      ptr_evn_sf_float[i] = 0;
307
79.7k
    }
308
510k
  }
309
310
344k
  for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
311
318k
       i++) {
312
318k
    if (ptr_prev_evn_sf[i] < 0) {
313
47.4k
      ptr_prev_evn_sf[i] = 0;
314
270k
    } else {
315
270k
      if (ptr_prev_evn_sf[i] > sbr_max_env_sf)
316
60.5k
        ptr_prev_evn_sf[i] = sbr_max_env_sf;
317
270k
    }
318
318k
  }
319
26.1k
  return (WORD16)(error_code);
320
26.1k
}
321
322
VOID ixheaacd_dequant_env_data(ia_sbr_frame_info_data_struct *ptr_sbr_data,
323
61.0k
                               WORD32 amp_res) {
324
61.0k
  WORD32 i;
325
61.0k
  WORD32 num_env_sf = ptr_sbr_data->num_env_sfac;
326
61.0k
  WORD32 mantissa;
327
61.0k
  WORD32 amp_res_1;
328
61.0k
  WORD32 exponent;
329
61.0k
  WORD32 exp_add = (7 + NRG_EXP_OFFSET);
330
61.0k
  WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr;
331
61.0k
  const WORD32 mant_arr[2] = {0x4000, 0x5a80};
332
333
61.0k
  amp_res_1 = (1 - amp_res);
334
335
879k
  for (i = num_env_sf - 1; i >= 0; i--) {
336
818k
    exponent = *ptr_env_sf;
337
818k
    mantissa = mant_arr[(exponent & amp_res_1)];
338
818k
    exponent = (exponent >> amp_res_1);
339
818k
    exponent = (exponent + exp_add);
340
818k
    *ptr_env_sf++ = (WORD16)(mantissa | (exponent & MASK_FOR_EXP));
341
818k
  }
342
61.0k
}
343
344
static PLATFORM_INLINE VOID
345
ixheaacd_limit_noise_floor_fac(ia_sbr_header_data_struct *ptr_header_data,
346
369k
                               ia_sbr_frame_info_data_struct *ptr_sbr_data) {
347
369k
  WORD32 i, tot_nf_bands;
348
369k
  WORD32 value;
349
369k
  WORD32 num_nf_bands;
350
369k
  WORD16 *ptr_noise_floor;
351
369k
  FLOAT32 *ptr_noise_floor_flt;
352
353
369k
  num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
354
355
369k
  tot_nf_bands =
356
369k
      ptr_sbr_data->str_frame_info_details.num_noise_env * num_nf_bands;
357
358
369k
  ptr_noise_floor = ptr_sbr_data->int_noise_floor;
359
360
369k
  ptr_noise_floor_flt = &ptr_sbr_data->flt_noise_floor[0];
361
362
1.75M
  for (i = tot_nf_bands - 1; i >= 0; i--) {
363
1.38M
    value = *ptr_noise_floor;
364
1.38M
    if (value > MAX_NOISE_FLOOR_FAC_VAL) {
365
27.2k
      *ptr_noise_floor = MAX_NOISE_FLOOR_FAC_VAL;
366
27.2k
      *ptr_noise_floor_flt = MAX_NOISE_FLOOR_FAC_VAL;
367
1.36M
    } else {
368
1.36M
      if (value < MIN_NOISE_FLOOR_FAC_VAL) {
369
52.1k
        *ptr_noise_floor = MIN_NOISE_FLOOR_FAC_VAL;
370
52.1k
        *ptr_noise_floor_flt = MIN_NOISE_FLOOR_FAC_VAL;
371
52.1k
      }
372
1.36M
    }
373
1.38M
    ptr_noise_floor++;
374
1.38M
    ptr_noise_floor_flt++;
375
1.38M
  }
376
369k
}
377
378
502k
VOID ixheaacd_add_arr(WORD16 *ptr1, WORD16 *ptr2, WORD32 num) {
379
502k
  WORD32 i;
380
1.54M
  for (i = num - 1; i >= 0; i--) {
381
1.04M
    *ptr2 = (*ptr2 + *ptr1);
382
1.04M
    ptr2++;
383
1.04M
    ptr1++;
384
1.04M
  }
385
502k
}
386
387
502k
VOID ixheaacd_add_farr(FLOAT32 *ptr1, FLOAT32 *ptr2, WORD32 num) {
388
502k
  WORD32 i;
389
1.54M
  for (i = num - 1; i >= 0; i--) {
390
1.04M
    *ptr2 = (*ptr2 + *ptr1);
391
1.04M
    ptr2++;
392
1.04M
    ptr1++;
393
1.04M
  }
394
502k
}
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
369k
    WORD32 audio_object_type) {
401
369k
  WORD32 i;
402
369k
  WORD32 num_nf_bands;
403
369k
  WORD32 num_noise_env;
404
369k
  WORD32 ixheaacd_drc_offset;
405
369k
  WORD16 *ptr_noise_floor = ptr_sbr_data->int_noise_floor;
406
407
369k
  WORD16 *ptr_prev_noise_floor = ptr_prev_data->prev_noise_level;
408
369k
  WORD16 *ptr1, *ptr2;
409
369k
  FLOAT32 *f_ptr1, *f_ptr2;
410
369k
  WORD32 num;
411
369k
  FLOAT32 *ptr_noise_floor_float = ptr_sbr_data->flt_noise_floor;
412
413
369k
  num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands;
414
369k
  num_noise_env = ptr_sbr_data->str_frame_info_details.num_noise_env;
415
416
369k
  if (ptr_sbr_data->del_cod_dir_noise_arr[0] == DTDF_DIR_FREQ) {
417
275k
    ptr1 = ptr_noise_floor++;
418
275k
    ptr2 = ptr_noise_floor;
419
275k
    num = num_nf_bands - 1;
420
275k
    f_ptr1 = &ptr_noise_floor_float[0];
421
275k
    f_ptr2 = &ptr_noise_floor_float[1];
422
275k
  } else {
423
93.5k
    ptr1 = ptr_prev_noise_floor;
424
93.5k
    ptr2 = ptr_sbr_data->int_noise_floor;
425
93.5k
    f_ptr1 = &ptr_sbr_data->prev_noise_level[0];
426
93.5k
    f_ptr2 = &ptr_noise_floor_float[0];
427
93.5k
    num = num_nf_bands;
428
93.5k
  }
429
430
369k
  ixheaacd_add_arr(ptr1, ptr2, num);
431
369k
  ixheaacd_add_farr(f_ptr1, f_ptr2, num);
432
433
369k
  if (num_noise_env > 1) {
434
133k
    if (ptr_sbr_data->del_cod_dir_noise_arr[1] == DTDF_DIR_FREQ) {
435
82.1k
      ptr1 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
436
82.1k
      ptr2 = &ptr_sbr_data->int_noise_floor[(num_nf_bands + 1)];
437
82.1k
      f_ptr1 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
438
82.1k
      f_ptr2 = &ptr_sbr_data->flt_noise_floor[(num_nf_bands + 1)];
439
82.1k
      num = num_nf_bands - 1;
440
82.1k
    } else {
441
51.0k
      ptr1 = &ptr_sbr_data->int_noise_floor[0];
442
51.0k
      ptr2 = &ptr_sbr_data->int_noise_floor[num_nf_bands];
443
51.0k
      f_ptr1 = &ptr_sbr_data->flt_noise_floor[0];
444
51.0k
      f_ptr2 = &ptr_sbr_data->flt_noise_floor[num_nf_bands];
445
51.0k
      num = num_nf_bands;
446
51.0k
    }
447
133k
    ixheaacd_add_arr(ptr1, ptr2, num);
448
133k
    ixheaacd_add_farr(f_ptr1, f_ptr2, num);
449
133k
  }
450
451
369k
  ixheaacd_limit_noise_floor_fac(ptr_header_data, ptr_sbr_data);
452
453
369k
  ixheaacd_drc_offset = num_nf_bands * (num_noise_env - 1);
454
369k
  if (ixheaacd_drc_offset < 0 || ixheaacd_drc_offset >= MAX_NUM_NOISE_VALUES)
455
28
    return IA_FATAL_ERROR;
456
369k
  ptr1 = &ptr_sbr_data->int_noise_floor[ixheaacd_drc_offset];
457
369k
  ptr2 = ptr_prev_noise_floor;
458
459
369k
  memcpy(ptr2, ptr1, sizeof(WORD16) * (num_nf_bands));
460
369k
  if (!ptr_header_data->usac_flag) {
461
225k
    for (i = 0; i < num_nf_bands; i++) {
462
149k
      ptr_sbr_data->prev_noise_level[i] = ptr_prev_noise_floor[i];
463
149k
    }
464
76.3k
  }
465
369k
  if (audio_object_type != AOT_ER_AAC_ELD && ptr_header_data->enh_sbr) {
466
310k
    WORD32 noise_floor_exp, tot_nf_bands;
467
468
310k
    tot_nf_bands = (num_nf_bands * num_noise_env);
469
310k
    ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
470
471
1.53M
    for (i = 0; i < tot_nf_bands; i++) {
472
1.22M
      noise_floor_exp =
473
1.22M
          (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
474
475
1.22M
      *ptr_noise_floor_float++ = *ptr_noise_floor;
476
1.22M
      *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
477
1.22M
    }
478
310k
  } else {
479
58.8k
    if (ptr_sbr_data->coupling_mode != COUPLING_BAL) {
480
54.1k
      WORD32 noise_floor_exp, tot_nf_bands;
481
482
54.1k
      tot_nf_bands = (num_nf_bands * num_noise_env);
483
54.1k
      ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0];
484
485
200k
      for (i = 0; i < tot_nf_bands; i++) {
486
146k
        noise_floor_exp =
487
146k
            (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor);
488
146k
        *ptr_noise_floor_float++ = *ptr_noise_floor;
489
146k
        *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP));
490
146k
      }
491
54.1k
    }
492
58.8k
  }
493
369k
  return IA_NO_ERROR;
494
369k
}
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
126k
    WORD32 audio_object_type) {
501
126k
  WORD32 err = 0;
502
126k
  err = ixheaacd_calc_noise_floor(ptr_header_data, ptr_sbr_data, ptr_prev_data,
503
126k
                                  audio_object_type);
504
126k
  if (err) return err;
505
506
126k
  if (!ptr_sbr_data->coupling_mode) {
507
122k
    ptr_sbr_data->num_noise_sfac =
508
122k
        ptr_header_data->pstr_freq_band_data->num_nf_bands *
509
122k
        ptr_sbr_data->str_frame_info_details.num_noise_env;
510
122k
    ixheaacd_dequant_pvc_env_data(ptr_sbr_data->num_noise_sfac,
511
122k
                                  ptr_sbr_data->flt_noise_floor);
512
122k
  }
513
126k
  return IA_NO_ERROR;
514
126k
}
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
21.3k
    ixheaacd_misc_tables *pstr_common_tables) {
521
21.3k
  WORD32 i;
522
21.3k
  WORD32 num_env_sf = ptr_data_left->num_env_sfac;
523
21.3k
  WORD16 temp_left_mant, temp_right_mant, temp_right_plus1_mant, new_left_mant,
524
21.3k
      new_right_mant;
525
21.3k
  WORD16 temp_left_exp, temp_right_exp, temp_rightplus1_exp, new_left_exp,
526
21.3k
      new_right_exp;
527
21.3k
  WORD32 i_end;
528
21.3k
  WORD16 *r_data = ptr_data_right->int_env_sf_arr;
529
21.3k
  WORD16 *l_data = ptr_data_left->int_env_sf_arr;
530
531
553k
  for (i = 0; i < num_env_sf; i++) {
532
531k
    temp_right_mant = (WORD16)(*r_data & MASK_M);
533
531k
    temp_right_exp = (WORD16)(*r_data & MASK_FOR_EXP);
534
535
531k
    temp_right_exp = sub16_m(temp_right_exp, add16_m(18, NRG_EXP_OFFSET));
536
531k
    temp_left_mant = (WORD16)(*l_data & MASK_M);
537
531k
    temp_left_exp = (WORD16)(*l_data & MASK_FOR_EXP);
538
539
531k
    temp_left_exp = sub16_m(temp_left_exp, NRG_EXP_OFFSET);
540
541
531k
    ixheaacd_fix_mant_exp_add(temp_right_mant, temp_right_exp, 0x4000, 1,
542
531k
                              &temp_right_plus1_mant, &temp_rightplus1_exp);
543
544
531k
    new_right_exp = ixheaacd_fix_mant_div(temp_left_mant, temp_right_plus1_mant,
545
531k
                                          &new_right_mant, pstr_common_tables);
546
547
531k
    new_right_exp += temp_left_exp - temp_rightplus1_exp + 2;
548
549
531k
    new_left_mant = ixheaac_mult16_shl(temp_right_mant, new_right_mant);
550
551
531k
    new_left_exp = add16_m(temp_right_exp, new_right_exp);
552
553
531k
    *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) +
554
531k
                         ((new_right_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP));
555
531k
    *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) +
556
531k
                         ((new_left_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP));
557
531k
  }
558
559
21.3k
  i_end = ptr_header_data->pstr_freq_band_data->num_nf_bands *
560
21.3k
          ptr_data_left->str_frame_info_details.num_noise_env;
561
21.3k
  r_data = ptr_data_right->int_noise_floor;
562
21.3k
  l_data = ptr_data_left->int_noise_floor;
563
564
107k
  for (i = i_end - 1; i >= 0; i--) {
565
86.3k
    temp_left_exp =
566
86.3k
        sub16_m((WORD16)(*l_data & (WORD16)MASK_FOR_EXP), NOISE_EXP_OFFSET);
567
86.3k
    temp_right_exp = sub16_m(*r_data, 12);
568
569
86.3k
    ixheaacd_fix_mant_exp_add(0x4000, ixheaac_add16(1, temp_right_exp), 0x4000,
570
86.3k
                              1, &temp_right_plus1_mant, &temp_rightplus1_exp);
571
572
86.3k
    new_right_exp = ixheaacd_fix_mant_div(0x4000, temp_right_plus1_mant,
573
86.3k
                                          &new_right_mant, pstr_common_tables);
574
575
86.3k
    new_right_exp += temp_left_exp - temp_rightplus1_exp + 2;
576
577
86.3k
    new_left_mant = new_right_mant;
578
86.3k
    new_left_exp = add16_m(new_right_exp, temp_right_exp);
579
86.3k
    *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) +
580
86.3k
                         ((new_right_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP));
581
86.3k
    *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) +
582
86.3k
                         ((new_left_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP));
583
86.3k
  }
584
21.3k
}
585
586
VOID ixheaacd_sbr_env_dequant_coup(
587
    ia_sbr_frame_info_data_struct *ptr_data_ch_0,
588
21.3k
    ia_sbr_frame_info_data_struct *ptr_data_ch_1) {
589
21.3k
  FLOAT32 *ptr_env_sf_left = ptr_data_ch_0->flt_env_sf_arr;
590
21.3k
  FLOAT32 *ptr_env_sf_right = ptr_data_ch_1->flt_env_sf_arr;
591
21.3k
  FLOAT32 *ptr_noise_floor_left = ptr_data_ch_0->flt_noise_floor;
592
21.3k
  FLOAT32 *ptr_noise_floor_right = ptr_data_ch_1->flt_noise_floor;
593
21.3k
  WORD32 num_env_sf = ptr_data_ch_0->num_env_sfac;
594
21.3k
  WORD32 num_noise_fac = ptr_data_ch_0->num_noise_sfac;
595
21.3k
  WORD32 amp_res = ptr_data_ch_0->amp_res;
596
597
21.3k
  WORD32 i;
598
21.3k
  FLOAT32 temp_l, temp_r;
599
21.3k
  const FLOAT32 pan_offset[2] = {24.0f, 12.0f};
600
21.3k
  const FLOAT32 a_arr[2] = {0.5f, 1.0f};
601
602
21.3k
  FLOAT32 a = a_arr[amp_res];
603
604
553k
  for (i = 0; i < num_env_sf; i++) {
605
531k
    temp_l = ptr_env_sf_left[i];
606
531k
    temp_r = ptr_env_sf_right[i];
607
608
531k
    ptr_env_sf_left[i] =
609
531k
        (FLOAT32)(64 * (pow(2, temp_l * a + 1) /
610
531k
                        (1 + pow(2, (pan_offset[amp_res] - temp_r) * a))));
611
531k
    ptr_env_sf_right[i] =
612
531k
        (FLOAT32)(64 * (pow(2, temp_l * a + 1) /
613
531k
                        (1 + pow(2, (temp_r - pan_offset[amp_res]) * a))));
614
531k
  }
615
616
107k
  for (i = 0; i < num_noise_fac; i++) {
617
86.3k
    temp_l = ptr_noise_floor_left[i];
618
86.3k
    temp_r = ptr_noise_floor_right[i];
619
620
86.3k
    ptr_noise_floor_left[i] =
621
86.3k
        (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) /
622
86.3k
                  (1 + pow(2, pan_offset[1] - temp_r)));
623
86.3k
    ptr_noise_floor_right[i] =
624
86.3k
        (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) /
625
86.3k
                  (1 + pow(2, temp_r - pan_offset[1])));
626
86.3k
  }
627
21.3k
}
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
170k
                                  WORD32 audio_object_type, WORD32 ec_flag) {
636
170k
  FLAG error_code;
637
170k
  WORD32 err = 0;
638
170k
  WORD16 temp_sfb_nrg_prev[MAX_FREQ_COEFFS];
639
170k
  WORD32 usac_flag = ptr_header_data_ch_0->usac_flag |
640
170k
                     ptr_header_data_ch_0->enh_sbr;
641
642
170k
  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
170k
  err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
647
170k
                              ptr_prev_data_ch_1, ptr_common_tables, audio_object_type, ec_flag);
648
649
170k
  if (err) return err;
650
651
170k
  err = ixheaacd_calc_noise_floor(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
652
170k
                                  ptr_prev_data_ch_0, audio_object_type);
653
170k
  if (err) return err;
654
170k
  if ((!ptr_sbr_data_ch_0->coupling_mode &&
655
170k
     ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) || ldmps_present) {
656
123k
    ptr_sbr_data_ch_0->num_noise_sfac =
657
123k
        ptr_header_data_ch_0->pstr_freq_band_data->num_nf_bands *
658
123k
        ptr_sbr_data_ch_0->str_frame_info_details.num_noise_env;
659
660
123k
    ixheaacd_dequant_esbr_env_data(
661
123k
        ptr_sbr_data_ch_0->flt_env_sf_arr, ptr_sbr_data_ch_0->num_env_sfac,
662
123k
        ptr_sbr_data_ch_0->num_noise_sfac, ptr_sbr_data_ch_0->amp_res,
663
123k
        ptr_sbr_data_ch_0->flt_noise_floor);
664
123k
  }
665
666
170k
  if (ptr_sbr_data_ch_1 != NULL) {
667
71.6k
    error_code = ptr_header_data_ch_0->err_flag;
668
71.6k
    err =
669
71.6k
        ixheaacd_dec_envelope(ptr_header_data_ch_1, ptr_sbr_data_ch_1, ptr_prev_data_ch_1,
670
71.6k
                              ptr_prev_data_ch_0, ptr_common_tables, audio_object_type, ec_flag);
671
672
71.6k
    if (err) return err;
673
674
71.6k
    err = ixheaacd_calc_noise_floor(ptr_header_data_ch_1, ptr_sbr_data_ch_1,
675
71.6k
                                    ptr_prev_data_ch_1, audio_object_type);
676
677
71.6k
    if (err) return err;
678
679
71.6k
    if (!ptr_sbr_data_ch_1->coupling_mode &&
680
71.6k
        ((usac_flag) && (audio_object_type != AOT_ER_AAC_ELD))) {
681
29.5k
      ptr_sbr_data_ch_1->num_noise_sfac =
682
29.5k
          ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
683
29.5k
          ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
684
685
29.5k
      ixheaacd_dequant_esbr_env_data(
686
29.5k
          ptr_sbr_data_ch_1->flt_env_sf_arr, ptr_sbr_data_ch_1->num_env_sfac,
687
29.5k
          ptr_sbr_data_ch_1->num_noise_sfac, ptr_sbr_data_ch_1->amp_res,
688
29.5k
          ptr_sbr_data_ch_1->flt_noise_floor);
689
29.5k
    }
690
71.6k
    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
71.6k
    } else {
703
71.6k
      if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
704
25.4k
        if (!error_code && ptr_header_data_ch_0->err_flag) {
705
2.23k
          err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_prev_data_ch_0,
706
2.23k
                                      ptr_prev_data_ch_1, ptr_common_tables, audio_object_type,
707
2.23k
                                      ec_flag);
708
709
2.23k
          if (err) return err;
710
2.23k
        }
711
25.4k
      }
712
71.6k
    }
713
714
71.6k
    if (ptr_sbr_data_ch_0->coupling_mode) {
715
21.3k
      ptr_sbr_data_ch_0->num_noise_sfac =
716
21.3k
          ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands *
717
21.3k
          ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env;
718
21.3k
      ixheaacd_sbr_env_dequant_coup_fix(ptr_header_data_ch_0, ptr_sbr_data_ch_0,
719
21.3k
                                        ptr_sbr_data_ch_1, ptr_common_tables);
720
721
21.3k
      ixheaacd_sbr_env_dequant_coup(ptr_sbr_data_ch_0, ptr_sbr_data_ch_1);
722
21.3k
    }
723
71.6k
  }
724
725
170k
  return 0;
726
170k
}
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
251k
                                   WORD32 audio_object_type, WORD32 ec_flag) {
733
251k
  FLAG error_code;
734
251k
  WORD32 err;
735
251k
  WORD16 env_sf_local_arr[MAX_FREQ_COEFFS];
736
251k
  WORD32 enh_sbr = ptr_header_data->enh_sbr;
737
251k
  WORD32 usac_flag = enh_sbr | ptr_header_data->usac_flag;
738
251k
  WORD32 temp_1 =
739
251k
      ptr_prev_data_ch_0->end_position - ptr_header_data->num_time_slots;
740
741
251k
  if (temp_1 < 0) return IA_FATAL_ERROR;
742
251k
  temp_1 = ptr_sbr_data->str_frame_info_details.border_vec[0] - temp_1;
743
744
251k
  if ((!ptr_header_data->err_flag_prev) && (!ptr_header_data->err_flag) &&
745
251k
      (temp_1 != 0)) {
746
11.3k
    if (ptr_sbr_data->del_cod_dir_arr[0] == DTDF_DIR_TIME) {
747
1.96k
      ptr_header_data->err_flag = 1;
748
9.39k
    } else {
749
9.39k
      ptr_header_data->err_flag_prev = 1;
750
9.39k
    }
751
11.3k
  }
752
251k
  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
251k
  if (ec_flag && ptr_header_data->err_flag &&
760
251k
      ((!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
251k
  } else if (ptr_header_data->err_flag &&
765
251k
             ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD))) {
766
41.9k
    ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
767
768
41.9k
    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0);
769
209k
  } else {
770
209k
    WORD32 num = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
771
209k
    if (ptr_header_data->err_flag_prev && ((!usac_flag) ||
772
49.6k
        (audio_object_type == AOT_ER_AAC_ELD))) {
773
7.84k
      WORD16 *ptr1, *ptr2;
774
7.84k
      WORD32 i;
775
776
7.84k
      err = ixheaacd_wrong_timing_compensate(ptr_header_data, ptr_sbr_data,
777
7.84k
                                             ptr_prev_data_ch_0,
778
7.84k
                                             pstr_common_tables);
779
780
7.84k
      if (err) return err;
781
782
7.84k
      if (ptr_sbr_data->coupling_mode !=
783
7.84k
          (WORD16)ptr_prev_data_ch_0->coupling_mode) {
784
2.22k
        if (ptr_prev_data_ch_0->coupling_mode == COUPLING_BAL) {
785
351
          memcpy(ptr_prev_data_ch_0->sfb_nrg_prev,
786
351
                 ptr_prev_data_ch_1->sfb_nrg_prev, sizeof(WORD16) * num);
787
1.87k
        } else {
788
1.87k
          if (ptr_sbr_data->coupling_mode == COUPLING_LEVEL) {
789
791
            ptr1 = ptr_prev_data_ch_0->sfb_nrg_prev;
790
791
            ptr2 = ptr_prev_data_ch_1->sfb_nrg_prev;
791
792
11.3k
            for (i = 0; i < num; i++) {
793
10.5k
              *ptr1 = (add16_m(*ptr1, *ptr2) >> 1);
794
10.5k
              ptr2++;
795
10.5k
              ptr1++;
796
10.5k
            }
797
1.08k
          } else {
798
1.08k
            if (ptr_sbr_data->coupling_mode == COUPLING_BAL) {
799
491
              memset(ptr_prev_data_ch_0->sfb_nrg_prev, SBR_ENERGY_PAN_OFFSET,
800
491
                     sizeof(WORD16) * num);
801
491
            }
802
1.08k
          }
803
1.87k
        }
804
2.22k
      }
805
7.84k
    }
806
807
209k
    memcpy(env_sf_local_arr, ptr_prev_data_ch_0->sfb_nrg_prev,
808
209k
           sizeof(WORD16) * MAX_FREQ_COEFFS);
809
810
209k
    ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data,
811
209k
                                      ptr_prev_data_ch_0);
812
813
209k
    if ((!usac_flag)||(audio_object_type == AOT_ER_AAC_ELD)) {
814
26.1k
      error_code = ixheaacd_check_env_data(ptr_header_data, ptr_sbr_data,
815
26.1k
                                           ptr_prev_data_ch_0);
816
817
26.1k
      if (error_code) {
818
6.98k
        ptr_header_data->err_flag = 1;
819
820
6.98k
        memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, env_sf_local_arr,
821
6.98k
               sizeof(WORD16) * MAX_FREQ_COEFFS);
822
823
6.98k
        err = ixheaacd_dec_envelope(ptr_header_data, ptr_sbr_data, ptr_prev_data_ch_0,
824
6.98k
                                    ptr_prev_data_ch_1, pstr_common_tables, audio_object_type,
825
6.98k
                                    ec_flag);
826
827
6.98k
        if (err) return err;
828
6.98k
        return 0;
829
6.98k
      }
830
26.1k
    }
831
209k
  }
832
244k
  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
244k
  } else {
837
244k
    if ((!usac_flag) || (audio_object_type == AOT_ER_AAC_ELD)) {
838
61.0k
      ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res);
839
61.0k
    }
840
244k
  }
841
842
244k
  return 0;
843
251k
}
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
838k
                           ia_sbr_tables_struct *ptr_sbr_tables) {
854
838k
  WORD16 k;
855
838k
  WORD16 *ptr_smoothed_gain, *ptr_smoothed_noise;
856
838k
  WORD16 direct_ratio;
857
838k
  WORD32 index = *ptr_phase_index;
858
838k
  WORD32 harm_idx = *ptr_harm_index;
859
838k
  WORD32 freq_inv_flag;
860
838k
  const WORD32 *ptr_rand_ph_buf;
861
838k
  WORD32 factor = 0;
862
863
838k
  direct_ratio = ixheaac_sub16_sat(0x7fff, smooth_ratio);
864
838k
  freq_inv_flag = (sub_band_start & 1);
865
866
838k
  scale_change = scale_change - 1;
867
868
838k
  ptr_rand_ph_buf = &ptr_sbr_tables->sbr_rand_ph[index];
869
838k
  *ptr_phase_index =
870
838k
      (WORD16)((index + num_sub_bands) & (SBR_NF_NO_RANDOM_VAL - 1));
871
872
838k
  if (smooth_ratio) {
873
74.2k
    WORD16 *ptr_filt_buf_local = &ptr_filt_buf[0];
874
74.2k
    WORD16 *ptr_gain_buf_local = &ptr_gain_buf[0];
875
74.2k
    WORD16 *ptr_filt_noise_local = &ptr_filt_buf_noise[0];
876
74.2k
    WORD16 *ptr_noise_floor_local = &ptr_noise_floor[0];
877
878
74.2k
    WORD16 tmp, tmp1;
879
880
1.80M
    for (k = 0; k < num_sub_bands; k++) {
881
1.73M
      tmp = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_buf_local),
882
1.73M
                    mult16x16_16(direct_ratio, *ptr_gain_buf_local++));
883
884
1.73M
      ptr_gain_buf_local++;
885
886
1.73M
      tmp1 = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_noise_local),
887
1.73M
                     mult16x16_16(direct_ratio, *ptr_noise_floor_local++));
888
889
1.73M
      ptr_noise_floor_local++;
890
891
1.73M
      *ptr_filt_buf_local++ = tmp << 1;
892
1.73M
      ptr_filt_buf_local++;
893
1.73M
      *ptr_filt_noise_local++ = tmp1 << 1;
894
1.73M
    }
895
74.2k
    ptr_smoothed_gain = ptr_filt_buf;
896
74.2k
    ptr_smoothed_noise = ptr_filt_buf_noise;
897
74.2k
    factor = 1;
898
763k
  } else {
899
763k
    ptr_smoothed_gain = ptr_gain_buf;
900
763k
    ptr_smoothed_noise = ptr_noise_floor;
901
763k
    factor = 2;
902
763k
  }
903
904
838k
  switch (harm_idx) {
905
210k
    case 0:
906
420k
    case 2:
907
420k
      ixheaacd_harm_idx_zerotwo(num_noise_flg, num_sub_bands, ptr_buf_real,
908
420k
                                ptr_buf_imag, ptr_smoothed_gain,
909
420k
                                ptr_smoothed_noise, factor, ptr_gain_buf,
910
420k
                                scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf,
911
420k
                                noise_floor_exp, harm_idx);
912
420k
      break;
913
210k
    case 1:
914
417k
    case 3:
915
417k
      ixheaacd_harm_idx_onethree(
916
417k
          num_noise_flg, num_sub_bands, ptr_buf_real, ptr_buf_imag,
917
417k
          ptr_smoothed_gain, ptr_smoothed_noise, factor, ptr_gain_buf,
918
417k
          scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf, noise_floor_exp,
919
417k
          freq_inv_flag, harm_idx);
920
417k
      break;
921
838k
  }
922
838k
  *ptr_harm_index = (WORD16)((harm_idx + 1) & 3);
923
838k
}