/src/libxaac/encoder/ixheaace_sbr_env_est.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2023 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 | | |
21 | | #include <string.h> |
22 | | #include <math.h> |
23 | | #include <limits.h> |
24 | | |
25 | | #include "ixheaac_type_def.h" |
26 | | #include "ixheaac_constants.h" |
27 | | #include "ixheaace_aac_constants.h" |
28 | | #include "ixheaac_error_standards.h" |
29 | | #include "ixheaace_error_codes.h" |
30 | | #include "ixheaac_basic_ops32.h" |
31 | | #include "ixheaac_basic_ops16.h" |
32 | | #include "ixheaac_basic_ops40.h" |
33 | | #include "ixheaac_basic_ops.h" |
34 | | |
35 | | #include "ixheaace_sbr_header.h" |
36 | | #include "ixheaace_sbr_def.h" |
37 | | #include "ixheaace_resampler.h" |
38 | | |
39 | | #include "ixheaace_sbr_rom.h" |
40 | | #include "ixheaace_common_rom.h" |
41 | | #include "ixheaace_sbr_hbe.h" |
42 | | #include "ixheaace_sbr_qmf_enc.h" |
43 | | #include "ixheaace_sbr_tran_det.h" |
44 | | #include "ixheaace_sbr_frame_info_gen.h" |
45 | | #include "ixheaace_sbr_env_est.h" |
46 | | #include "ixheaace_sbr_code_envelope.h" |
47 | | #include "ixheaace_sbr_main.h" |
48 | | #include "ixheaace_sbr_missing_harmonics_det.h" |
49 | | #include "ixheaace_sbr_inv_filtering_estimation.h" |
50 | | #include "ixheaace_sbr_noise_floor_est.h" |
51 | | |
52 | | #include "ixheaace_common_rom.h" |
53 | | #include "ixheaace_sbr_ton_corr.h" |
54 | | #include "iusace_esbr_pvc.h" |
55 | | #include "iusace_esbr_inter_tes.h" |
56 | | #include "ixheaace_sbr.h" |
57 | | |
58 | | #include "ixheaace_bitbuffer.h" |
59 | | |
60 | | #include "ixheaace_sbr_cmondata.h" |
61 | | #include "ixheaace_sbr_write_bitstream.h" |
62 | | |
63 | | #include "ixheaace_sbr_hybrid.h" |
64 | | #include "ixheaace_sbr_ps_enc.h" |
65 | | |
66 | | #include "ixheaace_common_utils.h" |
67 | | |
68 | | #include "ixheaace_sbr_header.h" |
69 | | #include "ixheaace_sbr_def.h" |
70 | | #include "ixheaace_resampler.h" |
71 | | #include "ixheaace_sbr_rom.h" |
72 | | #include "ixheaace_common_rom.h" |
73 | | #include "ixheaace_sbr_hbe.h" |
74 | | #include "ixheaace_sbr_qmf_enc.h" |
75 | | #include "ixheaace_sbr_tran_det.h" |
76 | | #include "ixheaace_sbr_frame_info_gen.h" |
77 | | #include "ixheaace_sbr_env_est.h" |
78 | | #include "ixheaace_sbr_code_envelope.h" |
79 | | #include "ixheaace_psy_const.h" |
80 | | #include "ixheaace_tns.h" |
81 | | #include "ixheaace_tns_params.h" |
82 | | #include "ixheaace_rom.h" |
83 | | #include "ixheaace_common_rom.h" |
84 | | #include "ixheaace_bitbuffer.h" |
85 | | |
86 | | #include "ixheaace_sbr_main.h" |
87 | | #include "ixheaace_common_rom.h" |
88 | | #include "ixheaace_sbr_missing_harmonics_det.h" |
89 | | #include "ixheaace_sbr_inv_filtering_estimation.h" |
90 | | #include "ixheaace_sbr_noise_floor_est.h" |
91 | | #include "ixheaace_sbr_ton_corr.h" |
92 | | #include "iusace_esbr_pvc.h" |
93 | | #include "ixheaace_sbr.h" |
94 | | |
95 | | #include "ixheaace_sbr_freq_scaling.h" |
96 | | |
97 | | #include "ixheaace_bitbuffer.h" |
98 | | |
99 | | #include "ixheaace_sbr_hybrid.h" |
100 | | #include "ixheaace_sbr_ps_enc.h" |
101 | | |
102 | | #include "ixheaace_sbr_crc.h" |
103 | | #include "ixheaace_sbr_cmondata.h" |
104 | | #include "ixheaace_sbr_enc_struct.h" |
105 | | #include "ixheaace_sbr_write_bitstream.h" |
106 | | |
107 | | #include "ixheaace_common_utils.h" |
108 | | |
109 | 2.86M | static WORD32 ixheaace_map_panorama(WORD32 nrg_val, WORD32 amp_res, WORD32 *ptr_quant_error) { |
110 | 2.86M | WORD32 i = 0; |
111 | 2.86M | ; |
112 | 2.86M | WORD32 min_val, val; |
113 | 2.86M | WORD32 pan_tab[2][10] = {{0, 2, 4, 6, 8, 12, 16, 20, 24}, {0, 2, 4, 8, 12}}; |
114 | 2.86M | WORD32 max_index[2] = {9, 5}; |
115 | | |
116 | 2.86M | WORD32 pan_index; |
117 | 2.86M | WORD32 sign; |
118 | | |
119 | 2.86M | sign = nrg_val > 0 ? 1 : -1; |
120 | | |
121 | 2.86M | nrg_val = sign * nrg_val; |
122 | | |
123 | 2.86M | min_val = INT_MAX; |
124 | 2.86M | pan_index = 0; |
125 | | |
126 | 19.1M | while (i < max_index[amp_res]) { |
127 | 16.2M | val = ixheaac_abs32(nrg_val - pan_tab[amp_res][i]); |
128 | 16.2M | if (val < min_val) { |
129 | 3.23M | min_val = val; |
130 | 3.23M | pan_index = i; |
131 | 3.23M | } |
132 | 16.2M | i++; |
133 | 16.2M | } |
134 | | |
135 | 2.86M | *ptr_quant_error = min_val; |
136 | | |
137 | 2.86M | return pan_tab[amp_res][max_index[amp_res] - 1] + sign * pan_tab[amp_res][pan_index]; |
138 | 2.86M | } |
139 | | |
140 | | static VOID ixheaace_sbr_noise_floor_levels_quantisation(WORD32 *ptr_noise_levels, |
141 | | FLOAT32 *ptr_flt_noise_levels, |
142 | 911k | WORD32 coupling) { |
143 | 911k | WORD32 i = 0; |
144 | 911k | WORD32 dummy; |
145 | | |
146 | 10.0M | while (i < MAXIMUM_NUM_NOISE_VALUES) { |
147 | 9.11M | WORD32 tmp; |
148 | | |
149 | 9.11M | tmp = ptr_flt_noise_levels[i] > 30.0f ? 30 : (WORD32)(ptr_flt_noise_levels[i] + 0.5f); |
150 | | |
151 | 9.11M | if (coupling) { |
152 | 1.18M | tmp = tmp < -30 ? -30 : tmp; |
153 | 1.18M | tmp = ixheaace_map_panorama(tmp, 1, &dummy); |
154 | 1.18M | } |
155 | 9.11M | ptr_noise_levels[i] = tmp; |
156 | | |
157 | 9.11M | i++; |
158 | 9.11M | } |
159 | 911k | } |
160 | | |
161 | | static VOID ixheaace_couple_noise_floor(FLOAT32 *ptr_noise_lvl_left, |
162 | 118k | FLOAT32 *ptr_noise_lvl_right) { |
163 | 118k | WORD32 i = 0; |
164 | | |
165 | 1.30M | while (i < MAXIMUM_NUM_NOISE_VALUES) { |
166 | 1.18M | FLOAT32 pow_left, pow_right; |
167 | | |
168 | 1.18M | pow_left = (FLOAT32)pow(2.0f, (SBR_NOISE_FLOOR_OFFSET - ptr_noise_lvl_left[i])); |
169 | 1.18M | pow_right = (FLOAT32)pow(2.0f, (SBR_NOISE_FLOOR_OFFSET - ptr_noise_lvl_right[i])); |
170 | | |
171 | 1.18M | ptr_noise_lvl_right[i] -= ptr_noise_lvl_left[i]; |
172 | 1.18M | ptr_noise_lvl_left[i] = |
173 | 1.18M | (FLOAT32)(SBR_NOISE_FLOOR_OFFSET - log((pow_left * pow_right) / 2) * SBR_INV_LOG_2); |
174 | 1.18M | i++; |
175 | 1.18M | } |
176 | 118k | } |
177 | | |
178 | | static IA_ERRORCODE ixheaace_calculate_sbr_envelope( |
179 | | FLOAT32 **ptr_y_buf_left, FLOAT32 **ptr_y_buf_right, |
180 | | const ixheaace_str_frame_info_sbr *pstr_const_frame_info, WORD32 *ptr_sfb_ene_l, |
181 | | WORD32 *ptr_sfb_ene_r, ixheaace_pstr_sbr_config_data pstr_sbr_cfg, |
182 | | ixheaace_pstr_enc_channel pstr_sbr, ixheaace_sbr_stereo_mode stereo_mode, |
183 | 793k | WORD32 *ptr_max_quant_err) { |
184 | 793k | WORD32 i, j, k, l, count, m = 0; |
185 | 793k | WORD32 num_bands, start_pos, stop_pos, li, ui; |
186 | 793k | ixheaace_freq_res freq_res; |
187 | | |
188 | 793k | WORD32 ca = 2 - pstr_sbr->enc_env_data.init_sbr_amp_res; |
189 | 793k | WORD32 n_envelopes = pstr_const_frame_info->n_envelopes; |
190 | 793k | WORD32 short_env = pstr_const_frame_info->short_env - 1; |
191 | 793k | WORD32 time_step = pstr_sbr->str_sbr_extract_env.time_step; |
192 | 793k | WORD32 missing_harmonic = 0; |
193 | | |
194 | 793k | if ((ca != 1) && (ca != 2)) { |
195 | 0 | return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_AMP_RES; |
196 | 0 | } |
197 | | |
198 | 793k | if (stereo_mode == SBR_COUPLING) { |
199 | 118k | *ptr_max_quant_err = 0; |
200 | 118k | } |
201 | | |
202 | 793k | i = 0; |
203 | 2.01M | while (i < n_envelopes) { |
204 | 1.22M | start_pos = pstr_const_frame_info->borders[i]; |
205 | 1.22M | stop_pos = pstr_const_frame_info->borders[i + 1]; |
206 | 1.22M | freq_res = pstr_const_frame_info->freq_res[i]; |
207 | 1.22M | num_bands = pstr_sbr_cfg->num_scf[freq_res]; |
208 | | |
209 | 1.22M | if (i == short_env) { |
210 | 153k | if (pstr_sbr_cfg->is_ld_sbr) { |
211 | 52.0k | WORD32 temp = 2; |
212 | 52.0k | if (temp < time_step) { |
213 | 0 | temp = time_step; |
214 | 0 | } |
215 | 52.0k | if (stop_pos - start_pos > temp) { |
216 | 50.9k | stop_pos = stop_pos - temp; |
217 | 50.9k | } |
218 | 101k | } else { |
219 | 101k | stop_pos = stop_pos - 1; |
220 | 101k | } |
221 | 153k | } |
222 | 14.0M | for (j = 0; j < num_bands; j++) { |
223 | 12.8M | FLOAT32 energy_left = 0, energy_right = 0, tmp_ene_l = 0, tmp_ene_r = 0; |
224 | 12.8M | li = pstr_sbr_cfg->ptr_freq_band_tab[freq_res][j]; |
225 | 12.8M | ui = pstr_sbr_cfg->ptr_freq_band_tab[freq_res][j + 1]; |
226 | | |
227 | 12.8M | if ((freq_res == FREQ_RES_HIGH) && (j == 0 && ui - li > 1)) { |
228 | 145k | li++; |
229 | 12.7M | } else { |
230 | 12.7M | if (j == 0 && ui - li > 2) { |
231 | 115k | li++; |
232 | 115k | } |
233 | 12.7M | } |
234 | | |
235 | 12.8M | missing_harmonic = 0; |
236 | | |
237 | 12.8M | if (pstr_sbr->enc_env_data.add_harmonic_flag) { |
238 | 6.83M | if (freq_res == FREQ_RES_HIGH) { |
239 | 4.92M | if (pstr_sbr->enc_env_data.add_harmonic[j]) { |
240 | 1.43M | missing_harmonic = 1; |
241 | 1.43M | } |
242 | 4.92M | } else { |
243 | 1.91M | WORD32 band; |
244 | 1.91M | WORD32 start_band_high = 0; |
245 | 1.91M | WORD32 stop_band_high = 0; |
246 | | |
247 | 12.0M | while (pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_HIGH][start_band_high] < |
248 | 12.0M | pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_LOW][j]) { |
249 | 10.1M | start_band_high++; |
250 | 10.1M | } |
251 | | |
252 | 15.8M | while (pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_HIGH][stop_band_high] < |
253 | 15.8M | pstr_sbr_cfg->ptr_freq_band_tab[FREQ_RES_LOW][j + 1]) { |
254 | 13.9M | stop_band_high++; |
255 | 13.9M | } |
256 | | |
257 | 5.74M | for (band = start_band_high; band < stop_band_high; band++) { |
258 | 3.83M | if (pstr_sbr->enc_env_data.add_harmonic[band]) { |
259 | 994k | missing_harmonic = 1; |
260 | 994k | } |
261 | 3.83M | } |
262 | 1.91M | } |
263 | 6.83M | } |
264 | | |
265 | 12.8M | if (missing_harmonic) { |
266 | 2.32M | count = stop_pos - start_pos; |
267 | 24.3M | for (l = start_pos; l < stop_pos; l++) { |
268 | 22.0M | if (pstr_sbr_cfg->is_ld_sbr) { |
269 | 1.99M | energy_left += ptr_y_buf_left[l >> 1][li]; |
270 | 20.0M | } else { |
271 | 20.0M | energy_left += ptr_y_buf_left[l][li]; |
272 | 20.0M | } |
273 | 22.0M | } |
274 | | |
275 | 2.32M | k = li + 1; |
276 | 5.99M | while (k < ui) { |
277 | 3.67M | tmp_ene_l = 0.0f; |
278 | 32.9M | for (l = start_pos; l < stop_pos; l++) { |
279 | 29.2M | if (pstr_sbr_cfg->is_ld_sbr) { |
280 | 3.95M | tmp_ene_l += ptr_y_buf_left[l >> 1][k]; |
281 | 25.3M | } else { |
282 | 25.3M | tmp_ene_l += ptr_y_buf_left[l][k]; |
283 | 25.3M | } |
284 | 29.2M | } |
285 | | |
286 | 3.67M | if (tmp_ene_l > energy_left) { |
287 | 784k | energy_left = tmp_ene_l; |
288 | 784k | } |
289 | 3.67M | k++; |
290 | 3.67M | } |
291 | | |
292 | 2.32M | if (ui - li > 2) { |
293 | 841k | energy_left = energy_left * 0.398107267f; |
294 | 1.48M | } else { |
295 | 1.48M | if (ui - li > 1) { |
296 | 1.05M | energy_left = energy_left * 0.5f; |
297 | 1.05M | } |
298 | 1.48M | } |
299 | | |
300 | 2.32M | if (stereo_mode == SBR_COUPLING) { |
301 | 2.92M | for (l = start_pos; l < stop_pos; l++) { |
302 | 2.62M | if (pstr_sbr_cfg->is_ld_sbr) { |
303 | 410k | energy_right += ptr_y_buf_right[l >> 1][li]; |
304 | 2.21M | } else { |
305 | 2.21M | energy_right += ptr_y_buf_right[l][li]; |
306 | 2.21M | } |
307 | 2.62M | } |
308 | | |
309 | 299k | k = li + 1; |
310 | 821k | while (k < ui) { |
311 | 522k | tmp_ene_r = 0.0f; |
312 | 4.64M | for (l = start_pos; l < stop_pos; l++) { |
313 | 4.12M | if (pstr_sbr_cfg->is_ld_sbr) { |
314 | 851k | tmp_ene_r += ptr_y_buf_right[l >> 1][k]; |
315 | 3.27M | } else { |
316 | 3.27M | tmp_ene_r += ptr_y_buf_right[l][k]; |
317 | 3.27M | } |
318 | 4.12M | } |
319 | | |
320 | 522k | if (tmp_ene_r > energy_right) { |
321 | 93.8k | energy_right = tmp_ene_r; |
322 | 93.8k | } |
323 | 522k | k++; |
324 | 522k | } |
325 | | |
326 | 299k | if (ui - li > 2) { |
327 | 123k | energy_right = energy_right * 0.398107267f; |
328 | 175k | } else { |
329 | 175k | if (ui - li > 1) { |
330 | 133k | energy_right = energy_right * 0.5f; |
331 | 133k | } |
332 | 175k | } |
333 | 299k | tmp_ene_l = energy_left; |
334 | 299k | energy_left = (energy_left + energy_right) * 0.5f; |
335 | 299k | energy_right = ((tmp_ene_l * time_step) + 1) / ((energy_right * time_step) + 1); |
336 | 299k | } |
337 | 10.5M | } else { |
338 | 10.5M | count = (stop_pos - start_pos) * (ui - li); |
339 | | |
340 | 10.5M | k = li; |
341 | 37.7M | while (k < ui) { |
342 | 321M | for (l = start_pos; l < stop_pos; l++) { |
343 | 293M | energy_left += ptr_y_buf_left[l][k]; |
344 | 293M | } |
345 | 27.2M | k++; |
346 | 27.2M | } |
347 | | |
348 | 10.5M | if (stereo_mode == SBR_COUPLING) { |
349 | 1.38M | k = li; |
350 | 4.99M | while (k < ui) { |
351 | 41.6M | for (l = start_pos; l < stop_pos; l++) { |
352 | 38.0M | if (pstr_sbr_cfg->is_ld_sbr) { |
353 | 16.2M | energy_right += ptr_y_buf_right[l >> 1][k]; |
354 | 21.8M | } else { |
355 | 21.8M | energy_right += ptr_y_buf_right[l][k]; |
356 | 21.8M | } |
357 | 38.0M | } |
358 | 3.61M | k++; |
359 | 3.61M | } |
360 | 1.38M | tmp_ene_l = energy_left; |
361 | 1.38M | energy_left = (energy_left + energy_right) * 0.5f; |
362 | 1.38M | energy_right = ((tmp_ene_l * time_step) + 1) / ((energy_right * time_step) + 1); |
363 | 1.38M | } |
364 | 10.5M | } |
365 | | |
366 | 12.8M | energy_left = (FLOAT32)(log((energy_left / (count * 64)) + EPS) * SBR_INV_LOG_2); |
367 | | |
368 | 12.8M | if (energy_left < 0.0f) { |
369 | 4.13M | energy_left = 0.0f; |
370 | 4.13M | } |
371 | | |
372 | 12.8M | ptr_sfb_ene_l[m] = (WORD32)(ca * energy_left + 0.5); |
373 | | |
374 | 12.8M | if (stereo_mode == SBR_COUPLING) { |
375 | 1.68M | WORD32 quant_err; |
376 | 1.68M | energy_right = (FLOAT32)(log(energy_right) * SBR_INV_LOG_2); |
377 | 1.68M | ptr_sfb_ene_r[m] = |
378 | 1.68M | ixheaace_map_panorama((WORD32)((FLOAT32)ca * energy_right), |
379 | 1.68M | pstr_sbr->enc_env_data.init_sbr_amp_res, &quant_err); |
380 | 1.68M | if (quant_err > *ptr_max_quant_err) { |
381 | 27.7k | *ptr_max_quant_err = quant_err; |
382 | 27.7k | } |
383 | 1.68M | } |
384 | 12.8M | m++; |
385 | 12.8M | } |
386 | | |
387 | 1.22M | if (pstr_sbr_cfg->use_parametric_coding) { |
388 | 940k | m -= num_bands; |
389 | | |
390 | 12.0M | for (j = 0; j < num_bands; j++) { |
391 | 11.0M | if (freq_res == FREQ_RES_HIGH && pstr_sbr->str_sbr_extract_env.envelope_compensation[j]) { |
392 | 553k | ptr_sfb_ene_l[m] -= |
393 | 553k | (WORD32)(ca * |
394 | 553k | ixheaac_abs32(pstr_sbr->str_sbr_extract_env.envelope_compensation[j])); |
395 | 553k | } |
396 | | |
397 | 11.0M | if (ptr_sfb_ene_l[m] < 0) { |
398 | 269k | ptr_sfb_ene_l[m] = 0; |
399 | 269k | } |
400 | 11.0M | m++; |
401 | 11.0M | } |
402 | 940k | } |
403 | 1.22M | i++; |
404 | 1.22M | } |
405 | 793k | return IA_NO_ERROR; |
406 | 793k | } |
407 | | static WORD32 ixheaace_get_pitch_bin_deint(FLOAT32 *ptr_fft_data_real, FLOAT32 *ptr_fft_data_im, |
408 | 52.0k | const WORD32 *ptr_sfb_tab, WORD32 is_4_1) { |
409 | 52.0k | WORD32 i, j = 0, k = 0; |
410 | 52.0k | WORD32 bin = -1; |
411 | 52.0k | FLOAT32 tmp, prev_val = 0.0f; |
412 | | |
413 | 248k | while (ptr_sfb_tab[j] != -1) { |
414 | 242k | WORD32 size = ptr_sfb_tab[j]; |
415 | 242k | tmp = 0; |
416 | | |
417 | 8.64M | for (i = 0; i < size; i++) { |
418 | 8.40M | tmp += ptr_fft_data_real[k / 2] * ptr_fft_data_real[k / 2]; |
419 | 8.40M | tmp += ptr_fft_data_im[k / 2] * ptr_fft_data_im[k / 2]; |
420 | 8.40M | k += 2; |
421 | 8.40M | } |
422 | | |
423 | 242k | tmp = (FLOAT32)log(max(MIN_FLT_VAL, (tmp / (FLOAT32)size))); |
424 | 242k | if (j != 0) { |
425 | 190k | if (fabs(tmp - prev_val) >= 3.0f) { |
426 | 45.6k | if (1 == is_4_1) { |
427 | 45.6k | bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 8; |
428 | 45.6k | } else { |
429 | 0 | bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 4; |
430 | 0 | } |
431 | 45.6k | if (bin > 127) { |
432 | 588 | bin = -1; |
433 | 588 | } |
434 | 45.6k | break; |
435 | 45.6k | } |
436 | 190k | } |
437 | 196k | prev_val = tmp; |
438 | 196k | j++; |
439 | 196k | } |
440 | | |
441 | 52.0k | return bin; |
442 | 52.0k | } |
443 | | static WORD32 ixheaace_get_pitch_bin(FLOAT32 *fft_data, const WORD32 *ptr_sfb_tab, |
444 | 182k | WORD32 is_4_1) { |
445 | 182k | WORD32 i, j = 0, k = 0; |
446 | 182k | WORD32 bin = -1; |
447 | 182k | FLOAT32 tmp, prev_val = 0; |
448 | | |
449 | 1.07M | while (ptr_sfb_tab[j] != -1) { |
450 | 1.04M | WORD32 size = ptr_sfb_tab[j]; |
451 | 1.04M | tmp = 0; |
452 | | |
453 | 35.9M | for (i = 0; i < size; i++) { |
454 | 34.9M | tmp += fft_data[k] * fft_data[k]; |
455 | 34.9M | tmp += fft_data[k + 1] * fft_data[k + 1]; |
456 | 34.9M | k += 2; |
457 | 34.9M | } |
458 | | |
459 | 1.04M | tmp = (FLOAT32)log(MAX(MIN_FLT_VAL, (tmp / (FLOAT32)size))); |
460 | 1.04M | if (j != 0) { |
461 | 860k | if (fabs(tmp - prev_val) >= 3.0f) { |
462 | 152k | if (1 == is_4_1) { |
463 | 0 | bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 8; |
464 | 152k | } else { |
465 | 152k | bin = ((k - (ptr_sfb_tab[j] * 2)) * 3) / 4; |
466 | 152k | } |
467 | 152k | if (bin > 127) { |
468 | 2.42k | bin = -1; |
469 | 2.42k | } |
470 | 152k | break; |
471 | 152k | } |
472 | 860k | } |
473 | 890k | prev_val = tmp; |
474 | 890k | j++; |
475 | 890k | } |
476 | | |
477 | 182k | return bin; |
478 | 182k | } |
479 | | static IA_ERRORCODE ixheaace_hbe_get_pitch_bins(FLOAT32 *ptr_time_in, |
480 | | ixheaace_pstr_sbr_config_data pstr_sbr_cfg, |
481 | | FLOAT32 *ptr_esbr_scr, |
482 | | ixheaace_str_sbr_tabs *ptr_sbr_tab, |
483 | | WORD32 time_sn_stride, WORD32 num_samples, |
484 | 92.1k | WORD32 *bin1, WORD32 *bin2) { |
485 | 92.1k | const WORD32 *ptr_sbr_table = NULL; |
486 | 92.1k | FLOAT32 *ptr_esbr_inp = ptr_esbr_scr; |
487 | 92.1k | ptr_esbr_scr += num_samples * 2; |
488 | 92.1k | FLOAT32 *ptr_esbr_inp_i = ptr_esbr_inp + num_samples; |
489 | 92.1k | FLOAT32 *ptr_scratch_fft = ptr_esbr_scr; |
490 | 92.1k | WORD32 idx, sf, is_4_1 = 0; |
491 | | |
492 | 92.1k | sf = pstr_sbr_cfg->sample_freq; |
493 | 92.1k | if (IXHEAACE_MAX_NUM_SAMPLES == num_samples) { |
494 | 41.1k | sf = sf >> 1; |
495 | 41.1k | is_4_1 = 1; |
496 | 41.1k | } |
497 | | |
498 | 92.1k | switch (sf) { |
499 | 5.90k | case 16000: |
500 | 5.90k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_8k; |
501 | 5.90k | break; |
502 | 17.1k | case 22050: |
503 | 17.1k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_11k; |
504 | 17.1k | break; |
505 | 22.6k | case 24000: |
506 | 22.6k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_12k; |
507 | 22.6k | break; |
508 | 16.4k | case 32000: |
509 | 16.4k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_16k; |
510 | 16.4k | break; |
511 | 10.0k | case 44100: |
512 | 10.0k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_22k; |
513 | 10.0k | break; |
514 | 19.0k | case 48000: |
515 | 19.0k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_24k; |
516 | 19.0k | break; |
517 | 1.00k | default: |
518 | 1.00k | return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_SAMP_FREQ; |
519 | 92.1k | } |
520 | 91.1k | if (1 == pstr_sbr_cfg->num_ch) { |
521 | 60.7k | if (num_samples == 2048) { |
522 | 31.1M | for (idx = 0; idx < num_samples; idx += 2) { |
523 | 31.1M | ptr_esbr_inp[idx] = ptr_time_in[time_sn_stride * idx]; |
524 | 31.1M | ptr_esbr_inp[idx + 1] = 0; |
525 | 31.1M | ptr_esbr_inp[num_samples + idx] = ptr_time_in[time_sn_stride * (idx + 1)]; |
526 | 31.1M | ptr_esbr_inp[num_samples + idx + 1] = 0; |
527 | 31.1M | } |
528 | 30.3k | iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft); |
529 | 30.3k | *bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1); |
530 | 30.3k | } else if (num_samples == IXHEAACE_MAX_NUM_SAMPLES) { |
531 | 30.3k | memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0])); |
532 | 62.1M | for (idx = 0; idx < num_samples; idx += 2) { |
533 | 62.1M | ptr_esbr_inp[idx / 2] = ptr_time_in[time_sn_stride * idx]; |
534 | 62.1M | ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[time_sn_stride * (idx + 1)]; |
535 | 62.1M | } |
536 | 30.3k | iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft); |
537 | 30.3k | *bin1 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1); |
538 | 30.3k | } |
539 | 60.7k | } else { |
540 | 30.4k | if (num_samples == 2048) { |
541 | 20.1M | for (idx = 0; idx < num_samples; idx += 2) { |
542 | 20.0M | ptr_esbr_inp[idx] = ptr_time_in[2 * idx]; |
543 | 20.0M | ptr_esbr_inp[idx + 1] = 0; |
544 | 20.0M | ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 2]; |
545 | 20.0M | ptr_esbr_inp[num_samples + idx + 1] = 0; |
546 | 20.0M | } |
547 | 19.6k | iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft); |
548 | 19.6k | *bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1); |
549 | | |
550 | 20.1M | for (idx = 0; idx < num_samples; idx += 2) { |
551 | 20.0M | ptr_esbr_inp[idx] = ptr_time_in[2 * idx + 1]; |
552 | 20.0M | ptr_esbr_inp[idx + 1] = 0; |
553 | 20.0M | ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 3]; |
554 | 20.0M | ptr_esbr_inp[num_samples + idx + 1] = 0; |
555 | 20.0M | } |
556 | 19.6k | iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft); |
557 | 19.6k | *bin2 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, is_4_1); |
558 | 19.6k | } else if (num_samples == IXHEAACE_MAX_NUM_SAMPLES) { |
559 | 10.8k | memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0])); |
560 | 22.2M | for (idx = 0; idx < num_samples; idx += 2) { |
561 | 22.2M | ptr_esbr_inp[idx / 2] = ptr_time_in[2 * idx]; |
562 | 22.2M | ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[2 * idx + 2]; |
563 | 22.2M | } |
564 | 10.8k | iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft); |
565 | 10.8k | *bin1 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1); |
566 | | |
567 | 10.8k | memset(ptr_esbr_inp_i, 0, num_samples * sizeof(ptr_esbr_inp_i[0])); |
568 | 22.2M | for (idx = 0; idx < num_samples; idx += 2) { |
569 | 22.2M | ptr_esbr_inp[idx / 2] = ptr_time_in[2 * idx + 1]; |
570 | 22.2M | ptr_esbr_inp[(num_samples + idx) / 2] = ptr_time_in[2 * idx + 3]; |
571 | 22.2M | } |
572 | 10.8k | iusace_complex_fft_4096(ptr_esbr_inp, ptr_esbr_inp_i, ptr_scratch_fft); |
573 | 10.8k | *bin2 = ixheaace_get_pitch_bin_deint(ptr_esbr_inp, ptr_esbr_inp_i, ptr_sbr_table, is_4_1); |
574 | 10.8k | } |
575 | 30.4k | } |
576 | 91.1k | return IA_NO_ERROR; |
577 | 92.1k | } |
578 | | static IA_ERRORCODE ixheaace_update_esbr_ext_data( |
579 | | FLOAT32 *ptr_time_in, ixheaace_pstr_sbr_config_data pstr_sbr_cfg, FLOAT32 *ptr_esbr_scr, |
580 | | ixheaace_str_esbr_bs_data *pstr_esbr, WORD32 transient_info[][3], |
581 | | ixheaace_str_sbr_tabs *ptr_sbr_tab, WORD32 coupling, WORD32 time_sn_stride, |
582 | 76.8k | WORD32 num_samples) { |
583 | 76.8k | WORD32 bin, bin1; |
584 | 76.8k | const WORD32 *ptr_sbr_table = NULL; |
585 | 76.8k | FLOAT32 *ptr_esbr_inp = ptr_esbr_scr; |
586 | 76.8k | ptr_esbr_scr += num_samples * 2; |
587 | 76.8k | FLOAT32 *ptr_scratch_fft = ptr_esbr_scr; |
588 | 76.8k | WORD32 idx; |
589 | 76.8k | switch (pstr_sbr_cfg->sample_freq) { |
590 | 0 | case 16000: |
591 | 0 | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_8k; |
592 | 0 | break; |
593 | 0 | case 22050: |
594 | 0 | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_11k; |
595 | 0 | break; |
596 | 0 | case 24000: |
597 | 0 | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_12k; |
598 | 0 | break; |
599 | 18.0k | case 32000: |
600 | 18.0k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_16k; |
601 | 18.0k | break; |
602 | 33.0k | case 44100: |
603 | 33.0k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_22k; |
604 | 33.0k | break; |
605 | 25.7k | case 48000: |
606 | 25.7k | ptr_sbr_table = ptr_sbr_tab->ptr_esbr_sfb_tab->sfb_bins_24k; |
607 | 25.7k | break; |
608 | 0 | default: |
609 | 0 | return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_SAMP_FREQ; |
610 | 76.8k | } |
611 | 76.8k | if (1 == pstr_sbr_cfg->num_ch) { |
612 | 41.8M | for (idx = 0; idx < num_samples; idx += 2) { |
613 | 41.8M | ptr_esbr_inp[idx] = ptr_time_in[time_sn_stride * idx]; |
614 | 41.8M | ptr_esbr_inp[idx + 1] = 0; |
615 | 41.8M | ptr_esbr_inp[num_samples + idx] = ptr_time_in[time_sn_stride * (idx + 1)]; |
616 | 41.8M | ptr_esbr_inp[num_samples + idx + 1] = 0; |
617 | 41.8M | } |
618 | 40.8k | iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft); |
619 | 40.8k | bin = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0); |
620 | 40.8k | pstr_esbr->sbr_num_chan = 1; |
621 | 40.8k | if (transient_info[0][1] != 0) { |
622 | 8.57k | pstr_esbr->sbr_preprocessing = 1; |
623 | 32.2k | } else { |
624 | 32.2k | pstr_esbr->sbr_preprocessing = 0; |
625 | 32.2k | } |
626 | | |
627 | 40.8k | if (transient_info[0][1] != 0 && bin != -1) { |
628 | 7.18k | pstr_esbr->sbr_oversampling_flag[0] = 1; |
629 | 7.18k | pstr_esbr->sbr_patching_mode[0] = 0; |
630 | 7.18k | pstr_esbr->sbr_pitchin_flags[0] = 1; |
631 | 7.18k | pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127); |
632 | 33.6k | } else if (bin != -1) { |
633 | 23.7k | pstr_esbr->sbr_oversampling_flag[0] = 0; |
634 | 23.7k | pstr_esbr->sbr_patching_mode[0] = 0; |
635 | 23.7k | pstr_esbr->sbr_pitchin_flags[0] = 1; |
636 | 23.7k | pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127); |
637 | 23.7k | } else if (transient_info[0][1] != 0) { |
638 | 1.38k | pstr_esbr->sbr_oversampling_flag[0] = 1; |
639 | 1.38k | pstr_esbr->sbr_patching_mode[0] = 0; |
640 | 1.38k | pstr_esbr->sbr_pitchin_flags[0] = 0; |
641 | 8.54k | } else { |
642 | 8.54k | pstr_esbr->sbr_patching_mode[0] = 1; |
643 | 8.54k | } |
644 | 40.8k | } else { |
645 | 35.9k | pstr_esbr->sbr_num_chan = 2; |
646 | 35.9k | pstr_esbr->sbr_coupling = coupling; |
647 | 36.8M | for (idx = 0; idx < num_samples; idx += 2) { |
648 | 36.8M | ptr_esbr_inp[idx] = ptr_time_in[2 * idx]; |
649 | 36.8M | ptr_esbr_inp[idx + 1] = 0; |
650 | 36.8M | ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 2]; |
651 | 36.8M | ptr_esbr_inp[num_samples + idx + 1] = 0; |
652 | 36.8M | } |
653 | 35.9k | iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft); |
654 | 35.9k | bin = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0); |
655 | 36.8M | for (idx = 0; idx < num_samples; idx += 2) { |
656 | 36.8M | ptr_esbr_inp[idx] = ptr_time_in[2 * idx + 1]; |
657 | 36.8M | ptr_esbr_inp[idx + 1] = 0; |
658 | 36.8M | ptr_esbr_inp[num_samples + idx] = ptr_time_in[2 * idx + 3]; |
659 | 36.8M | ptr_esbr_inp[num_samples + idx + 1] = 0; |
660 | 36.8M | } |
661 | 35.9k | iusace_complex_fft_2048(ptr_esbr_inp, ptr_scratch_fft); |
662 | 35.9k | bin1 = ixheaace_get_pitch_bin(ptr_esbr_inp, ptr_sbr_table, 0); |
663 | | |
664 | 35.9k | if (coupling) { |
665 | 23.7k | if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) { |
666 | 5.65k | pstr_esbr->sbr_preprocessing = 1; |
667 | 18.1k | } else { |
668 | 18.1k | pstr_esbr->sbr_preprocessing = 0; |
669 | 18.1k | } |
670 | 23.7k | if ((transient_info[0][1] != 0 || transient_info[1][1] != 0) && bin != -1) { |
671 | 4.90k | pstr_esbr->sbr_oversampling_flag[0] = 1; |
672 | 4.90k | pstr_esbr->sbr_patching_mode[0] = 0; |
673 | 4.90k | pstr_esbr->sbr_pitchin_flags[0] = 1; |
674 | 4.90k | bin = MIN(bin, bin1); |
675 | 4.90k | pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127); |
676 | 18.8k | } else if (bin != -1) { |
677 | 15.2k | pstr_esbr->sbr_oversampling_flag[0] = 0; |
678 | 15.2k | pstr_esbr->sbr_patching_mode[0] = 0; |
679 | 15.2k | pstr_esbr->sbr_pitchin_flags[0] = 1; |
680 | 15.2k | bin = MIN(bin, bin1); |
681 | 15.2k | pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127); |
682 | 15.2k | } else if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) { |
683 | 752 | pstr_esbr->sbr_oversampling_flag[0] = 1; |
684 | 752 | pstr_esbr->sbr_patching_mode[0] = 0; |
685 | 752 | pstr_esbr->sbr_pitchin_flags[0] = 0; |
686 | 2.88k | } else { |
687 | 2.88k | pstr_esbr->sbr_patching_mode[0] = 1; |
688 | 2.88k | } |
689 | 23.7k | } else { |
690 | 12.1k | pstr_esbr->sbr_preprocessing = 0; |
691 | 12.1k | if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) { |
692 | 3.01k | pstr_esbr->sbr_preprocessing = 1; |
693 | 3.01k | } |
694 | | |
695 | 12.1k | if (transient_info[0][1] != 0 && bin != -1) { |
696 | 2.36k | pstr_esbr->sbr_oversampling_flag[0] = 1; |
697 | 2.36k | pstr_esbr->sbr_patching_mode[0] = 0; |
698 | 2.36k | pstr_esbr->sbr_pitchin_flags[0] = 1; |
699 | 2.36k | bin = MIN(bin, bin1); |
700 | 2.36k | pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127); |
701 | 9.82k | } else if (bin != -1) { |
702 | 6.46k | pstr_esbr->sbr_oversampling_flag[0] = 0; |
703 | 6.46k | pstr_esbr->sbr_patching_mode[0] = 0; |
704 | 6.46k | pstr_esbr->sbr_pitchin_flags[0] = 1; |
705 | 6.46k | pstr_esbr->sbr_pitchin_bins[0] = (UWORD8)MIN(bin, 127); |
706 | 6.46k | } else if (transient_info[0][1] != 0) { |
707 | 450 | pstr_esbr->sbr_oversampling_flag[0] = 1; |
708 | 450 | pstr_esbr->sbr_patching_mode[0] = 0; |
709 | 450 | pstr_esbr->sbr_pitchin_flags[0] = 0; |
710 | 2.91k | } else { |
711 | 2.91k | pstr_esbr->sbr_patching_mode[0] = 1; |
712 | 2.91k | } |
713 | | |
714 | 12.1k | if (transient_info[1][1] != 0 && bin1 != -1) { |
715 | 2.36k | pstr_esbr->sbr_oversampling_flag[1] = 1; |
716 | 2.36k | pstr_esbr->sbr_patching_mode[1] = 0; |
717 | 2.36k | pstr_esbr->sbr_pitchin_flags[1] = 1; |
718 | 2.36k | pstr_esbr->sbr_pitchin_bins[1] = (UWORD8)MIN(bin1, 127); |
719 | 9.83k | } else if (bin1 != -1) { |
720 | 6.45k | pstr_esbr->sbr_oversampling_flag[1] = 0; |
721 | 6.45k | pstr_esbr->sbr_patching_mode[1] = 0; |
722 | 6.45k | pstr_esbr->sbr_pitchin_flags[1] = 1; |
723 | 6.45k | pstr_esbr->sbr_pitchin_bins[1] = (UWORD8)MIN(bin1, 127); |
724 | 6.45k | } else if (transient_info[1][1] != 0) { |
725 | 470 | pstr_esbr->sbr_oversampling_flag[1] = 1; |
726 | 470 | pstr_esbr->sbr_patching_mode[1] = 0; |
727 | 470 | pstr_esbr->sbr_pitchin_flags[1] = 0; |
728 | 2.90k | } else { |
729 | 2.90k | pstr_esbr->sbr_patching_mode[1] = 1; |
730 | 2.90k | } |
731 | 12.1k | } |
732 | 35.9k | } |
733 | 76.8k | return IA_NO_ERROR; |
734 | 76.8k | } |
735 | | |
736 | | static VOID ixheaace_update_harmonic_sbr_data( |
737 | | WORD32 transient_info[][3], WORD32 coupling, |
738 | 79.6k | ixheaace_pstr_enc_channel *pstr_enc_ch, WORD32 num_channels) { |
739 | 79.6k | WORD32 bin, bin1; |
740 | 79.6k | struct ixheaace_str_sbr_env_data *pstr_sbr_env_left = NULL; |
741 | 79.6k | struct ixheaace_str_sbr_env_data *pstr_sbr_env_right = NULL; |
742 | 79.6k | if (1 == num_channels) { |
743 | 53.7k | pstr_sbr_env_left = &pstr_enc_ch[0]->enc_env_data; |
744 | 53.7k | bin = pstr_sbr_env_left->sbr_pitchin_bins; |
745 | 53.7k | if (transient_info[0][1] != 0) { |
746 | 0 | pstr_sbr_env_left->sbr_preprocessing = 1; |
747 | 53.7k | } else { |
748 | 53.7k | pstr_sbr_env_left->sbr_preprocessing = 0; |
749 | 53.7k | } |
750 | | |
751 | 53.7k | if (transient_info[0][1] != 0 && bin != -1) { |
752 | 0 | pstr_sbr_env_left->sbr_oversampling_flag = 1; |
753 | 0 | pstr_sbr_env_left->sbr_patching_mode = 0; |
754 | 0 | pstr_sbr_env_left->sbr_pitchin_bins_flag = 1; |
755 | 0 | pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127); |
756 | 53.7k | } else if (bin != -1) { |
757 | 46.5k | pstr_sbr_env_left->sbr_oversampling_flag = 0; |
758 | 46.5k | pstr_sbr_env_left->sbr_patching_mode = 0; |
759 | 46.5k | pstr_sbr_env_left->sbr_pitchin_bins_flag = 1; |
760 | 46.5k | pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127); |
761 | 46.5k | } else if (transient_info[0][1] != 0) { |
762 | 0 | pstr_sbr_env_left->sbr_oversampling_flag = 1; |
763 | 0 | pstr_sbr_env_left->sbr_patching_mode = 0; |
764 | 0 | pstr_sbr_env_left->sbr_pitchin_bins = 0; |
765 | 7.16k | } else { |
766 | 7.16k | pstr_sbr_env_left->sbr_patching_mode = 1; |
767 | 7.16k | } |
768 | 53.7k | } else { |
769 | 25.9k | pstr_sbr_env_left = &pstr_enc_ch[0]->enc_env_data; |
770 | 25.9k | pstr_sbr_env_right = &pstr_enc_ch[1]->enc_env_data; |
771 | 25.9k | pstr_sbr_env_left->sbr_coupling = coupling; |
772 | 25.9k | pstr_sbr_env_right->sbr_coupling = coupling; |
773 | 25.9k | bin = pstr_sbr_env_left->sbr_pitchin_bins; |
774 | | |
775 | 25.9k | bin1 = pstr_sbr_env_right->sbr_pitchin_bins; |
776 | | |
777 | 25.9k | if (coupling) { |
778 | 14.9k | pstr_sbr_env_right->sbr_preprocessing = 1; |
779 | 14.9k | if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) { |
780 | 0 | pstr_sbr_env_left->sbr_preprocessing = 1; |
781 | 14.9k | } else { |
782 | 14.9k | pstr_sbr_env_left->sbr_preprocessing = 0; |
783 | 14.9k | } |
784 | 14.9k | if ((transient_info[0][1] != 0 || transient_info[1][1] != 0) && bin != -1) { |
785 | 0 | pstr_sbr_env_left->sbr_oversampling_flag = 1; |
786 | 0 | pstr_sbr_env_left->sbr_patching_mode = 0; |
787 | 0 | pstr_sbr_env_left->sbr_pitchin_bins_flag = 1; |
788 | 0 | bin = min(bin, bin1); |
789 | 0 | pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127); |
790 | 14.9k | } else if (bin != -1) { |
791 | 13.3k | pstr_sbr_env_left->sbr_oversampling_flag = 0; |
792 | 13.3k | pstr_sbr_env_left->sbr_patching_mode = 0; |
793 | 13.3k | pstr_sbr_env_left->sbr_pitchin_bins_flag = 1; |
794 | 13.3k | bin = min(bin, bin1); |
795 | 13.3k | pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127); |
796 | 13.3k | } else if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) { |
797 | 0 | pstr_sbr_env_left->sbr_oversampling_flag = 1; |
798 | 0 | pstr_sbr_env_left->sbr_patching_mode = 0; |
799 | 0 | pstr_sbr_env_left->sbr_pitchin_bins_flag = 0; |
800 | 1.56k | } else { |
801 | 1.56k | pstr_sbr_env_left->sbr_patching_mode = 1; |
802 | 1.56k | } |
803 | 14.9k | } else { |
804 | 11.0k | pstr_sbr_env_left->sbr_preprocessing = 0; |
805 | 11.0k | pstr_sbr_env_right->sbr_preprocessing = 0; |
806 | 11.0k | if ((transient_info[0][1] != 0 || transient_info[1][1] != 0)) { |
807 | 0 | pstr_sbr_env_left->sbr_preprocessing = 1; |
808 | 0 | pstr_sbr_env_right->sbr_preprocessing = 1; |
809 | 0 | } |
810 | | |
811 | 11.0k | if (transient_info[0][1] != 0 && bin != -1) { |
812 | 0 | pstr_sbr_env_left->sbr_oversampling_flag = 1; |
813 | 0 | pstr_sbr_env_left->sbr_patching_mode = 0; |
814 | 0 | pstr_sbr_env_left->sbr_pitchin_bins_flag = 1; |
815 | 0 | bin = min(bin, bin1); |
816 | 0 | pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127); |
817 | 11.0k | } else if (bin != -1) { |
818 | 9.68k | pstr_sbr_env_left->sbr_oversampling_flag = 0; |
819 | 9.68k | pstr_sbr_env_left->sbr_patching_mode = 0; |
820 | 9.68k | pstr_sbr_env_left->sbr_pitchin_bins_flag = 1; |
821 | 9.68k | pstr_sbr_env_left->sbr_pitchin_bins = min(bin, 127); |
822 | 9.68k | } else if (transient_info[0][1] != 0) { |
823 | 0 | pstr_sbr_env_left->sbr_oversampling_flag = 1; |
824 | 0 | pstr_sbr_env_left->sbr_patching_mode = 0; |
825 | 0 | pstr_sbr_env_left->sbr_pitchin_bins_flag = 0; |
826 | 1.33k | } else { |
827 | 1.33k | pstr_sbr_env_left->sbr_patching_mode = 1; |
828 | 1.33k | } |
829 | | |
830 | 11.0k | if (transient_info[1][1] != 0 && bin1 != -1) { |
831 | 0 | pstr_sbr_env_right->sbr_oversampling_flag = 1; |
832 | 0 | pstr_sbr_env_right->sbr_patching_mode = 0; |
833 | 0 | pstr_sbr_env_right->sbr_pitchin_bins_flag = 1; |
834 | 0 | pstr_sbr_env_right->sbr_pitchin_bins = bin1 < 127 ? bin1 : 127; |
835 | 11.0k | } else if (bin1 != -1) { |
836 | 9.67k | pstr_sbr_env_right->sbr_oversampling_flag = 0; |
837 | 9.67k | pstr_sbr_env_right->sbr_patching_mode = 0; |
838 | 9.67k | pstr_sbr_env_right->sbr_pitchin_bins_flag = 1; |
839 | 9.67k | pstr_sbr_env_right->sbr_pitchin_bins = bin1 < 127 ? bin1 : 127; |
840 | 9.67k | } else if (transient_info[1][1] != 0) { |
841 | 0 | pstr_sbr_env_right->sbr_oversampling_flag = 1; |
842 | 0 | pstr_sbr_env_right->sbr_patching_mode = 0; |
843 | 0 | pstr_sbr_env_right->sbr_pitchin_bins_flag = 0; |
844 | 1.34k | } else { |
845 | 1.34k | pstr_sbr_env_right->sbr_patching_mode = 1; |
846 | 1.34k | } |
847 | 11.0k | } |
848 | 25.9k | } |
849 | 79.6k | } |
850 | | |
851 | | VOID ixheaace_esbr_qmf_init(ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank, |
852 | 1.91k | WORD32 sbr_ratio_idx, WORD32 output_frame_size) { |
853 | 1.91k | pstr_codec_qmf_bank->pstr_qmf_dec_tabs = |
854 | 1.91k | (ixheaace_str_qmf_dec_tabs_struct *)&ixheaace_str_aac_qmf_tabs; |
855 | 1.91k | memset( |
856 | 1.91k | pstr_codec_qmf_bank->anal_filter_states_32, 0, |
857 | 1.91k | sizeof(pstr_codec_qmf_bank->anal_filter_states_32[0]) * IXHEAACE_QMF_FILTER_STATE_ANA_SIZE); |
858 | 1.91k | pstr_codec_qmf_bank->num_time_slots = (WORD16)(output_frame_size / 64); |
859 | 1.91k | pstr_codec_qmf_bank->ptr_filter_pos_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c; |
860 | 1.91k | pstr_codec_qmf_bank->ptr_state_new_samples_pos_low_32 = |
861 | 1.91k | pstr_codec_qmf_bank->anal_filter_states_32; |
862 | 1.91k | pstr_codec_qmf_bank->ptr_ana_win_coeff_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c; |
863 | | |
864 | 1.91k | switch (sbr_ratio_idx) { |
865 | 1.46k | case USAC_SBR_RATIO_INDEX_2_1: |
866 | 1.46k | pstr_codec_qmf_bank->no_channels = 32; |
867 | 1.46k | pstr_codec_qmf_bank->ptr_esbr_cos_twiddle = |
868 | 1.46k | ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l32; |
869 | 1.46k | pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle = |
870 | 1.46k | ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l32; |
871 | 1.46k | pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l32; |
872 | 1.46k | break; |
873 | 0 | case USAC_SBR_RATIO_INDEX_8_3: |
874 | 0 | pstr_codec_qmf_bank->no_channels = 24; |
875 | 0 | pstr_codec_qmf_bank->ptr_filter_pos_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c_24; |
876 | 0 | pstr_codec_qmf_bank->ptr_ana_win_coeff_32 = ixheaace_str_aac_qmf_tabs.esbr_qmf_c_24; |
877 | 0 | pstr_codec_qmf_bank->ptr_esbr_cos_twiddle = |
878 | 0 | ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l24; |
879 | 0 | pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle = |
880 | 0 | ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l24; |
881 | 0 | pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l24; |
882 | 0 | break; |
883 | 450 | case USAC_SBR_RATIO_INDEX_4_1: |
884 | 450 | pstr_codec_qmf_bank->no_channels = 16; |
885 | 450 | pstr_codec_qmf_bank->ptr_esbr_cos_twiddle = |
886 | 450 | ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l16; |
887 | 450 | pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle = |
888 | 450 | ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l16; |
889 | 450 | pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l16; |
890 | 450 | break; |
891 | 0 | default: |
892 | 0 | pstr_codec_qmf_bank->no_channels = 32; |
893 | 0 | pstr_codec_qmf_bank->ptr_esbr_cos_twiddle = |
894 | 0 | ixheaace_str_aac_qmf_tabs.esbr_sin_cos_twiddle_l32; |
895 | 0 | pstr_codec_qmf_bank->ptr_esbr_alt_sin_twiddle = |
896 | 0 | ixheaace_str_aac_qmf_tabs.esbr_alt_sin_twiddle_l32; |
897 | 0 | pstr_codec_qmf_bank->ptr_esbr_t_cos = ixheaace_str_aac_qmf_tabs.esbr_t_cos_sin_l32; |
898 | 0 | break; |
899 | 1.91k | } |
900 | 1.91k | } |
901 | | VOID ixheaace_esbr_qmfanal32_winadd(FLOAT32 *ptr_inp1, FLOAT32 *ptr_inp2, FLOAT32 *ptr_qmf1, |
902 | | FLOAT32 *ptr_qmf2, FLOAT32 *ptr_out, |
903 | 4.13M | WORD32 num_band_anal_qmf) { |
904 | 4.13M | WORD32 n; |
905 | 4.13M | FLOAT32 accu; |
906 | | |
907 | 4.13M | switch (num_band_anal_qmf) { |
908 | 1.25M | case 32: { |
909 | 1.25M | n = 0; |
910 | 21.3M | while (n < num_band_anal_qmf) { |
911 | 20.0M | accu = (ptr_inp1[n + 0] * ptr_qmf1[2 * (n + 0)]); |
912 | 20.0M | accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 2 * num_band_anal_qmf)]); |
913 | 20.0M | accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 4 * num_band_anal_qmf)]); |
914 | 20.0M | accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 6 * num_band_anal_qmf)]); |
915 | 20.0M | accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[2 * (n + 8 * num_band_anal_qmf)]); |
916 | 20.0M | ptr_out[n] = 2 * accu; |
917 | | |
918 | 20.0M | accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[2 * (n + 1 + 0)]); |
919 | 20.0M | accu += (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] * |
920 | 20.0M | ptr_qmf1[2 * (n + 1 + 2 * num_band_anal_qmf)]); |
921 | 20.0M | accu += (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] * |
922 | 20.0M | ptr_qmf1[2 * (n + 1 + 4 * num_band_anal_qmf)]); |
923 | 20.0M | accu += (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] * |
924 | 20.0M | ptr_qmf1[2 * (n + 1 + 6 * num_band_anal_qmf)]); |
925 | 20.0M | accu += (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] * |
926 | 20.0M | ptr_qmf1[2 * (n + 1 + 8 * num_band_anal_qmf)]); |
927 | 20.0M | ptr_out[n + 1] = 2 * accu; |
928 | | |
929 | 20.0M | accu = (ptr_inp2[n + 0] * ptr_qmf2[2 * (n + 0)]); |
930 | 20.0M | accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 2 * num_band_anal_qmf)]); |
931 | 20.0M | accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 4 * num_band_anal_qmf)]); |
932 | 20.0M | accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 6 * num_band_anal_qmf)]); |
933 | 20.0M | accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[2 * (n + 8 * num_band_anal_qmf)]); |
934 | 20.0M | ptr_out[n + num_band_anal_qmf] = 2 * accu; |
935 | | |
936 | 20.0M | accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[2 * (n + 1 + 0)]); |
937 | 20.0M | accu += (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] * |
938 | 20.0M | ptr_qmf2[2 * (n + 1 + 2 * num_band_anal_qmf)]); |
939 | 20.0M | accu += (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] * |
940 | 20.0M | ptr_qmf2[2 * (n + 1 + 4 * num_band_anal_qmf)]); |
941 | 20.0M | accu += (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] * |
942 | 20.0M | ptr_qmf2[2 * (n + 1 + 6 * num_band_anal_qmf)]); |
943 | 20.0M | accu += (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] * |
944 | 20.0M | ptr_qmf2[2 * (n + 1 + 8 * num_band_anal_qmf)]); |
945 | 20.0M | ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu; |
946 | | |
947 | 20.0M | n += 2; |
948 | 20.0M | } |
949 | 1.25M | break; |
950 | 0 | } |
951 | 0 | case 24: { |
952 | 0 | n = 0; |
953 | 0 | while (n < num_band_anal_qmf) { |
954 | 0 | accu = (ptr_inp1[n + 0] * ptr_qmf1[(n + 0)]); |
955 | 0 | accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[(n + 2 * num_band_anal_qmf)]); |
956 | 0 | accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[(n + 4 * num_band_anal_qmf)]); |
957 | 0 | accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[(n + 6 * num_band_anal_qmf)]); |
958 | 0 | accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[(n + 8 * num_band_anal_qmf)]); |
959 | 0 | ptr_out[n] = 2 * accu; |
960 | |
|
961 | 0 | accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[(n + 1 + 0)]); |
962 | 0 | accu += |
963 | 0 | (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 2 * num_band_anal_qmf)]); |
964 | 0 | accu += |
965 | 0 | (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 4 * num_band_anal_qmf)]); |
966 | 0 | accu += |
967 | 0 | (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 6 * num_band_anal_qmf)]); |
968 | 0 | accu += |
969 | 0 | (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] * ptr_qmf1[(n + 1 + 8 * num_band_anal_qmf)]); |
970 | 0 | ptr_out[n + 1] = 2 * accu; |
971 | |
|
972 | 0 | accu = (ptr_inp2[n + 0] * ptr_qmf2[(n + 0)]); |
973 | 0 | accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[(n + 2 * num_band_anal_qmf)]); |
974 | 0 | accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[(n + 4 * num_band_anal_qmf)]); |
975 | 0 | accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[(n + 6 * num_band_anal_qmf)]); |
976 | 0 | accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[(n + 8 * num_band_anal_qmf)]); |
977 | 0 | ptr_out[n + num_band_anal_qmf] = 2 * accu; |
978 | |
|
979 | 0 | accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[(n + 1 + 0)]); |
980 | 0 | accu += |
981 | 0 | (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 2 * num_band_anal_qmf)]); |
982 | 0 | accu += |
983 | 0 | (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 4 * num_band_anal_qmf)]); |
984 | 0 | accu += |
985 | 0 | (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 6 * num_band_anal_qmf)]); |
986 | 0 | accu += |
987 | 0 | (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] * ptr_qmf2[(n + 1 + 8 * num_band_anal_qmf)]); |
988 | 0 | ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu; |
989 | 0 | n += 2; |
990 | 0 | } |
991 | 0 | break; |
992 | 0 | } |
993 | 2.88M | default: { |
994 | 2.88M | n = 0; |
995 | 25.9M | while (n < num_band_anal_qmf) { |
996 | 23.0M | accu = (ptr_inp1[n + 0] * ptr_qmf1[4 * (n + 0)]); |
997 | 23.0M | accu += (ptr_inp1[n + 2 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 2 * num_band_anal_qmf)]); |
998 | 23.0M | accu += (ptr_inp1[n + 4 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 4 * num_band_anal_qmf)]); |
999 | 23.0M | accu += (ptr_inp1[n + 6 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 6 * num_band_anal_qmf)]); |
1000 | 23.0M | accu += (ptr_inp1[n + 8 * num_band_anal_qmf] * ptr_qmf1[4 * (n + 8 * num_band_anal_qmf)]); |
1001 | 23.0M | ptr_out[n] = 2 * accu; |
1002 | | |
1003 | 23.0M | accu = (ptr_inp1[n + 1 + 0] * ptr_qmf1[4 * (n + 1 + 0)]); |
1004 | 23.0M | accu += (ptr_inp1[n + 1 + 2 * num_band_anal_qmf] * |
1005 | 23.0M | ptr_qmf1[4 * (n + 1 + 2 * num_band_anal_qmf)]); |
1006 | 23.0M | accu += (ptr_inp1[n + 1 + 4 * num_band_anal_qmf] * |
1007 | 23.0M | ptr_qmf1[4 * (n + 1 + 4 * num_band_anal_qmf)]); |
1008 | 23.0M | accu += (ptr_inp1[n + 1 + 6 * num_band_anal_qmf] * |
1009 | 23.0M | ptr_qmf1[4 * (n + 1 + 6 * num_band_anal_qmf)]); |
1010 | 23.0M | accu += (ptr_inp1[n + 1 + 8 * num_band_anal_qmf] * |
1011 | 23.0M | ptr_qmf1[4 * (n + 1 + 8 * num_band_anal_qmf)]); |
1012 | 23.0M | ptr_out[n + 1] = 2 * accu; |
1013 | | |
1014 | 23.0M | accu = (ptr_inp2[n + 0] * ptr_qmf2[4 * (n + 0)]); |
1015 | 23.0M | accu += (ptr_inp2[n + 2 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 2 * num_band_anal_qmf)]); |
1016 | 23.0M | accu += (ptr_inp2[n + 4 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 4 * num_band_anal_qmf)]); |
1017 | 23.0M | accu += (ptr_inp2[n + 6 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 6 * num_band_anal_qmf)]); |
1018 | 23.0M | accu += (ptr_inp2[n + 8 * num_band_anal_qmf] * ptr_qmf2[4 * (n + 8 * num_band_anal_qmf)]); |
1019 | 23.0M | ptr_out[n + num_band_anal_qmf] = 2 * accu; |
1020 | | |
1021 | 23.0M | accu = (ptr_inp2[n + 1 + 0] * ptr_qmf2[4 * (n + 1 + 0)]); |
1022 | 23.0M | accu += (ptr_inp2[n + 1 + 2 * num_band_anal_qmf] * |
1023 | 23.0M | ptr_qmf2[4 * (n + 1 + 2 * num_band_anal_qmf)]); |
1024 | 23.0M | accu += (ptr_inp2[n + 1 + 4 * num_band_anal_qmf] * |
1025 | 23.0M | ptr_qmf2[4 * (n + 1 + 4 * num_band_anal_qmf)]); |
1026 | 23.0M | accu += (ptr_inp2[n + 1 + 6 * num_band_anal_qmf] * |
1027 | 23.0M | ptr_qmf2[4 * (n + 1 + 6 * num_band_anal_qmf)]); |
1028 | 23.0M | accu += (ptr_inp2[n + 1 + 8 * num_band_anal_qmf] * |
1029 | 23.0M | ptr_qmf2[4 * (n + 1 + 8 * num_band_anal_qmf)]); |
1030 | 23.0M | ptr_out[n + 1 + num_band_anal_qmf] = 2 * accu; |
1031 | 23.0M | n += 2; |
1032 | 23.0M | } |
1033 | 2.88M | break; |
1034 | 0 | } |
1035 | 4.13M | } |
1036 | 4.13M | } |
1037 | | |
1038 | | VOID ixheaace_esbr_radix4bfly(const FLOAT32 *ptr_w_in, FLOAT32 *ptr_x, WORD32 index1, |
1039 | 2.51M | WORD32 index) { |
1040 | 2.51M | int i; |
1041 | 2.51M | WORD32 l1, l2, h2, fft_jmp; |
1042 | 2.51M | FLOAT32 xt0_0, yt0_0, xt1_0, yt1_0, xt2_0, yt2_0; |
1043 | 2.51M | FLOAT32 xh0_0, xh1_0, xh20_0, xh21_0, xl0_0, xl1_0, xl20_0, xl21_0; |
1044 | 2.51M | FLOAT32 x_0, x_1, x_l1_0, x_l1_1, x_l2_0, x_l2_1; |
1045 | 2.51M | FLOAT32 x_h2_0, x_h2_1; |
1046 | 2.51M | FLOAT32 si10, si20, si30, co10, co20, co30; |
1047 | | |
1048 | 2.51M | FLOAT32 mul_1, mul_2, mul_3, mul_4, mul_5, mul_6; |
1049 | 2.51M | FLOAT32 mul_7, mul_8, mul_9, mul_10, mul_11, mul_12; |
1050 | | |
1051 | 2.51M | const FLOAT32 *ptr_w = ptr_w_in; |
1052 | 2.51M | WORD32 i1; |
1053 | | |
1054 | 2.51M | h2 = index << 1; |
1055 | 2.51M | l1 = index << 2; |
1056 | 2.51M | l2 = (index << 2) + (index << 1); |
1057 | | |
1058 | 2.51M | fft_jmp = 6 * (index); |
1059 | | |
1060 | 2.51M | i1 = 0; |
1061 | 5.02M | while (i1 < index1) { |
1062 | 12.5M | for (i = 0; i < index; i++) { |
1063 | 10.0M | si10 = (*ptr_w++); |
1064 | 10.0M | co10 = (*ptr_w++); |
1065 | 10.0M | si20 = (*ptr_w++); |
1066 | 10.0M | co20 = (*ptr_w++); |
1067 | 10.0M | si30 = (*ptr_w++); |
1068 | 10.0M | co30 = (*ptr_w++); |
1069 | | |
1070 | 10.0M | x_0 = ptr_x[0]; |
1071 | 10.0M | x_h2_0 = ptr_x[h2]; |
1072 | 10.0M | x_l1_0 = ptr_x[l1]; |
1073 | 10.0M | x_l2_0 = ptr_x[l2]; |
1074 | | |
1075 | 10.0M | xh0_0 = (x_0 + x_l1_0); |
1076 | 10.0M | xl0_0 = (x_0 - x_l1_0); |
1077 | | |
1078 | 10.0M | xh20_0 = (x_h2_0 + x_l2_0); |
1079 | 10.0M | xl20_0 = (x_h2_0 - x_l2_0); |
1080 | | |
1081 | 10.0M | ptr_x[0] = (xh0_0 + xh20_0); |
1082 | 10.0M | xt0_0 = (xh0_0 - xh20_0); |
1083 | | |
1084 | 10.0M | x_1 = ptr_x[1]; |
1085 | 10.0M | x_h2_1 = ptr_x[h2 + 1]; |
1086 | 10.0M | x_l1_1 = ptr_x[l1 + 1]; |
1087 | 10.0M | x_l2_1 = ptr_x[l2 + 1]; |
1088 | | |
1089 | 10.0M | xh1_0 = (x_1 + x_l1_1); |
1090 | 10.0M | xl1_0 = (x_1 - x_l1_1); |
1091 | | |
1092 | 10.0M | xh21_0 = (x_h2_1 + x_l2_1); |
1093 | 10.0M | xl21_0 = (x_h2_1 - x_l2_1); |
1094 | | |
1095 | 10.0M | ptr_x[1] = (xh1_0 + xh21_0); |
1096 | 10.0M | yt0_0 = (xh1_0 - xh21_0); |
1097 | | |
1098 | 10.0M | xt1_0 = (xl0_0 + xl21_0); |
1099 | 10.0M | xt2_0 = (xl0_0 - xl21_0); |
1100 | | |
1101 | 10.0M | yt2_0 = (xl1_0 + xl20_0); |
1102 | 10.0M | yt1_0 = (xl1_0 - xl20_0); |
1103 | | |
1104 | 10.0M | mul_11 = (xt2_0 * co30); |
1105 | 10.0M | mul_3 = (yt2_0 * si30); |
1106 | 10.0M | ptr_x[l2] = 2 * (mul_3 + mul_11); |
1107 | | |
1108 | 10.0M | mul_5 = (xt2_0 * si30); |
1109 | 10.0M | mul_9 = (yt2_0 * co30); |
1110 | 10.0M | ptr_x[l2 + 1] = 2 * (mul_9 - mul_5); |
1111 | | |
1112 | 10.0M | mul_12 = (xt0_0 * co20); |
1113 | 10.0M | mul_2 = (yt0_0 * si20); |
1114 | 10.0M | ptr_x[l1] = 2 * (mul_2 + mul_12); |
1115 | | |
1116 | 10.0M | mul_6 = (xt0_0 * si20); |
1117 | 10.0M | mul_8 = (yt0_0 * co20); |
1118 | 10.0M | ptr_x[l1 + 1] = 2 * (mul_8 - mul_6); |
1119 | | |
1120 | 10.0M | mul_4 = (xt1_0 * co10); |
1121 | 10.0M | mul_1 = (yt1_0 * si10); |
1122 | 10.0M | ptr_x[h2] = 2 * (mul_1 + mul_4); |
1123 | | |
1124 | 10.0M | mul_10 = (xt1_0 * si10); |
1125 | 10.0M | mul_7 = (yt1_0 * co10); |
1126 | 10.0M | ptr_x[h2 + 1] = 2 * (mul_7 - mul_10); |
1127 | | |
1128 | 10.0M | ptr_x += 2; |
1129 | 10.0M | } |
1130 | 2.51M | ptr_x += fft_jmp; |
1131 | 2.51M | ptr_w = ptr_w - fft_jmp; |
1132 | 2.51M | i1++; |
1133 | 2.51M | } |
1134 | 2.51M | } |
1135 | | |
1136 | | VOID ixheaace_esbr_postradixcompute2(FLOAT32 *ptr_y, FLOAT32 *ptr_x, |
1137 | 0 | const FLOAT32 *ptr_dig_rev_tbl, WORD32 npoints) { |
1138 | 0 | WORD32 i, k; |
1139 | 0 | WORD32 h2; |
1140 | 0 | FLOAT32 x_0, x_1, x_2, x_3; |
1141 | 0 | FLOAT32 x_4, x_5, x_6, x_7; |
1142 | 0 | FLOAT32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f; |
1143 | 0 | FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31; |
1144 | 0 | FLOAT32 n02, n12, n22, n32, n03, n13, n23, n33; |
1145 | |
|
1146 | 0 | FLOAT32 *ptr_x2, *ptr_x0; |
1147 | 0 | FLOAT32 *ptr_y0, *ptr_y1, *ptr_y2, *ptr_y3; |
1148 | |
|
1149 | 0 | ptr_y0 = ptr_y; |
1150 | 0 | ptr_y2 = ptr_y + (WORD32)npoints; |
1151 | 0 | ptr_x0 = ptr_x; |
1152 | 0 | ptr_x2 = ptr_x + (WORD32)(npoints >> 1); |
1153 | |
|
1154 | 0 | ptr_y1 = ptr_y0 + (WORD32)(npoints >> 2); |
1155 | 0 | ptr_y3 = ptr_y2 + (WORD32)(npoints >> 2); |
1156 | |
|
1157 | 0 | for (k = 0; k < 2; k++) { |
1158 | 0 | for (i = 0; i<npoints>> 1; i += 8) { |
1159 | 0 | h2 = (WORD32)*ptr_dig_rev_tbl++ / 4; |
1160 | |
|
1161 | 0 | x_0 = *ptr_x0++; |
1162 | 0 | x_1 = *ptr_x0++; |
1163 | 0 | x_2 = *ptr_x0++; |
1164 | 0 | x_3 = *ptr_x0++; |
1165 | 0 | x_4 = *ptr_x0++; |
1166 | 0 | x_5 = *ptr_x0++; |
1167 | 0 | x_6 = *ptr_x0++; |
1168 | 0 | x_7 = *ptr_x0++; |
1169 | |
|
1170 | 0 | n00 = (x_0 + x_2); |
1171 | 0 | n01 = (x_1 + x_3); |
1172 | |
|
1173 | 0 | n20 = (x_0 - x_2); |
1174 | 0 | n21 = (x_1 - x_3); |
1175 | |
|
1176 | 0 | n10 = (x_4 + x_6); |
1177 | 0 | n11 = (x_5 + x_7); |
1178 | |
|
1179 | 0 | n30 = (x_4 - x_6); |
1180 | 0 | n31 = (x_5 - x_7); |
1181 | |
|
1182 | 0 | ptr_y0[h2] = n00; |
1183 | 0 | ptr_y0[h2 + 1] = n01; |
1184 | 0 | ptr_y1[h2] = n10; |
1185 | 0 | ptr_y1[h2 + 1] = n11; |
1186 | 0 | ptr_y2[h2] = n20; |
1187 | 0 | ptr_y2[h2 + 1] = n21; |
1188 | 0 | ptr_y3[h2] = n30; |
1189 | 0 | ptr_y3[h2 + 1] = n31; |
1190 | |
|
1191 | 0 | x_8 = *ptr_x2++; |
1192 | 0 | x_9 = *ptr_x2++; |
1193 | 0 | x_a = *ptr_x2++; |
1194 | 0 | x_b = *ptr_x2++; |
1195 | 0 | x_c = *ptr_x2++; |
1196 | 0 | x_d = *ptr_x2++; |
1197 | 0 | x_e = *ptr_x2++; |
1198 | 0 | x_f = *ptr_x2++; |
1199 | |
|
1200 | 0 | n02 = (x_8 + x_a); |
1201 | 0 | n03 = (x_9 + x_b); |
1202 | |
|
1203 | 0 | n22 = (x_8 - x_a); |
1204 | 0 | n23 = (x_9 - x_b); |
1205 | |
|
1206 | 0 | n12 = (x_c + x_e); |
1207 | 0 | n13 = (x_d + x_f); |
1208 | |
|
1209 | 0 | n32 = (x_c - x_e); |
1210 | 0 | n33 = (x_d - x_f); |
1211 | |
|
1212 | 0 | ptr_y0[h2 + 2] = n02; |
1213 | 0 | ptr_y0[h2 + 3] = n03; |
1214 | 0 | ptr_y1[h2 + 2] = n12; |
1215 | 0 | ptr_y1[h2 + 3] = n13; |
1216 | 0 | ptr_y2[h2 + 2] = n22; |
1217 | 0 | ptr_y2[h2 + 3] = n23; |
1218 | 0 | ptr_y3[h2 + 2] = n32; |
1219 | 0 | ptr_y3[h2 + 3] = n33; |
1220 | 0 | } |
1221 | 0 | ptr_x0 += (WORD32)npoints >> 1; |
1222 | 0 | ptr_x2 += (WORD32)npoints >> 1; |
1223 | 0 | } |
1224 | 0 | } |
1225 | | |
1226 | | VOID ixheaace_esbr_postradixcompute4(FLOAT32 *ptr_y, FLOAT32 *ptr_x, |
1227 | 2.51M | const FLOAT32 *ptr_dig_rev_tbl, WORD32 npoints) { |
1228 | 2.51M | WORD32 i, k; |
1229 | 2.51M | WORD32 h2; |
1230 | 2.51M | FLOAT32 xh0_0, xh1_0, xl0_0, xl1_0; |
1231 | 2.51M | FLOAT32 xh0_1, xh1_1, xl0_1, xl1_1; |
1232 | 2.51M | FLOAT32 x_0, x_1, x_2, x_3; |
1233 | 2.51M | FLOAT32 xh0_2, xh1_2, xl0_2, xl1_2, xh0_3, xh1_3, xl0_3, xl1_3; |
1234 | 2.51M | FLOAT32 x_4, x_5, x_6, x_7; |
1235 | 2.51M | FLOAT32 x_8, x_9, x_a, x_b, x_c, x_d, x_e, x_f; |
1236 | 2.51M | FLOAT32 n00, n10, n20, n30, n01, n11, n21, n31; |
1237 | 2.51M | FLOAT32 n02, n12, n22, n32, n03, n13, n23, n33; |
1238 | | |
1239 | 2.51M | FLOAT32 *ptr_x2, *ptr_x0; |
1240 | 2.51M | FLOAT32 *ptr_y0, *ptr_y1, *ptr_y2, *ptr_y3; |
1241 | | |
1242 | 2.51M | ptr_y0 = ptr_y; |
1243 | 2.51M | ptr_y2 = ptr_y + npoints; |
1244 | 2.51M | ptr_x0 = ptr_x; |
1245 | 2.51M | ptr_x2 = ptr_x + (WORD32)(npoints >> 1); |
1246 | | |
1247 | 2.51M | ptr_y1 = ptr_y0 + (WORD32)(npoints >> 1); |
1248 | 2.51M | ptr_y3 = ptr_y2 + (WORD32)(npoints >> 1); |
1249 | | |
1250 | 7.53M | for (k = 0; k < 2; k++) { |
1251 | 10.0M | for (i = 0; i<npoints>> 1; i += 8) { |
1252 | 5.02M | h2 = (WORD32)*ptr_dig_rev_tbl++ / 4; |
1253 | 5.02M | x_0 = *ptr_x0++; |
1254 | 5.02M | x_1 = *ptr_x0++; |
1255 | 5.02M | x_2 = *ptr_x0++; |
1256 | 5.02M | x_3 = *ptr_x0++; |
1257 | 5.02M | x_4 = *ptr_x0++; |
1258 | 5.02M | x_5 = *ptr_x0++; |
1259 | 5.02M | x_6 = *ptr_x0++; |
1260 | 5.02M | x_7 = *ptr_x0++; |
1261 | | |
1262 | 5.02M | xh0_0 = (x_0 + x_4); |
1263 | 5.02M | xh1_0 = (x_1 + x_5); |
1264 | | |
1265 | 5.02M | xl0_0 = (x_0 - x_4); |
1266 | 5.02M | xl1_0 = (x_1 - x_5); |
1267 | | |
1268 | 5.02M | xh0_1 = (x_2 + x_6); |
1269 | 5.02M | xh1_1 = (x_3 + x_7); |
1270 | | |
1271 | 5.02M | xl0_1 = (x_2 - x_6); |
1272 | 5.02M | xl1_1 = (x_3 - x_7); |
1273 | | |
1274 | 5.02M | n00 = (xh0_0 + xh0_1); |
1275 | 5.02M | n01 = (xh1_0 + xh1_1); |
1276 | 5.02M | n10 = (xl0_0 + xl1_1); |
1277 | | |
1278 | 5.02M | n11 = (xl1_0 - xl0_1); |
1279 | 5.02M | n20 = (xh0_0 - xh0_1); |
1280 | 5.02M | n21 = (xh1_0 - xh1_1); |
1281 | 5.02M | n30 = (xl0_0 - xl1_1); |
1282 | | |
1283 | 5.02M | n31 = (xl1_0 + xl0_1); |
1284 | | |
1285 | 5.02M | ptr_y0[h2] = n00; |
1286 | 5.02M | ptr_y0[h2 + 1] = n01; |
1287 | 5.02M | ptr_y1[h2] = n10; |
1288 | 5.02M | ptr_y1[h2 + 1] = n11; |
1289 | 5.02M | ptr_y2[h2] = n20; |
1290 | 5.02M | ptr_y2[h2 + 1] = n21; |
1291 | 5.02M | ptr_y3[h2] = n30; |
1292 | 5.02M | ptr_y3[h2 + 1] = n31; |
1293 | | |
1294 | 5.02M | x_8 = *ptr_x2++; |
1295 | 5.02M | x_9 = *ptr_x2++; |
1296 | 5.02M | x_a = *ptr_x2++; |
1297 | 5.02M | x_b = *ptr_x2++; |
1298 | 5.02M | x_c = *ptr_x2++; |
1299 | 5.02M | x_d = *ptr_x2++; |
1300 | 5.02M | x_e = *ptr_x2++; |
1301 | 5.02M | x_f = *ptr_x2++; |
1302 | | |
1303 | 5.02M | xh0_2 = (x_8 + x_c); |
1304 | 5.02M | xh1_2 = (x_9 + x_d); |
1305 | | |
1306 | 5.02M | xl0_2 = (x_8 - x_c); |
1307 | 5.02M | xl1_2 = (x_9 - x_d); |
1308 | | |
1309 | 5.02M | xh0_3 = (x_a + x_e); |
1310 | 5.02M | xh1_3 = (x_b + x_f); |
1311 | | |
1312 | 5.02M | xl0_3 = (x_a - x_e); |
1313 | 5.02M | xl1_3 = (x_b - x_f); |
1314 | | |
1315 | 5.02M | n02 = (xh0_2 + xh0_3); |
1316 | 5.02M | n03 = (xh1_2 + xh1_3); |
1317 | 5.02M | n12 = (xl0_2 + xl1_3); |
1318 | | |
1319 | 5.02M | n13 = (xl1_2 - xl0_3); |
1320 | 5.02M | n22 = (xh0_2 - xh0_3); |
1321 | 5.02M | n23 = (xh1_2 - xh1_3); |
1322 | 5.02M | n32 = (xl0_2 - xl1_3); |
1323 | | |
1324 | 5.02M | n33 = (xl1_2 + xl0_3); |
1325 | | |
1326 | 5.02M | ptr_y0[h2 + 2] = n02; |
1327 | 5.02M | ptr_y0[h2 + 3] = n03; |
1328 | 5.02M | ptr_y1[h2 + 2] = n12; |
1329 | 5.02M | ptr_y1[h2 + 3] = n13; |
1330 | 5.02M | ptr_y2[h2 + 2] = n22; |
1331 | 5.02M | ptr_y2[h2 + 3] = n23; |
1332 | 5.02M | ptr_y3[h2 + 2] = n32; |
1333 | 5.02M | ptr_y3[h2 + 3] = n33; |
1334 | 5.02M | } |
1335 | 5.02M | ptr_x0 += (WORD32)npoints >> 1; |
1336 | 5.02M | ptr_x2 += (WORD32)npoints >> 1; |
1337 | 5.02M | } |
1338 | 2.51M | } |
1339 | | |
1340 | | VOID ixheaace_esbr_cos_sin_mod(FLOAT32 *subband, ia_sbr_qmf_filter_bank_struct *pstr_qmf_bank, |
1341 | 4.13M | FLOAT32 *ptr_twiddle, FLOAT32 *ptr_dig_rev_tbl) { |
1342 | 4.13M | WORD32 z; |
1343 | 4.13M | FLOAT32 temp[128] = {0}; |
1344 | | |
1345 | 4.13M | FLOAT32 re2, re3; |
1346 | 4.13M | FLOAT32 wim, wre; |
1347 | | |
1348 | 4.13M | WORD32 i, M_2; |
1349 | 4.13M | WORD32 M = pstr_qmf_bank->no_channels / 2; |
1350 | | |
1351 | 4.13M | const FLOAT32 *ptr_sin; |
1352 | 4.13M | const FLOAT32 *ptr_sin_cos; |
1353 | | |
1354 | 4.13M | FLOAT32 subband_tmp[128] = {0}; |
1355 | 4.13M | FLOAT32 re; |
1356 | 4.13M | FLOAT32 im; |
1357 | 4.13M | FLOAT32 *ptr_subband, *ptr_subband1; |
1358 | 4.13M | FLOAT32 *ptr_subband_t, *ptr_subband1_t; |
1359 | 4.13M | FLOAT32 *ptr_subband2, *ptr_subband12; |
1360 | 4.13M | FLOAT32 *ptr_subband_t2, *ptr_subband1_t2; |
1361 | | |
1362 | 4.13M | M_2 = M / 2; |
1363 | | |
1364 | 4.13M | ptr_sin_cos = pstr_qmf_bank->ptr_esbr_cos_twiddle; |
1365 | | |
1366 | 4.13M | ptr_subband = &subband[0]; |
1367 | 4.13M | ptr_subband1 = &subband[2 * M - 1]; |
1368 | 4.13M | ptr_subband_t = subband_tmp; |
1369 | 4.13M | ptr_subband1_t = &subband_tmp[2 * M - 1]; |
1370 | | |
1371 | 4.13M | ptr_subband2 = &subband[64]; |
1372 | 4.13M | ptr_subband12 = &subband[2 * M - 1 + 64]; |
1373 | 4.13M | ptr_subband_t2 = &subband_tmp[64]; |
1374 | 4.13M | ptr_subband1_t2 = &subband_tmp[2 * M - 1 + 64]; |
1375 | | |
1376 | 4.13M | i = (M_2 >> 1) - 1; |
1377 | 14.9M | while (i >= 0) { |
1378 | 10.7M | re = *ptr_subband++; |
1379 | 10.7M | im = *ptr_subband1--; |
1380 | | |
1381 | 10.7M | wim = *ptr_sin_cos++; |
1382 | 10.7M | wre = *ptr_sin_cos++; |
1383 | | |
1384 | 10.7M | *ptr_subband_t++ = (re * wre) + (im * wim); |
1385 | 10.7M | *ptr_subband_t++ = (im * wre) - (re * wim); |
1386 | | |
1387 | 10.7M | re = *ptr_subband2++; |
1388 | 10.7M | im = *ptr_subband12--; |
1389 | | |
1390 | 10.7M | *ptr_subband_t2++ = (im * wim) - (re * wre); |
1391 | 10.7M | *ptr_subband_t2++ = (re * wim) + (im * wre); |
1392 | | |
1393 | 10.7M | re = *ptr_subband1--; |
1394 | 10.7M | im = *ptr_subband++; |
1395 | | |
1396 | 10.7M | wim = *ptr_sin_cos++; |
1397 | 10.7M | wre = *ptr_sin_cos++; |
1398 | | |
1399 | 10.7M | *ptr_subband1_t-- = (im * wre) - (re * wim); |
1400 | 10.7M | *ptr_subband1_t-- = (re * wre) + (im * wim); |
1401 | | |
1402 | 10.7M | re = *ptr_subband12--; |
1403 | 10.7M | im = *ptr_subband2++; |
1404 | | |
1405 | 10.7M | *ptr_subband1_t2-- = (re * wim) + (im * wre); |
1406 | 10.7M | *ptr_subband1_t2-- = (im * wim) - (re * wre); |
1407 | | |
1408 | 10.7M | re = *ptr_subband++; |
1409 | 10.7M | im = *ptr_subband1--; |
1410 | | |
1411 | 10.7M | wim = *ptr_sin_cos++; |
1412 | 10.7M | wre = *ptr_sin_cos++; |
1413 | | |
1414 | 10.7M | *ptr_subband_t++ = (re * wre) + (im * wim); |
1415 | 10.7M | *ptr_subband_t++ = (im * wre) - (re * wim); |
1416 | | |
1417 | 10.7M | re = *ptr_subband2++; |
1418 | 10.7M | im = *ptr_subband12--; |
1419 | | |
1420 | 10.7M | *ptr_subband_t2++ = (im * wim) - (re * wre); |
1421 | 10.7M | *ptr_subband_t2++ = (re * wim) + (im * wre); |
1422 | | |
1423 | 10.7M | re = *ptr_subband1--; |
1424 | 10.7M | im = *ptr_subband++; |
1425 | | |
1426 | 10.7M | wim = *ptr_sin_cos++; |
1427 | 10.7M | wre = *ptr_sin_cos++; |
1428 | | |
1429 | 10.7M | *ptr_subband1_t-- = (im * wre) - (re * wim); |
1430 | 10.7M | *ptr_subband1_t-- = (re * wre) + (im * wim); |
1431 | | |
1432 | 10.7M | re = *ptr_subband12--; |
1433 | 10.7M | im = *ptr_subband2++; |
1434 | | |
1435 | 10.7M | *ptr_subband1_t2-- = (re * wim) + (im * wre); |
1436 | 10.7M | *ptr_subband1_t2-- = (im * wim) - (re * wre); |
1437 | | |
1438 | 10.7M | i--; |
1439 | 10.7M | } |
1440 | | |
1441 | 4.13M | switch (M) { |
1442 | 0 | case M_32: |
1443 | 0 | ixheaace_esbr_radix4bfly(ptr_twiddle, subband_tmp, 1, 8); |
1444 | 0 | ixheaace_esbr_radix4bfly(ptr_twiddle + 48, subband_tmp, 4, 2); |
1445 | 0 | ixheaace_esbr_postradixcompute2(subband, subband_tmp, ptr_dig_rev_tbl, 32); |
1446 | |
|
1447 | 0 | ixheaace_esbr_radix4bfly(ptr_twiddle, &subband_tmp[64], 1, 8); |
1448 | 0 | ixheaace_esbr_radix4bfly(ptr_twiddle + 48, &subband_tmp[64], 4, 2); |
1449 | 0 | ixheaace_esbr_postradixcompute2(&subband[64], &subband_tmp[64], ptr_dig_rev_tbl, 32); |
1450 | 0 | break; |
1451 | | |
1452 | 1.25M | case M_16: |
1453 | 1.25M | ixheaace_esbr_radix4bfly(ptr_twiddle, subband_tmp, 1, 4); |
1454 | 1.25M | ixheaace_esbr_postradixcompute4(subband, subband_tmp, ptr_dig_rev_tbl, 16); |
1455 | | |
1456 | 1.25M | ixheaace_esbr_radix4bfly(ptr_twiddle, &subband_tmp[64], 1, 4); |
1457 | 1.25M | ixheaace_esbr_postradixcompute4(&subband[64], &subband_tmp[64], ptr_dig_rev_tbl, 16); |
1458 | 1.25M | break; |
1459 | | |
1460 | 0 | case M_12: |
1461 | |
|
1462 | 0 | for (z = 0; z < (pstr_qmf_bank->no_channels >> 1); z++) { |
1463 | 0 | temp[z] = subband_tmp[2 * z]; |
1464 | 0 | temp[12 + z] = subband_tmp[2 * z + 1]; |
1465 | 0 | } |
1466 | | |
1467 | | // convert re and im data to interleave |
1468 | 0 | FLOAT32 intermediate[24]; |
1469 | 0 | WORD32 cnt = 0; |
1470 | 0 | while (cnt < M_12) { |
1471 | 0 | intermediate[2 * cnt] = temp[cnt]; |
1472 | 0 | intermediate[2 * cnt + 1] = temp[12 + cnt]; |
1473 | 0 | cnt++; |
1474 | 0 | } |
1475 | |
|
1476 | 0 | iusace_complex_fft_p3_no_scratch(intermediate, 12); |
1477 | | // de-interleave |
1478 | 0 | for (cnt = 0; cnt < 12; cnt++) { |
1479 | 0 | temp[cnt] = intermediate[2 * cnt]; |
1480 | 0 | temp[12 + cnt] = intermediate[2 * cnt + 1]; |
1481 | 0 | } |
1482 | |
|
1483 | 0 | z = 0; |
1484 | 0 | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1485 | 0 | subband[2 * z] = temp[z]; |
1486 | 0 | subband[2 * z + 1] = temp[z + 12]; |
1487 | 0 | z++; |
1488 | 0 | } |
1489 | |
|
1490 | 0 | z = 0; |
1491 | 0 | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1492 | 0 | temp[z] = subband_tmp[64 + 2 * z]; |
1493 | 0 | temp[12 + z] = subband_tmp[64 + 2 * z + 1]; |
1494 | 0 | z++; |
1495 | 0 | } |
1496 | | |
1497 | | // convert re and im data to interleave |
1498 | 0 | cnt = 0; |
1499 | 0 | while (cnt < 12) { |
1500 | 0 | intermediate[2 * cnt] = temp[cnt]; |
1501 | 0 | intermediate[2 * cnt + 1] = temp[12 + cnt]; |
1502 | 0 | cnt++; |
1503 | 0 | } |
1504 | 0 | iusace_complex_fft_p3_no_scratch(intermediate, 12); |
1505 | | // de-interleave |
1506 | |
|
1507 | 0 | cnt = 0; |
1508 | 0 | while (cnt < 12) { |
1509 | 0 | temp[cnt] = intermediate[2 * cnt]; |
1510 | 0 | temp[12 + cnt] = intermediate[2 * cnt + 1]; |
1511 | 0 | cnt++; |
1512 | 0 | } |
1513 | |
|
1514 | 0 | z = 0; |
1515 | 0 | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1516 | 0 | subband[64 + 2 * z] = temp[z]; |
1517 | 0 | subband[64 + 2 * z + 1] = temp[z + 12]; |
1518 | 0 | z++; |
1519 | 0 | } |
1520 | 0 | break; |
1521 | | |
1522 | 2.88M | default: |
1523 | 2.88M | z = 0; |
1524 | 25.9M | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1525 | 23.0M | temp[z] = subband_tmp[2 * z]; |
1526 | 23.0M | temp[8 + z] = subband_tmp[2 * z + 1]; |
1527 | 23.0M | z++; |
1528 | 23.0M | } |
1529 | | |
1530 | 2.88M | FLOAT32 scratch[1024]; |
1531 | 2.88M | cnt = 0; |
1532 | 25.9M | while (cnt < 8) { |
1533 | 23.0M | intermediate[2 * cnt] = temp[cnt]; |
1534 | 23.0M | intermediate[2 * cnt + 1] = temp[8 + cnt]; |
1535 | 23.0M | cnt++; |
1536 | 23.0M | } |
1537 | | |
1538 | 2.88M | iusace_complex_fft_p2(intermediate, 8, scratch); |
1539 | | // de-interleave |
1540 | 2.88M | cnt = 0; |
1541 | 25.9M | while (cnt < 8) { |
1542 | 23.0M | temp[cnt] = intermediate[2 * cnt]; |
1543 | 23.0M | temp[8 + cnt] = intermediate[2 * cnt + 1]; |
1544 | 23.0M | cnt++; |
1545 | 23.0M | } |
1546 | | |
1547 | 2.88M | z = 0; |
1548 | 25.9M | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1549 | 23.0M | subband[2 * z] = temp[z]; |
1550 | 23.0M | subband[2 * z + 1] = temp[z + 8]; |
1551 | 23.0M | z++; |
1552 | 23.0M | } |
1553 | 2.88M | z = 0; |
1554 | 25.9M | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1555 | 23.0M | temp[z] = subband_tmp[64 + 2 * z]; |
1556 | 23.0M | temp[8 + z] = subband_tmp[64 + 2 * z + 1]; |
1557 | 23.0M | z++; |
1558 | 23.0M | } |
1559 | | |
1560 | | // convert re and im data to interleave |
1561 | 2.88M | cnt = 0; |
1562 | 25.9M | while (cnt < 8) { |
1563 | 23.0M | intermediate[2 * cnt] = temp[cnt]; |
1564 | 23.0M | intermediate[2 * cnt + 1] = temp[8 + cnt]; |
1565 | 23.0M | cnt++; |
1566 | 23.0M | } |
1567 | | |
1568 | 2.88M | iusace_complex_fft_p2(intermediate, 8, scratch); |
1569 | | |
1570 | | // de-interleave |
1571 | 2.88M | cnt = 0; |
1572 | 25.9M | while (cnt < 8) { |
1573 | 23.0M | temp[cnt] = intermediate[2 * cnt]; |
1574 | 23.0M | temp[8 + cnt] = intermediate[2 * cnt + 1]; |
1575 | 23.0M | cnt++; |
1576 | 23.0M | } |
1577 | | |
1578 | 2.88M | z = 0; |
1579 | 25.9M | while (z < (pstr_qmf_bank->no_channels >> 1)) { |
1580 | 23.0M | subband[64 + 2 * z] = temp[z]; |
1581 | 23.0M | subband[64 + 2 * z + 1] = temp[8 + z]; |
1582 | 23.0M | z++; |
1583 | 23.0M | } |
1584 | 2.88M | break; |
1585 | 4.13M | } |
1586 | | |
1587 | 4.13M | ptr_subband = &subband[0]; |
1588 | 4.13M | ptr_subband1 = &subband[2 * M - 1]; |
1589 | | |
1590 | 4.13M | re = *ptr_subband1; |
1591 | | |
1592 | 4.13M | *ptr_subband = *ptr_subband / 2; |
1593 | 4.13M | ptr_subband++; |
1594 | 4.13M | *ptr_subband1 = -(*ptr_subband / 2); |
1595 | 4.13M | ptr_subband1--; |
1596 | | |
1597 | 4.13M | ptr_sin = pstr_qmf_bank->ptr_esbr_alt_sin_twiddle; |
1598 | | |
1599 | 4.13M | wim = *ptr_sin++; |
1600 | 4.13M | wre = *ptr_sin++; |
1601 | | |
1602 | 4.13M | im = *ptr_subband1; |
1603 | | |
1604 | 4.13M | *ptr_subband1-- = (re * wre) + (im * wim); |
1605 | 4.13M | *ptr_subband++ = (im * wre) - (re * wim); |
1606 | | |
1607 | 4.13M | ptr_subband2 = &subband[64]; |
1608 | 4.13M | ptr_subband12 = &subband[2 * M - 1 + 64]; |
1609 | | |
1610 | 4.13M | re = *ptr_subband12; |
1611 | | |
1612 | 4.13M | *ptr_subband12-- = -(*ptr_subband2 / 2); |
1613 | | |
1614 | 4.13M | *ptr_subband2 = ptr_subband2[1] / 2; |
1615 | | |
1616 | 4.13M | ptr_subband2++; |
1617 | | |
1618 | 4.13M | im = *ptr_subband12; |
1619 | | |
1620 | 4.13M | *ptr_subband2++ = -((re * wre) + (im * wim)); |
1621 | 4.13M | *ptr_subband12-- = (re * wim) - (im * wre); |
1622 | | |
1623 | 4.13M | i = (M_2 - 2); |
1624 | 21.5M | while (i >= 0) { |
1625 | 17.4M | im = ptr_subband[0]; |
1626 | | |
1627 | 17.4M | re = ptr_subband[1]; |
1628 | | |
1629 | 17.4M | re2 = *ptr_subband1; |
1630 | | |
1631 | 17.4M | *ptr_subband++ = (re * wim) + (im * wre); |
1632 | 17.4M | *ptr_subband1-- = (im * wim) - (re * wre); |
1633 | | |
1634 | 17.4M | im = ptr_subband2[0]; |
1635 | | |
1636 | 17.4M | re = ptr_subband2[1]; |
1637 | | |
1638 | 17.4M | re3 = *ptr_subband12; |
1639 | | |
1640 | 17.4M | *ptr_subband12-- = -((re * wim) + (im * wre)); |
1641 | 17.4M | *ptr_subband2++ = (re * wre) - (im * wim); |
1642 | | |
1643 | 17.4M | wim = *ptr_sin++; |
1644 | 17.4M | wre = *ptr_sin++; |
1645 | 17.4M | im = ptr_subband1[0]; |
1646 | | |
1647 | 17.4M | *ptr_subband1-- = (re2 * wre) + (im * wim); |
1648 | 17.4M | *ptr_subband++ = (im * wre) - (re2 * wim); |
1649 | | |
1650 | 17.4M | im = ptr_subband12[0]; |
1651 | | |
1652 | 17.4M | *ptr_subband2++ = -((re3 * wre) + (im * wim)); |
1653 | 17.4M | *ptr_subband12-- = (re3 * wim) - (im * wre); |
1654 | 17.4M | i--; |
1655 | 17.4M | } |
1656 | 4.13M | } |
1657 | | |
1658 | | static VOID ixheaace_esbr_fwd_modulation(const FLOAT32 *ptr_time_sample_buf, |
1659 | | FLOAT32 *ptr_in_real_subband, |
1660 | | FLOAT32 *ptr_in_imag_subband, |
1661 | | ia_sbr_qmf_filter_bank_struct *pstr_qmf_bank, |
1662 | 4.13M | ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs) { |
1663 | 4.13M | WORD32 i; |
1664 | 4.13M | const FLOAT32 *ptr_time_sample_buf1 = &ptr_time_sample_buf[2 * pstr_qmf_bank->no_channels - 1]; |
1665 | 4.13M | FLOAT32 temp1, temp2; |
1666 | 4.13M | FLOAT32 *ptr_real_subband = ptr_in_real_subband; |
1667 | 4.13M | FLOAT32 *ptr_imag_subband = ptr_in_imag_subband; |
1668 | 4.13M | const FLOAT32 *ptr_cos; |
1669 | | |
1670 | 90.3M | for (i = pstr_qmf_bank->no_channels - 1; i >= 0; i--) { |
1671 | 86.2M | temp1 = *ptr_time_sample_buf++ / 16.0f; |
1672 | 86.2M | temp2 = *ptr_time_sample_buf1-- / 16.0f; |
1673 | 86.2M | *ptr_real_subband++ = (temp1 - temp2); |
1674 | 86.2M | *ptr_imag_subband++ = (temp1 + temp2); |
1675 | 86.2M | } |
1676 | | |
1677 | 4.13M | ixheaace_esbr_cos_sin_mod(ptr_in_real_subband, pstr_qmf_bank, pstr_qmf_dec_tabs->esbr_w_16, |
1678 | 4.13M | pstr_qmf_dec_tabs->dig_rev_tab_4_16); |
1679 | | |
1680 | 4.13M | ptr_cos = pstr_qmf_bank->ptr_esbr_t_cos; |
1681 | | |
1682 | 4.13M | i = (pstr_qmf_bank->usb - pstr_qmf_bank->lsb - 1); |
1683 | 90.3M | while (i >= 0) { |
1684 | 86.2M | FLOAT32 cosh, sinh; |
1685 | 86.2M | FLOAT32 re, im; |
1686 | | |
1687 | 86.2M | re = *ptr_in_real_subband; |
1688 | 86.2M | im = *ptr_in_imag_subband; |
1689 | 86.2M | cosh = *ptr_cos++; |
1690 | 86.2M | sinh = *ptr_cos++; |
1691 | 86.2M | *ptr_in_real_subband++ = 2 * ((re * cosh) + (im * sinh)); |
1692 | 86.2M | *ptr_in_imag_subband++ = 2 * ((im * cosh) - (re * sinh)); |
1693 | 86.2M | i--; |
1694 | 86.2M | } |
1695 | 4.13M | } |
1696 | | |
1697 | | VOID ixheaace_esbr_analysis_filt_block( |
1698 | | ia_sbr_qmf_filter_bank_struct *pstr_codec_qmf_bank, |
1699 | | ixheaace_str_qmf_dec_tabs_struct *pstr_qmf_dec_tabs, FLOAT32 *ptr_core_coder_samples, |
1700 | | FLOAT32 qmf_buf_real[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS], |
1701 | | FLOAT32 qmf_buf_imag[IXHEAACE_TIMESLOT_BUFFER_SIZE + 2 * 32][IXHEAACE_NUM_QMF_SYNTH_CHANNELS], |
1702 | 84.2k | WORD32 op_delay) { |
1703 | 84.2k | FLOAT32 *ptr_filt_states; |
1704 | 84.2k | FLOAT32 *ptr_filt_states_1; |
1705 | 84.2k | FLOAT32 *ptr_filt_states_2; |
1706 | 84.2k | FLOAT32 *ptr_temp; |
1707 | 84.2k | FLOAT32 *ptr_win_coeffs_1; |
1708 | 84.2k | FLOAT32 *ptr_win_coeffs_2; |
1709 | 84.2k | FLOAT32 *ptr_win_coeffs; |
1710 | 84.2k | FLOAT32 *ptr_loc_qmf_buf_real; |
1711 | 84.2k | FLOAT32 *ptr_loc_qmf_buf_imag; |
1712 | 84.2k | FLOAT32 local_qmf_buffer[128] = {0}; |
1713 | 84.2k | FLOAT32 anal_buf[2 * 32] = {0}; |
1714 | 84.2k | WORD32 idx, z; |
1715 | 84.2k | WORD32 core_syn_ch_index; |
1716 | 84.2k | FLOAT32 gain; |
1717 | 84.2k | WORD32 filt_offset; |
1718 | 84.2k | WORD32 num_columns; |
1719 | | |
1720 | 84.2k | ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank = pstr_codec_qmf_bank; |
1721 | 84.2k | ptr_filt_states = pstr_qmf_anal_bank->ptr_state_new_samples_pos_low_32; |
1722 | 84.2k | ptr_win_coeffs_1 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_filter_pos_32; |
1723 | 84.2k | num_columns = pstr_qmf_anal_bank->no_channels; |
1724 | | |
1725 | 84.2k | switch (num_columns) { |
1726 | 45.0k | case 16: |
1727 | 45.0k | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; |
1728 | 45.0k | gain = 128.0f; |
1729 | 45.0k | filt_offset = 64; |
1730 | 45.0k | break; |
1731 | 0 | case 24: |
1732 | 0 | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24; |
1733 | 0 | gain = 12.0f; |
1734 | 0 | filt_offset = 24; |
1735 | 0 | break; |
1736 | 39.2k | case 32: |
1737 | 39.2k | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; |
1738 | 39.2k | gain = 256.0f; |
1739 | 39.2k | filt_offset = 64; |
1740 | 39.2k | break; |
1741 | 0 | default: |
1742 | 0 | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; |
1743 | 0 | gain = 256.0f; |
1744 | 0 | filt_offset = 64; |
1745 | 0 | break; |
1746 | 84.2k | } |
1747 | 84.2k | gain = 1.0f / gain; |
1748 | | |
1749 | 84.2k | pstr_qmf_anal_bank->usb = (WORD16)num_columns; |
1750 | | |
1751 | 84.2k | ptr_loc_qmf_buf_real = &local_qmf_buffer[0]; |
1752 | 84.2k | ptr_loc_qmf_buf_imag = &local_qmf_buffer[64]; |
1753 | | |
1754 | 84.2k | ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32; |
1755 | 84.2k | ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns; |
1756 | | |
1757 | 84.2k | idx = 0; |
1758 | 4.22M | while (idx < pstr_codec_qmf_bank->num_time_slots) { |
1759 | 90.3M | for (z = 0; z < num_columns; z++) { |
1760 | 86.2M | ptr_filt_states[num_columns - 1 - z] = ptr_core_coder_samples[z]; |
1761 | 86.2M | } |
1762 | | |
1763 | 4.13M | ixheaace_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2, ptr_win_coeffs_1, |
1764 | 4.13M | ptr_win_coeffs_2, anal_buf, num_columns); |
1765 | | |
1766 | 4.13M | ptr_core_coder_samples += num_columns; |
1767 | | |
1768 | 4.13M | ptr_filt_states -= num_columns; |
1769 | 4.13M | if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) { |
1770 | 414k | ptr_filt_states = |
1771 | 414k | pstr_qmf_anal_bank->anal_filter_states_32 + 10 * num_columns - num_columns; |
1772 | 414k | } |
1773 | | |
1774 | 4.13M | ptr_temp = ptr_filt_states_1; |
1775 | 4.13M | ptr_filt_states_1 = ptr_filt_states_2; |
1776 | 4.13M | ptr_filt_states_2 = ptr_temp; |
1777 | | |
1778 | 4.13M | ptr_win_coeffs_1 += filt_offset; |
1779 | 4.13M | ptr_win_coeffs_2 += filt_offset; |
1780 | | |
1781 | 4.13M | ptr_win_coeffs = ptr_win_coeffs_1; |
1782 | 4.13M | ptr_win_coeffs_1 = ptr_win_coeffs_2; |
1783 | 4.13M | ptr_win_coeffs_2 = ptr_win_coeffs; |
1784 | | |
1785 | 4.13M | if (ptr_win_coeffs_2 > (pstr_qmf_anal_bank->ptr_ana_win_coeff_32 + filt_offset * 10)) { |
1786 | 413k | ptr_win_coeffs_1 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_ana_win_coeff_32; |
1787 | 413k | ptr_win_coeffs_2 = (FLOAT32 *)pstr_qmf_anal_bank->ptr_ana_win_coeff_32 + filt_offset; |
1788 | 413k | } |
1789 | | |
1790 | 4.13M | ixheaace_esbr_fwd_modulation(anal_buf, &ptr_loc_qmf_buf_real[0], &ptr_loc_qmf_buf_imag[0], |
1791 | 4.13M | pstr_qmf_anal_bank, pstr_qmf_dec_tabs); |
1792 | | |
1793 | 4.13M | core_syn_ch_index = num_columns; |
1794 | | |
1795 | 90.3M | for (z = 0; z < core_syn_ch_index; z++) { |
1796 | 86.2M | qmf_buf_real[op_delay + idx][z] = ((FLOAT32)ptr_loc_qmf_buf_real[z] * gain); |
1797 | 86.2M | qmf_buf_imag[op_delay + idx][z] = ((FLOAT32)ptr_loc_qmf_buf_imag[z] * gain); |
1798 | 86.2M | } |
1799 | | |
1800 | 4.13M | idx++; |
1801 | 4.13M | } |
1802 | | |
1803 | 84.2k | pstr_qmf_anal_bank->ptr_filter_pos_32 = ptr_win_coeffs_1; |
1804 | 84.2k | pstr_qmf_anal_bank->ptr_state_new_samples_pos_low_32 = ptr_filt_states; |
1805 | 84.2k | } |
1806 | | IA_ERRORCODE ixheaace_extract_sbr_envelope(FLOAT32 *ptr_in_time, FLOAT32 *ptr_core_buf, |
1807 | | UWORD32 time_sn_stride, |
1808 | | ixheaace_pstr_sbr_enc pstr_env_enc, |
1809 | | ixheaace_str_sbr_tabs *ptr_sbr_tab, |
1810 | | ixheaace_comm_tables *pstr_com_tab, |
1811 | 468k | WORD32 flag_framelength_small) { |
1812 | 468k | IA_ERRORCODE err_code = IA_NO_ERROR; |
1813 | 468k | WORD32 ch, i, j, c; |
1814 | 468k | WORD32 n_envelopes[IXHEAACE_MAX_CH_IN_BS_ELE]; |
1815 | 468k | WORD32 transient_info[IXHEAACE_MAX_CH_IN_BS_ELE][3]; |
1816 | 468k | const ixheaace_str_frame_info_sbr *pstr_const_frame_info[IXHEAACE_MAX_CH_IN_BS_ELE]; |
1817 | 468k | ixheaace_str_frame_info_sbr *pstr_frame_info = NULL; |
1818 | | |
1819 | 468k | ixheaace_pstr_sbr_config_data pstr_sbr_cfg = &pstr_env_enc->str_sbr_cfg; |
1820 | 468k | ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr = &pstr_env_enc->str_sbr_hdr; |
1821 | 468k | ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs = &pstr_env_enc->str_sbr_bs; |
1822 | 468k | struct ixheaace_ps_enc *pstr_ps_enc = pstr_env_enc->pstr_ps_enc; |
1823 | 468k | ixheaace_pstr_sbr_qmf_filter_bank pstr_synthesis_qmf_bank = |
1824 | 468k | pstr_env_enc->pstr_synthesis_qmf_bank; |
1825 | 468k | ixheaace_pstr_common_data pstr_com_data = &pstr_env_enc->str_cmon_data; |
1826 | 468k | WORD8 *ptr_sbr_scratch = pstr_env_enc->ptr_sbr_enc_scr->sbr_scratch; |
1827 | 468k | ixheaace_pstr_enc_channel pstr_env_ch[IXHEAACE_MAX_CH_IN_BS_ELE]; |
1828 | 468k | pstr_env_ch[0] = pstr_env_enc->pstr_env_channel[0]; |
1829 | 468k | pstr_env_ch[1] = pstr_env_enc->pstr_env_channel[1]; |
1830 | | |
1831 | 468k | WORD32 num_channels = pstr_sbr_cfg->num_ch; |
1832 | 468k | WORD32 n_in_channels = (pstr_ps_enc) ? 2 : num_channels; |
1833 | | |
1834 | 468k | ixheaace_sbr_stereo_mode stereo_mode = pstr_sbr_cfg->stereo_mode; |
1835 | 468k | struct ixheaace_str_sbr_env_data *pstr_env_0 = &(pstr_env_ch[0]->enc_env_data); |
1836 | 468k | struct ixheaace_str_sbr_env_data *pstr_env_1 = NULL; |
1837 | | |
1838 | 468k | if (num_channels > 1) { |
1839 | 224k | pstr_env_1 = &(pstr_env_ch[1]->enc_env_data); |
1840 | 224k | } |
1841 | 468k | ixheaace_freq_res res[MAXIMUM_NUM_NOISE_VALUES]; |
1842 | 468k | WORD32 *ptr_v_tuning; |
1843 | 468k | WORD32 v_tuning_lc_sbr[6] = {0, 2, 4, 0, 0, 0}; |
1844 | 468k | WORD32 v_tuning_ld_sbr[6] = {0, 2, 3, 0, 0, 0}; |
1845 | 468k | if (pstr_sbr_cfg->is_ld_sbr) { |
1846 | 113k | ptr_v_tuning = v_tuning_ld_sbr; |
1847 | 354k | } else { |
1848 | 354k | ptr_v_tuning = v_tuning_lc_sbr; |
1849 | 354k | } |
1850 | 468k | FLOAT32 *ptr_noise_floor[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL}; |
1851 | 468k | WORD32 *ptr_scale_factor_band_nrg[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL}; |
1852 | 468k | WORD32 *ptr_noise_level[IXHEAACE_MAX_CH_IN_BS_ELE] = {NULL}; |
1853 | | |
1854 | 468k | WORD32 *ptr_sfb_nrg_coupling[IXHEAACE_MAX_CH_IN_BS_ELE]; |
1855 | 468k | WORD32 *ptr_noise_lvl_coupling[IXHEAACE_MAX_CH_IN_BS_ELE]; |
1856 | 468k | WORD32 *ptr_frame_splitter_scratch = |
1857 | 468k | (WORD32 *)pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0]; |
1858 | | |
1859 | 468k | WORD32 max_quant_error; |
1860 | 468k | ixheaace_str_esbr_bs_data str_esbr = {0}; |
1861 | 468k | WORD32 samp_ratio_fac = DOWNSAMPLE_FAC_2_1; |
1862 | 468k | if ((pstr_env_enc->str_sbr_cfg.sbr_codec == USAC_SBR) && |
1863 | 468k | (pstr_env_enc->str_sbr_cfg.sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1)) { |
1864 | 54.5k | samp_ratio_fac = DOWNSAMPLE_FAC_4_1; |
1865 | 54.5k | } |
1866 | 468k | if ((n_in_channels > IXHEAACE_MAX_CH_IN_BS_ELE) || (n_in_channels < num_channels) || |
1867 | 468k | (n_in_channels <= 0) || (num_channels <= 0)) { |
1868 | 0 | return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_IN_CHANNELS; |
1869 | 0 | } |
1870 | 468k | ch = 0; |
1871 | 1.18M | while (ch < n_in_channels) { |
1872 | 716k | ptr_sfb_nrg_coupling[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_r_buffer[0]; |
1873 | 716k | ptr_noise_lvl_coupling[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0]; |
1874 | 716k | ptr_scale_factor_band_nrg[ch] = |
1875 | 716k | (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_r_buffer[0] + |
1876 | 716k | IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES; |
1877 | 716k | ptr_noise_level[ch] = (WORD32 *)pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0] + |
1878 | 716k | IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES; |
1879 | 716k | ptr_noise_floor[ch] = pstr_env_ch[ch]->str_sbr_extract_env.ptr_i_buffer[0] + |
1880 | 716k | IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES * 2; |
1881 | 716k | ch++; |
1882 | 716k | } |
1883 | 468k | if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) { |
1884 | 92.1k | WORD32 num_sbr_samples = 2048; |
1885 | 92.1k | if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) { |
1886 | 41.1k | num_sbr_samples = IXHEAACE_MAX_NUM_SAMPLES; |
1887 | 41.1k | } |
1888 | 92.1k | err_code = ixheaace_hbe_get_pitch_bins( |
1889 | 92.1k | ptr_in_time, pstr_sbr_cfg, pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0], |
1890 | 92.1k | ptr_sbr_tab, time_sn_stride, num_sbr_samples, &pstr_env_0->sbr_pitchin_bins, |
1891 | 92.1k | n_in_channels == 1 ? NULL : &pstr_env_1->sbr_pitchin_bins); |
1892 | 92.1k | if (err_code) return err_code; |
1893 | | |
1894 | 91.1k | WORD32 op_delay, codec_x_delay, num_time_slots; |
1895 | 91.1k | op_delay = IXHEAACE_OP_DELAY_OFFSET; |
1896 | 91.1k | codec_x_delay = IXHEAACE_ESBR_HBE_DELAY_OFFSET; |
1897 | 91.1k | if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) { |
1898 | 41.1k | op_delay = 2 * op_delay; |
1899 | 41.1k | codec_x_delay = 2 * codec_x_delay; |
1900 | 41.1k | } |
1901 | | |
1902 | 91.1k | WORD32 eff_offset = op_delay + IXHEAACE_SBR_HF_ADJ_OFFSET; |
1903 | 91.1k | WORD32 memmove_sz1 = (eff_offset + codec_x_delay) * |
1904 | 91.1k | sizeof(pstr_env_ch[0]->pstr_hbe_enc->qmf_buf_real[0][0]) * |
1905 | 91.1k | MAX_QMF_TIME_SLOTS; |
1906 | 91.1k | WORD32 memmove_sz2 = eff_offset * |
1907 | 91.1k | sizeof(pstr_env_ch[0]->pstr_hbe_enc->ph_vocod_qmf_real[0][0]) * |
1908 | 91.1k | MAX_QMF_TIME_SLOTS; |
1909 | | |
1910 | 212k | for (ch = 0; ch < n_in_channels; ch++) { |
1911 | 121k | ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc; |
1912 | 121k | num_time_slots = |
1913 | 121k | pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate; |
1914 | | |
1915 | 121k | memmove(pstr_hbe_enc->qmf_buf_real[0], pstr_hbe_enc->qmf_buf_real[num_time_slots], |
1916 | 121k | memmove_sz1); |
1917 | 121k | memmove(pstr_hbe_enc->qmf_buf_imag[0], pstr_hbe_enc->qmf_buf_imag[num_time_slots], |
1918 | 121k | memmove_sz1); |
1919 | 121k | memmove(pstr_hbe_enc->ph_vocod_qmf_real[0], pstr_hbe_enc->ph_vocod_qmf_real[num_time_slots], |
1920 | 121k | memmove_sz2); |
1921 | 121k | memmove(pstr_hbe_enc->ph_vocod_qmf_imag, pstr_hbe_enc->ph_vocod_qmf_imag + num_time_slots, |
1922 | 121k | memmove_sz2); |
1923 | 121k | } |
1924 | 91.1k | } |
1925 | 467k | i = 0; |
1926 | 5.13M | while (i < MAXIMUM_NUM_NOISE_VALUES) { |
1927 | 4.67M | res[i] = FREQ_RES_HIGH; |
1928 | 4.67M | i++; |
1929 | 4.67M | } |
1930 | | |
1931 | 467k | memset(transient_info, 0, sizeof(transient_info)); |
1932 | | |
1933 | 467k | ch = 0; |
1934 | 1.18M | while (ch < n_in_channels) { |
1935 | 714k | ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env); |
1936 | | |
1937 | 714k | ixheaace_sbr_analysis_filtering( |
1938 | 714k | ptr_in_time ? ptr_in_time + ch : NULL, time_sn_stride, |
1939 | 714k | pstr_sbr_extract_env->ptr_r_buffer, pstr_sbr_extract_env->ptr_i_buffer, |
1940 | 714k | &pstr_env_ch[ch]->str_sbr_qmf, ptr_sbr_tab->ptr_qmf_tab, |
1941 | 714k | pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate, |
1942 | 714k | pstr_sbr_cfg->is_ld_sbr, (FLOAT32 *)ptr_sbr_scratch, |
1943 | 714k | (pstr_ps_enc != NULL && flag_framelength_small)); |
1944 | | |
1945 | 714k | if ((1 == n_in_channels) && (USAC_SBR == pstr_sbr_cfg->sbr_codec) && |
1946 | 714k | (pstr_sbr_hdr->sbr_pvc_active)) { |
1947 | 69.6k | ixheaace_pvc_scratch *pstr_pvc_scr = (ixheaace_pvc_scratch *)ptr_sbr_scratch; |
1948 | 69.6k | WORD32 ts, bd; |
1949 | 69.6k | FLOAT32 nrg_0, nrg_1; |
1950 | 69.6k | FLOAT32 *ptr_r_0, *ptr_r_1, *ptr_i_0, *ptr_i_1; |
1951 | 69.6k | FLOAT32 *ptr_r_2, *ptr_r_3, *ptr_i_2, *ptr_i_3, nrg_2, nrg_3; |
1952 | 69.6k | WORD32 pvc_rate = pstr_env_enc->pstr_pvc_enc->pvc_param.pvc_rate; |
1953 | | |
1954 | | // update header_active to send SBR header when previous PVC mode is different from |
1955 | | // current frame's |
1956 | 69.6k | if (pstr_env_enc->str_sbr_hdr.sbr_pvc_mode != |
1957 | 69.6k | pstr_env_enc->pstr_pvc_enc->pvc_param.pvc_mode) { |
1958 | 1.46k | pstr_sbr_bs->header_active = 1; |
1959 | 1.46k | } |
1960 | | |
1961 | 69.6k | switch (pvc_rate) { |
1962 | 50.2k | case 2: { |
1963 | 853k | for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) { |
1964 | 803k | ptr_r_0 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts]; |
1965 | 803k | ptr_r_1 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 1]; |
1966 | 803k | ptr_i_0 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts]; |
1967 | 803k | ptr_i_1 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 1]; |
1968 | | |
1969 | 52.2M | for (bd = 0; bd < MAX_QMF_TIME_SLOTS; bd++) { |
1970 | 51.4M | nrg_0 = ptr_r_0[bd] * ptr_r_0[bd] + ptr_i_0[bd] * ptr_i_0[bd]; |
1971 | 51.4M | nrg_1 = ptr_r_1[bd] * ptr_r_1[bd] + ptr_i_1[bd] * ptr_i_1[bd]; |
1972 | 51.4M | pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd] = |
1973 | 51.4M | (nrg_0 + nrg_1) / 2.0f; |
1974 | 51.4M | } |
1975 | 803k | WORD32 num_low_bands = MAX_QMF_TIME_SLOTS >> 1; |
1976 | 26.5M | for (bd = 0; bd < num_low_bands; bd++) { |
1977 | 25.7M | pstr_pvc_scr->pvc_qmf_low[ts * num_low_bands + bd] = |
1978 | 25.7M | pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd]; |
1979 | 25.7M | } |
1980 | 803k | } |
1981 | 50.2k | break; |
1982 | 0 | } |
1983 | 19.4k | case 4: { |
1984 | 330k | for (ts = 0; ts < IXHEAACE_ESBR_PVC_NUM_TS; ts++) { |
1985 | 311k | ptr_r_0 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts]; |
1986 | 311k | ptr_r_1 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 1]; |
1987 | 311k | ptr_r_2 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 2]; |
1988 | 311k | ptr_r_3 = pstr_sbr_extract_env->ptr_r_buffer[pvc_rate * ts + 3]; |
1989 | 311k | ptr_i_0 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts]; |
1990 | 311k | ptr_i_1 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 1]; |
1991 | 311k | ptr_i_2 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 2]; |
1992 | 311k | ptr_i_3 = pstr_sbr_extract_env->ptr_i_buffer[pvc_rate * ts + 3]; |
1993 | | |
1994 | 20.2M | for (bd = 0; bd < MAX_QMF_TIME_SLOTS; bd++) { |
1995 | 19.9M | nrg_0 = ptr_r_0[bd] * ptr_r_0[bd] + ptr_i_0[bd] * ptr_i_0[bd]; |
1996 | 19.9M | nrg_1 = ptr_r_1[bd] * ptr_r_1[bd] + ptr_i_1[bd] * ptr_i_1[bd]; |
1997 | 19.9M | nrg_2 = ptr_r_2[bd] * ptr_r_2[bd] + ptr_i_2[bd] * ptr_i_2[bd]; |
1998 | 19.9M | nrg_3 = ptr_r_3[bd] * ptr_r_3[bd] + ptr_i_3[bd] * ptr_i_3[bd]; |
1999 | 19.9M | pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd] = |
2000 | 19.9M | (nrg_0 + nrg_1 + nrg_2 + nrg_3) / 4.0f; |
2001 | 19.9M | } |
2002 | 311k | WORD32 num_low_bands = (MAX_QMF_TIME_SLOTS >> 2); |
2003 | 5.29M | for (bd = 0; bd < num_low_bands; bd++) { |
2004 | 4.98M | pstr_pvc_scr->pvc_qmf_low[ts * num_low_bands + bd] = |
2005 | 4.98M | pstr_pvc_scr->pvc_qmf_high[ts * IXHEAACE_ESBR_PVC_NUM_QMF_BANDS + bd]; |
2006 | 4.98M | } |
2007 | 311k | } |
2008 | 19.4k | break; |
2009 | 0 | } |
2010 | 69.6k | } |
2011 | 69.6k | pstr_env_enc->pstr_pvc_enc->pvc_param.usac_indep_flag = pstr_sbr_bs->usac_indep_flag; |
2012 | 69.6k | err_code = ixheaace_pvc_encode_frame( |
2013 | 69.6k | pstr_env_enc->pstr_pvc_enc, (UWORD8)pstr_env_enc->str_sbr_hdr.sbr_pvc_mode, |
2014 | 69.6k | pstr_pvc_scr->pvc_qmf_low, pstr_pvc_scr->pvc_qmf_high, |
2015 | 69.6k | pstr_sbr_cfg->ptr_v_k_master[0], |
2016 | 69.6k | pstr_sbr_cfg->ptr_v_k_master[pstr_sbr_cfg->num_master] - 1); |
2017 | 69.6k | if (err_code) { |
2018 | 0 | return err_code; |
2019 | 0 | } |
2020 | | |
2021 | 69.6k | memcpy(&pstr_env_ch[ch]->enc_env_data.pvc_info, &pstr_env_enc->pstr_pvc_enc->pvc_bs_info, |
2022 | 69.6k | sizeof(ixheaace_pvc_bs_info)); |
2023 | 69.6k | } |
2024 | | |
2025 | | // COPY generated spectrum for inter-TES encoder |
2026 | 714k | if ((USAC_SBR == pstr_sbr_cfg->sbr_codec) && (1 == pstr_sbr_hdr->sbr_inter_tes_active)) { |
2027 | 168k | WORD32 ts, num_ts, delay; |
2028 | 168k | num_ts = pstr_env_ch[ch]->str_sbr_qmf.num_time_slots; |
2029 | | |
2030 | 168k | ixheaace_str_inter_tes_params *pstr_tes_enc = &pstr_env_ch[ch]->str_inter_tes_enc; |
2031 | 168k | delay = pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET; |
2032 | 168k | ts = 0; |
2033 | 2.86M | while (ts < num_ts) { |
2034 | 2.69M | memcpy(pstr_tes_enc->qmf_buf_real[delay + ts], pstr_sbr_extract_env->ptr_r_buffer[ts], |
2035 | 2.69M | IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0])); |
2036 | 2.69M | memcpy(pstr_tes_enc->qmf_buf_imag[delay + ts], pstr_sbr_extract_env->ptr_i_buffer[ts], |
2037 | 2.69M | IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_imag[0][0])); |
2038 | 2.69M | ts++; |
2039 | 2.69M | } |
2040 | 168k | } |
2041 | | |
2042 | 714k | ch++; |
2043 | 714k | } |
2044 | 467k | if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) { |
2045 | 91.1k | WORD32 dft_hbe_flag = 0; |
2046 | 91.1k | WORD32 op_delay, codec_x_delay, num_time_slots; |
2047 | 91.1k | WORD32 esbr_hbe_delay_offsets = IXHEAACE_ESBR_HBE_DELAY_OFFSET; |
2048 | 91.1k | WORD32 oversampling_flag = 0; |
2049 | 91.1k | op_delay = IXHEAACE_OP_DELAY_OFFSET; |
2050 | 91.1k | codec_x_delay = IXHEAACE_ESBR_HBE_DELAY_OFFSET; |
2051 | 91.1k | if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) { |
2052 | 41.1k | op_delay = 2 * IXHEAACE_OP_DELAY_OFFSET; |
2053 | 41.1k | codec_x_delay = 2 * codec_x_delay; |
2054 | 41.1k | oversampling_flag = 1; |
2055 | 41.1k | } |
2056 | 91.1k | WORD32 eff_offset = op_delay + IXHEAACE_SBR_HF_ADJ_OFFSET; |
2057 | 91.1k | dft_hbe_flag = pstr_sbr_hdr->hq_esbr; |
2058 | 91.1k | ch = 0; |
2059 | 196k | while (ch < n_in_channels) { |
2060 | 117k | ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc; |
2061 | 117k | pstr_hbe_enc->pstr_hbe_txposer->oversampling_flag = oversampling_flag; |
2062 | 117k | num_time_slots = |
2063 | 117k | pstr_env_ch[ch]->str_sbr_qmf.num_time_slots * pstr_env_ch[ch]->str_sbr_qmf.rate; |
2064 | | |
2065 | 117k | if (dft_hbe_flag == 1) { |
2066 | 32.9k | err_code = ixheaace_dft_hbe_apply( |
2067 | 32.9k | pstr_hbe_enc->pstr_hbe_txposer, |
2068 | 32.9k | pstr_hbe_enc->qmf_buf_real + eff_offset + esbr_hbe_delay_offsets, |
2069 | 32.9k | pstr_hbe_enc->qmf_buf_imag + eff_offset + esbr_hbe_delay_offsets, num_time_slots, |
2070 | 32.9k | pstr_hbe_enc->ph_vocod_qmf_real + eff_offset, |
2071 | 32.9k | pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset, |
2072 | 32.9k | pstr_env_ch[ch]->enc_env_data.sbr_pitchin_bins, (FLOAT32 *)ptr_sbr_scratch); |
2073 | 32.9k | if (err_code) { |
2074 | 11.5k | return err_code; |
2075 | 11.5k | } |
2076 | 84.2k | } else { |
2077 | | // size 4096 samples |
2078 | 84.2k | FLOAT32 *ptr_time_data = (FLOAT32 *)ptr_sbr_scratch; |
2079 | 84.2k | int cnt = 0; |
2080 | 84.2k | if (0 == ch) { |
2081 | 271M | while (cnt < IXHEAACE_MAX_NUM_SAMPLES) { |
2082 | 271M | ptr_time_data[cnt] = pstr_env_enc->ptr_hbe_resample_buf[2 * cnt]; |
2083 | 271M | cnt++; |
2084 | 271M | } |
2085 | 66.1k | } else { |
2086 | 74.0M | while (cnt < IXHEAACE_MAX_NUM_SAMPLES) { |
2087 | 73.9M | ptr_time_data[cnt] = pstr_env_enc->ptr_hbe_resample_buf[2 * cnt + 1]; |
2088 | 73.9M | cnt++; |
2089 | 73.9M | } |
2090 | 18.0k | } |
2091 | | |
2092 | 84.2k | ixheaace_esbr_analysis_filt_block(&(pstr_hbe_enc->str_codec_qmf_bank), |
2093 | 84.2k | pstr_hbe_enc->str_codec_qmf_bank.pstr_qmf_dec_tabs, |
2094 | 84.2k | ptr_time_data, pstr_hbe_enc->qmf_buf_real, |
2095 | 84.2k | pstr_hbe_enc->qmf_buf_imag, |
2096 | 84.2k | op_delay + codec_x_delay + IXHEAACE_SBR_HF_ADJ_OFFSET); |
2097 | | |
2098 | 84.2k | err_code = ixheaace_qmf_hbe_apply( |
2099 | 84.2k | pstr_hbe_enc->pstr_hbe_txposer, |
2100 | 84.2k | pstr_hbe_enc->qmf_buf_real + eff_offset + esbr_hbe_delay_offsets, |
2101 | 84.2k | pstr_hbe_enc->qmf_buf_imag + eff_offset + esbr_hbe_delay_offsets, num_time_slots, |
2102 | 84.2k | pstr_hbe_enc->ph_vocod_qmf_real + eff_offset, |
2103 | 84.2k | pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset, |
2104 | 84.2k | pstr_env_ch[ch]->enc_env_data.sbr_pitchin_bins); |
2105 | 84.2k | if (err_code) { |
2106 | 0 | return err_code; |
2107 | 0 | } |
2108 | | |
2109 | 84.2k | if (pstr_sbr_cfg->sbr_ratio_idx == USAC_SBR_RATIO_INDEX_4_1) { |
2110 | 45.0k | ixheaace_hbe_repl_spec(&pstr_hbe_enc->pstr_hbe_txposer->x_over_qmf[0], |
2111 | 45.0k | pstr_hbe_enc->ph_vocod_qmf_real + eff_offset, |
2112 | 45.0k | pstr_hbe_enc->ph_vocod_qmf_imag + eff_offset, num_time_slots, |
2113 | 45.0k | pstr_hbe_enc->pstr_hbe_txposer->max_stretch); |
2114 | 45.0k | } |
2115 | 84.2k | } |
2116 | 105k | ch++; |
2117 | 105k | } |
2118 | 91.1k | } |
2119 | 455k | if (pstr_ps_enc && pstr_synthesis_qmf_bank) { |
2120 | 24.2k | err_code = ixheaace_encode_ps_frame( |
2121 | 24.2k | pstr_ps_enc, pstr_env_ch[0]->str_sbr_extract_env.ptr_i_buffer, |
2122 | 24.2k | pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer, |
2123 | 24.2k | pstr_env_ch[1]->str_sbr_extract_env.ptr_i_buffer, |
2124 | 24.2k | pstr_env_ch[1]->str_sbr_extract_env.ptr_r_buffer, ptr_sbr_tab->ptr_ps_tab, pstr_com_tab); |
2125 | 24.2k | if (err_code) { |
2126 | 0 | return err_code; |
2127 | 0 | } |
2128 | 24.2k | ixheaace_enc_synthesis_qmf_filtering( |
2129 | 24.2k | pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer, |
2130 | 24.2k | pstr_env_ch[0]->str_sbr_extract_env.ptr_i_buffer, ptr_core_buf, |
2131 | 24.2k | (ixheaace_pstr_sbr_qmf_filter_bank)pstr_synthesis_qmf_bank); |
2132 | 24.2k | } |
2133 | | |
2134 | 455k | ch = 0; |
2135 | 1.13M | while (ch < num_channels) { |
2136 | 674k | ixheaace_str_hbe_enc *pstr_hbe_enc = pstr_env_ch[ch]->pstr_hbe_enc; |
2137 | 674k | ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env); |
2138 | | |
2139 | 674k | ixheaace_get_energy_from_cplx_qmf( |
2140 | 674k | pstr_sbr_extract_env->ptr_y_buffer + pstr_sbr_extract_env->y_buffer_write_offset, |
2141 | 674k | pstr_sbr_extract_env->ptr_r_buffer, pstr_sbr_extract_env->ptr_i_buffer, |
2142 | 674k | pstr_sbr_cfg->is_ld_sbr, pstr_env_ch[ch]->str_sbr_qmf.num_time_slots, samp_ratio_fac, |
2143 | 674k | pstr_hbe_enc, |
2144 | 674k | (IXHEAACE_OP_DELAY_OFFSET + IXHEAACE_ESBR_HBE_DELAY_OFFSET + IXHEAACE_SBR_HF_ADJ_OFFSET), |
2145 | 674k | pstr_sbr_hdr->sbr_harmonic); |
2146 | | |
2147 | 674k | ixheaace_calculate_tonality_quotas( |
2148 | 674k | &pstr_env_ch[ch]->str_ton_corr, pstr_sbr_extract_env->ptr_r_buffer, |
2149 | 674k | pstr_sbr_extract_env->ptr_i_buffer, |
2150 | 674k | pstr_sbr_cfg->ptr_freq_band_tab[HI][pstr_sbr_cfg->num_scf[HI]], |
2151 | 674k | pstr_env_ch[ch]->str_sbr_qmf.num_time_slots, pstr_sbr_extract_env->time_step); |
2152 | 674k | if (pstr_sbr_cfg->is_ld_sbr) { |
2153 | 166k | ixheaace_detect_transient_eld(pstr_sbr_extract_env->ptr_y_buffer, |
2154 | 166k | &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch]); |
2155 | 508k | } else if (pstr_sbr_extract_env->time_step == 4) { |
2156 | 64.0k | ixheaace_detect_transient_4_1(pstr_sbr_extract_env->ptr_y_buffer, |
2157 | 64.0k | &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch], |
2158 | 64.0k | pstr_sbr_extract_env->time_step, pstr_sbr_cfg->sbr_codec); |
2159 | 444k | } else { |
2160 | 444k | ixheaace_detect_transient(pstr_sbr_extract_env->ptr_y_buffer, |
2161 | 444k | &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch], |
2162 | 444k | pstr_sbr_extract_env->time_step, pstr_sbr_cfg->sbr_codec); |
2163 | 444k | } |
2164 | 674k | if (transient_info[ch][1] == 0) { |
2165 | 547k | if (pstr_sbr_cfg->is_ld_sbr) { |
2166 | 124k | err_code = ixheaace_frame_splitter( |
2167 | 124k | pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector, |
2168 | 124k | pstr_sbr_cfg->ptr_freq_band_tab[1], pstr_sbr_cfg->num_scf[1], |
2169 | 124k | pstr_sbr_extract_env->time_step, pstr_sbr_extract_env->time_slots, transient_info[ch], |
2170 | 124k | (FLOAT32 *)ptr_frame_splitter_scratch, pstr_sbr_cfg->is_ld_sbr); |
2171 | 422k | } else { |
2172 | 422k | err_code = ixheaace_frame_splitter( |
2173 | 422k | pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector, |
2174 | 422k | pstr_sbr_cfg->ptr_freq_band_tab[1], pstr_sbr_cfg->num_scf[1], |
2175 | 422k | pstr_sbr_extract_env->time_step, pstr_sbr_extract_env->no_cols, transient_info[ch], |
2176 | 422k | (FLOAT32 *)ptr_frame_splitter_scratch, pstr_sbr_cfg->is_ld_sbr); |
2177 | 422k | } |
2178 | 547k | if (err_code) { |
2179 | 0 | return err_code; |
2180 | 0 | } |
2181 | 547k | } |
2182 | 674k | ch++; |
2183 | 674k | } |
2184 | | |
2185 | 455k | if (stereo_mode == SBR_COUPLING) { |
2186 | 0 | if (transient_info[0][1] && transient_info[1][1]) { |
2187 | 0 | transient_info[0][0] = ixheaac_min32(transient_info[1][0], transient_info[0][0]); |
2188 | |
|
2189 | 0 | transient_info[1][0] = transient_info[0][0]; |
2190 | 0 | } else if (transient_info[0][1] && !transient_info[1][1]) { |
2191 | 0 | transient_info[1][0] = transient_info[0][0]; |
2192 | 0 | } else if (!transient_info[0][1] && transient_info[1][1]) { |
2193 | 0 | transient_info[0][0] = transient_info[1][0]; |
2194 | 0 | } else { |
2195 | 0 | transient_info[0][0] = ixheaac_max32(transient_info[1][0], transient_info[0][0]); |
2196 | |
|
2197 | 0 | transient_info[1][0] = transient_info[0][0]; |
2198 | 0 | } |
2199 | 0 | } |
2200 | | |
2201 | 455k | err_code = ixheaace_frame_info_generator( |
2202 | 455k | &pstr_env_ch[0]->str_sbr_env_frame, pstr_env_ch[0]->str_sbr_extract_env.pre_transient_info, |
2203 | 455k | transient_info[0], ptr_v_tuning, ptr_sbr_tab->ptr_qmf_tab, |
2204 | 455k | pstr_env_ch[0]->str_sbr_qmf.num_time_slots, pstr_sbr_cfg->is_ld_sbr, &pstr_frame_info, |
2205 | 455k | flag_framelength_small); |
2206 | 455k | if (pstr_sbr_cfg->is_ld_sbr && transient_info[0][2]) { |
2207 | 1.30k | pstr_frame_info->short_env = pstr_frame_info->n_envelopes; |
2208 | 1.30k | } |
2209 | 455k | pstr_const_frame_info[0] = pstr_frame_info; |
2210 | 455k | if (err_code) { |
2211 | 0 | return err_code; |
2212 | 0 | } |
2213 | | |
2214 | 455k | pstr_env_0->pstr_sbr_bs_grid = &pstr_env_ch[0]->str_sbr_env_frame.sbr_grid; |
2215 | | |
2216 | 1.13M | for (ch = 0; ch < num_channels; ch++) { |
2217 | 674k | memset( |
2218 | 674k | ptr_noise_floor[ch], 0, |
2219 | 674k | IXHEAACE_MAX_CH_IN_BS_ELE * MAXIMUM_NUM_ENVELOPE_VALUES * sizeof(ptr_noise_floor[0][0])); |
2220 | 674k | } |
2221 | | |
2222 | 455k | switch (stereo_mode) { |
2223 | 95.5k | case IXHEAACE_SBR_MODE_LEFT_RIGHT: |
2224 | 218k | case IXHEAACE_SBR_MODE_SWITCH_LRC: |
2225 | | |
2226 | 218k | err_code = ixheaace_frame_info_generator( |
2227 | 218k | &pstr_env_ch[1]->str_sbr_env_frame, |
2228 | 218k | pstr_env_ch[1]->str_sbr_extract_env.pre_transient_info, transient_info[1], ptr_v_tuning, |
2229 | 218k | ptr_sbr_tab->ptr_qmf_tab, pstr_env_ch[1]->str_sbr_qmf.num_time_slots, |
2230 | 218k | pstr_sbr_cfg->is_ld_sbr, &pstr_frame_info, flag_framelength_small); |
2231 | | |
2232 | 218k | if (pstr_sbr_cfg->is_ld_sbr && transient_info[1][2]) { |
2233 | 758 | pstr_frame_info->short_env = pstr_frame_info->n_envelopes; |
2234 | 758 | } |
2235 | 218k | pstr_const_frame_info[1] = pstr_frame_info; |
2236 | 218k | if (err_code) { |
2237 | 0 | return err_code; |
2238 | 0 | } |
2239 | | |
2240 | 218k | pstr_env_1->pstr_sbr_bs_grid = &pstr_env_ch[1]->str_sbr_env_frame.sbr_grid; |
2241 | | |
2242 | 218k | if (pstr_const_frame_info[0]->n_envelopes != pstr_const_frame_info[1]->n_envelopes) { |
2243 | 4.89k | stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT; |
2244 | 214k | } else { |
2245 | 754k | for (i = 0; i < pstr_const_frame_info[0]->n_envelopes + 1; i++) { |
2246 | 543k | if (pstr_const_frame_info[0]->borders[i] != pstr_const_frame_info[1]->borders[i]) { |
2247 | 2.94k | stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT; |
2248 | 2.94k | break; |
2249 | 2.94k | } |
2250 | 543k | } |
2251 | | |
2252 | 548k | for (i = 0; i < pstr_const_frame_info[0]->n_envelopes; i++) { |
2253 | 334k | if (pstr_const_frame_info[0]->freq_res[i] != pstr_const_frame_info[1]->freq_res[i]) { |
2254 | 564 | stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT; |
2255 | 564 | break; |
2256 | 564 | } |
2257 | 334k | } |
2258 | | |
2259 | 214k | if (pstr_const_frame_info[0]->short_env != pstr_const_frame_info[1]->short_env) { |
2260 | 719 | stereo_mode = IXHEAACE_SBR_MODE_LEFT_RIGHT; |
2261 | 719 | } |
2262 | 214k | } |
2263 | 218k | break; |
2264 | 0 | case SBR_COUPLING: |
2265 | |
|
2266 | 0 | pstr_const_frame_info[1] = pstr_const_frame_info[0]; |
2267 | |
|
2268 | 0 | pstr_env_1->pstr_sbr_bs_grid = &pstr_env_ch[0]->str_sbr_env_frame.sbr_grid; |
2269 | 0 | break; |
2270 | 236k | case IXHEAACE_SBR_MODE_MONO: |
2271 | 236k | break; |
2272 | 455k | } |
2273 | | |
2274 | 1.13M | for (ch = 0; ch < num_channels; ch++) { |
2275 | 674k | ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env); |
2276 | | |
2277 | 674k | pstr_sbr_extract_env->pre_transient_info[0] = transient_info[ch][0]; |
2278 | 674k | pstr_sbr_extract_env->pre_transient_info[1] = transient_info[ch][1]; |
2279 | 674k | pstr_env_ch[ch]->enc_env_data.no_of_envelopes = n_envelopes[ch] = |
2280 | 674k | pstr_const_frame_info[ch]->n_envelopes; |
2281 | | |
2282 | 1.70M | for (i = 0; i < n_envelopes[ch]; i++) { |
2283 | 1.03M | pstr_env_ch[ch]->enc_env_data.no_scf_bands[i] = |
2284 | 1.03M | (pstr_const_frame_info[ch]->freq_res[i] == FREQ_RES_HIGH |
2285 | 1.03M | ? pstr_sbr_cfg->num_scf[FREQ_RES_HIGH] |
2286 | 1.03M | : pstr_sbr_cfg->num_scf[FREQ_RES_LOW]); |
2287 | 1.03M | } |
2288 | | |
2289 | 674k | if ((pstr_env_ch[ch]->enc_env_data.pstr_sbr_bs_grid->frame_type == IXHEAACE_FIXFIX) && |
2290 | 674k | (n_envelopes[ch] == 1)) { |
2291 | 468k | if (pstr_sbr_cfg->is_ld_sbr) { |
2292 | 121k | pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res = IXHEAACE_SBR_AMP_RES_3_0; |
2293 | 347k | } else { |
2294 | 347k | pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res = IXHEAACE_SBR_AMP_RES_1_5; |
2295 | 347k | } |
2296 | 468k | if (pstr_env_ch[ch]->enc_env_data.init_sbr_amp_res != |
2297 | 468k | pstr_env_ch[ch]->enc_env_data.curr_sbr_amp_res) { |
2298 | 43.6k | err_code = ixheaace_init_sbr_huffman_tabs( |
2299 | 43.6k | &pstr_env_ch[ch]->enc_env_data, &pstr_env_ch[ch]->str_sbr_code_env, |
2300 | 43.6k | &pstr_env_ch[ch]->str_sbr_code_noise_floor, IXHEAACE_SBR_AMP_RES_1_5, |
2301 | 43.6k | ptr_sbr_tab->ptr_sbr_huff_tab); |
2302 | 43.6k | if (err_code) { |
2303 | 0 | return err_code; |
2304 | 0 | } |
2305 | 43.6k | pstr_env_ch[ch]->sbr_amp_res_init = IXHEAACE_SBR_AMP_RES_1_5; |
2306 | 43.6k | } |
2307 | 468k | } else { |
2308 | 206k | if (pstr_sbr_hdr->sbr_amp_res != pstr_env_ch[ch]->enc_env_data.init_sbr_amp_res) { |
2309 | 39.5k | err_code = ixheaace_init_sbr_huffman_tabs( |
2310 | 39.5k | &pstr_env_ch[ch]->enc_env_data, &pstr_env_ch[ch]->str_sbr_code_env, |
2311 | 39.5k | &pstr_env_ch[ch]->str_sbr_code_noise_floor, pstr_sbr_hdr->sbr_amp_res, |
2312 | 39.5k | ptr_sbr_tab->ptr_sbr_huff_tab); |
2313 | 39.5k | if (err_code) { |
2314 | 0 | return err_code; |
2315 | 0 | } |
2316 | 39.5k | pstr_env_ch[ch]->sbr_amp_res_init = pstr_sbr_hdr->sbr_amp_res; |
2317 | 39.5k | } |
2318 | 206k | } |
2319 | | |
2320 | 674k | ixheaace_ton_corr_param_extr( |
2321 | 674k | &pstr_env_ch[ch]->str_ton_corr, pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec, |
2322 | 674k | ptr_noise_floor[ch], &pstr_env_ch[ch]->enc_env_data.add_harmonic_flag, |
2323 | 674k | pstr_env_ch[ch]->enc_env_data.add_harmonic, pstr_sbr_extract_env->envelope_compensation, |
2324 | 674k | pstr_const_frame_info[ch], transient_info[ch], pstr_sbr_cfg->ptr_freq_band_tab[HI], |
2325 | 674k | pstr_sbr_cfg->num_scf[HI], pstr_env_ch[ch]->enc_env_data.sbr_xpos_mode, ptr_sbr_scratch, |
2326 | 674k | pstr_sbr_cfg->is_ld_sbr); |
2327 | | |
2328 | 674k | pstr_env_ch[ch]->enc_env_data.sbr_invf_mode = |
2329 | 674k | pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec[0]; |
2330 | 674k | pstr_env_ch[ch]->enc_env_data.noise_band_count = |
2331 | 674k | pstr_env_ch[ch]->str_ton_corr.sbr_noise_floor_est.num_of_noise_bands; |
2332 | 674k | } |
2333 | | |
2334 | 455k | switch (stereo_mode) { |
2335 | 236k | case IXHEAACE_SBR_MODE_MONO: |
2336 | 236k | err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer, |
2337 | 236k | NULL, pstr_const_frame_info[0], |
2338 | 236k | ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg, |
2339 | 236k | pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL); |
2340 | | |
2341 | 236k | if (err_code) { |
2342 | 0 | return err_code; |
2343 | 0 | } |
2344 | 236k | break; |
2345 | | |
2346 | 236k | case IXHEAACE_SBR_MODE_LEFT_RIGHT: |
2347 | | |
2348 | 100k | err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer, |
2349 | 100k | NULL, pstr_const_frame_info[0], |
2350 | 100k | ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg, |
2351 | 100k | pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL); |
2352 | 100k | if (err_code) { |
2353 | 0 | return err_code; |
2354 | 0 | } |
2355 | | |
2356 | 100k | err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, |
2357 | 100k | NULL, pstr_const_frame_info[1], |
2358 | 100k | ptr_scale_factor_band_nrg[1], NULL, pstr_sbr_cfg, |
2359 | 100k | pstr_env_ch[1], IXHEAACE_SBR_MODE_MONO, NULL); |
2360 | | |
2361 | 100k | if (err_code) { |
2362 | 0 | return err_code; |
2363 | 0 | } |
2364 | | |
2365 | 100k | break; |
2366 | | |
2367 | 100k | case SBR_COUPLING: |
2368 | |
|
2369 | 0 | err_code = ixheaace_calculate_sbr_envelope( |
2370 | 0 | pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer, |
2371 | 0 | pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, pstr_const_frame_info[0], |
2372 | 0 | ptr_scale_factor_band_nrg[0], ptr_scale_factor_band_nrg[1], pstr_sbr_cfg, |
2373 | 0 | pstr_env_ch[0], SBR_COUPLING, &max_quant_error); |
2374 | 0 | if (err_code) { |
2375 | 0 | return err_code; |
2376 | 0 | } |
2377 | 0 | break; |
2378 | | |
2379 | 118k | case IXHEAACE_SBR_MODE_SWITCH_LRC: |
2380 | 118k | err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer, |
2381 | 118k | NULL, pstr_const_frame_info[0], |
2382 | 118k | ptr_scale_factor_band_nrg[0], NULL, pstr_sbr_cfg, |
2383 | 118k | pstr_env_ch[0], IXHEAACE_SBR_MODE_MONO, NULL); |
2384 | 118k | if (err_code) { |
2385 | 0 | return err_code; |
2386 | 0 | } |
2387 | | |
2388 | 118k | err_code = ixheaace_calculate_sbr_envelope(pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, |
2389 | 118k | NULL, pstr_const_frame_info[1], |
2390 | 118k | ptr_scale_factor_band_nrg[1], NULL, pstr_sbr_cfg, |
2391 | 118k | pstr_env_ch[1], IXHEAACE_SBR_MODE_MONO, NULL); |
2392 | 118k | if (err_code) { |
2393 | 0 | return err_code; |
2394 | 0 | } |
2395 | | |
2396 | 118k | err_code = ixheaace_calculate_sbr_envelope( |
2397 | 118k | pstr_env_ch[0]->str_sbr_extract_env.ptr_y_buffer, |
2398 | 118k | pstr_env_ch[1]->str_sbr_extract_env.ptr_y_buffer, pstr_const_frame_info[0], |
2399 | 118k | ptr_sfb_nrg_coupling[0], ptr_sfb_nrg_coupling[1], pstr_sbr_cfg, pstr_env_ch[0], |
2400 | 118k | SBR_COUPLING, &max_quant_error); |
2401 | 118k | if (err_code) { |
2402 | 0 | return err_code; |
2403 | 0 | } |
2404 | 118k | break; |
2405 | 455k | } |
2406 | | |
2407 | 455k | switch (stereo_mode) { |
2408 | 236k | case IXHEAACE_SBR_MODE_MONO: |
2409 | | |
2410 | 236k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0); |
2411 | | |
2412 | 236k | err_code = ixheaace_code_envelope( |
2413 | 236k | ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor, |
2414 | 236k | pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0, |
2415 | 236k | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2416 | 236k | if (err_code) { |
2417 | 0 | return err_code; |
2418 | 0 | } |
2419 | | |
2420 | 236k | break; |
2421 | | |
2422 | 236k | case IXHEAACE_SBR_MODE_LEFT_RIGHT: |
2423 | | // We have a error checks for Number of channels to ensure memory is assigned to |
2424 | | // ptr_noise_floor[]. However, MSVS static analysis is marking this as a potential error. |
2425 | | // So, suppressed this in source |
2426 | 100k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0); |
2427 | | |
2428 | 100k | err_code = ixheaace_code_envelope( |
2429 | 100k | ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor, |
2430 | 100k | pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0, |
2431 | 100k | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2432 | 100k | if (err_code) { |
2433 | 0 | return err_code; |
2434 | 0 | } |
2435 | | |
2436 | 100k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 0); |
2437 | | |
2438 | 100k | err_code = ixheaace_code_envelope( |
2439 | 100k | ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor, |
2440 | 100k | pstr_env_1->domain_vec_noise, 0, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 0, |
2441 | 100k | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2442 | 100k | if (err_code) { |
2443 | 0 | return err_code; |
2444 | 0 | } |
2445 | | |
2446 | 100k | break; |
2447 | | |
2448 | 100k | case SBR_COUPLING: |
2449 | 0 | ixheaace_couple_noise_floor(ptr_noise_floor[0], ptr_noise_floor[1]); |
2450 | |
|
2451 | 0 | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0); |
2452 | |
|
2453 | 0 | err_code = ixheaace_code_envelope( |
2454 | 0 | ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor, |
2455 | 0 | pstr_env_0->domain_vec_noise, 1, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0, |
2456 | 0 | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2457 | 0 | if (err_code) { |
2458 | 0 | return err_code; |
2459 | 0 | } |
2460 | | |
2461 | 0 | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 1); |
2462 | |
|
2463 | 0 | err_code = ixheaace_code_envelope( |
2464 | 0 | ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor, |
2465 | 0 | pstr_env_1->domain_vec_noise, 1, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 1, |
2466 | 0 | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2467 | 0 | if (err_code) { |
2468 | 0 | return err_code; |
2469 | 0 | } |
2470 | | |
2471 | 0 | break; |
2472 | | |
2473 | 118k | case IXHEAACE_SBR_MODE_SWITCH_LRC: |
2474 | | |
2475 | 118k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[0], ptr_noise_floor[0], 0); |
2476 | | |
2477 | 118k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_level[1], ptr_noise_floor[1], 0); |
2478 | | |
2479 | 118k | ixheaace_couple_noise_floor(ptr_noise_floor[0], ptr_noise_floor[1]); |
2480 | | |
2481 | 118k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_lvl_coupling[0], ptr_noise_floor[0], |
2482 | 118k | 0); |
2483 | | |
2484 | 118k | ixheaace_sbr_noise_floor_levels_quantisation(ptr_noise_lvl_coupling[1], ptr_noise_floor[1], |
2485 | 118k | 1); |
2486 | 118k | break; |
2487 | 455k | } |
2488 | | |
2489 | 455k | switch (stereo_mode) { |
2490 | 236k | case IXHEAACE_SBR_MODE_MONO: |
2491 | | |
2492 | 236k | pstr_sbr_hdr->coupling = 0; |
2493 | 236k | pstr_env_0->balance = 0; |
2494 | | |
2495 | 236k | err_code = ixheaace_code_envelope( |
2496 | 236k | ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res, |
2497 | 236k | &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling, |
2498 | 236k | pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2499 | 236k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2500 | 236k | if (err_code) { |
2501 | 0 | return err_code; |
2502 | 0 | } |
2503 | 236k | break; |
2504 | | |
2505 | 236k | case IXHEAACE_SBR_MODE_LEFT_RIGHT: |
2506 | | |
2507 | 100k | pstr_sbr_hdr->coupling = 0; |
2508 | | |
2509 | 100k | pstr_env_0->balance = 0; |
2510 | 100k | pstr_env_1->balance = 0; |
2511 | | |
2512 | 100k | err_code = ixheaace_code_envelope( |
2513 | 100k | ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res, |
2514 | 100k | &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling, |
2515 | 100k | pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2516 | 100k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2517 | 100k | if (err_code) { |
2518 | 0 | return err_code; |
2519 | 0 | } |
2520 | | |
2521 | 100k | err_code = ixheaace_code_envelope( |
2522 | 100k | ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res, |
2523 | 100k | &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, pstr_sbr_hdr->coupling, |
2524 | 100k | pstr_const_frame_info[1]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2525 | 100k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2526 | 100k | if (err_code) { |
2527 | 0 | return err_code; |
2528 | 0 | } |
2529 | 100k | break; |
2530 | | |
2531 | 100k | case SBR_COUPLING: |
2532 | |
|
2533 | 0 | pstr_sbr_hdr->coupling = 1; |
2534 | 0 | pstr_env_0->balance = 0; |
2535 | 0 | pstr_env_1->balance = 1; |
2536 | |
|
2537 | 0 | err_code = ixheaace_code_envelope( |
2538 | 0 | ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res, |
2539 | 0 | &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, pstr_sbr_hdr->coupling, |
2540 | 0 | pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2541 | 0 | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2542 | 0 | if (err_code) { |
2543 | 0 | return err_code; |
2544 | 0 | } |
2545 | | |
2546 | 0 | err_code = ixheaace_code_envelope( |
2547 | 0 | ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res, |
2548 | 0 | &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, pstr_sbr_hdr->coupling, |
2549 | 0 | pstr_const_frame_info[1]->n_envelopes, 1, pstr_sbr_bs->header_active, |
2550 | 0 | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2551 | 0 | if (err_code) { |
2552 | 0 | return err_code; |
2553 | 0 | } |
2554 | 0 | break; |
2555 | | |
2556 | 118k | case IXHEAACE_SBR_MODE_SWITCH_LRC: { |
2557 | 118k | WORD32 payloadbits_lr; |
2558 | 118k | WORD32 payloadbits_coupling; |
2559 | | |
2560 | 118k | WORD32 scale_factor_band_nrg_prev_temp[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_FREQ_COEFFS]; |
2561 | 118k | WORD32 noise_prev_temp[IXHEAACE_MAX_CH_IN_BS_ELE][MAXIMUM_NUM_NOISE_COEFFS]; |
2562 | 118k | WORD32 up_date_nrg_temp[IXHEAACE_MAX_CH_IN_BS_ELE]; |
2563 | 118k | WORD32 up_date_noise_temp[IXHEAACE_MAX_CH_IN_BS_ELE]; |
2564 | 118k | WORD32 domain_vec_temp[IXHEAACE_MAX_CH_IN_BS_ELE][IXHEAACE_MAX_ENV]; |
2565 | 118k | WORD32 domain_vec_noise_temp[IXHEAACE_MAX_CH_IN_BS_ELE][IXHEAACE_MAX_ENV]; |
2566 | | |
2567 | 118k | WORD32 temp_flag_right = 0; |
2568 | 118k | WORD32 temp_flag_left = 0; |
2569 | | |
2570 | 118k | ch = 0; |
2571 | 355k | while (ch < num_channels) { |
2572 | 237k | memcpy(scale_factor_band_nrg_prev_temp[ch], |
2573 | 237k | pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev, |
2574 | 237k | MAXIMUM_FREQ_COEFFS * sizeof(scale_factor_band_nrg_prev_temp[0][0])); |
2575 | | |
2576 | 237k | memcpy(noise_prev_temp[ch], pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev, |
2577 | 237k | MAXIMUM_NUM_NOISE_COEFFS * sizeof(noise_prev_temp[0][0])); |
2578 | | |
2579 | 237k | up_date_nrg_temp[ch] = pstr_env_ch[ch]->str_sbr_code_env.update; |
2580 | 237k | up_date_noise_temp[ch] = pstr_env_ch[ch]->str_sbr_code_noise_floor.update; |
2581 | | |
2582 | 237k | if (pstr_sbr_hdr->prev_coupling) { |
2583 | 227k | pstr_env_ch[ch]->str_sbr_code_env.update = 0; |
2584 | 227k | pstr_env_ch[ch]->str_sbr_code_noise_floor.update = 0; |
2585 | 227k | } |
2586 | 237k | ch++; |
2587 | 237k | } |
2588 | | |
2589 | 118k | err_code = ixheaace_code_envelope( |
2590 | 118k | ptr_scale_factor_band_nrg[0], pstr_const_frame_info[0]->freq_res, |
2591 | 118k | &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, 0, |
2592 | 118k | pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2593 | 118k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2594 | 118k | if (err_code) { |
2595 | 0 | return err_code; |
2596 | 0 | } |
2597 | | |
2598 | 118k | err_code = ixheaace_code_envelope( |
2599 | 118k | ptr_scale_factor_band_nrg[1], pstr_const_frame_info[1]->freq_res, |
2600 | 118k | &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, 0, |
2601 | 118k | pstr_const_frame_info[1]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2602 | 118k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2603 | 118k | if (err_code) { |
2604 | 0 | return err_code; |
2605 | 0 | } |
2606 | | |
2607 | 118k | c = 0; |
2608 | 118k | i = 0; |
2609 | 305k | while (i < n_envelopes[0]) { |
2610 | 1.87M | for (j = 0; j < pstr_env_0->no_scf_bands[i]; j++) { |
2611 | 1.68M | pstr_env_0->ienvelope[i][j] = ptr_scale_factor_band_nrg[0][c]; |
2612 | 1.68M | pstr_env_1->ienvelope[i][j] = ptr_scale_factor_band_nrg[1][c]; |
2613 | | |
2614 | 1.68M | c++; |
2615 | 1.68M | } |
2616 | 187k | i++; |
2617 | 187k | } |
2618 | | |
2619 | 118k | err_code = ixheaace_code_envelope( |
2620 | 118k | ptr_noise_level[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor, |
2621 | 118k | pstr_env_0->domain_vec_noise, 0, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0, |
2622 | 118k | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2623 | 118k | if (err_code) { |
2624 | 0 | return err_code; |
2625 | 0 | } |
2626 | | |
2627 | 118k | i = 0; |
2628 | 1.30M | while (i < MAXIMUM_NUM_NOISE_VALUES) { |
2629 | 1.18M | pstr_env_0->noise_level[i] = ptr_noise_level[0][i]; |
2630 | 1.18M | i++; |
2631 | 1.18M | } |
2632 | | |
2633 | 118k | err_code = ixheaace_code_envelope( |
2634 | 118k | ptr_noise_level[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor, |
2635 | 118k | pstr_env_1->domain_vec_noise, 0, (pstr_const_frame_info[1]->n_envelopes > 1 ? 2 : 1), 0, |
2636 | 118k | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2637 | 118k | if (err_code) { |
2638 | 0 | return err_code; |
2639 | 0 | } |
2640 | | |
2641 | 118k | i = 0; |
2642 | 1.30M | while (i < MAXIMUM_NUM_NOISE_VALUES) { |
2643 | 1.18M | pstr_env_1->noise_level[i] = ptr_noise_level[1][i]; |
2644 | 1.18M | i++; |
2645 | 1.18M | } |
2646 | | |
2647 | 118k | pstr_sbr_hdr->coupling = 0; |
2648 | 118k | pstr_env_0->balance = 0; |
2649 | 118k | pstr_env_1->balance = 0; |
2650 | | |
2651 | 118k | err_code = ixheaace_count_sbr_channel_pair_element( |
2652 | 118k | pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data, |
2653 | 118k | pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr, |
2654 | 118k | &payloadbits_lr); |
2655 | 118k | if (err_code) { |
2656 | 434 | return err_code; |
2657 | 434 | } |
2658 | | |
2659 | 354k | for (ch = 0; ch < num_channels; ch++) { |
2660 | 236k | WORD32 itmp; |
2661 | | |
2662 | 13.4M | for (i = 0; i < MAXIMUM_FREQ_COEFFS; i++) { |
2663 | 13.2M | itmp = pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev[i]; |
2664 | 13.2M | pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev[i] = |
2665 | 13.2M | scale_factor_band_nrg_prev_temp[ch][i]; |
2666 | 13.2M | scale_factor_band_nrg_prev_temp[ch][i] = itmp; |
2667 | 13.2M | } |
2668 | | |
2669 | 1.41M | for (i = 0; i < MAXIMUM_NUM_NOISE_COEFFS; i++) { |
2670 | 1.18M | itmp = pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev[i]; |
2671 | 1.18M | pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev[i] = noise_prev_temp[ch][i]; |
2672 | 1.18M | noise_prev_temp[ch][i] = itmp; |
2673 | 1.18M | } |
2674 | | |
2675 | 236k | itmp = pstr_env_ch[ch]->str_sbr_code_env.update; |
2676 | 236k | pstr_env_ch[ch]->str_sbr_code_env.update = up_date_nrg_temp[ch]; |
2677 | 236k | up_date_nrg_temp[ch] = itmp; |
2678 | | |
2679 | 236k | itmp = pstr_env_ch[ch]->str_sbr_code_noise_floor.update; |
2680 | 236k | pstr_env_ch[ch]->str_sbr_code_noise_floor.update = up_date_noise_temp[ch]; |
2681 | 236k | up_date_noise_temp[ch] = itmp; |
2682 | | |
2683 | 236k | memcpy(domain_vec_temp[ch], pstr_env_ch[ch]->enc_env_data.domain_vec, |
2684 | 236k | sizeof(domain_vec_temp[0][0]) * IXHEAACE_MAX_ENV); |
2685 | | |
2686 | 236k | memcpy(domain_vec_noise_temp[ch], pstr_env_ch[ch]->enc_env_data.domain_vec_noise, |
2687 | 236k | sizeof(domain_vec_noise_temp[0][0]) * IXHEAACE_MAX_ENV); |
2688 | | |
2689 | 236k | if (!pstr_sbr_hdr->prev_coupling) { |
2690 | 9.45k | pstr_env_ch[ch]->str_sbr_code_env.update = 0; |
2691 | 9.45k | pstr_env_ch[ch]->str_sbr_code_noise_floor.update = 0; |
2692 | 9.45k | } |
2693 | 236k | } |
2694 | | |
2695 | 118k | err_code = ixheaace_code_envelope( |
2696 | 118k | ptr_sfb_nrg_coupling[0], pstr_const_frame_info[0]->freq_res, |
2697 | 118k | &pstr_env_ch[0]->str_sbr_code_env, pstr_env_0->domain_vec, 1, |
2698 | 118k | pstr_const_frame_info[0]->n_envelopes, 0, pstr_sbr_bs->header_active, |
2699 | 118k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2700 | 118k | if (err_code) { |
2701 | 280 | return err_code; |
2702 | 280 | } |
2703 | | |
2704 | 117k | err_code = ixheaace_code_envelope( |
2705 | 117k | ptr_sfb_nrg_coupling[1], pstr_const_frame_info[1]->freq_res, |
2706 | 117k | &pstr_env_ch[1]->str_sbr_code_env, pstr_env_1->domain_vec, 1, |
2707 | 117k | pstr_const_frame_info[1]->n_envelopes, 1, pstr_sbr_bs->header_active, |
2708 | 117k | pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2709 | 117k | if (err_code) { |
2710 | 589 | return err_code; |
2711 | 589 | } |
2712 | | |
2713 | 117k | c = 0; |
2714 | 117k | i = 0; |
2715 | 300k | while (i < n_envelopes[0]) { |
2716 | 1.83M | for (j = 0; j < pstr_env_0->no_scf_bands[i]; j++) { |
2717 | 1.65M | pstr_env_0->ienvelope[i][j] = ptr_sfb_nrg_coupling[0][c]; |
2718 | 1.65M | pstr_env_1->ienvelope[i][j] = ptr_sfb_nrg_coupling[1][c]; |
2719 | 1.65M | c++; |
2720 | 1.65M | } |
2721 | 183k | i++; |
2722 | 183k | } |
2723 | | |
2724 | 117k | err_code = ixheaace_code_envelope( |
2725 | 117k | ptr_noise_lvl_coupling[0], res, &pstr_env_ch[0]->str_sbr_code_noise_floor, |
2726 | 117k | pstr_env_0->domain_vec_noise, 1, (pstr_const_frame_info[0]->n_envelopes > 1 ? 2 : 1), 0, |
2727 | 117k | pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2728 | 117k | if (err_code) { |
2729 | 0 | return err_code; |
2730 | 0 | } |
2731 | | |
2732 | 1.29M | for (i = 0; i < MAXIMUM_NUM_NOISE_VALUES; i++) { |
2733 | 1.17M | pstr_env_0->noise_level[i] = ptr_noise_lvl_coupling[0][i]; |
2734 | 1.17M | } |
2735 | | |
2736 | 117k | err_code = ixheaace_code_envelope( |
2737 | 117k | ptr_noise_lvl_coupling[1], res, &pstr_env_ch[1]->str_sbr_code_noise_floor, |
2738 | 117k | pstr_env_1->domain_vec_noise, 1, ((pstr_const_frame_info[1]->n_envelopes > 1) ? 2 : 1), |
2739 | 117k | 1, pstr_sbr_bs->header_active, pstr_sbr_bs->usac_indep_flag, pstr_sbr_cfg->is_ld_sbr); |
2740 | 117k | if (err_code) { |
2741 | 0 | return err_code; |
2742 | 0 | } |
2743 | | |
2744 | 1.29M | for (i = 0; i < MAXIMUM_NUM_NOISE_VALUES; i++) { |
2745 | 1.17M | pstr_env_1->noise_level[i] = ptr_noise_lvl_coupling[1][i]; |
2746 | 1.17M | } |
2747 | | |
2748 | 117k | pstr_sbr_hdr->coupling = 1; |
2749 | | |
2750 | 117k | pstr_env_0->balance = 0; |
2751 | 117k | pstr_env_1->balance = 1; |
2752 | | |
2753 | 117k | temp_flag_left = pstr_env_0->add_harmonic_flag; |
2754 | 117k | temp_flag_right = pstr_env_1->add_harmonic_flag; |
2755 | | |
2756 | 117k | err_code = ixheaace_count_sbr_channel_pair_element( |
2757 | 117k | pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data, |
2758 | 117k | pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr, |
2759 | 117k | &payloadbits_coupling); |
2760 | 117k | if (err_code) { |
2761 | 0 | return err_code; |
2762 | 0 | } |
2763 | | |
2764 | 117k | pstr_env_0->add_harmonic_flag = temp_flag_left; |
2765 | 117k | pstr_env_1->add_harmonic_flag = temp_flag_right; |
2766 | | |
2767 | 117k | if (payloadbits_coupling < payloadbits_lr) { |
2768 | 116k | ch = 0; |
2769 | 350k | while (ch < num_channels) { |
2770 | 233k | memcpy(ptr_scale_factor_band_nrg[ch], ptr_sfb_nrg_coupling[ch], |
2771 | 233k | MAXIMUM_NUM_ENVELOPE_VALUES * sizeof(ptr_scale_factor_band_nrg[0][0])); |
2772 | | |
2773 | 233k | memcpy(ptr_noise_level[ch], ptr_noise_lvl_coupling[ch], |
2774 | 233k | MAXIMUM_NUM_NOISE_VALUES * sizeof(ptr_noise_level[0][0])); |
2775 | 233k | ch++; |
2776 | 233k | } |
2777 | | |
2778 | 116k | pstr_sbr_hdr->coupling = 1; |
2779 | 116k | pstr_env_0->balance = 0; |
2780 | 116k | pstr_env_1->balance = 1; |
2781 | 116k | } else { |
2782 | 551 | ch = 0; |
2783 | 1.65k | while (ch < num_channels) { |
2784 | 1.10k | memcpy(pstr_env_ch[ch]->str_sbr_code_env.sfb_nrg_prev, |
2785 | 1.10k | scale_factor_band_nrg_prev_temp[ch], |
2786 | 1.10k | MAXIMUM_FREQ_COEFFS * sizeof(scale_factor_band_nrg_prev_temp[0][0])); |
2787 | | |
2788 | 1.10k | pstr_env_ch[ch]->str_sbr_code_env.update = up_date_nrg_temp[ch]; |
2789 | | |
2790 | 1.10k | memcpy(pstr_env_ch[ch]->str_sbr_code_noise_floor.sfb_nrg_prev, noise_prev_temp[ch], |
2791 | 1.10k | MAXIMUM_NUM_NOISE_COEFFS * sizeof(noise_prev_temp[0][0])); |
2792 | | |
2793 | 1.10k | memcpy(pstr_env_ch[ch]->enc_env_data.domain_vec, domain_vec_temp[ch], |
2794 | 1.10k | sizeof(domain_vec_temp[0][0]) * IXHEAACE_MAX_ENV); |
2795 | | |
2796 | 1.10k | memcpy(pstr_env_ch[ch]->enc_env_data.domain_vec_noise, domain_vec_noise_temp[ch], |
2797 | 1.10k | sizeof(domain_vec_noise_temp[0][0]) * IXHEAACE_MAX_ENV); |
2798 | | |
2799 | 1.10k | pstr_env_ch[ch]->str_sbr_code_noise_floor.update = up_date_noise_temp[ch]; |
2800 | 1.10k | ch++; |
2801 | 1.10k | } |
2802 | | |
2803 | 551 | pstr_sbr_hdr->coupling = 0; |
2804 | 551 | pstr_env_0->balance = 0; |
2805 | 551 | pstr_env_1->balance = 0; |
2806 | 551 | } |
2807 | 117k | } break; |
2808 | 455k | } |
2809 | | |
2810 | 454k | if (num_channels == 1) { |
2811 | 236k | if (pstr_env_0->domain_vec[0] == TIME) { |
2812 | 65.8k | pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac++; |
2813 | 170k | } else { |
2814 | 170k | pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac = 0; |
2815 | 170k | } |
2816 | 236k | } else { |
2817 | 217k | if (pstr_env_0->domain_vec[0] == TIME || pstr_env_1->domain_vec[0] == TIME) { |
2818 | 82.8k | pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac++; |
2819 | 82.8k | pstr_env_ch[1]->str_sbr_code_env.df_edge_incr_fac++; |
2820 | 134k | } else { |
2821 | 134k | pstr_env_ch[0]->str_sbr_code_env.df_edge_incr_fac = 0; |
2822 | 134k | pstr_env_ch[1]->str_sbr_code_env.df_edge_incr_fac = 0; |
2823 | 134k | } |
2824 | 217k | } |
2825 | | |
2826 | 1.12M | for (ch = 0; ch < num_channels; ch++) { |
2827 | 671k | c = 0; |
2828 | 671k | i = 0; |
2829 | | |
2830 | 1.69M | while (i < n_envelopes[ch]) { |
2831 | 12.1M | for (j = 0; j < pstr_env_ch[ch]->enc_env_data.no_scf_bands[i]; j++) { |
2832 | 11.1M | pstr_env_ch[ch]->enc_env_data.ienvelope[i][j] = ptr_scale_factor_band_nrg[ch][c]; |
2833 | 11.1M | c++; |
2834 | 11.1M | } |
2835 | 1.02M | i++; |
2836 | 1.02M | } |
2837 | | |
2838 | 671k | i = 0; |
2839 | 7.39M | while (i < MAXIMUM_NUM_NOISE_VALUES) { |
2840 | 6.71M | pstr_env_ch[ch]->enc_env_data.noise_level[i] = ptr_noise_level[ch][i]; |
2841 | 6.71M | i++; |
2842 | 6.71M | } |
2843 | 671k | } |
2844 | 454k | if ((USAC_SBR == pstr_sbr_cfg->sbr_codec) && (1 == pstr_sbr_hdr->sbr_inter_tes_active)) { |
2845 | | // inter-TES encoder |
2846 | 97.4k | WORD32 idx; |
2847 | 257k | for (ch = 0; ch < num_channels; ch++) { |
2848 | 160k | ixheaace_str_inter_tes_params *pstr_tes_enc = &pstr_env_ch[ch]->str_inter_tes_enc; |
2849 | | |
2850 | 160k | pstr_tes_enc->num_if_bands = pstr_env_ch[ch]->enc_env_data.noise_band_count; |
2851 | 160k | pstr_tes_enc->sub_band_start = pstr_sbr_cfg->ptr_freq_band_tab[LO][0]; |
2852 | 160k | pstr_tes_enc->sub_band_end = pstr_sbr_cfg->ptr_freq_band_tab[LO][pstr_sbr_cfg->num_scf[LO]]; |
2853 | 160k | pstr_tes_enc->num_mf_bands = pstr_sbr_cfg->num_master; |
2854 | 160k | pstr_tes_enc->out_fs = pstr_sbr_cfg->sample_freq; |
2855 | 160k | pstr_tes_enc->num_env = pstr_env_ch[ch]->str_sbr_env_frame.sbr_grid.bs_num_env; |
2856 | | |
2857 | 1.60M | for (idx = 0; idx < (IXHEAACE_MAX_ENV + 1); idx++) { |
2858 | 1.44M | pstr_tes_enc->border_vec[idx] = (WORD16)pstr_const_frame_info[ch]->borders[idx]; |
2859 | 1.44M | } |
2860 | | |
2861 | 9.31M | for (idx = 0; idx < (MAXIMUM_FREQ_COEFFS + 1); idx++) { |
2862 | 9.15M | pstr_tes_enc->f_master_tbl[idx] = (WORD16)((UWORD16)pstr_sbr_cfg->ptr_v_k_master[idx]); |
2863 | 9.15M | } |
2864 | | |
2865 | 1.76M | for (idx = 0; idx < MAXIMUM_NUM_NOISE_VALUES; idx++) { |
2866 | 1.60M | pstr_tes_enc->inv_filt_mode[idx] = |
2867 | 1.60M | (WORD32)pstr_env_ch[ch]->enc_env_data.sbr_invf_mode_vec[idx]; |
2868 | 1.60M | pstr_tes_enc->invf_band_tbl[idx] = |
2869 | 1.60M | (WORD16)pstr_env_ch[ch]->str_ton_corr.sbr_noise_floor_est.s_freq_qmf_band_tbl[idx]; |
2870 | 1.60M | } |
2871 | 160k | pstr_tes_enc->invf_band_tbl[MAXIMUM_NUM_NOISE_VALUES] = |
2872 | 160k | (WORD16)pstr_env_ch[ch] |
2873 | 160k | ->str_ton_corr.sbr_noise_floor_est.s_freq_qmf_band_tbl[MAXIMUM_NUM_NOISE_VALUES]; |
2874 | | |
2875 | 160k | err_code = ixheaace_process_inter_tes(pstr_tes_enc, ptr_sbr_scratch); |
2876 | 160k | if (err_code) { |
2877 | 562 | return err_code; |
2878 | 562 | } |
2879 | | |
2880 | 160k | WORD32 ts, num_ts, delay; |
2881 | 160k | num_ts = pstr_env_ch[ch]->str_sbr_qmf.num_time_slots; |
2882 | | |
2883 | 160k | delay = pstr_tes_enc->op_delay + pstr_tes_enc->codec_delay + IXHEAACE_SBR_HF_ADJ_OFFSET; |
2884 | | |
2885 | 4.11M | for (ts = 0; ts < delay; ts++) { |
2886 | 3.95M | memcpy(pstr_tes_enc->qmf_buf_real[ts], pstr_tes_enc->qmf_buf_real[num_ts + ts], |
2887 | 3.95M | IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_real[0][0])); |
2888 | 3.95M | memcpy(pstr_tes_enc->qmf_buf_imag[ts], pstr_tes_enc->qmf_buf_imag[num_ts + ts], |
2889 | 3.95M | IXHEAACE_QMF_CHANNELS * sizeof(pstr_tes_enc->qmf_buf_imag[0][0])); |
2890 | 3.95M | } |
2891 | 160k | } |
2892 | 97.4k | } |
2893 | | // Pitch detection, pre-processing detection and oversampling decision making |
2894 | 453k | if ((1 == pstr_sbr_cfg->is_esbr) && (pstr_sbr_cfg->sbr_codec == HEAAC_SBR)) { |
2895 | 76.8k | err_code = ixheaace_update_esbr_ext_data( |
2896 | 76.8k | ptr_in_time, pstr_sbr_cfg, pstr_env_ch[0]->str_sbr_extract_env.ptr_r_buffer[0], &str_esbr, |
2897 | 76.8k | transient_info, ptr_sbr_tab, pstr_sbr_hdr->coupling, time_sn_stride, 2048); |
2898 | 76.8k | if (err_code) return err_code; |
2899 | 76.8k | } |
2900 | | |
2901 | 453k | if ((pstr_sbr_cfg->sbr_codec == USAC_SBR) && (pstr_sbr_hdr->sbr_harmonic)) { |
2902 | 79.6k | ixheaace_update_harmonic_sbr_data(transient_info, pstr_sbr_hdr->coupling, |
2903 | 79.6k | &pstr_env_ch[0], num_channels); |
2904 | 79.6k | } |
2905 | 453k | if (num_channels == 2) { |
2906 | 217k | WORD32 num_bits; |
2907 | 217k | pstr_env_0->usac_indep_flag = pstr_sbr_bs->usac_indep_flag; |
2908 | 217k | pstr_env_1->usac_indep_flag = pstr_sbr_bs->usac_indep_flag; |
2909 | 217k | err_code = ixheaace_write_env_channel_pair_element( |
2910 | 217k | pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, &pstr_env_ch[1]->enc_env_data, |
2911 | 217k | pstr_com_data, ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr, |
2912 | 217k | &num_bits); |
2913 | 217k | if (err_code) { |
2914 | 75 | return err_code; |
2915 | 75 | } |
2916 | 236k | } else { |
2917 | 236k | WORD32 num_bits; |
2918 | 236k | pstr_env_0->sbr_pvc_mode = pstr_sbr_hdr->sbr_pvc_mode; |
2919 | 236k | pstr_env_0->sbr_sinusoidal_pos_flag = 0; |
2920 | 236k | pstr_env_0->usac_indep_flag = pstr_sbr_bs->usac_indep_flag; |
2921 | | |
2922 | 236k | err_code = ixheaace_write_env_single_channel_element( |
2923 | 236k | pstr_sbr_hdr, pstr_sbr_bs, &pstr_env_ch[0]->enc_env_data, pstr_ps_enc, pstr_com_data, |
2924 | 236k | ptr_sbr_tab, pstr_sbr_cfg->sbr_codec, pstr_sbr_cfg->is_esbr, &str_esbr, &num_bits); |
2925 | 236k | if (err_code) { |
2926 | 24 | return err_code; |
2927 | 24 | } |
2928 | 236k | } |
2929 | | |
2930 | 453k | ch = 0; |
2931 | 1.12M | while (ch < num_channels) { |
2932 | 670k | ixheaace_str_sbr_extr_env *pstr_sbr_extract_env = &(pstr_env_ch[ch]->str_sbr_extract_env); |
2933 | 9.99M | for (i = 0; i < pstr_sbr_extract_env->y_buffer_write_offset; i++) { |
2934 | 9.32M | FLOAT32 *ptr_tmp; |
2935 | 9.32M | ptr_tmp = pstr_sbr_extract_env->ptr_y_buffer[i]; |
2936 | 9.32M | pstr_sbr_extract_env->ptr_y_buffer[i] = |
2937 | 9.32M | pstr_sbr_extract_env->ptr_y_buffer[i + pstr_sbr_extract_env->time_slots]; |
2938 | 9.32M | pstr_sbr_extract_env->ptr_y_buffer[i + pstr_sbr_extract_env->time_slots] = ptr_tmp; |
2939 | 9.32M | } |
2940 | | |
2941 | 670k | pstr_sbr_extract_env->buffer_flag ^= 1; |
2942 | 670k | ch++; |
2943 | 670k | } |
2944 | | |
2945 | 453k | pstr_sbr_hdr->prev_coupling = pstr_sbr_hdr->coupling; |
2946 | | |
2947 | 453k | return err_code; |
2948 | 453k | } |