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