xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_mps_smoothing.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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