Coverage Report

Created: 2026-05-30 06:39

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