/src/libxaac/decoder/ixheaacd_sbr_dec.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | #include <string.h> |
21 | | #include "ixheaacd_sbr_common.h" |
22 | | #include "ixheaac_type_def.h" |
23 | | |
24 | | #include "ixheaac_constants.h" |
25 | | #include "ixheaac_basic_ops32.h" |
26 | | #include "ixheaac_basic_ops16.h" |
27 | | #include "ixheaac_basic_ops40.h" |
28 | | #include "ixheaac_basic_ops.h" |
29 | | |
30 | | #include "ixheaac_basic_op.h" |
31 | | #include "ixheaacd_intrinsics.h" |
32 | | #include "ixheaacd_common_rom.h" |
33 | | #include "ixheaacd_basic_funcs.h" |
34 | | #include "ixheaacd_bitbuffer.h" |
35 | | #include "ixheaacd_defines.h" |
36 | | |
37 | | #include "ixheaacd_pns.h" |
38 | | |
39 | | #include "ixheaacd_aac_rom.h" |
40 | | #include "ixheaacd_pulsedata.h" |
41 | | |
42 | | #include "ixheaacd_drc_data_struct.h" |
43 | | #include "ixheaacd_lt_predict.h" |
44 | | #include "ixheaacd_cnst.h" |
45 | | #include "ixheaacd_ec_defines.h" |
46 | | #include "ixheaacd_ec_struct_def.h" |
47 | | #include "ixheaacd_channelinfo.h" |
48 | | #include "ixheaacd_drc_dec.h" |
49 | | #include "ixheaacd_sbrdecoder.h" |
50 | | |
51 | | #include "ixheaacd_defines.h" |
52 | | #include "ixheaacd_sbrdecoder.h" |
53 | | #include "ixheaacd_definitions.h" |
54 | | #include "ixheaacd_error_codes.h" |
55 | | |
56 | | #include "ixheaacd_pulsedata.h" |
57 | | |
58 | | #include "ixheaacd_sbrdecsettings.h" |
59 | | #include "ixheaacd_sbr_scale.h" |
60 | | #include "ixheaacd_lpp_tran.h" |
61 | | #include "ixheaacd_env_extr_part.h" |
62 | | #include "ixheaacd_sbr_rom.h" |
63 | | #include "ixheaacd_hybrid.h" |
64 | | #include "ixheaacd_ps_dec.h" |
65 | | #include "ixheaacd_env_extr.h" |
66 | | |
67 | | #include "ixheaacd_qmf_dec.h" |
68 | | |
69 | | #include "ixheaacd_env_calc.h" |
70 | | #include "ixheaac_sbr_const.h" |
71 | | |
72 | | #include "ixheaacd_pvc_dec.h" |
73 | | #include "ixheaacd_sbr_dec.h" |
74 | | #include "ixheaacd_env_extr.h" |
75 | | #include "ixheaacd_env_calc.h" |
76 | | #include "ixheaacd_ps_dec.h" |
77 | | #include "ixheaacd_function_selector.h" |
78 | | |
79 | | #include "ixheaacd_audioobjtypes.h" |
80 | | |
81 | | VOID ixheaacd_qmf_enrg_calc(ia_sbr_dec_struct *ptr_sbr_dec, |
82 | 64.8k | WORD32 upsample_ratio_idx, WORD32 low_pow_flag) { |
83 | 64.8k | WORD32 i, j; |
84 | 64.8k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
85 | 1.07M | for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
86 | 18.0M | for (j = 0; j < 16; j++) { |
87 | 16.9M | ptr_sbr_dec->qmf_energy_buf[i][j] = |
88 | 16.9M | ptr_sbr_dec->qmf_buf_real[2 + i][j] * |
89 | 16.9M | ptr_sbr_dec->qmf_buf_real[2 + i][j]; |
90 | 16.9M | if (!low_pow_flag) |
91 | 16.9M | ptr_sbr_dec->qmf_energy_buf[i][j] += |
92 | 16.9M | (ptr_sbr_dec->qmf_buf_imag[2 + i][j] * |
93 | 16.9M | ptr_sbr_dec->qmf_buf_imag[2 + i][j]); |
94 | 16.9M | } |
95 | 1.06M | } |
96 | | |
97 | 281k | for (i = 0; i < 16; i++) { |
98 | 4.50M | for (j = 0; j < 16; j++) { |
99 | 4.24M | ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] = |
100 | 4.24M | (ptr_sbr_dec->qmf_energy_buf[4 * i + 0][j] + |
101 | 4.24M | ptr_sbr_dec->qmf_energy_buf[4 * i + 1][j] + |
102 | 4.24M | ptr_sbr_dec->qmf_energy_buf[4 * i + 2][j] + |
103 | 4.24M | ptr_sbr_dec->qmf_energy_buf[4 * i + 3][j]) * |
104 | 4.24M | 0.25f; |
105 | 4.24M | } |
106 | 265k | } |
107 | 48.3k | } else { |
108 | 1.59M | for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
109 | 51.0M | for (j = 0; j < 32; j++) { |
110 | 49.4M | ptr_sbr_dec->qmf_energy_buf[i][j] = |
111 | 49.4M | ptr_sbr_dec->qmf_buf_real[2 + i][j] * |
112 | 49.4M | ptr_sbr_dec->qmf_buf_real[2 + i][j]; |
113 | 49.4M | if (!low_pow_flag) |
114 | 49.4M | ptr_sbr_dec->qmf_energy_buf[i][j] += |
115 | 49.4M | (ptr_sbr_dec->qmf_buf_imag[2 + i][j] * |
116 | 49.4M | ptr_sbr_dec->qmf_buf_imag[2 + i][j]); |
117 | 49.4M | } |
118 | 1.54M | } |
119 | | |
120 | 821k | for (i = 0; i < 16; i++) { |
121 | 25.5M | for (j = 0; j < 32; j++) { |
122 | 24.7M | ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] = |
123 | 24.7M | (ptr_sbr_dec->qmf_energy_buf[2 * i + 0][j] + |
124 | 24.7M | ptr_sbr_dec->qmf_energy_buf[2 * i + 1][j]) * |
125 | 24.7M | 0.5f; |
126 | 24.7M | } |
127 | 773k | } |
128 | 48.3k | } |
129 | 64.8k | } |
130 | | |
131 | | VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES], |
132 | | FLOAT32 qmf_buf_real[][64], |
133 | | FLOAT32 qmf_buf_imag[][64], WORD32 no_bins, |
134 | 30.2k | WORD32 max_stretch) { |
135 | 30.2k | WORD32 patch_bands; |
136 | 30.2k | WORD32 patch, band, col, target, source_bands, i; |
137 | 30.2k | WORD32 num_patches = 0; |
138 | | |
139 | 181k | for (i = 1; i < MAX_NUM_PATCHES; i++) { |
140 | 151k | if (x_over_qmf[i] != 0) { |
141 | 78.5k | num_patches++; |
142 | 78.5k | } |
143 | 151k | } |
144 | | |
145 | 38.4k | for (patch = (max_stretch - 1); patch < num_patches; patch++) { |
146 | 8.18k | patch_bands = x_over_qmf[patch + 1] - x_over_qmf[patch]; |
147 | 8.18k | target = x_over_qmf[patch]; |
148 | 8.18k | source_bands = x_over_qmf[max_stretch - 1] - x_over_qmf[max_stretch - 2]; |
149 | 26.1k | while (patch_bands > 0) { |
150 | 17.9k | WORD32 ixheaacd_num_bands = source_bands; |
151 | 17.9k | WORD32 start_band = x_over_qmf[max_stretch - 1] - 1; |
152 | 17.9k | if (target + ixheaacd_num_bands >= x_over_qmf[patch + 1]) { |
153 | 11.3k | ixheaacd_num_bands = x_over_qmf[patch + 1] - target; |
154 | 11.3k | } |
155 | 17.9k | if ((((target + ixheaacd_num_bands - 1) & 1) + |
156 | 17.9k | ((x_over_qmf[max_stretch - 1] - 1) & 1)) & |
157 | 17.9k | 1) { |
158 | 13.5k | if (ixheaacd_num_bands == source_bands) { |
159 | 9.57k | ixheaacd_num_bands--; |
160 | 9.57k | } else { |
161 | 3.94k | start_band--; |
162 | 3.94k | } |
163 | 13.5k | } |
164 | 17.9k | if (!ixheaacd_num_bands) break; |
165 | 1.16M | for (col = 0; col < no_bins; col++) { |
166 | 1.15M | WORD32 i = 0; |
167 | 1.15M | band = target + ixheaacd_num_bands - 1; |
168 | 1.15M | if (64 <= band) { |
169 | 0 | band = 63; |
170 | 0 | } |
171 | 1.15M | if (x_over_qmf[patch + 1] <= band) { |
172 | 0 | band = x_over_qmf[patch + 1] - 1; |
173 | 0 | } |
174 | 4.90M | for (i = 0; i < ixheaacd_num_bands; i++, band--) { |
175 | 3.75M | qmf_buf_real[col][band] = qmf_buf_real[col][start_band - i]; |
176 | 3.75M | qmf_buf_imag[col][band] = qmf_buf_imag[col][start_band - i]; |
177 | 3.75M | } |
178 | 1.15M | } |
179 | 17.9k | target += ixheaacd_num_bands; |
180 | 17.9k | patch_bands -= ixheaacd_num_bands; |
181 | 17.9k | } |
182 | 8.18k | } |
183 | 30.2k | } |
184 | | |
185 | | VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec, |
186 | | ia_sbr_tables_struct *sbr_tables_ptr, |
187 | 182k | WORD32 op_delay) { |
188 | 182k | FLOAT32 *core_coder_samples; |
189 | 182k | WORD32 *ptr_filt_states; |
190 | 182k | WORD32 *ptr_filt_states_1; |
191 | 182k | WORD32 *ptr_filt_states_2; |
192 | 182k | WORD32 *ptr_temp; |
193 | 182k | WORD32 *ptr_win_coeffs_1; |
194 | 182k | WORD32 *ptr_win_coeffs_2; |
195 | 182k | WORD32 *ptr_win_coeffs; |
196 | 182k | WORD32 *ploc_qmf_buf_real; |
197 | 182k | WORD32 *ploc_qmf_buf_imag; |
198 | 182k | WORD32 local_qmf_buffer[128] = {0}; |
199 | 182k | WORD32 anal_buf[2 * 32]; |
200 | 182k | WORD32 idx, z; |
201 | 182k | WORD32 core_syn_ch_index; |
202 | 182k | FLOAT32 gain; |
203 | 182k | WORD32 filt_offset; |
204 | 182k | WORD32 num_columns; |
205 | 182k | ia_qmf_dec_tables_struct *qmf_dec_tables_ptr = |
206 | 182k | sbr_tables_ptr->qmf_dec_tables_ptr; |
207 | 182k | ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank = |
208 | 182k | &ptr_sbr_dec->str_codec_qmf_bank; |
209 | 182k | core_coder_samples = ptr_sbr_dec->time_sample_buf; |
210 | 182k | ptr_filt_states = pstr_qmf_anal_bank->state_new_samples_pos_low_32; |
211 | 182k | ptr_win_coeffs_1 = pstr_qmf_anal_bank->filter_pos_32; |
212 | 182k | num_columns = pstr_qmf_anal_bank->no_channels; |
213 | | |
214 | 182k | switch (num_columns) { |
215 | 27.4k | case 16: |
216 | 27.4k | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; |
217 | 27.4k | gain = 128.0f; |
218 | 27.4k | filt_offset = 64; |
219 | 27.4k | break; |
220 | 13.4k | case 24: |
221 | 13.4k | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24; |
222 | 13.4k | gain = 12.0f; |
223 | 13.4k | filt_offset = 24; |
224 | 13.4k | break; |
225 | 141k | case 32: |
226 | 141k | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; |
227 | 141k | gain = 256.0f; |
228 | 141k | filt_offset = 64; |
229 | 141k | break; |
230 | 0 | default: |
231 | 0 | ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; |
232 | 0 | gain = 256.0f; |
233 | 0 | filt_offset = 64; |
234 | 0 | break; |
235 | 182k | } |
236 | 182k | gain = 1.0f / gain; |
237 | | |
238 | 182k | pstr_qmf_anal_bank->usb = num_columns; |
239 | | |
240 | 182k | ploc_qmf_buf_real = &local_qmf_buffer[0]; |
241 | 182k | ploc_qmf_buf_imag = &local_qmf_buffer[64]; |
242 | | |
243 | 182k | ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32; |
244 | 182k | ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns; |
245 | | |
246 | 6.90M | for (idx = 0; idx < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; idx++) { |
247 | 190M | for (z = 0; z < num_columns; z++) { |
248 | 183M | ptr_filt_states[num_columns - 1 - z] = |
249 | 183M | (WORD32)(core_coder_samples[z] * (1 << 15)); |
250 | 183M | } |
251 | 6.72M | ixheaacd_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2, |
252 | 6.72M | ptr_win_coeffs_1, ptr_win_coeffs_2, anal_buf, |
253 | 6.72M | num_columns); |
254 | | |
255 | 6.72M | core_coder_samples += num_columns; |
256 | | |
257 | 6.72M | ptr_filt_states -= num_columns; |
258 | 6.72M | if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) { |
259 | 674k | ptr_filt_states = pstr_qmf_anal_bank->anal_filter_states_32 + |
260 | 674k | 10 * num_columns - num_columns; |
261 | 674k | } |
262 | | |
263 | 6.72M | ptr_temp = ptr_filt_states_1; |
264 | 6.72M | ptr_filt_states_1 = ptr_filt_states_2; |
265 | 6.72M | ptr_filt_states_2 = ptr_temp; |
266 | | |
267 | 6.72M | ptr_win_coeffs_1 += filt_offset; |
268 | 6.72M | ptr_win_coeffs_2 += filt_offset; |
269 | | |
270 | 6.72M | ptr_win_coeffs = ptr_win_coeffs_1; |
271 | 6.72M | ptr_win_coeffs_1 = ptr_win_coeffs_2; |
272 | 6.72M | ptr_win_coeffs_2 = ptr_win_coeffs; |
273 | | |
274 | 6.72M | if (ptr_win_coeffs_2 > |
275 | 6.72M | (pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset * 10)) { |
276 | 671k | ptr_win_coeffs_1 = pstr_qmf_anal_bank->analy_win_coeff_32; |
277 | 671k | ptr_win_coeffs_2 = pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset; |
278 | 671k | } |
279 | | |
280 | 6.72M | ixheaacd_esbr_fwd_modulation(anal_buf, &ploc_qmf_buf_real[0], |
281 | 6.72M | &ploc_qmf_buf_imag[0], pstr_qmf_anal_bank, |
282 | 6.72M | qmf_dec_tables_ptr); |
283 | 6.72M | core_syn_ch_index = num_columns; |
284 | | |
285 | 190M | for (z = 0; z < core_syn_ch_index; z++) { |
286 | 183M | ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = |
287 | 183M | ((FLOAT32)ploc_qmf_buf_real[z] * gain); |
288 | 183M | ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = |
289 | 183M | ((FLOAT32)ploc_qmf_buf_imag[z] * gain); |
290 | 183M | } |
291 | 6.72M | } |
292 | | |
293 | 182k | pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1; |
294 | 182k | pstr_qmf_anal_bank->state_new_samples_pos_low_32 = ptr_filt_states; |
295 | 182k | } |
296 | | |
297 | | VOID ixheaacd_esbr_synthesis_regrp( |
298 | | FLOAT32 *qmf_buf_real, FLOAT32 *qmf_buf_imag, |
299 | | ia_sbr_dec_struct *ptr_sbr_dec, |
300 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
301 | | ia_sbr_header_data_struct *ptr_header_data, WORD32 stereo_config_idx, |
302 | 127k | WORD32 apply_processing) { |
303 | 127k | WORD32 i, k; |
304 | 127k | WORD32 stop_border = 0; |
305 | 127k | WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
306 | 127k | WORD32 x_over_band = num_anal_bands; |
307 | | |
308 | 127k | if (apply_processing) { |
309 | 105k | if (ptr_header_data->sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
310 | 8.77k | stop_border = 4 * ptr_frame_data->str_frame_info_details.border_vec[0]; |
311 | 96.6k | } else { |
312 | 96.6k | stop_border = 2 * ptr_frame_data->str_frame_info_details.border_vec[0]; |
313 | 96.6k | } |
314 | 105k | x_over_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev; |
315 | 105k | } |
316 | | |
317 | 127k | if (stereo_config_idx > 0) { |
318 | 55.4k | for (i = 0; i < stop_border; i++) { |
319 | 40.5k | for (k = 0; k < 3; k++) { |
320 | 30.4k | *qmf_buf_real++ = |
321 | 30.4k | ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k]; |
322 | 30.4k | *qmf_buf_imag++ = |
323 | 30.4k | ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k]; |
324 | 30.4k | } |
325 | | |
326 | 171k | for (; k < x_over_band; k++) { |
327 | 161k | *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; |
328 | 161k | *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; |
329 | 161k | } |
330 | | |
331 | 467k | for (; k < 64; k++) { |
332 | 456k | *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; |
333 | 456k | *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; |
334 | 456k | } |
335 | | |
336 | 10.1k | qmf_buf_real += 14; |
337 | 10.1k | qmf_buf_imag += 14; |
338 | 10.1k | } |
339 | | |
340 | 45.2k | x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start; |
341 | | |
342 | 2.03M | for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
343 | 7.95M | for (k = 0; k < 3; k++) { |
344 | 5.96M | *qmf_buf_real++ = |
345 | 5.96M | ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k]; |
346 | 5.96M | *qmf_buf_imag++ = |
347 | 5.96M | ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k]; |
348 | 5.96M | } |
349 | | |
350 | 66.1M | for (; k < x_over_band; k++) { |
351 | 64.1M | *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; |
352 | 64.1M | *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; |
353 | 64.1M | } |
354 | | |
355 | 59.1M | for (; k < 64; k++) { |
356 | 57.1M | *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; |
357 | 57.1M | *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; |
358 | 57.1M | } |
359 | | |
360 | 1.98M | qmf_buf_real += 14; |
361 | 1.98M | qmf_buf_imag += 14; |
362 | 1.98M | } |
363 | | |
364 | 82.6k | } else { |
365 | 120k | for (i = 0; i < stop_border; i++) { |
366 | 745k | for (k = 0; k < x_over_band; k++) { |
367 | 707k | *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; |
368 | 707k | *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; |
369 | 707k | } |
370 | | |
371 | 1.73M | for (; k < 64; k++) { |
372 | 1.69M | *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; |
373 | 1.69M | *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; |
374 | 1.69M | } |
375 | | |
376 | 37.5k | qmf_buf_real += 14; |
377 | 37.5k | qmf_buf_imag += 14; |
378 | 37.5k | } |
379 | | |
380 | 82.6k | x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start; |
381 | | |
382 | 2.69M | for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
383 | 40.4M | for (k = 0; k < x_over_band; k++) { |
384 | 37.8M | *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; |
385 | 37.8M | *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; |
386 | 37.8M | } |
387 | | |
388 | 131M | for (; k < 64; k++) { |
389 | 129M | *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; |
390 | 129M | *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; |
391 | 129M | } |
392 | | |
393 | 2.61M | qmf_buf_real += 14; |
394 | 2.61M | qmf_buf_imag += 14; |
395 | 2.61M | } |
396 | 82.6k | } |
397 | 127k | } |
398 | | |
399 | | VOID ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 *qmf_buf_real, |
400 | | FLOAT32 *qmf_buf_imag, |
401 | | ia_sbr_dec_struct *ptr_sbr_dec, |
402 | 54.7k | WORD32 stereo_config_idx) { |
403 | 54.7k | WORD32 i, k; |
404 | 54.7k | WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
405 | 54.7k | WORD32 x_over_band = num_anal_bands; |
406 | | |
407 | 54.7k | if (stereo_config_idx > 0) { |
408 | 2.12M | for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
409 | 8.29M | for (k = 0; k < 3; k++) { |
410 | 6.21M | *qmf_buf_real++ = |
411 | 6.21M | ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k]; |
412 | 6.21M | *qmf_buf_imag++ = |
413 | 6.21M | ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k]; |
414 | 6.21M | } |
415 | | |
416 | 51.2M | for (; k < x_over_band; k++) { |
417 | 49.1M | *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; |
418 | 49.1M | *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; |
419 | 49.1M | } |
420 | | |
421 | 79.3M | for (; k < 64; k++) { |
422 | 77.2M | *qmf_buf_real++ = 0; |
423 | 77.2M | *qmf_buf_imag++ = 0; |
424 | 77.2M | } |
425 | | |
426 | 2.07M | qmf_buf_real += 14; |
427 | 2.07M | qmf_buf_imag += 14; |
428 | 2.07M | } |
429 | 54.7k | } else { |
430 | 0 | for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
431 | 0 | for (k = 0; k < x_over_band; k++) { |
432 | 0 | *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; |
433 | 0 | *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; |
434 | 0 | } |
435 | |
|
436 | 0 | for (; k < 64; k++) { |
437 | 0 | *qmf_buf_real++ = 0.0f; |
438 | 0 | *qmf_buf_imag++ = 0.0f; |
439 | 0 | } |
440 | |
|
441 | 0 | qmf_buf_real += 14; |
442 | 0 | qmf_buf_imag += 14; |
443 | 0 | } |
444 | 0 | } |
445 | 54.7k | } |
446 | | |
447 | | VOID ixheaacd_esbr_synthesis_filt_block( |
448 | | ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data, |
449 | | ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing, |
450 | | FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx, |
451 | | ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac, |
452 | | WORD32 ps_enable, WORD32 skip_re_grouping, ia_ps_dec_struct *ptr_ps_dec, |
453 | 189k | FLAG drc_on, WORD32 drc_sbr_factors[][64]) { |
454 | | |
455 | 189k | WORD32 i, k; |
456 | 189k | WORD32 *ptr_filt_states; |
457 | 189k | WORD32 *ptr_filt_states_1; |
458 | 189k | WORD32 *ptr_filt_states_2; |
459 | 189k | WORD32 *filter_l; |
460 | 189k | WORD32 *ploc_qmf_buf_real; |
461 | 189k | WORD32 *ploc_qmf_buf_imag; |
462 | 189k | WORD32 out_scalefactor; |
463 | 189k | WORD32 sixty4, thrity2; |
464 | 189k | WORD32 no_synthesis_channels; |
465 | 189k | WORD32 ixheaacd_drc_offset; |
466 | 189k | FLOAT32 *syn_buffer; |
467 | 189k | WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local; |
468 | 189k | WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]); |
469 | 189k | FLOAT32 *time_sample_buf; |
470 | 189k | if (ps_enable) { |
471 | 14.2k | time_sample_buf = ptr_ps_dec->time_sample_buf[0]; |
472 | 175k | } else { |
473 | 175k | time_sample_buf = ptr_sbr_dec->time_sample_buf; |
474 | 175k | } |
475 | 189k | ia_sbr_qmf_filter_bank_struct *qmf_bank = |
476 | 189k | &ptr_sbr_dec->str_synthesis_qmf_bank; |
477 | 189k | ia_qmf_dec_tables_struct *qmf_dec_tables_ptr = |
478 | 189k | sbr_tables_ptr->qmf_dec_tables_ptr; |
479 | | |
480 | 189k | if (!skip_re_grouping) { |
481 | 182k | if (!mps_sbr_flag) { |
482 | 127k | ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0], |
483 | 127k | ptr_sbr_dec, ptr_frame_data, ptr_header_data, |
484 | 127k | stereo_config_idx, apply_processing); |
485 | 127k | if (ps_enable) { |
486 | 7.13k | FLOAT32 factor = 1.0f; |
487 | 49.9k | for (i = ptr_ps_dec->num_sub_samples;i < (WORD32)ptr_ps_dec->num_sub_samples + 6;i++) { |
488 | 256k | for (k = 0; k < 5; k++) |
489 | 214k | { |
490 | 214k | if (drc_on) |
491 | 214k | { |
492 | 214k | if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30) |
493 | 0 | { |
494 | 0 | factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25; |
495 | 0 | } |
496 | 214k | else |
497 | 214k | { |
498 | 214k | factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25; |
499 | 214k | } |
500 | 214k | } |
501 | 214k | ptr_ps_dec->pp_qmf_buf_real[0][i][k] = |
502 | 214k | factor * ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; |
503 | 214k | ptr_ps_dec->pp_qmf_buf_imag[0][i][k] = |
504 | 214k | factor * ptr_sbr_dec->qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k]; |
505 | 214k | } |
506 | 42.8k | } |
507 | 7.13k | } |
508 | 127k | if (ps_enable && apply_processing) { |
509 | 7.03k | WORD32 usb = ptr_header_data->pstr_freq_band_data->sub_band_end; |
510 | | |
511 | 7.03k | ixheaacd_esbr_apply_ps(ptr_ps_dec, |
512 | 7.03k | ptr_ps_dec->pp_qmf_buf_real[0], |
513 | 7.03k | ptr_ps_dec->pp_qmf_buf_imag[0], |
514 | 7.03k | ptr_ps_dec->pp_qmf_buf_real[1], |
515 | 7.03k | ptr_ps_dec->pp_qmf_buf_imag[1], |
516 | 7.03k | usb, sbr_tables_ptr->ps_tables_ptr, |
517 | 7.03k | ptr_header_data->num_time_slots); |
518 | 120k | } else if (ps_enable) { |
519 | 3.43k | for (i = 0; i < (ptr_header_data->num_time_slots * 2); i++) { |
520 | 216k | for (k = 0; k < 64; k++) { |
521 | 212k | ptr_ps_dec->pp_qmf_buf_real[1][i][k] = ptr_ps_dec->pp_qmf_buf_real[0][i][k]; |
522 | 212k | ptr_ps_dec->pp_qmf_buf_imag[1][i][k] = ptr_ps_dec->pp_qmf_buf_imag[0][i][k]; |
523 | 212k | } |
524 | 3.32k | } |
525 | 104 | } |
526 | 127k | } else { |
527 | 54.7k | ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0], |
528 | 54.7k | ptr_sbr_dec, stereo_config_idx); |
529 | 54.7k | } |
530 | 182k | } else { |
531 | 7.13k | if (ps_enable) { |
532 | 7.13k | time_sample_buf = ptr_ps_dec->time_sample_buf[1]; |
533 | 7.13k | } |
534 | 7.13k | } |
535 | | |
536 | 189k | if (drc_on) |
537 | 18.0k | { |
538 | 18.0k | FLOAT32 factor = 1.0f; |
539 | 594k | for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) |
540 | 576k | { |
541 | 37.4M | for (k = 0; k < 64; k++) |
542 | 36.8M | { |
543 | 36.8M | if (ptr_sbr_dec->str_codec_qmf_bank.num_time_slots == 30) |
544 | 34.5k | { |
545 | 34.5k | factor = (FLOAT32)drc_sbr_factors[i + 30 - 25][k] / Q25; |
546 | 34.5k | } |
547 | 36.8M | else |
548 | 36.8M | { |
549 | 36.8M | factor = (FLOAT32)drc_sbr_factors[i + 32 - 26][k] / Q25; |
550 | 36.8M | } |
551 | 36.8M | qmf_buf_real[i][k] *= factor; |
552 | 36.8M | qmf_buf_imag[i][k] *= factor; |
553 | 36.8M | } |
554 | 576k | } |
555 | 18.0k | } |
556 | | |
557 | 189k | if (stereo_config_idx <= 0) { |
558 | 89.7k | out_scalefactor = 5; |
559 | 89.7k | no_synthesis_channels = qmf_bank->no_channels; |
560 | 89.7k | sixty4 = NO_SYNTHESIS_CHANNELS; |
561 | 89.7k | thrity2 = qmf_bank->no_channels; |
562 | | |
563 | 89.7k | if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) |
564 | 206 | { |
565 | 206 | qmf_bank->esbr_cos_twiddle = |
566 | 206 | (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l32; |
567 | 206 | qmf_bank->esbr_alt_sin_twiddle = |
568 | 206 | (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l32; |
569 | 206 | } |
570 | 89.5k | else |
571 | 89.5k | { |
572 | 89.5k | qmf_bank->esbr_cos_twiddle = |
573 | 89.5k | (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64; |
574 | 89.5k | qmf_bank->esbr_alt_sin_twiddle = |
575 | 89.5k | (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64; |
576 | 89.5k | } |
577 | | |
578 | 89.7k | qmf_bank->filter_pos_syn_32 += |
579 | 89.7k | qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32; |
580 | 89.7k | qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c; |
581 | | |
582 | 89.7k | ptr_filt_states = qmf_bank->filter_states_32; |
583 | | |
584 | 89.7k | ptr_filt_states_1 = &ptr_filt_states[0]; |
585 | 89.7k | ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels; |
586 | | |
587 | 89.7k | filter_l = qmf_bank->filter_pos_syn_32; |
588 | | |
589 | 89.7k | ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset; |
590 | | |
591 | 2.96M | for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { |
592 | 187M | for (k = 0; k < 64; k++) { |
593 | 184M | local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64); |
594 | 184M | local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64); |
595 | 184M | } |
596 | 2.87M | ploc_qmf_buf_real = local_qmf_buffer; |
597 | 2.87M | ploc_qmf_buf_imag = local_qmf_buffer + 64; |
598 | | |
599 | 2.87M | ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real, |
600 | 2.87M | &ptr_sbr_dec->str_synthesis_qmf_bank, |
601 | 2.87M | sbr_tables_ptr->qmf_dec_tables_ptr, |
602 | 2.87M | no_synthesis_channels); |
603 | | |
604 | 2.87M | ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag, |
605 | 2.87M | &ptr_filt_states[ixheaacd_drc_offset], |
606 | 2.87M | no_synthesis_channels, |
607 | 2.87M | out_scalefactor + 1); |
608 | | |
609 | 2.87M | if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) { |
610 | 6.59k | ixheaacd_esbr_qmfsyn32_winadd(ptr_filt_states_1, ptr_filt_states_2, |
611 | 6.59k | filter_l, &time_out[0], ch_fac); |
612 | | |
613 | 6.59k | if (!mps_sbr_flag) { |
614 | 6.59k | syn_buffer = time_sample_buf + i * 32; |
615 | 6.59k | } else { |
616 | 0 | syn_buffer = ptr_sbr_dec->time_sample_buf + i * 32; |
617 | 0 | } |
618 | 217k | for (k = 0; k < 32; k++) { |
619 | 210k | syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16); |
620 | 210k | } |
621 | | |
622 | 6.59k | ptr_filt_states_1 += thrity2; |
623 | 6.59k | ptr_filt_states_2 -= thrity2; |
624 | 6.59k | thrity2 = -thrity2; |
625 | 6.59k | ixheaacd_drc_offset -= 64; |
626 | | |
627 | 6.59k | if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 640; |
628 | 2.87M | } else { |
629 | 2.87M | ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2, |
630 | 2.87M | filter_l, &time_out[0], ch_fac); |
631 | | |
632 | 2.87M | if (!mps_sbr_flag) { |
633 | 2.87M | syn_buffer = time_sample_buf + i * 64; |
634 | 2.87M | } else { |
635 | 0 | syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64; |
636 | 0 | } |
637 | 186M | for (k = 0; k < 64; k++) { |
638 | 183M | syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16); |
639 | 183M | } |
640 | | |
641 | 2.87M | ptr_filt_states_1 += sixty4; |
642 | 2.87M | ptr_filt_states_2 -= sixty4; |
643 | 2.87M | sixty4 = -sixty4; |
644 | 2.87M | ixheaacd_drc_offset -= 128; |
645 | | |
646 | 2.87M | if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280; |
647 | 2.87M | } |
648 | | |
649 | 2.87M | filter_l += 64; |
650 | | |
651 | 2.87M | if (filter_l == qmf_bank->p_filter_32 + 640) |
652 | 287k | filter_l = (WORD32 *)qmf_bank->p_filter_32; |
653 | 2.87M | } |
654 | | |
655 | 89.7k | qmf_bank->filter_pos_syn_32 = filter_l; |
656 | 89.7k | qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset; |
657 | 89.7k | } |
658 | | |
659 | 189k | if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0; |
660 | 189k | } |
661 | | |
662 | | WORD32 ixheaacd_sbr_dec( |
663 | | ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, |
664 | | ia_sbr_header_data_struct *ptr_header_data, ia_sbr_frame_info_data_struct *ptr_frame_data, |
665 | | ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, ia_ps_dec_struct *ptr_ps_dec, |
666 | | ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, ia_sbr_scale_fact_struct *ptr_sbr_sf_r, |
667 | | FLAG apply_processing, FLAG low_pow_flag, WORD32 *ptr_work_buf_core, |
668 | | ia_sbr_tables_struct *sbr_tables_ptr, ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, |
669 | | ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, WORD32 drc_sbr_factors[][64], |
670 | | WORD32 audio_object_type, WORD32 ldmps_present, VOID *self, WORD32 heaac_mps_present, |
671 | 198k | WORD32 ec_flag) { |
672 | 198k | WORD i, j, k; |
673 | 198k | WORD slot, reserve; |
674 | 198k | WORD save_lb_scale; |
675 | 198k | WORD op_delay; |
676 | 198k | IA_ERRORCODE err_code = IA_NO_ERROR; |
677 | | |
678 | 198k | WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS] = {0}; |
679 | 198k | WORD32 *p_arr_qmf_buf_imag[MAX_ENV_COLS] = {0}; |
680 | 198k | WORD32 *ptr; |
681 | 198k | WORD hbe_flag = ptr_header_data->hbe_flag; |
682 | | |
683 | 198k | FLOAT32 **pp_qmf_buf_real = NULL; |
684 | 198k | FLOAT32 **pp_qmf_buf_imag = NULL; |
685 | 198k | FLOAT32 pvc_dec_out_buf[16 * 64]; |
686 | | |
687 | 198k | WORD upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; |
688 | 198k | WORD no_bins; |
689 | 198k | WORD mps_sbr_flag = ptr_frame_data->mps_sbr_flag; |
690 | 198k | WORD stereo_config_idx = ptr_frame_data->stereo_config_idx; |
691 | 198k | WORD sbr_mode = ptr_frame_data->sbr_mode; |
692 | 198k | WORD usac_flag = ptr_header_data->usac_flag; |
693 | 198k | WORD add_slot = 0; |
694 | | |
695 | 198k | FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr; |
696 | | |
697 | 198k | WORD32 dft_hbe_flag = ptr_header_data->esbr_hq; |
698 | 198k | WORD32 esbr_hbe_delay_offsets; |
699 | 198k | if (ptr_header_data->num_time_slots == 15) |
700 | 10.3k | esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET_960; |
701 | 187k | else |
702 | 187k | esbr_hbe_delay_offsets = ESBR_HBE_DELAY_OFFSET; |
703 | | |
704 | 198k | memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32)); |
705 | 198k | memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32)); |
706 | 198k | if (audio_object_type == AOT_ER_AAC_ELD) { |
707 | 33.4k | op_delay = 0; |
708 | 164k | } else { |
709 | 164k | op_delay = 6; |
710 | 164k | } |
711 | | |
712 | 198k | if (ldmps_present == 1) add_slot = SBR_HF_ADJ_OFFSET; |
713 | | |
714 | 198k | if (!((audio_object_type == AOT_ER_AAC_ELD) || (audio_object_type == AOT_ER_AAC_LD)) |
715 | 164k | && ptr_header_data->enh_sbr) { |
716 | 164k | ch_fac = 1; |
717 | 164k | pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real; |
718 | 164k | pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag; |
719 | 164k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
720 | 18.8k | op_delay = 2 * 6; |
721 | 18.8k | } |
722 | 164k | } |
723 | | |
724 | 198k | no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step); |
725 | | |
726 | 198k | if ((audio_object_type == AOT_ER_AAC_ELD) || |
727 | 164k | (audio_object_type == AOT_ER_AAC_LD) || |
728 | 164k | !ptr_header_data->enh_sbr) { |
729 | 33.4k | WORD32 num = op_delay; |
730 | 33.4k | WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf; |
731 | 33.4k | WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag)); |
732 | | |
733 | 33.4k | if (ptr_header_data->num_time_slots != 15) { |
734 | 23.0k | if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS)) { |
735 | 0 | if (ec_flag) |
736 | 0 | no_bins = LPC_ORDER; |
737 | 0 | else |
738 | 0 | return -1; |
739 | 0 | } |
740 | 23.0k | } else { |
741 | 10.3k | if ((no_bins < LPC_ORDER) || ((no_bins + op_delay) > MAX_ENV_COLS_960)) { |
742 | 0 | if (ec_flag) |
743 | 0 | no_bins = LPC_ORDER; |
744 | 0 | else |
745 | 0 | return -1; |
746 | 0 | } |
747 | 10.3k | } |
748 | | |
749 | 33.4k | if (!low_pow_flag) { |
750 | 33.4k | num = num << 1; |
751 | 33.4k | } |
752 | 33.4k | if (audio_object_type != AOT_ER_AAC_ELD) { |
753 | 0 | memcpy(p_scr_qmf_real, ptr_pers_qmf_real, |
754 | 0 | sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num); |
755 | 0 | } |
756 | 33.4k | ptr = p_scr_qmf_real; |
757 | | |
758 | 564k | for (slot = 0; slot < op_delay + no_bins + add_slot; slot++) { |
759 | 531k | p_arr_qmf_buf_real[slot] = ptr; |
760 | 531k | ptr += NO_SYNTHESIS_CHANNELS; |
761 | | |
762 | 531k | if (!low_pow_flag) { |
763 | 531k | p_arr_qmf_buf_imag[slot] = ptr; |
764 | 531k | ptr += NO_SYNTHESIS_CHANNELS; |
765 | 531k | } |
766 | 531k | } |
767 | | |
768 | 33.4k | ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0; |
769 | | |
770 | 33.4k | if (apply_processing) { |
771 | 33.4k | ixheaacd_rescale_x_overlap(ptr_sbr_dec, ptr_header_data, ptr_frame_data, |
772 | 33.4k | ptr_frame_data_prev, p_arr_qmf_buf_real, |
773 | 33.4k | p_arr_qmf_buf_imag, low_pow_flag); |
774 | 33.4k | } |
775 | 33.4k | } |
776 | | |
777 | 198k | if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1) && ptr_header_data->enh_sbr) { |
778 | 464 | WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
779 | 464 | WORD32 frame_move = 9 * num_anal_bands; |
780 | 464 | WORD32 core_frame_size = ptr_header_data->core_frame_size; |
781 | | |
782 | 464 | memcpy(&ptr_sbr_dec->core_sample_buf[core_frame_size], |
783 | 464 | &ptr_sbr_dec->time_sample_buf[core_frame_size - frame_move], |
784 | 464 | frame_move * sizeof(FLOAT32)); |
785 | | |
786 | 464 | memmove(&ptr_sbr_dec->time_sample_buf[frame_move], &ptr_sbr_dec->time_sample_buf[0], |
787 | 464 | (core_frame_size - frame_move)); |
788 | | |
789 | 464 | memcpy(&ptr_sbr_dec->time_sample_buf[0], &ptr_sbr_dec->core_sample_buf[0], |
790 | 464 | frame_move * sizeof(FLOAT32)); |
791 | | |
792 | 464 | memcpy(&ptr_sbr_dec->core_sample_buf[0], &ptr_sbr_dec->core_sample_buf[core_frame_size], |
793 | 464 | frame_move * sizeof(FLOAT32)); |
794 | 464 | } |
795 | 198k | if ((audio_object_type == AOT_AAC_LC) && (heaac_mps_present == 1) && |
796 | 464 | !ptr_header_data->enh_sbr) { |
797 | 0 | WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
798 | 0 | WORD32 frame_move = 9 * num_anal_bands; |
799 | 0 | WORD32 core_frame_size = ptr_header_data->core_frame_size; |
800 | |
|
801 | 0 | memcpy(&ptr_sbr_dec->core_sample_buf_sbr[core_frame_size], |
802 | 0 | &ptr_time_data[core_frame_size - frame_move], |
803 | 0 | frame_move * sizeof(WORD16)); |
804 | |
|
805 | 0 | memmove(&ptr_time_data[frame_move], &ptr_time_data[0], |
806 | 0 | (core_frame_size - frame_move)); |
807 | |
|
808 | 0 | memcpy(&ptr_time_data[0], &ptr_sbr_dec->core_sample_buf_sbr[0], |
809 | 0 | frame_move * sizeof(WORD16)); |
810 | |
|
811 | 0 | memcpy(&ptr_sbr_dec->core_sample_buf_sbr[0], |
812 | 0 | &ptr_sbr_dec->core_sample_buf_sbr[core_frame_size], |
813 | 0 | frame_move * sizeof(WORD16)); |
814 | 0 | } |
815 | | |
816 | 198k | if ((audio_object_type != AOT_ER_AAC_ELD) && |
817 | 164k | (audio_object_type != AOT_ER_AAC_LD) && |
818 | 164k | ptr_header_data->enh_sbr) { |
819 | 164k | WORD32 codec_x_delay = 0; |
820 | | |
821 | 164k | if (hbe_flag || !usac_flag) { |
822 | 114k | codec_x_delay = esbr_hbe_delay_offsets; |
823 | 114k | } |
824 | 164k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
825 | 18.8k | codec_x_delay = 2 * codec_x_delay; |
826 | 18.8k | } |
827 | | /* fixed decoder delay for bitstreams with SBR 4:1 and stereoConfigIndex 3 |
828 | | */ |
829 | 164k | if (ptr_header_data->num_time_slots != 15) { |
830 | 164k | if (mps_sbr_flag) op_delay = MPS_SBR_DELAY; |
831 | 164k | } else { |
832 | 39 | if (mps_sbr_flag) op_delay = MPS_SBR_DELAY_960; |
833 | 39 | } |
834 | | |
835 | 164k | { |
836 | 164k | memmove( |
837 | 164k | &ptr_sbr_dec->qmf_buf_real[0][0], |
838 | 164k | &ptr_sbr_dec |
839 | 164k | ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], |
840 | 164k | (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); |
841 | | |
842 | 164k | memmove( |
843 | 164k | &ptr_sbr_dec->qmf_buf_imag[0][0], |
844 | 164k | &ptr_sbr_dec |
845 | 164k | ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], |
846 | 164k | (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); |
847 | | |
848 | 164k | memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0], |
849 | 164k | &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank |
850 | 164k | .num_time_slots][0], |
851 | 164k | (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); |
852 | | |
853 | 164k | memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0], |
854 | 164k | &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank |
855 | 164k | .num_time_slots][0], |
856 | 164k | (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); |
857 | | |
858 | 164k | if (hbe_flag) { |
859 | 114k | memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0], |
860 | 114k | &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank |
861 | 114k | .num_time_slots][0], |
862 | 114k | 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); |
863 | | |
864 | 114k | memmove(ptr_sbr_dec->ph_vocod_qmf_imag, |
865 | 114k | ptr_sbr_dec->ph_vocod_qmf_imag + |
866 | 114k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
867 | 114k | 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); |
868 | 114k | if (!usac_flag) { |
869 | 11.2k | WORD32 qmf_sb_prev = ptr_header_data->pstr_freq_band_data->qmf_sb_prev; |
870 | 78.6k | for (i = SBR_HF_ADJ_OFFSET; i < op_delay + SBR_HF_ADJ_OFFSET; ++i) { |
871 | 67.4k | memset(&ptr_sbr_dec->qmf_buf_real[i][qmf_sb_prev], 0, (64 - qmf_sb_prev)); |
872 | 67.4k | memset(&ptr_sbr_dec->qmf_buf_imag[i][qmf_sb_prev], 0, (64 - qmf_sb_prev)); |
873 | 67.4k | } |
874 | 11.2k | } |
875 | 114k | } |
876 | 164k | } |
877 | 164k | ixheaacd_esbr_analysis_filt_block( |
878 | 164k | ptr_sbr_dec, sbr_tables_ptr, |
879 | 164k | op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET); |
880 | | |
881 | 164k | if (hbe_flag && apply_processing) { |
882 | 108k | if (dft_hbe_flag == 1) { |
883 | 0 | WORD32 err_code = 0; |
884 | 0 | ptr_sbr_dec->p_hbe_txposer->oversampling_flag = |
885 | 0 | ptr_frame_data->over_sampling_flag; |
886 | 0 | err_code = ixheaacd_dft_hbe_apply( |
887 | 0 | ptr_sbr_dec->p_hbe_txposer, |
888 | 0 | ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) + |
889 | 0 | esbr_hbe_delay_offsets, |
890 | 0 | ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) + |
891 | 0 | esbr_hbe_delay_offsets, |
892 | 0 | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
893 | 0 | ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), |
894 | 0 | ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), |
895 | 0 | ptr_frame_data->pitch_in_bins, (FLOAT32 *)ptr_work_buf_core); |
896 | 0 | if (err_code) return err_code; |
897 | 108k | } else { |
898 | 108k | WORD32 err_code = ixheaacd_qmf_hbe_apply( |
899 | 108k | ptr_sbr_dec->p_hbe_txposer, |
900 | 108k | ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) + |
901 | 108k | esbr_hbe_delay_offsets, |
902 | 108k | ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) + |
903 | 108k | esbr_hbe_delay_offsets, |
904 | 108k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
905 | 108k | ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), |
906 | 108k | ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), |
907 | 108k | ptr_frame_data->pitch_in_bins, ptr_header_data); |
908 | 108k | if (err_code) return err_code; |
909 | | |
910 | 108k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
911 | 18.6k | ixheaacd_hbe_repl_spec( |
912 | 18.6k | &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0], |
913 | 18.6k | ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), |
914 | 18.6k | ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), |
915 | 18.6k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
916 | 18.6k | ptr_sbr_dec->p_hbe_txposer->max_stretch); |
917 | 18.6k | } |
918 | 108k | } |
919 | 108k | } |
920 | 164k | if (!mps_sbr_flag && apply_processing) { |
921 | 105k | err_code = ixheaacd_generate_hf(ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), |
922 | 105k | ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), |
923 | 105k | ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET), |
924 | 105k | ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), |
925 | 105k | ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), |
926 | 105k | ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), |
927 | 105k | ptr_frame_data, ptr_header_data, ldmps_present, |
928 | 105k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag); |
929 | 105k | if (err_code) return err_code; |
930 | | |
931 | 105k | ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac; |
932 | | |
933 | 105k | if (sbr_mode == PVC_SBR) { |
934 | 46.9k | ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag); |
935 | 46.9k | if (ec_flag) { |
936 | 0 | ptr_pvc_data->pvc_mode = 1; |
937 | 0 | } |
938 | 46.9k | err_code = ixheaacd_pvc_process( |
939 | 46.9k | ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start, |
940 | 46.9k | ptr_frame_data->str_pvc_frame_info.border_vec[0], |
941 | 46.9k | &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]); |
942 | | |
943 | 46.9k | if (err_code) return err_code; |
944 | | |
945 | 46.9k | ptr_pvc_data->prev_pvc_flg = 1; |
946 | 58.4k | } else { |
947 | 58.4k | memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32)); |
948 | 58.4k | ptr_pvc_data->prev_pvc_flg = 0; |
949 | 58.4k | } |
950 | | |
951 | 105k | ptr_pvc_data->prev_first_bnd_idx = |
952 | 105k | ptr_header_data->pstr_freq_band_data->sub_band_start; |
953 | 105k | ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate; |
954 | | |
955 | 105k | ptr_frame_data->pstr_sbr_header = ptr_header_data; |
956 | 105k | err_code = ixheaacd_sbr_env_calc( |
957 | 105k | ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), |
958 | 105k | ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), |
959 | 105k | ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), |
960 | 105k | ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), |
961 | 105k | (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf, |
962 | 105k | ptr_sbr_dec->scratch_buff, pvc_dec_out_buf, ldmps_present, ec_flag); |
963 | | |
964 | 105k | if (err_code) return err_code; |
965 | | |
966 | 105k | } else { |
967 | 3.85M | for (i = 0; i < 64; i++) { |
968 | 3.79M | memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32)); |
969 | 3.79M | memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32)); |
970 | 3.79M | } |
971 | 59.3k | } |
972 | | |
973 | 164k | if (!mps_sbr_flag) { |
974 | 109k | ptr_sbr_dec->band_count = |
975 | 109k | ptr_header_data->pstr_freq_band_data->sub_band_end; |
976 | 109k | } else |
977 | 54.7k | ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
978 | | |
979 | 164k | ixheaacd_esbr_synthesis_filt_block( |
980 | 164k | ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing, |
981 | 164k | pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr, |
982 | 164k | mps_sbr_flag, ch_fac, |
983 | 164k | ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps), |
984 | 164k | 0, ptr_ps_dec, drc_on, drc_sbr_factors); |
985 | | |
986 | 164k | if (ptr_header_data->enh_sbr_ps || ptr_header_data->channel_mode == PS_STEREO) { |
987 | 7.13k | pp_qmf_buf_real = ptr_ps_dec->pp_qmf_buf_real[1]; |
988 | 7.13k | pp_qmf_buf_imag = ptr_ps_dec->pp_qmf_buf_imag[1]; |
989 | 7.13k | ixheaacd_esbr_synthesis_filt_block( |
990 | 7.13k | (ia_sbr_dec_struct *) |
991 | 7.13k | (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_channel[1]->str_sbr_dec)), |
992 | 7.13k | (ia_sbr_header_data_struct *) |
993 | 7.13k | (&(((ia_handle_sbr_dec_inst_struct)self)->pstr_sbr_header[1])), |
994 | 7.13k | (ia_sbr_frame_info_data_struct *) |
995 | 7.13k | (&(((ia_handle_sbr_dec_inst_struct)self)->frame_buffer[1])), apply_processing, |
996 | 7.13k | pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr, |
997 | 7.13k | mps_sbr_flag, ch_fac, |
998 | 7.13k | ((ptr_header_data->channel_mode == PS_STEREO) || ptr_header_data->enh_sbr_ps), |
999 | 7.13k | 1, ptr_ps_dec, drc_on, drc_sbr_factors); |
1000 | 7.13k | } |
1001 | 164k | if (apply_processing && ec_flag) { |
1002 | 0 | WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec; |
1003 | 0 | ptr_frame_data_prev->end_position = |
1004 | 0 | border_vec[ptr_frame_data->str_frame_info_details.num_env]; |
1005 | 0 | } |
1006 | 164k | ptr_frame_data->prev_sbr_mode = sbr_mode; |
1007 | | |
1008 | 164k | return 0; |
1009 | 164k | } |
1010 | | |
1011 | 33.4k | if (ldmps_present) { |
1012 | 3.38k | if (ptr_sbr_dec->str_codec_qmf_bank.no_channels > 32) { |
1013 | 24 | if (ec_flag) { |
1014 | 0 | ptr_sbr_dec->str_codec_qmf_bank.no_channels = 32; |
1015 | 24 | } else { |
1016 | 24 | return IA_FATAL_ERROR; |
1017 | 24 | } |
1018 | 24 | } |
1019 | 3.36k | ixheaacd_cplx_anal_qmffilt_32( |
1020 | 3.36k | (WORD32 *)ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, |
1021 | 3.36k | &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay], |
1022 | 3.36k | &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr, |
1023 | 3.36k | ch_fac, 1); |
1024 | 30.0k | } else { |
1025 | 30.0k | ixheaacd_cplx_anal_qmffilt( |
1026 | 30.0k | ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, &p_arr_qmf_buf_real[op_delay], |
1027 | 30.0k | &p_arr_qmf_buf_imag[op_delay], &ptr_sbr_dec->str_codec_qmf_bank, |
1028 | 30.0k | sbr_tables_ptr->qmf_dec_tables_ptr, ch_fac, low_pow_flag, audio_object_type); |
1029 | 30.0k | } |
1030 | | |
1031 | 33.3k | if (ldmps_present == 1) { |
1032 | 3.36k | for (j = SBR_HF_ADJ_OFFSET; |
1033 | 56.6k | j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + SBR_HF_ADJ_OFFSET; |
1034 | 53.2k | j++) { |
1035 | 3.46M | for (k = 0; k < 64; k++) { |
1036 | 3.41M | WORD32 scale = 7; |
1037 | 3.41M | ptr_sbr_dec->mps_qmf_buf_real[j][k] = 0.0f; |
1038 | 3.41M | ptr_sbr_dec->mps_qmf_buf_imag[j][k] = 0.0f; |
1039 | 3.41M | if (k < ptr_sbr_dec->str_codec_qmf_bank.usb) { |
1040 | 1.29M | ptr_sbr_dec->mps_qmf_buf_real[j][k] += |
1041 | 1.29M | (FLOAT32)(p_arr_qmf_buf_real[j][k] / (FLOAT32)(1 << scale)); |
1042 | 1.29M | ptr_sbr_dec->mps_qmf_buf_imag[j][k] += |
1043 | 1.29M | (FLOAT32)(p_arr_qmf_buf_imag[j][k] / (FLOAT32)(1 << scale)); |
1044 | 1.29M | } |
1045 | 3.41M | } |
1046 | 53.2k | } |
1047 | 3.36k | } |
1048 | | /*ITTIAM : the size of real and img coeff are not same as that of the mps |
1049 | | * analysis.*/ |
1050 | 33.3k | { |
1051 | 33.3k | WORD shift1, shift2; |
1052 | 33.3k | WORD min_shift; |
1053 | 33.3k | WORD shift_over; |
1054 | 33.3k | WORD reserve_ov1, reserve_ov2; |
1055 | 33.3k | WORD reservea[2]; |
1056 | 33.3k | WORD i = 0; |
1057 | 33.3k | WORD usb = ptr_sbr_dec->str_codec_qmf_bank.usb; |
1058 | 33.3k | WORD iter_val = 1; |
1059 | 33.3k | if (audio_object_type == AOT_ER_AAC_ELD || |
1060 | 33.3k | audio_object_type == AOT_ER_AAC_LD) { |
1061 | 33.3k | iter_val = 0; |
1062 | 33.3k | } |
1063 | 33.3k | do { |
1064 | 33.3k | WORD t1 = op_delay; |
1065 | 33.3k | WORD t2 = no_bins + op_delay; |
1066 | 33.3k | if (i) { |
1067 | 0 | t1 = 0; |
1068 | 0 | t2 = op_delay; |
1069 | 0 | } |
1070 | 33.3k | reservea[i] = (*ixheaacd_ixheaacd_expsubbandsamples)( |
1071 | 33.3k | p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, t1, t2, low_pow_flag); |
1072 | 33.3k | i++; |
1073 | 33.3k | } while (i <= iter_val); |
1074 | 33.3k | ; |
1075 | | |
1076 | 33.3k | reserve = reservea[0]; |
1077 | 33.3k | if (audio_object_type != AOT_ER_AAC_ELD && |
1078 | 0 | audio_object_type != AOT_ER_AAC_LD) |
1079 | 0 | reserve_ov1 = reservea[1]; |
1080 | 33.3k | else |
1081 | 33.3k | reserve_ov1 = reserve; |
1082 | 33.3k | ptr_sbr_dec->max_samp_val = ixheaac_min32(reserve, reserve_ov1); |
1083 | | |
1084 | 33.3k | reserve_ov2 = (*ixheaacd_ixheaacd_expsubbandsamples)( |
1085 | 33.3k | ptr_sbr_dec->str_hf_generator.lpc_filt_states_real, |
1086 | 33.3k | ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, 0, usb, 0, |
1087 | 33.3k | LPC_ORDER, low_pow_flag); |
1088 | | |
1089 | 33.3k | reserve_ov1 = ixheaac_min32(reserve_ov1, reserve_ov2); |
1090 | | |
1091 | 33.3k | shift1 = ptr_sbr_dec->str_sbr_scale_fact.lb_scale + reserve; |
1092 | | |
1093 | 33.3k | shift2 = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale + reserve_ov1; |
1094 | 33.3k | min_shift = ixheaac_min32(shift1, shift2); |
1095 | 33.3k | shift_over = (shift2 - min_shift); |
1096 | 33.3k | reserve -= (shift1 - min_shift); |
1097 | | |
1098 | 33.3k | ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale += (reserve_ov1 - shift_over); |
1099 | | |
1100 | 33.3k | (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, 0, |
1101 | 33.3k | op_delay, reserve_ov1 - shift_over, low_pow_flag); |
1102 | | |
1103 | 33.3k | (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, |
1104 | 33.3k | op_delay, (no_bins + op_delay), reserve, |
1105 | 33.3k | low_pow_flag); |
1106 | | |
1107 | 33.3k | (*ixheaacd_adjust_scale)(ptr_sbr_dec->str_hf_generator.lpc_filt_states_real, |
1108 | 33.3k | ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, |
1109 | 33.3k | 0, usb, 0, LPC_ORDER, reserve_ov1 - shift_over, |
1110 | 33.3k | low_pow_flag); |
1111 | | |
1112 | 33.3k | ptr_sbr_dec->str_sbr_scale_fact.lb_scale += reserve; |
1113 | | |
1114 | 33.3k | save_lb_scale = ptr_sbr_dec->str_sbr_scale_fact.lb_scale; |
1115 | 33.3k | } |
1116 | | |
1117 | 33.3k | { |
1118 | 33.3k | WORD32 num = no_bins; |
1119 | 33.3k | WORD32 *p_loc_qmf_real = |
1120 | 33.3k | &p_arr_qmf_buf_real[op_delay][NO_ANALYSIS_CHANNELS]; |
1121 | | |
1122 | 33.3k | if (!low_pow_flag) { |
1123 | 33.3k | num = num << 1; |
1124 | 33.3k | } |
1125 | | |
1126 | 33.3k | ixheaacd_clr_subsamples(p_loc_qmf_real, num - 1, (NO_SYN_ANA_CHANNELS)); |
1127 | 33.3k | } |
1128 | | |
1129 | 33.3k | if (apply_processing) { |
1130 | 33.3k | WORD16 degree_alias[NO_SYNTHESIS_CHANNELS]; |
1131 | 33.3k | WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec; |
1132 | | |
1133 | 33.3k | if (low_pow_flag) { |
1134 | 0 | memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16)); |
1135 | 0 | } |
1136 | | |
1137 | 33.3k | if (low_pow_flag) { |
1138 | 0 | WORD32 com_low_band_scale; |
1139 | 0 | ixheaacd_low_pow_hf_generator( |
1140 | 0 | &ptr_sbr_dec->str_hf_generator, p_arr_qmf_buf_real, degree_alias, |
1141 | 0 | border_vec[0] * ptr_header_data->time_step, |
1142 | 0 | ptr_header_data->time_step * |
1143 | 0 | ixheaac_sub16_sat( |
1144 | 0 | border_vec[ptr_frame_data->str_frame_info_details.num_env], |
1145 | 0 | ptr_header_data->num_time_slots), |
1146 | 0 | ptr_header_data->pstr_freq_band_data->num_if_bands, |
1147 | 0 | ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode, |
1148 | 0 | ptr_frame_data_prev->sbr_invf_mode, ptr_sbr_dec->max_samp_val, |
1149 | 0 | ptr_work_buf_core); |
1150 | |
|
1151 | 0 | com_low_band_scale = |
1152 | 0 | ixheaac_min32(ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale, |
1153 | 0 | ptr_sbr_dec->str_sbr_scale_fact.lb_scale); |
1154 | |
|
1155 | 0 | ptr_sbr_dec->str_sbr_scale_fact.hb_scale = |
1156 | 0 | (WORD16)(com_low_band_scale - 2); |
1157 | 33.3k | } else { |
1158 | 33.3k | if (ldmps_present == 1) { |
1159 | 3.36k | err_code = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + (SBR_HF_ADJ_OFFSET), |
1160 | 3.36k | ptr_sbr_dec->mps_qmf_buf_imag + (SBR_HF_ADJ_OFFSET), |
1161 | 3.36k | ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET), |
1162 | 3.36k | ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), |
1163 | 3.36k | ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), |
1164 | 3.36k | ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), |
1165 | 3.36k | ptr_frame_data, ptr_header_data, ldmps_present, |
1166 | 3.36k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag); |
1167 | 3.36k | if (err_code) return err_code; |
1168 | 30.0k | } else { |
1169 | 30.0k | ixheaacd_hf_generator( |
1170 | 30.0k | &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact, |
1171 | 30.0k | p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step, |
1172 | 30.0k | border_vec[0], |
1173 | 30.0k | ixheaac_sub16_sat( |
1174 | 30.0k | border_vec[ptr_frame_data->str_frame_info_details.num_env], |
1175 | 30.0k | ptr_header_data->num_time_slots), |
1176 | 30.0k | ptr_header_data->pstr_freq_band_data->num_if_bands, |
1177 | 30.0k | ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode, |
1178 | 30.0k | ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core, |
1179 | 30.0k | audio_object_type); |
1180 | 30.0k | } |
1181 | 33.3k | } |
1182 | 33.3k | if (ldmps_present == 1) { |
1183 | 3.36k | ptr_frame_data->pstr_sbr_header = ptr_header_data; |
1184 | 3.36k | err_code = ixheaacd_sbr_env_calc( |
1185 | 3.36k | ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), |
1186 | 3.36k | ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), |
1187 | 3.36k | ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), |
1188 | 3.36k | ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, ptr_sbr_dec->scratch_buff, |
1189 | 3.36k | pvc_dec_out_buf, ldmps_present, ec_flag); |
1190 | | |
1191 | 63.3k | for (j = 0; j < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots + 2; j++) { |
1192 | 2.44M | for (k = ptr_sbr_dec->str_codec_qmf_bank.usb; k < 64; k++) { |
1193 | 2.38M | ptr_sbr_dec->mps_qmf_buf_real[j][k] += |
1194 | 2.38M | ptr_sbr_dec->sbr_qmf_out_real[j][k]; |
1195 | 2.38M | ptr_sbr_dec->mps_qmf_buf_imag[j][k] += |
1196 | 2.38M | ptr_sbr_dec->sbr_qmf_out_imag[j][k]; |
1197 | 2.38M | } |
1198 | 59.9k | } |
1199 | 30.0k | } else { |
1200 | 30.0k | err_code = ixheaacd_calc_sbrenvelope( |
1201 | 30.0k | &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env, |
1202 | 30.0k | ptr_header_data, ptr_frame_data, ptr_frame_data_prev, |
1203 | 30.0k | p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag, |
1204 | 30.0k | sbr_tables_ptr, pstr_common_tables, |
1205 | 30.0k | ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)), |
1206 | 30.0k | audio_object_type); |
1207 | 30.0k | if (err_code) return err_code; |
1208 | 30.0k | } |
1209 | | |
1210 | 33.3k | memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode, |
1211 | 33.3k | ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32)); |
1212 | | |
1213 | 33.3k | ptr_frame_data_prev->coupling_mode = ptr_frame_data->coupling_mode; |
1214 | 33.3k | ptr_frame_data_prev->max_qmf_subband_aac = |
1215 | 33.3k | ptr_frame_data->max_qmf_subband_aac; |
1216 | 33.3k | ptr_frame_data_prev->end_position = |
1217 | 33.3k | border_vec[ptr_frame_data->str_frame_info_details.num_env]; |
1218 | 33.3k | ptr_frame_data_prev->amp_res = ptr_frame_data->amp_res; |
1219 | 33.3k | } else { |
1220 | 0 | ptr_sbr_dec->str_sbr_scale_fact.hb_scale = save_lb_scale; |
1221 | 0 | } |
1222 | | |
1223 | 33.3k | if (!low_pow_flag) { |
1224 | 100k | for (i = 0; i < LPC_ORDER; i++) { |
1225 | 66.7k | WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0]; |
1226 | 66.7k | WORD32 *p_loc_qmf_imag = &p_arr_qmf_buf_imag[no_bins - LPC_ORDER + i][0]; |
1227 | 66.7k | WORD32 *plpc_filt_states_real = |
1228 | 66.7k | &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0]; |
1229 | 66.7k | WORD32 *plpc_filt_states_imag = |
1230 | 66.7k | &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[i][0]; |
1231 | | |
1232 | 66.7k | memcpy(plpc_filt_states_real, p_loc_qmf_real, |
1233 | 66.7k | sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb)); |
1234 | 66.7k | memcpy(plpc_filt_states_imag, p_loc_qmf_imag, |
1235 | 66.7k | sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb)); |
1236 | 66.7k | } |
1237 | 33.3k | } else { |
1238 | 0 | for (i = 0; i < LPC_ORDER; i++) { |
1239 | 0 | WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0]; |
1240 | 0 | WORD32 *plpc_filt_states_real = |
1241 | 0 | &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0]; |
1242 | 0 | memcpy(plpc_filt_states_real, p_loc_qmf_real, |
1243 | 0 | sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb)); |
1244 | 0 | } |
1245 | 0 | } |
1246 | | |
1247 | 33.3k | if (apply_processing && ptr_header_data->channel_mode == PS_STEREO && |
1248 | 930 | ((audio_object_type != AOT_ER_AAC_ELD) && |
1249 | 0 | (audio_object_type != AOT_ER_AAC_LD))) { |
1250 | 0 | WORD32 ps_scale; |
1251 | |
|
1252 | 0 | ixheaacd_init_ps_scale(ptr_ps_dec, &ptr_sbr_dec->str_sbr_scale_fact); |
1253 | |
|
1254 | 0 | ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay, |
1255 | 0 | ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag, |
1256 | 0 | &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data, |
1257 | 0 | &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec, |
1258 | 0 | 1, 0, sbr_tables_ptr, pstr_common_tables, ch_fac, |
1259 | 0 | drc_on, drc_sbr_factors, audio_object_type); |
1260 | |
|
1261 | 0 | ps_scale = ptr_sbr_dec->str_sbr_scale_fact.ps_scale; |
1262 | 0 | ptr_sbr_sf_r->ov_lb_scale = ps_scale; |
1263 | 0 | ptr_sbr_sf_r->lb_scale = ps_scale; |
1264 | 0 | ptr_sbr_sf_r->hb_scale = ps_scale; |
1265 | |
|
1266 | 0 | ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay, |
1267 | 0 | ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag, |
1268 | 0 | ptr_sbr_sf_r, ptr_time_data + 1, |
1269 | 0 | ptr_qmf_synth_bank_r, ptr_ps_dec, 0, 0, |
1270 | 0 | sbr_tables_ptr, pstr_common_tables, ch_fac, |
1271 | 0 | drc_on, drc_sbr_factors, audio_object_type); |
1272 | 33.3k | } else { |
1273 | 33.3k | ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay, |
1274 | 33.3k | ptr_sbr_dec->p_arr_qmf_buf_real, ptr_sbr_dec->p_arr_qmf_buf_imag, |
1275 | 33.3k | &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data, |
1276 | 33.3k | &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec, |
1277 | 33.3k | 0, low_pow_flag, sbr_tables_ptr, |
1278 | 33.3k | pstr_common_tables, ch_fac, drc_on, |
1279 | 33.3k | drc_sbr_factors, audio_object_type); |
1280 | 33.3k | } |
1281 | | |
1282 | 33.3k | { |
1283 | 33.3k | WORD32 num = op_delay; |
1284 | 33.3k | if (audio_object_type != AOT_ER_AAC_ELD) { |
1285 | 0 | WORD32 *p_loc_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf; |
1286 | 0 | WORD32 *p_loc_qmf_real_1 = &p_arr_qmf_buf_real[no_bins][0]; |
1287 | 0 | memcpy(p_loc_qmf_real, p_loc_qmf_real_1, |
1288 | 0 | sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num); |
1289 | 0 | } |
1290 | | |
1291 | 33.3k | if (!low_pow_flag) { |
1292 | 33.3k | num = num << 1; |
1293 | 33.3k | } |
1294 | | |
1295 | 33.3k | if (ldmps_present == 1) { |
1296 | 3.36k | memmove(&ptr_sbr_dec->mps_qmf_buf_real[0][0], |
1297 | 3.36k | &ptr_sbr_dec->mps_qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank |
1298 | 3.36k | .num_time_slots][0], |
1299 | 3.36k | SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64); |
1300 | | |
1301 | 3.36k | memmove(&ptr_sbr_dec->mps_qmf_buf_imag[0][0], |
1302 | 3.36k | &ptr_sbr_dec->mps_qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank |
1303 | 3.36k | .num_time_slots][0], |
1304 | 3.36k | SBR_HF_ADJ_OFFSET * sizeof(FLOAT32) * 64); |
1305 | 3.36k | } |
1306 | 33.3k | } |
1307 | | |
1308 | 33.3k | ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale; |
1309 | 33.3k | return 0; |
1310 | 33.3k | } |
1311 | | |
1312 | | WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, |
1313 | | ia_sbr_header_data_struct *ptr_header_data, |
1314 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
1315 | | FLAG apply_processing, FLAG low_pow_flag, |
1316 | 17.9k | ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) { |
1317 | 17.9k | WORD32 i; |
1318 | 17.9k | WORD32 op_delay; |
1319 | | |
1320 | 17.9k | WORD32 codec_x_delay = 0; |
1321 | | |
1322 | 17.9k | FLOAT32 **pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real; |
1323 | 17.9k | FLOAT32 **pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag; |
1324 | | |
1325 | 17.9k | WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; |
1326 | | |
1327 | 17.9k | WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag; |
1328 | 17.9k | WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx; |
1329 | 17.9k | WORD32 hbe_flag = ptr_header_data->hbe_flag; |
1330 | 17.9k | WORD32 sbr_mode = ptr_frame_data->sbr_mode; |
1331 | | |
1332 | 17.9k | op_delay = 6; |
1333 | 17.9k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
1334 | 8.60k | op_delay = 2 * 6; |
1335 | 8.60k | } |
1336 | | |
1337 | 17.9k | ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0; |
1338 | 17.9k | { |
1339 | 17.9k | if (hbe_flag) { |
1340 | 10.7k | codec_x_delay = 32; |
1341 | 10.7k | } |
1342 | 17.9k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
1343 | 8.60k | codec_x_delay = 2 * codec_x_delay; |
1344 | 8.60k | } |
1345 | | |
1346 | 17.9k | memmove( |
1347 | 17.9k | &ptr_sbr_dec->qmf_buf_real[0][0], |
1348 | 17.9k | &ptr_sbr_dec |
1349 | 17.9k | ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], |
1350 | 17.9k | (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); |
1351 | 17.9k | memmove( |
1352 | 17.9k | &ptr_sbr_dec->qmf_buf_imag[0][0], |
1353 | 17.9k | &ptr_sbr_dec |
1354 | 17.9k | ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], |
1355 | 17.9k | (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); |
1356 | | |
1357 | 17.9k | memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0], |
1358 | 17.9k | &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank |
1359 | 17.9k | .num_time_slots][0], |
1360 | 17.9k | (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); |
1361 | 17.9k | memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0], |
1362 | 17.9k | &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank |
1363 | 17.9k | .num_time_slots][0], |
1364 | 17.9k | (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); |
1365 | | |
1366 | 17.9k | if (hbe_flag) { |
1367 | 10.7k | memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0], |
1368 | 10.7k | &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank |
1369 | 10.7k | .num_time_slots][0], |
1370 | 10.7k | 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); |
1371 | 10.7k | memmove(ptr_sbr_dec->ph_vocod_qmf_imag, |
1372 | 10.7k | ptr_sbr_dec->ph_vocod_qmf_imag + |
1373 | 10.7k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
1374 | 10.7k | 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); |
1375 | 10.7k | } |
1376 | 17.9k | } |
1377 | | |
1378 | 17.9k | ixheaacd_esbr_analysis_filt_block( |
1379 | 17.9k | ptr_sbr_dec, ptr_sbr_tables, |
1380 | 17.9k | op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET); |
1381 | | |
1382 | 17.9k | if (hbe_flag) { |
1383 | 10.7k | WORD32 err = ixheaacd_qmf_hbe_apply( |
1384 | 10.7k | ptr_sbr_dec->p_hbe_txposer, |
1385 | 10.7k | ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) + |
1386 | 10.7k | ESBR_HBE_DELAY_OFFSET, |
1387 | 10.7k | ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) + |
1388 | 10.7k | ESBR_HBE_DELAY_OFFSET, |
1389 | 10.7k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
1390 | 10.7k | ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), |
1391 | 10.7k | ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), |
1392 | 10.7k | ptr_frame_data->pitch_in_bins, ptr_header_data); |
1393 | 10.7k | if (err) return err; |
1394 | | |
1395 | 10.7k | if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { |
1396 | 8.60k | ixheaacd_hbe_repl_spec( |
1397 | 8.60k | &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0], |
1398 | 8.60k | ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), |
1399 | 8.60k | ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), |
1400 | 8.60k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, |
1401 | 8.60k | ptr_sbr_dec->p_hbe_txposer->max_stretch); |
1402 | 8.60k | } |
1403 | 10.7k | } |
1404 | 17.9k | ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag); |
1405 | | |
1406 | 1.16M | for (i = 0; i < 64; i++) { |
1407 | 1.14M | memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32)); |
1408 | 1.14M | memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32)); |
1409 | 1.14M | } |
1410 | | |
1411 | 17.9k | ptr_sbr_dec->band_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
1412 | | |
1413 | 17.9k | ixheaacd_esbr_synthesis_filt_block( |
1414 | 17.9k | ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing, |
1415 | 17.9k | pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables, |
1416 | 17.9k | mps_sbr_flag, ch_fac, 0, 0, NULL, 0, NULL); |
1417 | | |
1418 | 17.9k | ptr_frame_data->prev_sbr_mode = sbr_mode; |
1419 | 17.9k | return 0; |
1420 | 17.9k | } |
1421 | | |
1422 | | WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, VOID *p_sbr_frame, |
1423 | 109k | VOID *p_sbr_header, WORD32 ec_flag) { |
1424 | 109k | WORD32 i, k; |
1425 | 109k | ia_sbr_frame_info_data_struct *ptr_frame_data = |
1426 | 109k | (ia_sbr_frame_info_data_struct *)p_sbr_frame; |
1427 | 109k | ia_sbr_header_data_struct *ptr_header_data = |
1428 | 109k | (ia_sbr_header_data_struct *)p_sbr_header; |
1429 | 109k | ia_sbr_dec_struct *ptr_sbr_dec = (ia_sbr_dec_struct *)p_sbr_dec; |
1430 | 109k | ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details; |
1431 | 109k | WORD32 no_bins; |
1432 | 109k | WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; |
1433 | 109k | WORD32 op_delay = 6 + SBR_HF_ADJ_OFFSET; |
1434 | 109k | WORD32 num_anal_bands = 40; |
1435 | 109k | WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag; |
1436 | 109k | WORD32 err = 0; |
1437 | | |
1438 | 109k | if (ptr_header_data->is_usf_4) { |
1439 | 27.2k | op_delay += 6; |
1440 | 27.2k | } |
1441 | | |
1442 | 109k | num_anal_bands = num_anal_bands - (upsample_ratio_idx << 3); |
1443 | | |
1444 | 109k | if (!mps_sbr_flag) { |
1445 | 54.4k | return 0; |
1446 | 54.6k | } else { |
1447 | 54.6k | ptr_frame_data->cov_count = ptr_sbr_dec->str_codec_qmf_bank.no_channels; |
1448 | 54.6k | } |
1449 | | |
1450 | 54.6k | no_bins = ptr_header_data->output_framesize / 64; |
1451 | | |
1452 | 2.12M | for (i = 0; i < no_bins; i++) { |
1453 | 2.07M | FLOAT32 *p_loc_mps_qmf_output = |
1454 | 2.07M | p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2); |
1455 | 40.9M | for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) { |
1456 | 38.8M | ptr_sbr_dec->mps_qmf_buf_real[op_delay + i][k] = *p_loc_mps_qmf_output++; |
1457 | 38.8M | ptr_sbr_dec->mps_qmf_buf_imag[op_delay + i][k] = *p_loc_mps_qmf_output++; |
1458 | | |
1459 | 38.8M | ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k] = |
1460 | 38.8M | ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; |
1461 | 38.8M | ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k] = |
1462 | 38.8M | ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; |
1463 | 38.8M | } |
1464 | 2.07M | } |
1465 | | |
1466 | 54.6k | if (ptr_frame_data->reset_flag) { |
1467 | 13.5k | WORD32 l; |
1468 | 13.5k | WORD32 start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev; |
1469 | 13.5k | WORD32 end_band = num_anal_bands; |
1470 | 13.5k | WORD32 start_slot = |
1471 | 13.5k | SBR_HF_ADJ_OFFSET + ptr_frame_data->rate * p_frame_info->border_vec[0]; |
1472 | | |
1473 | 106k | for (l = start_slot; l < op_delay; l++) { |
1474 | 732k | for (k = start_band; k < end_band; k++) { |
1475 | 639k | ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0; |
1476 | 639k | ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0; |
1477 | 639k | } |
1478 | 92.8k | } |
1479 | | |
1480 | 40.5k | for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) { |
1481 | 213k | for (k = start_band; k < end_band; k++) { |
1482 | 186k | ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0; |
1483 | 186k | ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0; |
1484 | 186k | } |
1485 | 27.0k | } |
1486 | 13.5k | } |
1487 | 54.6k | ptr_header_data->pstr_freq_band_data->qmf_sb_prev = |
1488 | 54.6k | ptr_header_data->pstr_freq_band_data->sub_band_start; |
1489 | | |
1490 | 54.6k | err = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, |
1491 | 54.6k | ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL, |
1492 | 54.6k | ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, |
1493 | 54.6k | ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, |
1494 | 54.6k | ptr_frame_data, ptr_header_data, 0, |
1495 | 54.6k | ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, ec_flag); |
1496 | 54.6k | if (err) return err; |
1497 | | |
1498 | 54.6k | ptr_frame_data->pstr_sbr_header = ptr_header_data; |
1499 | 54.6k | ptr_frame_data->sbr_mode = ORIG_SBR; |
1500 | 54.6k | ptr_frame_data->prev_sbr_mode = ORIG_SBR; |
1501 | 54.6k | err = ixheaacd_sbr_env_calc( |
1502 | 54.6k | ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, |
1503 | 54.6k | ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, |
1504 | 54.6k | ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, |
1505 | 54.6k | ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, |
1506 | 54.6k | (ptr_header_data->hbe_flag == 0) ? NULL : ptr_sbr_dec->p_hbe_txposer->x_over_qmf, |
1507 | 54.6k | ptr_sbr_dec->scratch_buff, NULL, 0, ec_flag); |
1508 | | |
1509 | 54.6k | if (err) return err; |
1510 | 2.12M | for (i = 0; i < no_bins; i++) { |
1511 | 2.07M | FLOAT32 *p_loc_mps_qmf_output = |
1512 | 2.07M | p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2); |
1513 | 40.9M | for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) { |
1514 | 38.8M | *p_loc_mps_qmf_output++ = |
1515 | 38.8M | ptr_sbr_dec->mps_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; |
1516 | 38.8M | *p_loc_mps_qmf_output++ = |
1517 | 38.8M | ptr_sbr_dec->mps_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k]; |
1518 | 38.8M | } |
1519 | 95.7M | for (k = ptr_header_data->pstr_freq_band_data->sub_band_start; k < 64; |
1520 | 93.6M | k++) { |
1521 | 93.6M | *p_loc_mps_qmf_output++ = |
1522 | 93.6M | ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; |
1523 | 93.6M | *p_loc_mps_qmf_output++ = |
1524 | 93.6M | ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k]; |
1525 | 93.6M | } |
1526 | 2.07M | } |
1527 | | |
1528 | 552k | for (i = 0; i < op_delay; i++) { |
1529 | 497k | memmove(ptr_sbr_dec->mps_qmf_buf_real[i], |
1530 | 497k | ptr_sbr_dec->mps_qmf_buf_real[no_bins + i], 64 * sizeof(FLOAT32)); |
1531 | | |
1532 | 497k | memmove(ptr_sbr_dec->mps_qmf_buf_imag[i], |
1533 | 497k | ptr_sbr_dec->mps_qmf_buf_imag[no_bins + i], 64 * sizeof(FLOAT32)); |
1534 | | |
1535 | 497k | memmove(ptr_sbr_dec->mps_sbr_qmf_buf_real[i], |
1536 | 497k | ptr_sbr_dec->mps_sbr_qmf_buf_real[no_bins + i], |
1537 | 497k | 64 * sizeof(FLOAT32)); |
1538 | | |
1539 | 497k | memmove(ptr_sbr_dec->mps_sbr_qmf_buf_imag[i], |
1540 | 497k | ptr_sbr_dec->mps_sbr_qmf_buf_imag[no_bins + i], |
1541 | 497k | 64 * sizeof(FLOAT32)); |
1542 | 497k | } |
1543 | | |
1544 | 54.6k | ptr_frame_data->reset_flag = 0; |
1545 | 54.6k | return err; |
1546 | 54.6k | } |