/src/libxaac/decoder/ixheaacd_mps_smoothing.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * * |
3 | | * Copyright (C) 2018 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | #include "ixheaac_type_def.h" |
21 | | #include "ixheaacd_bitbuffer.h" |
22 | | #include "ixheaacd_common_rom.h" |
23 | | #include "ixheaacd_sbrdecsettings.h" |
24 | | #include "ixheaacd_sbr_scale.h" |
25 | | #include "ixheaacd_env_extr_part.h" |
26 | | #include "ixheaacd_sbr_rom.h" |
27 | | #include "ixheaacd_hybrid.h" |
28 | | #include "ixheaacd_ps_dec.h" |
29 | | #include "ixheaacd_config.h" |
30 | | #include "ixheaacd_qmf_dec.h" |
31 | | #include "ixheaacd_mps_polyphase.h" |
32 | | #include "ixheaacd_mps_struct_def.h" |
33 | | #include "ixheaacd_mps_res_rom.h" |
34 | | #include "ixheaacd_mps_aac_struct.h" |
35 | | #include "ixheaac_constants.h" |
36 | | #include "ixheaac_basic_ops32.h" |
37 | | #include "ixheaac_basic_ops40.h" |
38 | | #include "ixheaacd_mps_dec.h" |
39 | | #include "ixheaac_error_standards.h" |
40 | | #include "ixheaacd_error_codes.h" |
41 | | #include "ixheaacd_mps_macro_def.h" |
42 | | #include "ixheaacd_mps_smoothing.h" |
43 | | #include "ixheaacd_mps_tonality.h" |
44 | | #ifndef MULT |
45 | 4.60M | #define MULT(a, b) (a * b) |
46 | | #endif |
47 | 4.65k | #define ONE_BY_128_IN_Q30 (8388608) |
48 | 4.65k | #define ONE_IN_Q30 (1073741824) |
49 | 532k | #define PI_IN_Q27 (421657440) |
50 | 1.86k | #define FIFTY_X_PI_BY_180_Q27 (117127067) |
51 | 2.78k | #define TWENTY_FIVE_X_PI_BY_180_Q27 (58563533) |
52 | 1.84M | #define Q28_VALUE (1 << 28) |
53 | 249k | #define Q28_FLOAT_VAL ((FLOAT32)(1 << 28)) |
54 | 124k | #define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL) |
55 | | |
56 | | VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing( |
57 | 89.0k | ia_mps_dec_state_struct *self) { |
58 | 89.0k | WORD32 smooth_band; |
59 | 89.0k | FLOAT32 delta, one_minus_delta; |
60 | 89.0k | WORD32 ps = 0, pb, row, col; |
61 | 89.0k | WORD32 res_bands = 0; |
62 | 89.0k | WORD32 *p_smoothing_data; |
63 | | |
64 | 89.0k | if (self->residual_coding) res_bands = self->max_res_bands; |
65 | | |
66 | 89.0k | p_smoothing_data = &self->smoothing_data[ps][res_bands]; |
67 | | |
68 | 89.0k | delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps]; |
69 | 89.0k | one_minus_delta = 1.0f - delta; |
70 | | |
71 | 629k | for (pb = res_bands; pb < self->bs_param_bands; pb++) { |
72 | 540k | smooth_band = *p_smoothing_data++; |
73 | 540k | if (smooth_band) { |
74 | 186k | for (row = 0; row < MAX_M_OUTPUT; row++) { |
75 | 373k | for (col = 0; col < MAX_M_INPUT; col++) { |
76 | 248k | self->m1_param_re[ps][pb][row][col] = |
77 | 248k | (MULT(delta, self->m1_param_re[ps][pb][row][col]) + |
78 | 248k | MULT(one_minus_delta, self->m1_param_re_prev[pb][row][col])); |
79 | 248k | self->m1_param_im[ps][pb][row][col] = |
80 | 248k | (MULT(delta, self->m1_param_im[ps][pb][row][col]) + |
81 | 248k | MULT(one_minus_delta, self->m1_param_im_prev[pb][row][col])); |
82 | 248k | self->m2_decor_re[ps][pb][row][col] = |
83 | 248k | (MULT(delta, self->m2_decor_re[ps][pb][row][col]) + |
84 | 248k | MULT(one_minus_delta, self->m2_decor_re_prev[pb][row][col])); |
85 | 248k | self->m2_decor_im[ps][pb][row][col] = |
86 | 248k | (MULT(delta, self->m2_decor_im[ps][pb][row][col]) + |
87 | 248k | MULT(one_minus_delta, self->m2_decor_im_prev[pb][row][col])); |
88 | 248k | self->m2_resid_re[ps][pb][row][col] = |
89 | 248k | (MULT(delta, self->m2_resid_re[ps][pb][row][col]) + |
90 | 248k | MULT(one_minus_delta, self->m2_resid_re_prev[pb][row][col])); |
91 | 248k | self->m2_resid_im[ps][pb][row][col] = |
92 | 248k | (MULT(delta, self->m2_resid_im[ps][pb][row][col]) + |
93 | 248k | MULT(one_minus_delta, self->m2_resid_im_prev[pb][row][col])); |
94 | 248k | } |
95 | 124k | } |
96 | 62.1k | self->pre_mix_req++; |
97 | 62.1k | } |
98 | 540k | } |
99 | | |
100 | 117k | for (ps = 1; ps < self->num_parameter_sets; ps++) { |
101 | 28.5k | delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps]; |
102 | 28.5k | one_minus_delta = 1.0f - delta; |
103 | | |
104 | 28.5k | p_smoothing_data = &self->smoothing_data[ps][res_bands]; |
105 | | |
106 | 240k | for (pb = res_bands; pb < self->bs_param_bands; pb++) { |
107 | 212k | smooth_band = *p_smoothing_data++; |
108 | 212k | if (smooth_band) { |
109 | 101k | for (row = 0; row < MAX_M_OUTPUT; row++) { |
110 | 202k | for (col = 0; col < MAX_M_INPUT; col++) { |
111 | 135k | self->m1_param_re[ps][pb][row][col] = |
112 | 135k | (MULT(delta, self->m1_param_re[ps][pb][row][col]) + |
113 | 135k | MULT(one_minus_delta, |
114 | 135k | self->m1_param_re[ps - 1][pb][row][col])); |
115 | 135k | self->m1_param_im[ps][pb][row][col] = |
116 | 135k | (MULT(delta, self->m1_param_im[ps][pb][row][col]) + |
117 | 135k | MULT(one_minus_delta, |
118 | 135k | self->m1_param_im[ps - 1][pb][row][col])); |
119 | 135k | self->m2_resid_re[ps][pb][row][col] = |
120 | 135k | (MULT(delta, self->m2_resid_re[ps][pb][row][col]) + |
121 | 135k | MULT(one_minus_delta, |
122 | 135k | self->m2_resid_re[ps - 1][pb][row][col])); |
123 | 135k | self->m2_decor_re[ps][pb][row][col] = |
124 | 135k | (MULT(delta, self->m2_decor_re[ps][pb][row][col]) + |
125 | 135k | MULT(one_minus_delta, |
126 | 135k | self->m2_decor_re[ps - 1][pb][row][col])); |
127 | 135k | self->m2_decor_im[ps][pb][row][col] = |
128 | 135k | (MULT(delta, self->m2_decor_im[ps][pb][row][col]) + |
129 | 135k | MULT(one_minus_delta, |
130 | 135k | self->m2_decor_im[ps - 1][pb][row][col])); |
131 | 135k | self->m2_resid_im[ps][pb][row][col] = |
132 | 135k | (MULT(delta, self->m2_resid_im[ps][pb][row][col]) + |
133 | 135k | MULT(one_minus_delta, |
134 | 135k | self->m2_resid_im[ps - 1][pb][row][col])); |
135 | 135k | } |
136 | 67.6k | } |
137 | 33.8k | self->pre_mix_req++; |
138 | 33.8k | } |
139 | 212k | } |
140 | 28.5k | } |
141 | 89.0k | } |
142 | | |
143 | 89.0k | VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self) { |
144 | 89.0k | WORD32 ps, pb; |
145 | 89.0k | WORD32 delta, one_minus_delta; |
146 | | |
147 | 89.0k | if (self->opd_smoothing_mode == 0) { |
148 | 1.01M | for (pb = 0; pb < self->bs_param_bands; pb++) { |
149 | 924k | self->opd_smooth.smooth_l_phase[pb] = |
150 | 924k | ((WORD32)(self->phase_l[self->num_parameter_sets - 1][pb] * |
151 | 924k | Q28_VALUE)) >> |
152 | 924k | 1; |
153 | 924k | self->opd_smooth.smooth_r_phase[pb] = |
154 | 924k | ((WORD32)(self->phase_r[self->num_parameter_sets - 1][pb] * |
155 | 924k | Q28_VALUE)) >> |
156 | 924k | 1; |
157 | 924k | } |
158 | 86.5k | return; |
159 | 86.5k | } |
160 | 7.11k | for (ps = 0; ps < self->num_parameter_sets; ps++) { |
161 | 4.65k | WORD32 thr = self->bs_frame.ipd_data.bs_quant_coarse_xxx[ps] |
162 | 4.65k | ? FIFTY_X_PI_BY_180_Q27 |
163 | 4.65k | : TWENTY_FIVE_X_PI_BY_180_Q27; |
164 | | |
165 | 4.65k | delta = self->param_slot_diff[ps] * ONE_BY_128_IN_Q30; |
166 | 4.65k | one_minus_delta = ONE_IN_Q30 - delta; |
167 | | |
168 | 66.9k | for (pb = 0; pb < self->bs_param_bands; pb++) { |
169 | 62.3k | WORD32 ltemp, rtemp, tmp; |
170 | 62.3k | ltemp = ((WORD32)(self->phase_l[ps][pb] * Q28_FLOAT_VAL)) >> 1; |
171 | 62.3k | rtemp = ((WORD32)(self->phase_r[ps][pb] * Q28_FLOAT_VAL)) >> 1; |
172 | | |
173 | 66.5k | while (ltemp > self->opd_smooth.smooth_l_phase[pb] + PI_IN_Q27) |
174 | 4.20k | ltemp -= 2 * PI_IN_Q27; |
175 | 65.6k | while (ltemp < self->opd_smooth.smooth_l_phase[pb] - PI_IN_Q27) |
176 | 3.33k | ltemp += 2 * PI_IN_Q27; |
177 | 64.5k | while (rtemp > self->opd_smooth.smooth_r_phase[pb] + PI_IN_Q27) |
178 | 2.16k | rtemp -= 2 * PI_IN_Q27; |
179 | 64.3k | while (rtemp < self->opd_smooth.smooth_r_phase[pb] - PI_IN_Q27) |
180 | 2.04k | rtemp += 2 * PI_IN_Q27; |
181 | | |
182 | 62.3k | self->opd_smooth.smooth_l_phase[pb] = |
183 | 62.3k | (ixheaac_mult32_shl(delta, ltemp) + |
184 | 62.3k | ixheaac_mult32_shl(one_minus_delta, |
185 | 62.3k | self->opd_smooth.smooth_l_phase[pb])) |
186 | 62.3k | << 1; |
187 | 62.3k | self->opd_smooth.smooth_r_phase[pb] = |
188 | 62.3k | (ixheaac_mult32_shl(delta, rtemp) + |
189 | 62.3k | ixheaac_mult32_shl(one_minus_delta, |
190 | 62.3k | self->opd_smooth.smooth_r_phase[pb])) |
191 | 62.3k | << 1; |
192 | | |
193 | 62.3k | tmp = (ltemp - rtemp) - (self->opd_smooth.smooth_l_phase[pb] - |
194 | 62.3k | self->opd_smooth.smooth_r_phase[pb]); |
195 | 62.4k | while (tmp > PI_IN_Q27) tmp -= 2 * PI_IN_Q27; |
196 | 62.5k | while (tmp < -PI_IN_Q27) tmp += 2 * PI_IN_Q27; |
197 | | |
198 | 62.3k | if (ixheaac_abs32(tmp) > thr) { |
199 | 6.90k | self->opd_smooth.smooth_l_phase[pb] = ltemp; |
200 | 6.90k | self->opd_smooth.smooth_r_phase[pb] = rtemp; |
201 | 6.90k | } |
202 | | |
203 | 63.0k | while (self->opd_smooth.smooth_l_phase[pb] > 2 * PI_IN_Q27) |
204 | 709 | self->opd_smooth.smooth_l_phase[pb] -= 2 * PI_IN_Q27; |
205 | 66.4k | while (self->opd_smooth.smooth_l_phase[pb] < 0) |
206 | 4.11k | self->opd_smooth.smooth_l_phase[pb] += 2 * PI_IN_Q27; |
207 | 63.3k | while (self->opd_smooth.smooth_r_phase[pb] > 2 * PI_IN_Q27) |
208 | 1.02k | self->opd_smooth.smooth_r_phase[pb] -= 2 * PI_IN_Q27; |
209 | 64.2k | while (self->opd_smooth.smooth_r_phase[pb] < 0) |
210 | 1.90k | self->opd_smooth.smooth_r_phase[pb] += 2 * PI_IN_Q27; |
211 | | |
212 | 62.3k | self->phase_l[ps][pb] = |
213 | 62.3k | (self->opd_smooth.smooth_l_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL; |
214 | 62.3k | self->phase_r[ps][pb] = |
215 | 62.3k | (self->opd_smooth.smooth_r_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL; |
216 | 62.3k | } |
217 | 4.65k | } |
218 | 2.46k | } |
219 | | |
220 | | static VOID ixheaacd_calc_filter_coeff( |
221 | 30.1k | ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 *delta) { |
222 | 30.1k | WORD32 d_slots; |
223 | 30.1k | WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot; |
224 | 30.1k | WORD32 *smg_time = pstr_mps_state->aux_struct->smg_time; |
225 | | |
226 | 30.1k | if (ps == 0) |
227 | 15.4k | d_slots = param_slot[ps] + 1; |
228 | 14.7k | else |
229 | 14.7k | d_slots = param_slot[ps] - param_slot[ps - 1]; |
230 | | |
231 | 30.1k | if (pstr_mps_state->smooth_control) { |
232 | 30.1k | switch (smg_time[ps]) { |
233 | 1.50k | case SMG_TIME_64: |
234 | 1.50k | *delta = d_slots << 9; |
235 | 1.50k | break; |
236 | 855 | case SMG_TIME_128: |
237 | 855 | *delta = d_slots << 8; |
238 | 855 | break; |
239 | 22.6k | case SMG_TIME_256: |
240 | 22.6k | *delta = d_slots << 7; |
241 | 22.6k | break; |
242 | 2.59k | case SMG_TIME_512: |
243 | 2.59k | *delta = d_slots << 6; |
244 | 2.59k | break; |
245 | 2.59k | default: |
246 | 2.59k | break; |
247 | 30.1k | } |
248 | 30.1k | } else { |
249 | 0 | *delta = d_slots << 7; |
250 | 0 | } |
251 | | |
252 | 30.1k | return; |
253 | 30.1k | } |
254 | | |
255 | 15.4k | VOID ixheaacd_smooth_m1m2(ia_heaac_mps_state_struct *pstr_mps_state) { |
256 | 15.4k | ia_heaac_mps_state_struct *curr_state = pstr_mps_state; |
257 | 15.4k | ia_mps_persistent_mem *persistent_mem = &curr_state->mps_persistent_mem; |
258 | 15.4k | ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct; |
259 | 15.4k | ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param; |
260 | 15.4k | ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param; |
261 | 15.4k | WORD32 *m1_param_real_prev = persistent_mem->m1_param_real_prev; |
262 | 15.4k | WORD32 *m2_decor_real_prev = persistent_mem->m2_decor_real_prev; |
263 | 15.4k | WORD32 *m2_resid_real_prev = persistent_mem->m2_resid_real_prev; |
264 | | |
265 | 15.4k | WORD32 num_parameter_bands = curr_state->num_parameter_bands; |
266 | 15.4k | WORD32 num_direct_signals = curr_state->num_direct_signals; |
267 | 15.4k | WORD32 num_decor_signals = curr_state->num_decor_signals; |
268 | 15.4k | WORD32 m1_param_imag_present = curr_state->m1_param_imag_present; |
269 | 15.4k | WORD32 m2_param_imag_present = curr_state->m2_param_imag_present; |
270 | 15.4k | WORD32 col_counter = num_direct_signals + num_decor_signals; |
271 | 15.4k | WORD32 num_parameter_sets = curr_state->num_parameter_sets; |
272 | 15.4k | WORD32 num_output_channels = curr_state->num_output_channels; |
273 | 15.4k | WORD32 num_v_channels = curr_state->num_v_channels; |
274 | 15.4k | WORD32 num_x_channels = curr_state->num_x_channels; |
275 | 15.4k | WORD32 smooth_control = curr_state->smooth_control; |
276 | 15.4k | WORD32 smooth_config = curr_state->smooth_config; |
277 | 15.4k | WORD32 resid_col_counter; |
278 | 15.4k | WORD32 smooth_band_arr[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]; |
279 | | |
280 | 15.4k | WORD32 *delta, *one_minus_delta, *delta_ptr, *one_minus_delta_ptr; |
281 | 15.4k | WORD32 *param_r, *param_i, *param_prev_r, *param_prev_i; |
282 | | |
283 | 15.4k | WORD32 *ton; |
284 | 15.4k | WORD32 i, ps, pb, row, col; |
285 | 15.4k | WORD32 res_bands = 0; |
286 | 15.4k | WORD32 idx = 0; |
287 | | |
288 | 15.4k | WORD32 *m2_decor_imag_prev = persistent_mem->m2_decor_imag_prev; |
289 | 15.4k | WORD32 *m2_resid_imag_prev = persistent_mem->m2_resid_imag_prev; |
290 | 15.4k | WORD32 *m1_param_imag_prev = persistent_mem->m1_param_imag_prev; |
291 | | |
292 | 15.4k | ton = pstr_mps_state->mps_scratch_mem_v; |
293 | 15.4k | delta = delta_ptr = |
294 | 15.4k | ton + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_BANDS, sizeof(*delta), BYTE_ALIGN_8); |
295 | 15.4k | one_minus_delta = one_minus_delta_ptr = |
296 | 15.4k | delta + |
297 | 15.4k | IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_SETS, sizeof(*one_minus_delta), BYTE_ALIGN_8); |
298 | | |
299 | 15.4k | param_r = curr_state->res_bands; |
300 | 15.4k | if (curr_state->residual_coding) { |
301 | 2.51k | for (i = 0; i < MAX_RESIDUAL_CHANNELS_MPS; i++) { |
302 | 2.29k | if (param_r[i] > res_bands) { |
303 | 240 | res_bands = param_r[i]; |
304 | 240 | } |
305 | 2.29k | } |
306 | 229 | } |
307 | | |
308 | 15.4k | if (curr_state->arbitrary_downmix == 2) { |
309 | 96 | if (res_bands < curr_state->arbdmx_residual_bands) { |
310 | 68 | res_bands = curr_state->arbdmx_residual_bands; |
311 | 68 | } |
312 | 96 | } |
313 | | |
314 | 15.4k | if (smooth_config) { |
315 | 0 | ixheaacd_measure_tonality(pstr_mps_state, ton); |
316 | 0 | } |
317 | | |
318 | 45.6k | for (ps = 0; ps < num_parameter_sets; ps++) { |
319 | 30.1k | ixheaacd_calc_filter_coeff(pstr_mps_state, ps, delta); |
320 | 30.1k | *one_minus_delta++ = (1 << 15) - *delta++; |
321 | 30.1k | } |
322 | | |
323 | 15.4k | if (smooth_control) { |
324 | 45.6k | for (ps = 0; ps < num_parameter_sets; ps++) { |
325 | 30.1k | if (ps < 8) { |
326 | 565k | for (pb = 0; pb < num_parameter_bands; pb++) { |
327 | 535k | smooth_band_arr[ps][pb] = pstr_mps_state->aux_struct->smg_data[ps][pb]; |
328 | 535k | } |
329 | 30.1k | } |
330 | 30.1k | } |
331 | 15.4k | } else if (smooth_config) { |
332 | 0 | for (ps = 0; ps < num_parameter_sets; ps++) { |
333 | 0 | for (pb = 0; pb < num_parameter_bands; pb++) { |
334 | 0 | smooth_band_arr[ps][pb] = (ton[pb] > POINT_EIGHT_Q15); |
335 | 0 | } |
336 | 0 | } |
337 | 0 | } |
338 | | |
339 | 15.4k | if (!(smooth_control == 0 && smooth_config == 0)) { |
340 | 15.4k | if (m1_param_imag_present) { |
341 | 12.7k | WORD32 *ptr_r1 = &m1_param->m1_param_real[0][0][0][0]; |
342 | 12.7k | WORD32 *ptr_i1 = &m1_param->m1_param_imag[0][0][0][0]; |
343 | 113k | for (row = 0; row < num_v_channels; row++) { |
344 | 100k | WORD32 *ptr_r2 = ptr_r1; |
345 | 100k | WORD32 *ptr_i2 = ptr_i1; |
346 | 686k | for (col = 0; col < num_x_channels; col++) { |
347 | 585k | param_r = ptr_r2; |
348 | 585k | param_i = ptr_i2; |
349 | 585k | m1_param_real_prev += res_bands; |
350 | 585k | m1_param_imag_prev += res_bands; |
351 | | |
352 | 12.1M | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
353 | 11.5M | if (smooth_band_arr[0][pb]) { |
354 | 3.56M | WORD64 acc; |
355 | | |
356 | 3.56M | acc = (WORD64)((WORD64)param_r[pb] * (WORD64)(*delta_ptr) + |
357 | 3.56M | (WORD64)(*m1_param_real_prev) * |
358 | 3.56M | (WORD64)(*one_minus_delta_ptr)); |
359 | | |
360 | 3.56M | acc >>= 15; |
361 | | |
362 | 3.56M | param_r[pb] = (WORD32)acc; |
363 | | |
364 | 3.56M | acc = (WORD64)((WORD64)param_i[pb] * (WORD64)(*delta_ptr) + |
365 | 3.56M | (WORD64)(*m1_param_imag_prev) * |
366 | 3.56M | (WORD64)(*one_minus_delta_ptr)); |
367 | | |
368 | 3.56M | acc >>= 15; |
369 | | |
370 | 3.56M | param_i[pb] = (WORD32)acc; |
371 | 3.56M | } |
372 | 11.5M | m1_param_real_prev++; |
373 | 11.5M | m1_param_imag_prev++; |
374 | 11.5M | } |
375 | 585k | param_r += MAX_PARAMETER_BANDS; |
376 | 585k | param_i += MAX_PARAMETER_BANDS; |
377 | | |
378 | 958k | for (ps = 1; ps < num_parameter_sets; ps++) { |
379 | 372k | WORD32 del = delta_ptr[ps]; |
380 | 372k | WORD32 one_minus_del = one_minus_delta_ptr[ps]; |
381 | | |
382 | 372k | param_prev_r = param_r - MAX_PARAMETER_BANDS; |
383 | 372k | param_prev_i = param_i - MAX_PARAMETER_BANDS; |
384 | | |
385 | 7.62M | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
386 | 7.24M | if (smooth_band_arr[ps][pb]) { |
387 | 2.00M | WORD64 acc; |
388 | | |
389 | 2.00M | acc = (WORD64)((WORD64)param_r[pb] * (WORD64)(del) + |
390 | 2.00M | (WORD64)param_prev_r[pb] * |
391 | 2.00M | (WORD64)(one_minus_del)); |
392 | | |
393 | 2.00M | acc >>= 15; |
394 | | |
395 | 2.00M | param_r[pb] = (WORD32)acc; |
396 | | |
397 | 2.00M | acc = (WORD64)((WORD64)param_i[pb] * (WORD64)(del) + |
398 | 2.00M | (WORD64)param_prev_i[pb] * |
399 | 2.00M | (WORD64)(one_minus_del)); |
400 | | |
401 | 2.00M | acc >>= 15; |
402 | | |
403 | 2.00M | param_i[pb] = (WORD32)acc; |
404 | 2.00M | } |
405 | 7.24M | } |
406 | 372k | param_r += MAX_PARAMETER_BANDS; |
407 | 372k | param_i += MAX_PARAMETER_BANDS; |
408 | 372k | } |
409 | 585k | ptr_r2 += PBXPS; |
410 | 585k | ptr_i2 += PBXPS; |
411 | 585k | } |
412 | 100k | ptr_r1 += INCHXPBXPS; |
413 | 100k | ptr_i1 += INCHXPBXPS; |
414 | 100k | } |
415 | 12.7k | } else { |
416 | 2.71k | WORD32 *ptr1 = (WORD32 *)m1_param; |
417 | | |
418 | 19.3k | for (row = 0; row < num_v_channels; row++) { |
419 | 16.5k | WORD32 *ptr2 = ptr1; |
420 | | |
421 | 64.3k | for (col = 0; col < num_x_channels; col++) { |
422 | 47.7k | WORD32 *param_r = ptr2; |
423 | | |
424 | 47.7k | WORD32 del = delta_ptr[0]; |
425 | 47.7k | WORD32 one_minus_del = one_minus_delta_ptr[0]; |
426 | | |
427 | 47.7k | m1_param_real_prev += res_bands; |
428 | | |
429 | 779k | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
430 | 731k | if (smooth_band_arr[0][pb]) { |
431 | 203k | WORD64 acc; |
432 | | |
433 | 203k | acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del)) + |
434 | 203k | (WORD64)((WORD64)(*m1_param_real_prev) * |
435 | 203k | (WORD64)(one_minus_del)); |
436 | | |
437 | 203k | param_r[pb] = (WORD32)(acc >> 15); |
438 | 203k | } |
439 | 731k | m1_param_real_prev++; |
440 | 731k | } |
441 | 47.7k | param_r += MAX_PARAMETER_BANDS; |
442 | | |
443 | 114k | for (ps = 1; ps < num_parameter_sets; ps++) { |
444 | 66.5k | WORD32 del = delta_ptr[ps]; |
445 | 66.5k | WORD32 one_minus_del = one_minus_delta_ptr[ps]; |
446 | | |
447 | 66.5k | param_prev_r = param_r - MAX_PARAMETER_BANDS; |
448 | | |
449 | 924k | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
450 | 857k | if (smooth_band_arr[ps][pb]) { |
451 | 272k | WORD64 acc; |
452 | | |
453 | 272k | acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del) + |
454 | 272k | (WORD64)((WORD64)(param_prev_r[pb]) * |
455 | 272k | (WORD64)one_minus_del); |
456 | | |
457 | 272k | param_r[pb] = (WORD32)(acc >> 15); |
458 | 272k | } |
459 | 857k | } |
460 | 66.5k | param_r += MAX_PARAMETER_BANDS; |
461 | 66.5k | } |
462 | 47.7k | ptr2 += PBXPS; |
463 | 47.7k | } |
464 | 16.5k | ptr1 += INCHXPBXPS; |
465 | 16.5k | } |
466 | 2.71k | } |
467 | | |
468 | 15.4k | if (curr_state->residual_coding) |
469 | 229 | resid_col_counter = col_counter; |
470 | 15.2k | else |
471 | 15.2k | resid_col_counter = num_direct_signals; |
472 | | |
473 | 15.4k | idx = 0; |
474 | 15.4k | if (m2_param_imag_present) { |
475 | 0 | WORD32 *ptr_r1 = &m2_param->m2_resid_real[0][0][0]; |
476 | 0 | WORD32 *ptr_i1 = &m2_param->m2_resid_imag[0][0][0]; |
477 | 0 | for (row = 0; row < num_output_channels; row++) { |
478 | 0 | for (col = 0; col < resid_col_counter; col++) { |
479 | 0 | if (curr_state->m2_param_present[row][col] & 2) { |
480 | 0 | WORD32 del = *delta_ptr; |
481 | 0 | WORD32 one_minus_del = *one_minus_delta_ptr; |
482 | |
|
483 | 0 | param_r = ptr_r1; |
484 | 0 | param_i = ptr_i1; |
485 | |
|
486 | 0 | m2_resid_real_prev += res_bands; |
487 | 0 | m2_resid_imag_prev += res_bands; |
488 | |
|
489 | 0 | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
490 | 0 | if (smooth_band_arr[0][pb]) { |
491 | 0 | WORD64 acc; |
492 | 0 | acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del) + |
493 | 0 | (WORD64)(*m2_resid_real_prev) * |
494 | 0 | (WORD64)(one_minus_del)); |
495 | |
|
496 | 0 | acc >>= 15; |
497 | 0 | param_r[pb] = (WORD32)acc; |
498 | |
|
499 | 0 | acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)(del) + |
500 | 0 | (WORD64)(*m2_resid_imag_prev) * |
501 | 0 | (WORD64)(one_minus_del)); |
502 | |
|
503 | 0 | acc >>= 15; |
504 | 0 | param_i[pb] = (WORD32)acc; |
505 | 0 | } |
506 | |
|
507 | 0 | m2_resid_real_prev++; |
508 | 0 | m2_resid_imag_prev++; |
509 | 0 | } |
510 | |
|
511 | 0 | param_r += MAX_PARAMETER_BANDS; |
512 | 0 | param_i += MAX_PARAMETER_BANDS; |
513 | |
|
514 | 0 | for (ps = 1; ps < num_parameter_sets; ps++) { |
515 | 0 | WORD32 del = delta_ptr[ps]; |
516 | 0 | WORD32 one_minus_del = one_minus_delta_ptr[ps]; |
517 | |
|
518 | 0 | param_prev_r = param_r - MAX_PARAMETER_BANDS; |
519 | 0 | param_prev_i = param_i - MAX_PARAMETER_BANDS; |
520 | 0 | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
521 | 0 | if (smooth_band_arr[ps][pb]) { |
522 | 0 | WORD64 acc; |
523 | 0 | acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del) + |
524 | 0 | (WORD64)(param_prev_r[pb]) * |
525 | 0 | (WORD64)(one_minus_del)); |
526 | |
|
527 | 0 | acc >>= 15; |
528 | 0 | param_r[pb] = (WORD32)acc; |
529 | |
|
530 | 0 | acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)(del) + |
531 | 0 | (WORD64)(param_prev_i[pb]) * |
532 | 0 | (WORD64)(one_minus_del)); |
533 | |
|
534 | 0 | acc >>= 15; |
535 | 0 | param_i[pb] = (WORD32)acc; |
536 | 0 | } |
537 | 0 | } |
538 | 0 | param_r += MAX_PARAMETER_BANDS; |
539 | 0 | param_i += MAX_PARAMETER_BANDS; |
540 | 0 | } |
541 | 0 | idx++; |
542 | 0 | ptr_r1 += PBXPS; |
543 | 0 | ptr_i1 += PBXPS; |
544 | 0 | } |
545 | 0 | } |
546 | 0 | } |
547 | |
|
548 | 0 | idx = 0; |
549 | |
|
550 | 0 | ptr_r1 = &m2_param->m2_resid_real[0][0][0]; |
551 | 0 | ptr_i1 = &m2_param->m2_resid_imag[0][0][0]; |
552 | 0 | for (row = 0; row < num_output_channels; row++) { |
553 | 0 | for (col = num_direct_signals; col < col_counter; col++) { |
554 | 0 | if (curr_state->m2_param_present[row][col] & 1) { |
555 | 0 | WORD32 del = *delta_ptr; |
556 | 0 | WORD32 one_minus_del = *one_minus_delta_ptr; |
557 | 0 | m2_decor_real_prev += res_bands; |
558 | 0 | m2_decor_imag_prev += res_bands; |
559 | |
|
560 | 0 | param_r = ptr_r1; |
561 | 0 | param_i = ptr_i1; |
562 | |
|
563 | 0 | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
564 | 0 | if (smooth_band_arr[0][pb]) { |
565 | 0 | WORD64 acc; |
566 | 0 | acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del + |
567 | 0 | (WORD64)(*m2_decor_real_prev) * |
568 | 0 | (WORD64)one_minus_del); |
569 | 0 | acc >>= 15; |
570 | 0 | param_r[pb] = (WORD32)acc; |
571 | |
|
572 | 0 | acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)del + |
573 | 0 | (WORD64)(*m2_decor_imag_prev) * |
574 | 0 | (WORD64)one_minus_del); |
575 | 0 | acc >>= 15; |
576 | 0 | param_i[pb] = (WORD32)acc; |
577 | 0 | } |
578 | 0 | m2_decor_real_prev++; |
579 | 0 | m2_decor_imag_prev++; |
580 | 0 | } |
581 | |
|
582 | 0 | param_r += MAX_PARAMETER_BANDS; |
583 | 0 | param_i += MAX_PARAMETER_BANDS; |
584 | |
|
585 | 0 | for (ps = 1; ps < num_parameter_sets; ps++) { |
586 | 0 | WORD32 del = delta_ptr[ps]; |
587 | 0 | WORD32 one_minus_del = one_minus_delta_ptr[ps]; |
588 | 0 | param_prev_r = param_r - MAX_PARAMETER_BANDS; |
589 | 0 | param_prev_i = param_i - MAX_PARAMETER_BANDS; |
590 | 0 | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
591 | 0 | if (smooth_band_arr[ps][pb]) { |
592 | 0 | WORD64 acc; |
593 | |
|
594 | 0 | acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del + |
595 | 0 | (WORD64)(param_prev_r[pb]) * |
596 | 0 | (WORD64)one_minus_del); |
597 | 0 | acc >>= 15; |
598 | 0 | param_r[pb] = (WORD32)acc; |
599 | |
|
600 | 0 | acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)del + |
601 | 0 | (WORD64)(param_prev_i[pb]) * |
602 | 0 | (WORD64)one_minus_del); |
603 | 0 | acc >>= 15; |
604 | 0 | param_i[pb] = (WORD32)acc; |
605 | 0 | } |
606 | 0 | } |
607 | 0 | param_r += MAX_PARAMETER_BANDS; |
608 | 0 | param_i += MAX_PARAMETER_BANDS; |
609 | 0 | } |
610 | |
|
611 | 0 | idx++; |
612 | 0 | ptr_r1 += PBXPS; |
613 | 0 | ptr_i1 += PBXPS; |
614 | 0 | } |
615 | 0 | } |
616 | 0 | } |
617 | 15.4k | } else { |
618 | 15.4k | WORD32 *ptr1 = &m2_param->m2_resid_real[0][0][0]; |
619 | | |
620 | 134k | for (row = 0; row < num_output_channels; row++) { |
621 | 771k | for (col = 0; col < resid_col_counter; col++) { |
622 | 651k | if (curr_state->m2_param_present[row][col] & 2) { |
623 | 121k | WORD32 *ptr2 = ptr1; |
624 | 121k | WORD32 del = *delta_ptr; |
625 | 121k | WORD32 one_minus_del = *one_minus_delta_ptr; |
626 | 121k | m2_resid_real_prev += res_bands; |
627 | | |
628 | 2.34M | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
629 | 2.22M | if (smooth_band_arr[0][pb]) { |
630 | 669k | WORD64 acc; |
631 | | |
632 | 669k | acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)(del) + |
633 | 669k | (WORD64)(*m2_resid_real_prev) * |
634 | 669k | (WORD64)(one_minus_del)); |
635 | | |
636 | 669k | acc >>= 15; |
637 | 669k | ptr2[pb] = (WORD32)acc; |
638 | 669k | } |
639 | | |
640 | 2.22M | m2_resid_real_prev++; |
641 | 2.22M | } |
642 | | |
643 | 121k | ptr2 += MAX_PARAMETER_BANDS; |
644 | | |
645 | 229k | for (ps = 1; ps < num_parameter_sets; ps++) { |
646 | 108k | WORD32 del = delta_ptr[ps]; |
647 | 108k | WORD32 one_minus_del = one_minus_delta_ptr[ps]; |
648 | | |
649 | 108k | param_prev_r = ptr2 - MAX_PARAMETER_BANDS; |
650 | | |
651 | 1.91M | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
652 | 1.80M | if (smooth_band_arr[ps][pb]) { |
653 | 560k | WORD64 acc; |
654 | | |
655 | 560k | acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)(del) + |
656 | 560k | (WORD64)(*param_prev_r) * |
657 | 560k | (WORD64)(one_minus_del)); |
658 | | |
659 | 560k | acc >>= 15; |
660 | 560k | ptr2[pb] = (WORD32)acc; |
661 | 560k | } |
662 | | |
663 | 1.80M | param_prev_r++; |
664 | 1.80M | } |
665 | 108k | ptr2 += MAX_PARAMETER_BANDS; |
666 | 108k | } |
667 | 121k | idx++; |
668 | 121k | ptr1 += PBXPS; |
669 | 121k | } |
670 | 651k | } |
671 | 119k | } |
672 | 15.4k | idx = 0; |
673 | 15.4k | ptr1 = &m2_param->m2_decor_real[0][0][0]; |
674 | | |
675 | 134k | for (row = 0; row < num_output_channels; row++) { |
676 | 385k | for (col = num_direct_signals; col < col_counter; col++) { |
677 | 266k | if (curr_state->m2_param_present[row][col] & 1) { |
678 | 76.7k | WORD32 *ptr2 = ptr1; |
679 | 76.7k | m2_decor_real_prev += res_bands; |
680 | | |
681 | 76.7k | param_r = &m2_param->m2_decor_real[idx][0][res_bands]; |
682 | 1.38M | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
683 | 1.30M | if (smooth_band_arr[0][pb]) { |
684 | 375k | WORD64 acc; |
685 | 375k | acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)*delta_ptr + |
686 | 375k | (WORD64)(*m2_decor_real_prev) * |
687 | 375k | (WORD64)*one_minus_delta_ptr); |
688 | 375k | acc >>= 15; |
689 | 375k | ptr2[pb] = (WORD32)acc; |
690 | 375k | } |
691 | 1.30M | m2_decor_real_prev++; |
692 | 1.30M | } |
693 | 76.7k | ptr2 += MAX_PARAMETER_BANDS; |
694 | | |
695 | 169k | for (ps = 1; ps < num_parameter_sets; ps++) { |
696 | 92.9k | WORD32 del = delta_ptr[ps]; |
697 | 92.9k | WORD32 one_minus_del = one_minus_delta_ptr[ps]; |
698 | | |
699 | 92.9k | param_prev_r = ptr2 - MAX_PARAMETER_BANDS; |
700 | 1.49M | for (pb = res_bands; pb < num_parameter_bands; pb++) { |
701 | 1.40M | if (smooth_band_arr[ps][pb]) { |
702 | 479k | WORD64 acc; |
703 | | |
704 | 479k | acc = |
705 | 479k | (WORD64)((WORD64)(ptr2[pb]) * (WORD64)del + |
706 | 479k | (WORD64)(*param_prev_r) * (WORD64)one_minus_del); |
707 | 479k | acc >>= 15; |
708 | 479k | ptr2[pb] = (WORD32)acc; |
709 | 479k | } |
710 | | |
711 | 1.40M | param_prev_r++; |
712 | 1.40M | } |
713 | | |
714 | 92.9k | ptr2 += MAX_PARAMETER_BANDS; |
715 | 92.9k | } |
716 | | |
717 | 76.7k | idx++; |
718 | | |
719 | 76.7k | ptr1 += PBXPS; |
720 | 76.7k | } |
721 | 266k | } |
722 | 119k | } |
723 | 15.4k | } |
724 | 15.4k | } |
725 | 15.4k | return; |
726 | 15.4k | } |