/src/libxaac/decoder/ixheaacd_ps_dec_flt.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | #include <string.h> |
21 | | #include <math.h> |
22 | | #include "ixheaacd_sbr_common.h" |
23 | | #include "ixheaac_type_def.h" |
24 | | |
25 | | #include "ixheaac_constants.h" |
26 | | #include "ixheaac_basic_ops32.h" |
27 | | #include "ixheaac_basic_ops16.h" |
28 | | #include "ixheaac_basic_ops40.h" |
29 | | #include "ixheaac_basic_ops_arr.h" |
30 | | #include "ixheaac_basic_ops.h" |
31 | | |
32 | | #include "ixheaacd_defines.h" |
33 | | #include "ixheaac_basic_op.h" |
34 | | #include "ixheaacd_intrinsics.h" |
35 | | #include "ixheaacd_common_rom.h" |
36 | | #include "ixheaacd_basic_funcs.h" |
37 | | #include "ixheaacd_bitbuffer.h" |
38 | | #include "ixheaacd_sbrdecsettings.h" |
39 | | #include "ixheaacd_defines.h" |
40 | | |
41 | | #include "ixheaacd_pns.h" |
42 | | |
43 | | #include "ixheaacd_aac_rom.h" |
44 | | #include "ixheaacd_pulsedata.h" |
45 | | |
46 | | #include "ixheaacd_drc_data_struct.h" |
47 | | #include "ixheaacd_lt_predict.h" |
48 | | #include "ixheaacd_cnst.h" |
49 | | #include "ixheaacd_ec_defines.h" |
50 | | #include "ixheaacd_ec_struct_def.h" |
51 | | #include "ixheaacd_channelinfo.h" |
52 | | #include "ixheaacd_drc_dec.h" |
53 | | |
54 | | #include "ixheaacd_sbrdecoder.h" |
55 | | #include "ixheaacd_sbr_scale.h" |
56 | | #include "ixheaacd_lpp_tran.h" |
57 | | #include "ixheaacd_env_extr_part.h" |
58 | | #include "ixheaacd_sbr_rom.h" |
59 | | |
60 | | #include "ixheaacd_hybrid.h" |
61 | | #include "ixheaacd_ps_dec.h" |
62 | | |
63 | | #include "ixheaacd_env_extr.h" |
64 | | |
65 | | #include "ixheaacd_ps_dec.h" |
66 | | |
67 | | #include "ixheaacd_qmf_dec.h" |
68 | | #include "ixheaacd_env_calc.h" |
69 | | #include "ixheaac_sbr_const.h" |
70 | | |
71 | | #include "ixheaacd_pvc_dec.h" |
72 | | #include "ixheaacd_sbr_dec.h" |
73 | | #include "ixheaacd_function_selector.h" |
74 | | |
75 | | VOID ixheaacd_k_chan_filt(const FLOAT32 *ptr_qmf_re, const FLOAT32 *ptr_qmf_im, |
76 | | FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_QMF_CHANNELS], |
77 | | FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_QMF_CHANNELS], WORD32 nSamples, |
78 | | WORD32 k, WORD32 bCplx, const FLOAT32 *p, |
79 | 56.4k | FLOAT32 *cos_sin_mod_tbl) { |
80 | 56.4k | WORD32 i, n, q; |
81 | 56.4k | FLOAT32 real, imag; |
82 | 56.4k | FLOAT32 cos_val, sin_val; |
83 | 56.4k | FLOAT32 *p_real_imag = cos_sin_mod_tbl; |
84 | | |
85 | 56.4k | if (bCplx) { |
86 | 621k | for (i = 0; i < nSamples; i++) { |
87 | 5.42M | for (q = 0; q < k; q++) { |
88 | 4.81M | real = 0; |
89 | 4.81M | imag = 0; |
90 | 67.4M | for (n = 0; n < 13; n++) { |
91 | 62.6M | cos_val = *p_real_imag++; |
92 | 62.6M | sin_val = *p_real_imag++; |
93 | 62.6M | real += p[n] * (ptr_qmf_re[n + i] * cos_val - ptr_qmf_im[n + i] * sin_val); |
94 | 62.6M | imag += p[n] * (ptr_qmf_im[n + i] * cos_val + ptr_qmf_re[n + i] * sin_val); |
95 | 62.6M | } |
96 | 4.81M | ptr_tmp_hyb_re[i][q] = real; |
97 | 4.81M | ptr_tmp_hyb_im[i][q] = imag; |
98 | 4.81M | } |
99 | 602k | p_real_imag -= (13 * k * 2); |
100 | 602k | } |
101 | 37.6k | } else { |
102 | 1.24M | for (i = 0; i < nSamples; i++) { |
103 | 3.61M | for (q = 0; q < k; q++) { |
104 | 2.40M | real = 0; |
105 | 2.40M | imag = 0; |
106 | 33.7M | for (n = 0; n < 13; n++) { |
107 | 31.3M | cos_val = *p_real_imag++; |
108 | 31.3M | real += p[n] * (ptr_qmf_re[n + i] * cos_val); |
109 | 31.3M | imag += p[n] * (ptr_qmf_im[n + i] * cos_val); |
110 | 31.3M | } |
111 | 2.40M | ptr_tmp_hyb_re[i][q] = real; |
112 | 2.40M | ptr_tmp_hyb_im[i][q] = imag; |
113 | 2.40M | } |
114 | 1.20M | p_real_imag -= (13 * k); |
115 | 1.20M | } |
116 | 37.6k | } |
117 | 56.4k | } |
118 | | |
119 | | VOID ixheaacd_hyb_anal(const FLOAT32 **ptr_qmf_re, const FLOAT32 **ptr_qmf_im, |
120 | | ia_ps_dec_struct *ptr_ps_dec, ia_ps_tables_struct *ptr_ps_tables, |
121 | 37.6k | WORD32 use_34_st_bands) { |
122 | 37.6k | WORD32 k, n, band; |
123 | 37.6k | WORD32 band_res; |
124 | 37.6k | WORD32 frame_size; |
125 | 37.6k | WORD32 ch_offset = 0; |
126 | 37.6k | FLOAT32(*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS]; |
127 | 37.6k | FLOAT32(*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS]; |
128 | 37.6k | ia_hybrid_flt_struct *ptr_hybrid; |
129 | 37.6k | if (!use_34_st_bands) { |
130 | 18.8k | ptr_tmp_hyb_re = ptr_ps_dec->hyb_left_re; |
131 | 18.8k | ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im; |
132 | 18.8k | ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20; |
133 | 18.8k | } else { |
134 | 18.8k | ptr_tmp_hyb_re = NULL; |
135 | 18.8k | ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im; |
136 | 18.8k | ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34; |
137 | 18.8k | } |
138 | 37.6k | frame_size = ptr_hybrid->frame_size; |
139 | 188k | for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) { |
140 | 150k | band_res = ptr_hybrid->ptr_resol[band]; |
141 | | |
142 | 150k | memcpy(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_qmf_buf_re[band], |
143 | 150k | (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_re[0])); |
144 | 150k | memcpy(ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_qmf_buf_im[band], |
145 | 150k | (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_im[0])); |
146 | | |
147 | 4.97M | for (n = 0; n < frame_size; n++) { |
148 | 4.81M | ptr_hybrid->ptr_work_re[(HYBRID_FILTER_LENGTH - 1) + n] = |
149 | 4.81M | ptr_qmf_re[n + HYBRID_FILTER_DELAY][band]; |
150 | 4.81M | ptr_hybrid->ptr_work_im[(HYBRID_FILTER_LENGTH - 1) + n] = |
151 | 4.81M | ptr_qmf_im[n + HYBRID_FILTER_DELAY][band]; |
152 | 4.81M | } |
153 | | |
154 | 150k | memcpy(ptr_hybrid->ptr_qmf_buf_re[band], ptr_hybrid->ptr_work_re + frame_size, |
155 | 150k | (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_re[band][0])); |
156 | 150k | memcpy(ptr_hybrid->ptr_qmf_buf_im[band], ptr_hybrid->ptr_work_im + frame_size, |
157 | 150k | (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_im[band][0])); |
158 | | |
159 | 150k | if (ptr_tmp_hyb_re) { |
160 | 56.4k | switch (band_res) { |
161 | 37.6k | case NO_HYBRID_CHANNELS_2: |
162 | 37.6k | ixheaacd_k_chan_filt( |
163 | 37.6k | ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re, |
164 | 37.6k | ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_2, REAL, |
165 | 37.6k | ptr_ps_tables->p2_13_20, |
166 | 37.6k | &ptr_ps_tables->cos_mod_2channel[0][0]); |
167 | 37.6k | break; |
168 | 0 | case NO_HYBRID_CHANNELS_4: |
169 | 0 | ixheaacd_k_chan_filt( |
170 | 0 | ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re, |
171 | 0 | ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_4, CPLX, |
172 | 0 | ptr_ps_tables->p4_13_34, |
173 | 0 | &ptr_ps_tables->cos_sin_mod_4channel[0][0]); |
174 | 0 | break; |
175 | 18.8k | case NO_HYBRID_CHANNELS_8: |
176 | 18.8k | ixheaacd_k_chan_filt( |
177 | 18.8k | ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re, |
178 | 18.8k | ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_8, CPLX, |
179 | 18.8k | use_34_st_bands ? ptr_ps_tables->p8_13_34 : ptr_ps_tables->p8_13_20, |
180 | 18.8k | &ptr_ps_tables->cos_sin_mod_8channel[0][0]); |
181 | 18.8k | break; |
182 | 0 | case NO_HYBRID_CHANNELS_12: |
183 | 0 | ixheaacd_k_chan_filt(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, |
184 | 0 | ptr_hybrid->ptr_temp_re, ptr_hybrid->ptr_temp_im, frame_size, |
185 | 0 | NO_HYBRID_CHANNELS_12, CPLX, ptr_ps_tables->p12_13_34, |
186 | 0 | &ptr_ps_tables->cos_sin_mod_12channel[0][0]); |
187 | 0 | break; |
188 | 0 | default: |
189 | 0 | break; |
190 | 56.4k | } |
191 | | |
192 | 1.86M | for (n = 0; n < frame_size; n++) { |
193 | 9.03M | for (k = 0; k < (WORD32)band_res; k++) { |
194 | 7.22M | ptr_tmp_hyb_re[n][ch_offset + k] = ptr_hybrid->ptr_temp_re[n][k]; |
195 | 7.22M | ptr_tmp_hyb_im[n][ch_offset + k] = ptr_hybrid->ptr_temp_im[n][k]; |
196 | 7.22M | } |
197 | 1.80M | } |
198 | 56.4k | ch_offset += band_res; |
199 | 56.4k | } |
200 | 150k | } |
201 | 37.6k | } |
202 | | |
203 | | VOID ixheaacd_hyb_synth( |
204 | | FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS], |
205 | | FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS], |
206 | | FLOAT32 **ptr_qmf_re, |
207 | | FLOAT32 **ptr_qmf_im, |
208 | 37.6k | ia_hybrid_flt_struct *ptr_hybrid) { |
209 | 37.6k | WORD32 k, n, band; |
210 | 37.6k | WORD16 band_res; |
211 | 37.6k | WORD32 frame_size = ptr_hybrid->frame_size; |
212 | 37.6k | WORD32 ch_offset = 0; |
213 | | |
214 | 150k | for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) { |
215 | 112k | band_res = ptr_hybrid->ptr_resol[band]; |
216 | | |
217 | 3.72M | for (n = 0; n < frame_size; n++) { |
218 | 3.61M | ptr_qmf_re[n][band] = ptr_qmf_im[n][band] = 0; |
219 | | |
220 | 18.0M | for (k = 0; k < (WORD32)band_res; k++) { |
221 | 14.4M | ptr_qmf_re[n][band] += ptr_tmp_hyb_re[n][ch_offset + k]; |
222 | 14.4M | ptr_qmf_im[n][band] += ptr_tmp_hyb_im[n][ch_offset + k]; |
223 | 14.4M | } |
224 | 3.61M | } |
225 | 112k | ch_offset += band_res; |
226 | 112k | } |
227 | 37.6k | } |
228 | | |
229 | 0 | VOID ixheaacd_map_34_float_to_20(FLOAT32 *ptr_index) { |
230 | 0 | ptr_index[0] = (2 * ptr_index[0] + ptr_index[1]) / 3.0f; |
231 | 0 | ptr_index[1] = (ptr_index[1] + 2 * ptr_index[2]) / 3.0f; |
232 | 0 | ptr_index[2] = (2 * ptr_index[3] + ptr_index[4]) / 3.0f; |
233 | 0 | ptr_index[3] = (ptr_index[4] + 2 * ptr_index[5]) / 3.0f; |
234 | 0 | ptr_index[4] = (ptr_index[6] + ptr_index[7]) / 2.0f; |
235 | 0 | ptr_index[5] = (ptr_index[8] + ptr_index[9]) / 2.0f; |
236 | 0 | ptr_index[6] = ptr_index[10]; |
237 | 0 | ptr_index[7] = ptr_index[11]; |
238 | 0 | ptr_index[8] = (ptr_index[12] + ptr_index[13]) / 2.0f; |
239 | 0 | ptr_index[9] = (ptr_index[14] + ptr_index[15]) / 2.0f; |
240 | 0 | ptr_index[10] = ptr_index[16]; |
241 | 0 | ptr_index[11] = ptr_index[17]; |
242 | 0 | ptr_index[12] = ptr_index[18]; |
243 | 0 | ptr_index[13] = ptr_index[19]; |
244 | 0 | ptr_index[14] = (ptr_index[20] + ptr_index[21]) / 2.0f; |
245 | 0 | ptr_index[15] = (ptr_index[22] + ptr_index[23]) / 2.0f; |
246 | 0 | ptr_index[16] = (ptr_index[24] + ptr_index[25]) / 2.0f; |
247 | 0 | ptr_index[17] = (ptr_index[26] + ptr_index[27]) / 2.0f; |
248 | 0 | ptr_index[18] = (ptr_index[28] + ptr_index[29] + ptr_index[30] + ptr_index[31]) / 4.0f; |
249 | 0 | ptr_index[19] = (ptr_index[32] + ptr_index[33]) / 2.0f; |
250 | 0 | } |
251 | | |
252 | 0 | VOID ixheaacd_map_20_float_to_34(FLOAT32 *ptr_index) { |
253 | 0 | FLOAT32 arr_temp[NUM_HI_RES_BINS]; |
254 | 0 | WORD32 i; |
255 | |
|
256 | 0 | arr_temp[0] = ptr_index[0]; |
257 | 0 | arr_temp[1] = (ptr_index[0] + ptr_index[1]) / 2.0f; |
258 | 0 | arr_temp[2] = ptr_index[1]; |
259 | 0 | arr_temp[3] = ptr_index[2]; |
260 | 0 | arr_temp[4] = (ptr_index[2] + ptr_index[3]) / 2.0f; |
261 | 0 | arr_temp[5] = ptr_index[3]; |
262 | 0 | arr_temp[6] = ptr_index[4]; |
263 | 0 | arr_temp[7] = ptr_index[4]; |
264 | 0 | arr_temp[8] = ptr_index[5]; |
265 | 0 | arr_temp[9] = ptr_index[5]; |
266 | 0 | arr_temp[10] = ptr_index[6]; |
267 | 0 | arr_temp[11] = ptr_index[7]; |
268 | 0 | arr_temp[12] = ptr_index[8]; |
269 | 0 | arr_temp[13] = ptr_index[8]; |
270 | 0 | arr_temp[14] = ptr_index[9]; |
271 | 0 | arr_temp[15] = ptr_index[9]; |
272 | 0 | arr_temp[16] = ptr_index[10]; |
273 | 0 | arr_temp[17] = ptr_index[11]; |
274 | 0 | arr_temp[18] = ptr_index[12]; |
275 | 0 | arr_temp[19] = ptr_index[13]; |
276 | 0 | arr_temp[20] = ptr_index[14]; |
277 | 0 | arr_temp[21] = ptr_index[14]; |
278 | 0 | arr_temp[22] = ptr_index[15]; |
279 | 0 | arr_temp[23] = ptr_index[15]; |
280 | 0 | arr_temp[24] = ptr_index[16]; |
281 | 0 | arr_temp[25] = ptr_index[16]; |
282 | 0 | arr_temp[26] = ptr_index[17]; |
283 | 0 | arr_temp[27] = ptr_index[17]; |
284 | 0 | arr_temp[28] = ptr_index[18]; |
285 | 0 | arr_temp[29] = ptr_index[18]; |
286 | 0 | arr_temp[30] = ptr_index[18]; |
287 | 0 | arr_temp[31] = ptr_index[18]; |
288 | 0 | arr_temp[32] = ptr_index[19]; |
289 | 0 | arr_temp[33] = ptr_index[19]; |
290 | |
|
291 | 0 | for (i = 0; i < 34; i++) { |
292 | 0 | ptr_index[i] = arr_temp[i]; |
293 | 0 | } |
294 | 0 | } |
295 | | |
296 | | WORD32 ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct *ptr_ps_dec_struct, |
297 | | ia_ps_tables_struct *ptr_ps_tables, UWORD32 noQmfChans, |
298 | 17.3k | UWORD32 num_sub_samples, WORD32 ps_mode) { |
299 | 17.3k | UWORD32 i; |
300 | 17.3k | ia_ps_dec_struct *ptr_ps_dec = ptr_ps_dec_struct; |
301 | | |
302 | 17.3k | ptr_ps_dec = ptr_ps_dec_struct; |
303 | | |
304 | 17.3k | ptr_ps_dec->num_sub_samples = num_sub_samples; |
305 | 17.3k | ptr_ps_dec->num_chans = noQmfChans; |
306 | 17.3k | ptr_ps_dec->ps_mode = ps_mode; |
307 | | |
308 | 17.3k | ptr_ps_dec->ps_data_present = 0; |
309 | 17.3k | ptr_ps_dec->enable_iid = 0; |
310 | 17.3k | ptr_ps_dec->iid_mode = 0; |
311 | 17.3k | ptr_ps_dec->enable_icc = 0; |
312 | 17.3k | ptr_ps_dec->icc_mode = 0; |
313 | 17.3k | ptr_ps_dec->enable_ext = 0; |
314 | | |
315 | 17.3k | ptr_ps_dec->use_pca_rot_flg = 0; |
316 | 17.3k | ptr_ps_dec->freq_res_ipd = 0; |
317 | 17.3k | ptr_ps_dec->use_34_st_bands = 0; |
318 | 17.3k | ptr_ps_dec->use_34_st_bands_prev = 0; |
319 | | |
320 | 17.3k | ptr_ps_dec->str_flt_hybrid20.frame_size = ptr_ps_dec->num_sub_samples; |
321 | 17.3k | ptr_ps_dec->str_flt_hybrid20.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID20; |
322 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb20[0]; |
323 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_work_re = &ptr_ps_dec->hyb_work_re_20[0]; |
324 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_work_im = &ptr_ps_dec->hyb_work_im_20[0]; |
325 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_20; |
326 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_20; |
327 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_temp_re = ptr_ps_dec->hyb_temp_re_20; |
328 | 17.3k | ptr_ps_dec->str_flt_hybrid20.ptr_temp_im = ptr_ps_dec->hyb_temp_im_20; |
329 | | |
330 | 17.3k | ptr_ps_dec->str_flt_hybrid34.frame_size = ptr_ps_dec->num_sub_samples; |
331 | 17.3k | ptr_ps_dec->str_flt_hybrid34.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID34; |
332 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb34[0]; |
333 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_work_re = &ptr_ps_dec->hyb_work_re_34[0]; |
334 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_work_im = &ptr_ps_dec->hyb_work_im_34[0]; |
335 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_34; |
336 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_34; |
337 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_temp_re = ptr_ps_dec->hyb_temp_re_34; |
338 | 17.3k | ptr_ps_dec->str_flt_hybrid34.ptr_temp_im = ptr_ps_dec->hyb_temp_im_34; |
339 | | |
340 | 17.3k | ptr_ps_dec->delay_buf_idx = 0; |
341 | | |
342 | 1.12M | for (i = 0; i < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; i++) { |
343 | 1.11M | ptr_ps_dec->delay_qmf_delay_buf_idx[i] = 0; |
344 | 1.11M | ptr_ps_dec->delay_qmf_delay_num_samp[i] = ptr_ps_tables->qmf_delay_idx_tbl[i]; |
345 | 1.11M | } |
346 | | |
347 | 608k | for (i = 0; i < NUM_HI_RES_BINS; i++) { |
348 | 590k | ptr_ps_dec->h11_re_prev[i] = 1.0f; |
349 | 590k | ptr_ps_dec->h12_re_prev[i] = 1.0f; |
350 | 590k | } |
351 | | |
352 | 17.3k | memset(ptr_ps_dec->h11_im_prev, 0, sizeof(ptr_ps_dec->h11_im_prev)); |
353 | 17.3k | memset(ptr_ps_dec->h12_im_prev, 0, sizeof(ptr_ps_dec->h12_im_prev)); |
354 | 17.3k | memset(ptr_ps_dec->h21_re_prev, 0, sizeof(ptr_ps_dec->h21_re_prev)); |
355 | 17.3k | memset(ptr_ps_dec->h22_re_prev, 0, sizeof(ptr_ps_dec->h22_re_prev)); |
356 | 17.3k | memset(ptr_ps_dec->h21_im_prev, 0, sizeof(ptr_ps_dec->h21_im_prev)); |
357 | 17.3k | memset(ptr_ps_dec->h22_im_prev, 0, sizeof(ptr_ps_dec->h22_im_prev)); |
358 | | |
359 | 17.3k | memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1)); |
360 | 17.3k | memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1)); |
361 | 17.3k | memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2)); |
362 | 17.3k | memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2)); |
363 | | |
364 | 608k | for (i = 0; i < NUM_HI_RES_BINS; i++) { |
365 | 590k | ptr_ps_dec->peak_decay_fast_bin[i] = 0.0f; |
366 | 590k | ptr_ps_dec->prev_nrg_bin[i] = 0.0f; |
367 | 590k | ptr_ps_dec->prev_peak_diff_bin[i] = 0.0f; |
368 | 590k | } |
369 | | |
370 | 17.3k | memset(ptr_ps_dec->qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->qmf_delay_buf_re)); |
371 | 17.3k | memset(ptr_ps_dec->qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->qmf_delay_buf_im)); |
372 | 17.3k | memset(ptr_ps_dec->sub_qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_re)); |
373 | 17.3k | memset(ptr_ps_dec->sub_qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_im)); |
374 | | |
375 | 69.5k | for (i = 0; i < NUM_SER_AP_LINKS; i++) { |
376 | 52.1k | memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0, |
377 | 52.1k | sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i])); |
378 | 52.1k | memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0, |
379 | 52.1k | sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i])); |
380 | 52.1k | memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0, |
381 | 52.1k | sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i])); |
382 | 52.1k | memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0, |
383 | 52.1k | sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i])); |
384 | 52.1k | } |
385 | | |
386 | 17.3k | return 0; |
387 | 17.3k | } |
388 | | |
389 | | VOID ixheaacd_esbr_apply_ps(ia_ps_dec_struct *ptr_ps_dec, |
390 | | FLOAT32 **pp_qmf_buf_re_left, |
391 | | FLOAT32 **pp_qmf_buf_im_left, |
392 | | FLOAT32 **pp_qmf_buf_re_right, |
393 | | FLOAT32 **pp_qmf_buf_im_right, |
394 | | WORD32 usb, ia_ps_tables_struct *ptr_ps_tables, |
395 | 18.8k | WORD32 num_time_slot) { |
396 | 18.8k | WORD32 sb; |
397 | 18.8k | WORD32 i, k; |
398 | | |
399 | 18.8k | WORD32 max_num_column; |
400 | | |
401 | 18.8k | if (num_time_slot == 15) |
402 | 0 | max_num_column = MAX_NUM_COLUMNS_960; |
403 | 18.8k | else |
404 | 18.8k | max_num_column = MAX_NUM_COLUMNS; |
405 | | |
406 | 18.8k | if (ptr_ps_dec->use_34_st_bands) { |
407 | 0 | ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_34_tbl[0]; |
408 | 0 | ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_34[0]; |
409 | 0 | ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34; |
410 | 0 | ptr_ps_dec->num_groups = NUM_IID_GROUPS_HI_RES; |
411 | 0 | ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS_HI_RES; |
412 | 0 | ptr_ps_dec->num_bins = NUM_HI_RES_BINS; |
413 | 0 | ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS_HI_RES; |
414 | 18.8k | } else { |
415 | 18.8k | ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_20_tbl[0]; |
416 | 18.8k | ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_20[0]; |
417 | 18.8k | ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20; |
418 | 18.8k | ptr_ps_dec->num_groups = NUM_IID_GROUPS; |
419 | 18.8k | ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS; |
420 | 18.8k | ptr_ps_dec->num_bins = NUM_MID_RES_BINS; |
421 | 18.8k | ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS; |
422 | 18.8k | } |
423 | | |
424 | 771k | for (sb = usb; sb < ptr_ps_dec->num_chans; sb++) { |
425 | 3.01M | for (i = 0; i < NUM_SER_AP_LINKS; i++) { |
426 | 11.2M | for (k = 0; k < ptr_ps_dec->delay_sample_ser[i]; k++) { |
427 | 9.03M | ptr_ps_dec->ser_qmf_delay_buf_re[i][k][sb] = 0; |
428 | 9.03M | ptr_ps_dec->ser_qmf_delay_buf_im[i][k][sb] = 0; |
429 | 9.03M | } |
430 | 2.25M | } |
431 | 11.2M | for (k = 0; k < HIGH_DEL; k++) { |
432 | 10.5M | ptr_ps_dec->qmf_delay_buf_re[k][sb] = 0; |
433 | 10.5M | ptr_ps_dec->qmf_delay_buf_im[k][sb] = 0; |
434 | 10.5M | } |
435 | 753k | } |
436 | 18.8k | ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left, |
437 | 18.8k | (const FLOAT32 **)pp_qmf_buf_im_left, |
438 | 18.8k | ptr_ps_dec, ptr_ps_tables, 0); |
439 | 18.8k | ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left, |
440 | 18.8k | (const FLOAT32 **)pp_qmf_buf_im_left, |
441 | 18.8k | ptr_ps_dec, ptr_ps_tables, 1); |
442 | | |
443 | 18.8k | if (!ptr_ps_dec->use_34_st_bands) { |
444 | 18.8k | WORD32 k; |
445 | 621k | for (k = 0; k < (WORD32)ptr_ps_dec->num_sub_samples; k++) { |
446 | 602k | ptr_ps_dec->hyb_left_re[k][3] += ptr_ps_dec->hyb_left_re[k][4]; |
447 | 602k | ptr_ps_dec->hyb_left_im[k][3] += ptr_ps_dec->hyb_left_im[k][4]; |
448 | 602k | ptr_ps_dec->hyb_left_re[k][4] = 0.; |
449 | 602k | ptr_ps_dec->hyb_left_im[k][4] = 0.; |
450 | | |
451 | 602k | ptr_ps_dec->hyb_left_re[k][2] += ptr_ps_dec->hyb_left_re[k][5]; |
452 | 602k | ptr_ps_dec->hyb_left_im[k][2] += ptr_ps_dec->hyb_left_im[k][5]; |
453 | 602k | ptr_ps_dec->hyb_left_re[k][5] = 0.; |
454 | 602k | ptr_ps_dec->hyb_left_im[k][5] = 0.; |
455 | 602k | } |
456 | 18.8k | } |
457 | | |
458 | 18.8k | if (ptr_ps_dec->ps_mode & 0x0080) { |
459 | 0 | WORD32 i, j; |
460 | 0 | for (i = 0; i < max_num_column; i++) { |
461 | 0 | for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) { |
462 | 0 | pp_qmf_buf_im_right[i][j] = pp_qmf_buf_im_left[i][j]; |
463 | 0 | pp_qmf_buf_re_right[i][j] = pp_qmf_buf_re_left[i][j]; |
464 | 0 | } |
465 | 0 | } |
466 | 0 | for (i = 0; i < max_num_column; i++) { |
467 | 0 | for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) { |
468 | 0 | ptr_ps_dec->hyb_right_re[i][j] = ptr_ps_dec->hyb_left_re[i][j]; |
469 | 0 | ptr_ps_dec->hyb_right_im[i][j] = ptr_ps_dec->hyb_left_im[i][j]; |
470 | 0 | } |
471 | 0 | } |
472 | 18.8k | } else { |
473 | 18.8k | if (ptr_ps_dec->ps_mode & 0x0002) { |
474 | 0 | WORD32 i, j; |
475 | 0 | for (i = 0; i < max_num_column; i++) { |
476 | 0 | for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) { |
477 | 0 | pp_qmf_buf_im_right[i][j] = 0.; |
478 | 0 | pp_qmf_buf_re_right[i][j] = 0.; |
479 | 0 | } |
480 | 0 | } |
481 | 0 | for (i = 0; i < max_num_column; i++) { |
482 | 0 | for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) { |
483 | 0 | ptr_ps_dec->hyb_right_re[i][j] = 0.; |
484 | 0 | ptr_ps_dec->hyb_right_im[i][j] = 0.; |
485 | 0 | } |
486 | 0 | } |
487 | 18.8k | } else { |
488 | 18.8k | ixheaacd_esbr_ps_de_correlate(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left, |
489 | 18.8k | pp_qmf_buf_re_right, pp_qmf_buf_im_right, |
490 | 18.8k | ptr_ps_tables); |
491 | 18.8k | } |
492 | | |
493 | 18.8k | if (!(ptr_ps_dec->ps_mode & 0x0040)) { |
494 | 18.8k | ixheaacd_esbr_ps_apply_rotation(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left, |
495 | 18.8k | pp_qmf_buf_re_right, pp_qmf_buf_im_right, |
496 | 18.8k | ptr_ps_tables); |
497 | 18.8k | } |
498 | 18.8k | } |
499 | | |
500 | 18.8k | ixheaacd_hyb_synth(ptr_ps_dec->hyb_left_re, ptr_ps_dec->hyb_left_im, |
501 | 18.8k | pp_qmf_buf_re_left, pp_qmf_buf_im_left, ptr_ps_dec->ptr_hybrid); |
502 | | |
503 | 18.8k | ixheaacd_hyb_synth(ptr_ps_dec->hyb_right_re, ptr_ps_dec->hyb_right_im, |
504 | 18.8k | pp_qmf_buf_re_right, pp_qmf_buf_im_right, ptr_ps_dec->ptr_hybrid); |
505 | | |
506 | 18.8k | ptr_ps_dec->use_34_st_bands_prev = ptr_ps_dec->use_34_st_bands; |
507 | | |
508 | 18.8k | } |
509 | | |
510 | | VOID ixheaacd_esbr_ps_de_correlate( |
511 | | ia_ps_dec_struct *ptr_ps_dec, |
512 | | FLOAT32 **pp_qmf_buf_re_left, |
513 | | FLOAT32 **pp_qmf_buf_im_left, |
514 | | FLOAT32 **pp_qmf_buf_re_right, |
515 | | FLOAT32 **pp_qmf_buf_im_right, |
516 | 18.8k | ia_ps_tables_struct *ptr_ps_tables) { |
517 | 18.8k | WORD32 sb, maxsb, gr, k; |
518 | 18.8k | WORD32 m; |
519 | 18.8k | WORD32 l_delay = 0; |
520 | 18.8k | WORD32 l_ser_delay_arr[NUM_SER_AP_LINKS] = {0}; |
521 | 18.8k | FLOAT32 re_left; |
522 | 18.8k | FLOAT32 im_left; |
523 | 18.8k | FLOAT32 peak_diff, nrg, trans_ratio; |
524 | | |
525 | 18.8k | FLOAT32(*pp_hyb_left_re)[MAX_NUM_COLUMNS]; |
526 | 18.8k | FLOAT32(*pp_hyb_left_im)[MAX_NUM_COLUMNS]; |
527 | 18.8k | FLOAT32(*pp_hyb_right_re)[MAX_NUM_COLUMNS]; |
528 | 18.8k | FLOAT32(*pp_hyb_right_im)[MAX_NUM_COLUMNS]; |
529 | | |
530 | 18.8k | FLOAT32(*ppp_ser_sub_qmf_dealy_buf_re)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS]; |
531 | 18.8k | FLOAT32(*ppp_ser_sub_qmf_dealy_buf_im)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS]; |
532 | 18.8k | FLOAT32(*pp_sub_qmf_delay_buf_re)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS]; |
533 | 18.8k | FLOAT32(*pp_sub_qmf_delay_buf_im)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS]; |
534 | | |
535 | 18.8k | FLOAT32 *pp_frac_delay_phase_fac_re; |
536 | 18.8k | FLOAT32 *pp_frac_delay_phase_fac_im; |
537 | 18.8k | FLOAT32(*pp_frac_delay_phase_fac_ser_re)[NUM_SER_AP_LINKS]; |
538 | 18.8k | FLOAT32(*pp_frac_delay_phase_fac_ser_im)[NUM_SER_AP_LINKS]; |
539 | | |
540 | 18.8k | WORD32 *p_delay_qmf_delay_num_samp = NULL; |
541 | 18.8k | WORD32 *p_delay_qmf_delay_buf_idx = NULL; |
542 | | |
543 | 18.8k | FLOAT32 pow_arr[32][NUM_HI_RES_BINS]; |
544 | 18.8k | FLOAT32 trans_ratio_arr[32][NUM_HI_RES_BINS]; |
545 | 18.8k | WORD32 bin; |
546 | 18.8k | FLOAT32 decay_cutoff; |
547 | | |
548 | 18.8k | pp_hyb_left_re = ptr_ps_dec->hyb_left_re; |
549 | 18.8k | pp_hyb_left_im = ptr_ps_dec->hyb_left_im; |
550 | 18.8k | pp_hyb_right_re = ptr_ps_dec->hyb_right_re; |
551 | 18.8k | pp_hyb_right_im = ptr_ps_dec->hyb_right_im; |
552 | | |
553 | 18.8k | ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_sub_qmf_dealy_buf_re; |
554 | 18.8k | ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_sub_qmf_dealy_buf_im; |
555 | | |
556 | 18.8k | pp_sub_qmf_delay_buf_re = ptr_ps_dec->sub_qmf_delay_buf_re; |
557 | 18.8k | pp_sub_qmf_delay_buf_im = ptr_ps_dec->sub_qmf_delay_buf_im; |
558 | | |
559 | 18.8k | if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) { |
560 | 0 | if (ptr_ps_dec->use_34_st_bands) { |
561 | 0 | WORD32 i; |
562 | 0 | for (i = 0; i < NUM_SER_AP_LINKS; i++) { |
563 | 0 | memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0, |
564 | 0 | sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i])); |
565 | 0 | memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0, |
566 | 0 | sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i])); |
567 | 0 | memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0, |
568 | 0 | sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i])); |
569 | 0 | memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0, |
570 | 0 | sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i])); |
571 | 0 | } |
572 | 0 | return; |
573 | 0 | } else { |
574 | 0 | WORD32 i; |
575 | 0 | for (i = 0; i < NUM_SER_AP_LINKS; i++) { |
576 | 0 | memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0, |
577 | 0 | sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i])); |
578 | 0 | memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0, |
579 | 0 | sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i])); |
580 | 0 | memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0, |
581 | 0 | sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i])); |
582 | 0 | memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0, |
583 | 0 | sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i])); |
584 | 0 | } |
585 | |
|
586 | 0 | return; |
587 | 0 | } |
588 | 0 | } |
589 | | |
590 | 18.8k | if (ptr_ps_dec->use_34_st_bands) { |
591 | 0 | pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_34; |
592 | 0 | pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_34; |
593 | 0 | pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_34; |
594 | 0 | pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_34; |
595 | 18.8k | } else { |
596 | 18.8k | pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_20; |
597 | 18.8k | pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_20; |
598 | 18.8k | pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_20; |
599 | 18.8k | pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_20; |
600 | 18.8k | } |
601 | | |
602 | 621k | for (k = 0; k < 32; k++) { |
603 | 21.0M | for (bin = 0; bin < NUM_HI_RES_BINS; bin++) { |
604 | 20.4M | pow_arr[k][bin] = 0; |
605 | 20.4M | } |
606 | 602k | } |
607 | | |
608 | 207k | for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) { |
609 | 188k | bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr]; |
610 | 188k | maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1; |
611 | 376k | for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) { |
612 | 188k | for (k = ptr_ps_dec->border_position[0]; |
613 | 6.21M | k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) { |
614 | 6.02M | im_left = pp_hyb_left_re[k][sb]; |
615 | 6.02M | re_left = pp_hyb_left_im[k][sb]; |
616 | 6.02M | pow_arr[k][bin] += im_left * im_left + re_left * re_left; |
617 | 6.02M | } |
618 | 188k | } |
619 | 188k | } |
620 | 244k | for (; gr < ptr_ps_dec->num_groups; gr++) { |
621 | 225k | bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr]; |
622 | 225k | maxsb = ptr_ps_dec->ptr_group_borders[gr + 1]; |
623 | 1.37M | for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) { |
624 | 1.14M | for (k = ptr_ps_dec->border_position[0]; |
625 | 37.9M | k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) { |
626 | 36.7M | im_left = pp_qmf_buf_re_left[k][sb]; |
627 | 36.7M | re_left = pp_qmf_buf_im_left[k][sb]; |
628 | 36.7M | pow_arr[k][bin] += im_left * im_left + re_left * re_left; |
629 | 36.7M | } |
630 | 1.14M | } |
631 | 225k | } |
632 | | |
633 | 395k | for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) { |
634 | 376k | for (k = ptr_ps_dec->border_position[0]; |
635 | 12.4M | k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) { |
636 | 12.0M | FLOAT32 q = 1.5f; |
637 | | |
638 | 12.0M | ptr_ps_dec->peak_decay_fast_bin[bin] *= PEAK_DECAY_FACTOR_FAST; |
639 | 12.0M | if (ptr_ps_dec->peak_decay_fast_bin[bin] < pow_arr[k][bin]) |
640 | 376k | ptr_ps_dec->peak_decay_fast_bin[bin] = pow_arr[k][bin]; |
641 | | |
642 | 12.0M | peak_diff = ptr_ps_dec->prev_peak_diff_bin[bin]; |
643 | 12.0M | peak_diff += INIT_FILT_COEFF * (ptr_ps_dec->peak_decay_fast_bin[bin] - |
644 | 12.0M | pow_arr[k][bin] - |
645 | 12.0M | ptr_ps_dec->prev_peak_diff_bin[bin]); |
646 | 12.0M | ptr_ps_dec->prev_peak_diff_bin[bin] = peak_diff; |
647 | | |
648 | 12.0M | nrg = ptr_ps_dec->prev_nrg_bin[bin]; |
649 | 12.0M | nrg += INIT_FILT_COEFF * (pow_arr[k][bin] - ptr_ps_dec->prev_nrg_bin[bin]); |
650 | 12.0M | ptr_ps_dec->prev_nrg_bin[bin] = nrg; |
651 | 12.0M | if (q * peak_diff <= nrg) { |
652 | 10.9M | trans_ratio_arr[k][bin] = 1.0f; |
653 | 10.9M | } else { |
654 | 1.09M | trans_ratio_arr[k][bin] = nrg / (q * peak_diff); |
655 | 1.09M | } |
656 | 12.0M | } |
657 | 376k | } |
658 | | |
659 | 18.8k | if (ptr_ps_dec->use_34_st_bands) { |
660 | 0 | decay_cutoff = DECAY_CUTOFF_HI_RES; |
661 | 18.8k | } else { |
662 | 18.8k | decay_cutoff = DECAY_CUTOFF; |
663 | 18.8k | } |
664 | | |
665 | 207k | for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) { |
666 | 188k | maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1; |
667 | | |
668 | 376k | for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) { |
669 | 188k | FLOAT32 decay_scale_factor; |
670 | | |
671 | 188k | decay_scale_factor = 1.0f; |
672 | | |
673 | 188k | decay_scale_factor = max(decay_scale_factor, 0.0f); |
674 | | |
675 | 188k | l_delay = ptr_ps_dec->delay_buf_idx; |
676 | 753k | for (k = 0; k < NUM_SER_AP_LINKS; k++) |
677 | 564k | l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k]; |
678 | | |
679 | 188k | for (k = ptr_ps_dec->border_position[0]; |
680 | 6.21M | k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) { |
681 | 6.02M | FLOAT32 real, imag, real0, imag0, r_r0, i_r0; |
682 | | |
683 | 6.02M | im_left = pp_hyb_left_re[k][sb]; |
684 | 6.02M | re_left = pp_hyb_left_im[k][sb]; |
685 | | |
686 | 6.02M | { |
687 | 6.02M | real0 = pp_sub_qmf_delay_buf_re[l_delay][sb]; |
688 | 6.02M | imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb]; |
689 | 6.02M | pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left; |
690 | 6.02M | pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left; |
691 | | |
692 | 6.02M | real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 * |
693 | 6.02M | pp_frac_delay_phase_fac_im[sb]; |
694 | 6.02M | imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 * |
695 | 6.02M | pp_frac_delay_phase_fac_re[sb]; |
696 | | |
697 | 6.02M | r_r0 = real; |
698 | 6.02M | i_r0 = imag; |
699 | 24.0M | for (m = 0; m < NUM_SER_AP_LINKS; m++) { |
700 | 18.0M | real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb]; |
701 | 18.0M | imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb]; |
702 | 18.0M | real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] - |
703 | 18.0M | imag0 * pp_frac_delay_phase_fac_ser_im[sb][m]; |
704 | 18.0M | imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] + |
705 | 18.0M | imag0 * pp_frac_delay_phase_fac_ser_re[sb][m]; |
706 | | |
707 | 18.0M | real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0; |
708 | 18.0M | imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0; |
709 | 18.0M | ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] = |
710 | 18.0M | r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real; |
711 | 18.0M | ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] = |
712 | 18.0M | i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag; |
713 | 18.0M | r_r0 = real; |
714 | 18.0M | i_r0 = imag; |
715 | 18.0M | } |
716 | 6.02M | } |
717 | | |
718 | 6.02M | bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr]; |
719 | 6.02M | trans_ratio = trans_ratio_arr[k][bin]; |
720 | | |
721 | 6.02M | pp_hyb_right_re[k][sb] = trans_ratio * r_r0; |
722 | 6.02M | pp_hyb_right_im[k][sb] = trans_ratio * i_r0; |
723 | | |
724 | 6.02M | if (++l_delay >= DEL_ALL_PASS) l_delay = 0; |
725 | | |
726 | 24.0M | for (m = 0; m < NUM_SER_AP_LINKS; m++) { |
727 | 18.0M | if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) { |
728 | 4.71M | l_ser_delay_arr[m] = 0; |
729 | 4.71M | } |
730 | 18.0M | } |
731 | 6.02M | } |
732 | 188k | } |
733 | 188k | } |
734 | 18.8k | { |
735 | 18.8k | ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_qmf_delay_buf_re; |
736 | 18.8k | ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_qmf_delay_buf_im; |
737 | | |
738 | 18.8k | pp_sub_qmf_delay_buf_re = ptr_ps_dec->qmf_delay_buf_re; |
739 | 18.8k | pp_sub_qmf_delay_buf_im = ptr_ps_dec->qmf_delay_buf_im; |
740 | | |
741 | 18.8k | pp_frac_delay_phase_fac_re = ptr_ps_tables->qmf_fract_delay_phase_factor_re; |
742 | 18.8k | pp_frac_delay_phase_fac_im = ptr_ps_tables->qmf_fract_delay_phase_factor_im; |
743 | | |
744 | 18.8k | pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_re; |
745 | 18.8k | pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_im; |
746 | | |
747 | 18.8k | p_delay_qmf_delay_buf_idx = ptr_ps_dec->delay_qmf_delay_buf_idx; |
748 | 18.8k | p_delay_qmf_delay_num_samp = ptr_ps_dec->delay_qmf_delay_num_samp; |
749 | 18.8k | } |
750 | 244k | for (; gr < ptr_ps_dec->num_groups; gr++) { |
751 | 225k | maxsb = ptr_ps_dec->ptr_group_borders[gr + 1]; |
752 | | |
753 | 1.37M | for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) { |
754 | 1.14M | FLOAT32 decay_scale_factor; |
755 | 1.14M | if (sb <= decay_cutoff) |
756 | 18.8k | decay_scale_factor = 1.0f; |
757 | 1.12M | else |
758 | 1.12M | decay_scale_factor = 1.0f + decay_cutoff * DECAY_SLOPE - DECAY_SLOPE * sb; |
759 | | |
760 | 1.14M | decay_scale_factor = max(decay_scale_factor, 0.0f); |
761 | | |
762 | 1.14M | l_delay = ptr_ps_dec->delay_buf_idx; |
763 | 4.59M | for (k = 0; k < NUM_SER_AP_LINKS; k++) |
764 | 3.44M | l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k]; |
765 | | |
766 | 1.14M | for (k = ptr_ps_dec->border_position[0]; |
767 | 37.9M | k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) { |
768 | 36.7M | FLOAT32 real, imag, real0, imag0, r_r0, i_r0; |
769 | | |
770 | 36.7M | im_left = pp_qmf_buf_re_left[k][sb]; |
771 | 36.7M | re_left = pp_qmf_buf_im_left[k][sb]; |
772 | | |
773 | 36.7M | if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) { |
774 | 24.7M | real = pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb]; |
775 | 24.7M | imag = pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb]; |
776 | 24.7M | r_r0 = real; |
777 | 24.7M | i_r0 = imag; |
778 | 24.7M | pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb] = im_left; |
779 | 24.7M | pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb] = re_left; |
780 | 24.7M | } else { |
781 | 12.0M | real0 = pp_sub_qmf_delay_buf_re[l_delay][sb]; |
782 | 12.0M | imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb]; |
783 | 12.0M | pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left; |
784 | 12.0M | pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left; |
785 | | |
786 | 12.0M | real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 * |
787 | 12.0M | pp_frac_delay_phase_fac_im[sb]; |
788 | 12.0M | imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 * |
789 | 12.0M | pp_frac_delay_phase_fac_re[sb]; |
790 | | |
791 | 12.0M | r_r0 = real; |
792 | 12.0M | i_r0 = imag; |
793 | 48.1M | for (m = 0; m < NUM_SER_AP_LINKS; m++) { |
794 | 36.1M | real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb]; |
795 | 36.1M | imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb]; |
796 | 36.1M | real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] - |
797 | 36.1M | imag0 * pp_frac_delay_phase_fac_ser_im[sb][m]; |
798 | 36.1M | imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] + |
799 | 36.1M | imag0 * pp_frac_delay_phase_fac_ser_re[sb][m]; |
800 | | |
801 | 36.1M | real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0; |
802 | 36.1M | imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0; |
803 | 36.1M | ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] = |
804 | 36.1M | r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real; |
805 | 36.1M | ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] = |
806 | 36.1M | i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag; |
807 | 36.1M | r_r0 = real; |
808 | 36.1M | i_r0 = imag; |
809 | 36.1M | } |
810 | 12.0M | } |
811 | | |
812 | 36.7M | bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr]; |
813 | 36.7M | trans_ratio = trans_ratio_arr[k][bin]; |
814 | | |
815 | 36.7M | pp_qmf_buf_re_right[k][sb] = trans_ratio * r_r0; |
816 | 36.7M | pp_qmf_buf_im_right[k][sb] = trans_ratio * i_r0; |
817 | | |
818 | 36.7M | if (++l_delay >= DEL_ALL_PASS) l_delay = 0; |
819 | | |
820 | 36.7M | if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) { |
821 | 24.7M | if (++p_delay_qmf_delay_buf_idx[sb] >= p_delay_qmf_delay_num_samp[sb]) { |
822 | 17.9M | p_delay_qmf_delay_buf_idx[sb] = 0; |
823 | 17.9M | } |
824 | 24.7M | } |
825 | | |
826 | 147M | for (m = 0; m < NUM_SER_AP_LINKS; m++) { |
827 | 110M | if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) { |
828 | 28.7M | l_ser_delay_arr[m] = 0; |
829 | 28.7M | } |
830 | 110M | } |
831 | 36.7M | } |
832 | 1.14M | } |
833 | 225k | } |
834 | | |
835 | 18.8k | ptr_ps_dec->delay_buf_idx = l_delay; |
836 | 75.3k | for (m = 0; m < NUM_SER_AP_LINKS; m++) { |
837 | 56.4k | ptr_ps_dec->delay_buf_idx_ser[m] = l_ser_delay_arr[m]; |
838 | 56.4k | } |
839 | 18.8k | } |
840 | | |
841 | | VOID ixheaacd_esbr_ps_apply_rotation( |
842 | | ia_ps_dec_struct *ptr_ps_dec, |
843 | | FLOAT32 **pp_qmf_buf_re_left, |
844 | | FLOAT32 **pp_qmf_buf_im_left, |
845 | | FLOAT32 **pp_qmf_buf_re_right, |
846 | | FLOAT32 **pp_qmf_buf_im_right, |
847 | 18.8k | ia_ps_tables_struct *ptr_ps_tables) { |
848 | 18.8k | WORD32 i; |
849 | 18.8k | WORD32 group; |
850 | 18.8k | WORD32 bin = 0; |
851 | 18.8k | WORD32 subband, max_subband; |
852 | 18.8k | WORD32 env; |
853 | 18.8k | FLOAT32(*p_hyb_left_re)[MAX_NUM_COLUMNS]; |
854 | 18.8k | FLOAT32(*p_hyb_left_im)[MAX_NUM_COLUMNS]; |
855 | 18.8k | FLOAT32(*p_hyb_rigth_re)[MAX_NUM_COLUMNS]; |
856 | 18.8k | FLOAT32(*p_hyb_rigth_im)[MAX_NUM_COLUMNS]; |
857 | 18.8k | FLOAT32 scale_fac_l, scale_fac_r; |
858 | 18.8k | FLOAT32 alpha, beta; |
859 | 18.8k | FLOAT32 ipd, opd; |
860 | 18.8k | FLOAT32 ipd1, opd1; |
861 | 18.8k | FLOAT32 ipd2, opd2; |
862 | | |
863 | 18.8k | FLOAT32 h11r, h12r, h21r, h22r; |
864 | 18.8k | FLOAT32 h11i, h12i, h21i, h22i; |
865 | 18.8k | FLOAT32 H11r, H12r, H21r, H22r; |
866 | 18.8k | FLOAT32 H11i, H12i, H21i, H22i; |
867 | 18.8k | FLOAT32 deltaH11r, deltaH12r, deltaH21r, deltaH22r; |
868 | 18.8k | FLOAT32 deltaH11i, deltaH12i, deltaH21i, deltaH22i; |
869 | 18.8k | FLOAT32 l_left_re, l_left_im; |
870 | 18.8k | FLOAT32 l_right_re, l_right_im; |
871 | | |
872 | 18.8k | WORD32 L; |
873 | 18.8k | FLOAT32 *ptr_scale_factors; |
874 | 18.8k | const WORD32 *ptr_quantized_iids; |
875 | 18.8k | WORD32 num_iid_steps; |
876 | | |
877 | 18.8k | if (ptr_ps_dec->iid_quant) { |
878 | 887 | num_iid_steps = NUM_IID_STEPS_FINE; |
879 | 887 | ptr_scale_factors = ptr_ps_tables->scale_factors_fine_flt; |
880 | 887 | ptr_quantized_iids = ptr_ps_tables->quantized_iids_fine; |
881 | 17.9k | } else { |
882 | 17.9k | num_iid_steps = NUM_IID_STEPS; |
883 | 17.9k | ptr_scale_factors = ptr_ps_tables->scale_factors_flt; |
884 | 17.9k | ptr_quantized_iids = ptr_ps_tables->quantized_iids; |
885 | 17.9k | } |
886 | | |
887 | 18.8k | if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) { |
888 | 0 | if (ptr_ps_dec->use_34_st_bands) { |
889 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_re_prev); |
890 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_re_prev); |
891 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_re_prev); |
892 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_re_prev); |
893 | |
|
894 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_im_prev); |
895 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_im_prev); |
896 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_im_prev); |
897 | 0 | ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_im_prev); |
898 | |
|
899 | 0 | memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1)); |
900 | 0 | memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1)); |
901 | 0 | memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2)); |
902 | 0 | memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2)); |
903 | 0 | } else { |
904 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_re_prev); |
905 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_re_prev); |
906 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_re_prev); |
907 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_re_prev); |
908 | |
|
909 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_im_prev); |
910 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_im_prev); |
911 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_im_prev); |
912 | 0 | ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_im_prev); |
913 | |
|
914 | 0 | memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1)); |
915 | 0 | memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1)); |
916 | 0 | memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2)); |
917 | 0 | memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2)); |
918 | 0 | } |
919 | 0 | } |
920 | | |
921 | 38.3k | for (env = 0; env < ptr_ps_dec->num_env; env++) { |
922 | 410k | for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) { |
923 | 390k | if (!ptr_ps_dec->use_pca_rot_flg) { |
924 | 390k | scale_fac_r = ptr_scale_factors[num_iid_steps + |
925 | 390k | ptr_ps_dec->iid_par_table[env][bin]]; |
926 | 390k | scale_fac_l = ptr_scale_factors[num_iid_steps - |
927 | 390k | ptr_ps_dec->iid_par_table[env][bin]]; |
928 | | |
929 | 390k | alpha = ptr_ps_tables->alphas[ptr_ps_dec->icc_par_table[env][bin]]; |
930 | | |
931 | 390k | beta = alpha * (scale_fac_r - scale_fac_l) / PSC_SQRT2F; |
932 | | |
933 | 390k | h11r = (FLOAT32)(scale_fac_l * cos(beta + alpha)); |
934 | 390k | h12r = (FLOAT32)(scale_fac_r * cos(beta - alpha)); |
935 | 390k | h21r = (FLOAT32)(scale_fac_l * sin(beta + alpha)); |
936 | 390k | h22r = (FLOAT32)(scale_fac_r * sin(beta - alpha)); |
937 | 390k | } else { |
938 | 0 | FLOAT32 c, rho, mu, alpha, gamma; |
939 | 0 | WORD32 i; |
940 | |
|
941 | 0 | i = ptr_ps_dec->iid_par_table[env][bin]; |
942 | 0 | c = (FLOAT32)pow( |
943 | 0 | 10.0, |
944 | 0 | ((i) ? (((i > 0) ? 1 : -1) * ptr_quantized_iids[((i > 0) ? i : -i) - 1]) : 0.) / |
945 | 0 | 20.0); |
946 | 0 | rho = ptr_ps_tables->quantized_rhos[ptr_ps_dec->icc_par_table[env][bin]]; |
947 | 0 | rho = max(rho, 0.05f); |
948 | |
|
949 | 0 | if (rho == 0.0f && c == 1.) { |
950 | 0 | alpha = (FLOAT32)PI / 4.0f; |
951 | 0 | } else { |
952 | 0 | if (rho <= 0.05f) { |
953 | 0 | rho = 0.05f; |
954 | 0 | } |
955 | 0 | alpha = 0.5f * (FLOAT32)atan((2.0f * c * rho) / (c * c - 1.0f)); |
956 | |
|
957 | 0 | if (alpha < 0.) { |
958 | 0 | alpha += (FLOAT32)PI / 2.0f; |
959 | 0 | } |
960 | 0 | } |
961 | 0 | mu = c + 1.0f / c; |
962 | 0 | mu = 1 + (4.0f * rho * rho - 4.0f) / (mu * mu); |
963 | 0 | gamma = (FLOAT32)atan(sqrt((1.0f - sqrt(mu)) / (1.0f + sqrt(mu)))); |
964 | |
|
965 | 0 | h11r = (FLOAT32)(sqrt(2.) * cos(alpha) * cos(gamma)); |
966 | 0 | h12r = (FLOAT32)(sqrt(2.) * sin(alpha) * cos(gamma)); |
967 | 0 | h21r = (FLOAT32)(sqrt(2.) * -sin(alpha) * sin(gamma)); |
968 | 0 | h22r = (FLOAT32)(sqrt(2.) * cos(alpha) * sin(gamma)); |
969 | 0 | } |
970 | | |
971 | 390k | if (bin >= ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]) { |
972 | 223k | h11i = h12i = h21i = h22i = 0.0f; |
973 | 223k | } else { |
974 | 166k | ipd = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map[env][bin]; |
975 | 166k | opd = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map[env][bin]; |
976 | 166k | ipd1 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_1[bin]; |
977 | 166k | opd1 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_1[bin]; |
978 | 166k | ipd2 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_2[bin]; |
979 | 166k | opd2 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_2[bin]; |
980 | | |
981 | 166k | l_left_re = (FLOAT32)cos(ipd); |
982 | 166k | l_left_im = (FLOAT32)sin(ipd); |
983 | 166k | l_right_re = (FLOAT32)cos(opd); |
984 | 166k | l_right_im = (FLOAT32)sin(opd); |
985 | | |
986 | 166k | l_left_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(ipd1); |
987 | 166k | l_left_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(ipd1); |
988 | 166k | l_right_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(opd1); |
989 | 166k | l_right_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(opd1); |
990 | | |
991 | 166k | l_left_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(ipd2); |
992 | 166k | l_left_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(ipd2); |
993 | 166k | l_right_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(opd2); |
994 | 166k | l_right_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(opd2); |
995 | | |
996 | 166k | ipd = (FLOAT32)atan2(l_left_im, l_left_re); |
997 | 166k | opd = (FLOAT32)atan2(l_right_im, l_right_re); |
998 | | |
999 | 166k | l_left_re = (FLOAT32)cos(opd); |
1000 | 166k | l_left_im = (FLOAT32)sin(opd); |
1001 | 166k | opd -= ipd; |
1002 | 166k | l_right_re = (FLOAT32)cos(opd); |
1003 | 166k | l_right_im = (FLOAT32)sin(opd); |
1004 | | |
1005 | 166k | h11i = h11r * l_left_im; |
1006 | 166k | h12i = h12r * l_right_im; |
1007 | 166k | h21i = h21r * l_left_im; |
1008 | 166k | h22i = h22r * l_right_im; |
1009 | | |
1010 | 166k | h11r *= l_left_re; |
1011 | 166k | h12r *= l_right_re; |
1012 | 166k | h21r *= l_left_re; |
1013 | 166k | h22r *= l_right_re; |
1014 | 166k | } |
1015 | | |
1016 | 390k | ptr_ps_dec->h11_re_vec[bin] = h11r; |
1017 | 390k | ptr_ps_dec->h12_re_vec[bin] = h12r; |
1018 | 390k | ptr_ps_dec->h21_re_vec[bin] = h21r; |
1019 | 390k | ptr_ps_dec->h22_re_vec[bin] = h22r; |
1020 | 390k | ptr_ps_dec->h11_im_vec[bin] = h11i; |
1021 | 390k | ptr_ps_dec->h12_im_vec[bin] = h12i; |
1022 | 390k | ptr_ps_dec->h21_im_vec[bin] = h21i; |
1023 | 390k | ptr_ps_dec->h22_im_vec[bin] = h22i; |
1024 | | |
1025 | 390k | } |
1026 | | |
1027 | 19.5k | p_hyb_left_re = ptr_ps_dec->hyb_left_re; |
1028 | 19.5k | p_hyb_left_im = ptr_ps_dec->hyb_left_im; |
1029 | 19.5k | p_hyb_rigth_re = ptr_ps_dec->hyb_right_re; |
1030 | 19.5k | p_hyb_rigth_im = ptr_ps_dec->hyb_right_im; |
1031 | | |
1032 | 214k | for (group = 0; group < ptr_ps_dec->num_sub_qmf_groups; group++) { |
1033 | 195k | bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group]; |
1034 | | |
1035 | 195k | max_subband = ptr_ps_dec->ptr_group_borders[group] + 1; |
1036 | | |
1037 | 195k | L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env]; |
1038 | | |
1039 | 195k | H11r = ptr_ps_dec->h11_re_prev[bin]; |
1040 | 195k | H12r = ptr_ps_dec->h12_re_prev[bin]; |
1041 | 195k | H21r = ptr_ps_dec->h21_re_prev[bin]; |
1042 | 195k | H22r = ptr_ps_dec->h22_re_prev[bin]; |
1043 | 195k | if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) { |
1044 | 39.0k | H11i = -ptr_ps_dec->h11_im_prev[bin]; |
1045 | 39.0k | H12i = -ptr_ps_dec->h12_im_prev[bin]; |
1046 | 39.0k | H21i = -ptr_ps_dec->h21_im_prev[bin]; |
1047 | 39.0k | H22i = -ptr_ps_dec->h22_im_prev[bin]; |
1048 | 156k | } else { |
1049 | 156k | H11i = ptr_ps_dec->h11_im_prev[bin]; |
1050 | 156k | H12i = ptr_ps_dec->h12_im_prev[bin]; |
1051 | 156k | H21i = ptr_ps_dec->h21_im_prev[bin]; |
1052 | 156k | H22i = ptr_ps_dec->h22_im_prev[bin]; |
1053 | 156k | } |
1054 | | |
1055 | 195k | h11r = ptr_ps_dec->h11_re_vec[bin]; |
1056 | 195k | h12r = ptr_ps_dec->h12_re_vec[bin]; |
1057 | 195k | h21r = ptr_ps_dec->h21_re_vec[bin]; |
1058 | 195k | h22r = ptr_ps_dec->h22_re_vec[bin]; |
1059 | 195k | if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) { |
1060 | 39.0k | h11i = -ptr_ps_dec->h11_im_vec[bin]; |
1061 | 39.0k | h12i = -ptr_ps_dec->h12_im_vec[bin]; |
1062 | 39.0k | h21i = -ptr_ps_dec->h21_im_vec[bin]; |
1063 | 39.0k | h22i = -ptr_ps_dec->h22_im_vec[bin]; |
1064 | 156k | } else { |
1065 | 156k | h11i = ptr_ps_dec->h11_im_vec[bin]; |
1066 | 156k | h12i = ptr_ps_dec->h12_im_vec[bin]; |
1067 | 156k | h21i = ptr_ps_dec->h21_im_vec[bin]; |
1068 | 156k | h22i = ptr_ps_dec->h22_im_vec[bin]; |
1069 | 156k | } |
1070 | | |
1071 | 195k | deltaH11r = (h11r - H11r) / L; |
1072 | 195k | deltaH12r = (h12r - H12r) / L; |
1073 | 195k | deltaH21r = (h21r - H21r) / L; |
1074 | 195k | deltaH22r = (h22r - H22r) / L; |
1075 | | |
1076 | 195k | deltaH11i = (h11i - H11i) / L; |
1077 | 195k | deltaH12i = (h12i - H12i) / L; |
1078 | 195k | deltaH21i = (h21i - H21i) / L; |
1079 | 195k | deltaH22i = (h22i - H22i) / L; |
1080 | | |
1081 | 6.22M | for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1]; |
1082 | 6.02M | i++) { |
1083 | 6.02M | H11r += deltaH11r; |
1084 | 6.02M | H12r += deltaH12r; |
1085 | 6.02M | H21r += deltaH21r; |
1086 | 6.02M | H22r += deltaH22r; |
1087 | | |
1088 | 6.02M | H11i += deltaH11i; |
1089 | 6.02M | H12i += deltaH12i; |
1090 | 6.02M | H21i += deltaH21i; |
1091 | 6.02M | H22i += deltaH22i; |
1092 | | |
1093 | 12.0M | for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband; |
1094 | 6.02M | subband++) { |
1095 | 6.02M | l_left_re = H11r * p_hyb_left_re[i][subband] - H11i * p_hyb_left_im[i][subband] + |
1096 | 6.02M | H21r * p_hyb_rigth_re[i][subband] - H21i * p_hyb_rigth_im[i][subband]; |
1097 | | |
1098 | 6.02M | l_left_im = H11i * p_hyb_left_re[i][subband] + H11r * p_hyb_left_im[i][subband] + |
1099 | 6.02M | H21i * p_hyb_rigth_re[i][subband] + H21r * p_hyb_rigth_im[i][subband]; |
1100 | | |
1101 | 6.02M | l_right_re = H12r * p_hyb_left_re[i][subband] - H12i * p_hyb_left_im[i][subband] + |
1102 | 6.02M | H22r * p_hyb_rigth_re[i][subband] - H22i * p_hyb_rigth_im[i][subband]; |
1103 | | |
1104 | 6.02M | l_right_im = H12i * p_hyb_left_re[i][subband] + H12r * p_hyb_left_im[i][subband] + |
1105 | 6.02M | H22i * p_hyb_rigth_re[i][subband] + H22r * p_hyb_rigth_im[i][subband]; |
1106 | | |
1107 | 6.02M | p_hyb_left_re[i][subband] = l_left_re; |
1108 | 6.02M | p_hyb_left_im[i][subband] = l_left_im; |
1109 | 6.02M | p_hyb_rigth_re[i][subband] = l_right_re; |
1110 | 6.02M | p_hyb_rigth_im[i][subband] = l_right_im; |
1111 | 6.02M | } |
1112 | 6.02M | } |
1113 | 195k | } |
1114 | | |
1115 | 254k | for (; group < ptr_ps_dec->num_groups; group++) { |
1116 | 234k | bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group]; |
1117 | | |
1118 | 234k | max_subband = ptr_ps_dec->ptr_group_borders[group + 1]; |
1119 | | |
1120 | 234k | L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env]; |
1121 | | |
1122 | 234k | H11r = ptr_ps_dec->h11_re_prev[bin]; |
1123 | 234k | H12r = ptr_ps_dec->h12_re_prev[bin]; |
1124 | 234k | H21r = ptr_ps_dec->h21_re_prev[bin]; |
1125 | 234k | H22r = ptr_ps_dec->h22_re_prev[bin]; |
1126 | 234k | if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) { |
1127 | 0 | H11i = -ptr_ps_dec->h11_im_prev[bin]; |
1128 | 0 | H12i = -ptr_ps_dec->h12_im_prev[bin]; |
1129 | 0 | H21i = -ptr_ps_dec->h21_im_prev[bin]; |
1130 | 0 | H22i = -ptr_ps_dec->h22_im_prev[bin]; |
1131 | 234k | } else { |
1132 | 234k | H11i = ptr_ps_dec->h11_im_prev[bin]; |
1133 | 234k | H12i = ptr_ps_dec->h12_im_prev[bin]; |
1134 | 234k | H21i = ptr_ps_dec->h21_im_prev[bin]; |
1135 | 234k | H22i = ptr_ps_dec->h22_im_prev[bin]; |
1136 | 234k | } |
1137 | | |
1138 | 234k | h11r = ptr_ps_dec->h11_re_vec[bin]; |
1139 | 234k | h12r = ptr_ps_dec->h12_re_vec[bin]; |
1140 | 234k | h21r = ptr_ps_dec->h21_re_vec[bin]; |
1141 | 234k | h22r = ptr_ps_dec->h22_re_vec[bin]; |
1142 | 234k | if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) { |
1143 | 0 | h11i = -ptr_ps_dec->h11_im_vec[bin]; |
1144 | 0 | h12i = -ptr_ps_dec->h12_im_vec[bin]; |
1145 | 0 | h21i = -ptr_ps_dec->h21_im_vec[bin]; |
1146 | 0 | h22i = -ptr_ps_dec->h22_im_vec[bin]; |
1147 | 234k | } else { |
1148 | 234k | h11i = ptr_ps_dec->h11_im_vec[bin]; |
1149 | 234k | h12i = ptr_ps_dec->h12_im_vec[bin]; |
1150 | 234k | h21i = ptr_ps_dec->h21_im_vec[bin]; |
1151 | 234k | h22i = ptr_ps_dec->h22_im_vec[bin]; |
1152 | 234k | } |
1153 | | |
1154 | 234k | deltaH11r = (h11r - H11r) / L; |
1155 | 234k | deltaH12r = (h12r - H12r) / L; |
1156 | 234k | deltaH21r = (h21r - H21r) / L; |
1157 | 234k | deltaH22r = (h22r - H22r) / L; |
1158 | | |
1159 | 234k | deltaH11i = (h11i - H11i) / L; |
1160 | 234k | deltaH12i = (h12i - H12i) / L; |
1161 | 234k | deltaH21i = (h21i - H21i) / L; |
1162 | 234k | deltaH22i = (h22i - H22i) / L; |
1163 | | |
1164 | 7.46M | for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1]; |
1165 | 7.22M | i++) { |
1166 | 7.22M | H11r += deltaH11r; |
1167 | 7.22M | H12r += deltaH12r; |
1168 | 7.22M | H21r += deltaH21r; |
1169 | 7.22M | H22r += deltaH22r; |
1170 | | |
1171 | 7.22M | H11i += deltaH11i; |
1172 | 7.22M | H12i += deltaH12i; |
1173 | 7.22M | H21i += deltaH21i; |
1174 | 7.22M | H22i += deltaH22i; |
1175 | | |
1176 | 43.9M | for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband; |
1177 | 36.7M | subband++) { |
1178 | 36.7M | l_left_re = H11r * pp_qmf_buf_re_left[i][subband] - H11i * |
1179 | 36.7M | pp_qmf_buf_im_left[i][subband] + |
1180 | 36.7M | H21r * pp_qmf_buf_re_right[i][subband] - H21i * |
1181 | 36.7M | pp_qmf_buf_im_right[i][subband]; |
1182 | | |
1183 | 36.7M | l_left_im = H11i * pp_qmf_buf_re_left[i][subband] + H11r * |
1184 | 36.7M | pp_qmf_buf_im_left[i][subband] + |
1185 | 36.7M | H21i * pp_qmf_buf_re_right[i][subband] + H21r * |
1186 | 36.7M | pp_qmf_buf_im_right[i][subband]; |
1187 | | |
1188 | 36.7M | l_right_re = H12r * pp_qmf_buf_re_left[i][subband] - H12i * |
1189 | 36.7M | pp_qmf_buf_im_left[i][subband] + |
1190 | 36.7M | H22r * pp_qmf_buf_re_right[i][subband] - H22i * |
1191 | 36.7M | pp_qmf_buf_im_right[i][subband]; |
1192 | | |
1193 | 36.7M | l_right_im = H12i * pp_qmf_buf_re_left[i][subband] + H12r * |
1194 | 36.7M | pp_qmf_buf_im_left[i][subband] + |
1195 | 36.7M | H22i * pp_qmf_buf_re_right[i][subband] + H22r * |
1196 | 36.7M | pp_qmf_buf_im_right[i][subband]; |
1197 | | |
1198 | 36.7M | pp_qmf_buf_re_left[i][subband] = l_left_re; |
1199 | 36.7M | pp_qmf_buf_im_left[i][subband] = l_left_im; |
1200 | 36.7M | pp_qmf_buf_re_right[i][subband] = l_right_re; |
1201 | 36.7M | pp_qmf_buf_im_right[i][subband] = l_right_im; |
1202 | 36.7M | } |
1203 | 7.22M | } |
1204 | 234k | } |
1205 | 410k | for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) { |
1206 | 390k | ptr_ps_dec->h11_re_prev[bin] = ptr_ps_dec->h11_re_vec[bin]; |
1207 | 390k | ptr_ps_dec->h12_re_prev[bin] = ptr_ps_dec->h12_re_vec[bin]; |
1208 | 390k | ptr_ps_dec->h21_re_prev[bin] = ptr_ps_dec->h21_re_vec[bin]; |
1209 | 390k | ptr_ps_dec->h22_re_prev[bin] = ptr_ps_dec->h22_re_vec[bin]; |
1210 | | |
1211 | 390k | ptr_ps_dec->h11_im_prev[bin] = ptr_ps_dec->h11_im_vec[bin]; |
1212 | 390k | ptr_ps_dec->h12_im_prev[bin] = ptr_ps_dec->h12_im_vec[bin]; |
1213 | 390k | ptr_ps_dec->h21_im_prev[bin] = ptr_ps_dec->h21_im_vec[bin]; |
1214 | 390k | ptr_ps_dec->h22_im_prev[bin] = ptr_ps_dec->h22_im_vec[bin]; |
1215 | 390k | } |
1216 | | |
1217 | 186k | for (bin = 0; bin < ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]; bin++) { |
1218 | 166k | ptr_ps_dec->ipd_idx_map_2[bin] = ptr_ps_dec->ipd_idx_map_1[bin]; |
1219 | 166k | ptr_ps_dec->opd_idx_map_2[bin] = ptr_ps_dec->opd_idx_map_1[bin]; |
1220 | 166k | ptr_ps_dec->ipd_idx_map_1[bin] = ptr_ps_dec->ipd_idx_map[env][bin]; |
1221 | 166k | ptr_ps_dec->opd_idx_map_1[bin] = ptr_ps_dec->opd_idx_map[env][bin]; |
1222 | 166k | } |
1223 | 19.5k | } |
1224 | 18.8k | } |