1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 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 <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_apply_common.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_basic_op.h"
43*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_apply_m1(ia_heaac_mps_state_struct * pstr_mps_state)44*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mps_apply_m1(ia_heaac_mps_state_struct *pstr_mps_state) {
45*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
46*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_m1_param_struct *m1_param = p_array_struct->m1_param;
47*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row, col;
48*15dc779aSAndroid Build Coastguard Worker WORD32 temp_1, temp_2;
49*15dc779aSAndroid Build Coastguard Worker WORD32 *rout_real_ptr, *rout_imag_ptr, *rout_kernel_real_ptr, *rout_kernel_imag_ptr;
50*15dc779aSAndroid Build Coastguard Worker WORD32 *v_real, *v_imag, *x_real, *x_imag;
51*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_real, *p_buffer_imag, *p_v_real, *p_v_imag;
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
54*15dc779aSAndroid Build Coastguard Worker WORD32 *m1_param_real_prev = curr_state->mps_persistent_mem.m1_param_real_prev;
55*15dc779aSAndroid Build Coastguard Worker WORD32 *m1_param_imag_prev = curr_state->mps_persistent_mem.m1_param_imag_prev;
56*15dc779aSAndroid Build Coastguard Worker WORD32 imag_present = curr_state->m1_param_imag_present;
57*15dc779aSAndroid Build Coastguard Worker WORD32 v_channels = curr_state->num_v_channels;
58*15dc779aSAndroid Build Coastguard Worker WORD32 x_channels = curr_state->num_x_channels;
59*15dc779aSAndroid Build Coastguard Worker WORD32 hybrid_bands = curr_state->hybrid_bands;
60*15dc779aSAndroid Build Coastguard Worker WORD32 num_parameter_bands = curr_state->num_parameter_bands;
61*15dc779aSAndroid Build Coastguard Worker WORD32 *index = curr_state->index;
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_re, *p_x_im;
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker WORD32 hyb_bands = hybrid_bands;
66*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = curr_state->time_slots;
67*15dc779aSAndroid Build Coastguard Worker SIZE_T params[4];
68*15dc779aSAndroid Build Coastguard Worker
69*15dc779aSAndroid Build Coastguard Worker params[0] = (SIZE_T)(&curr_state->kernels[0]);
70*15dc779aSAndroid Build Coastguard Worker params[1] = time_slots;
71*15dc779aSAndroid Build Coastguard Worker params[2] = num_parameter_bands;
72*15dc779aSAndroid Build Coastguard Worker params[3] = hybrid_bands;
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker rout_real_ptr = pstr_mps_state->mps_scratch_mem_v;
75*15dc779aSAndroid Build Coastguard Worker rout_kernel_real_ptr = rout_real_ptr + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
76*15dc779aSAndroid Build Coastguard Worker TSXHB, sizeof(*rout_kernel_real_ptr), BYTE_ALIGN_8);
77*15dc779aSAndroid Build Coastguard Worker rout_imag_ptr = rout_kernel_real_ptr +
78*15dc779aSAndroid Build Coastguard Worker IXHEAAC_GET_SIZE_ALIGNED_TYPE(TSXHB, sizeof(*rout_imag_ptr), BYTE_ALIGN_8);
79*15dc779aSAndroid Build Coastguard Worker rout_kernel_imag_ptr = rout_imag_ptr + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
80*15dc779aSAndroid Build Coastguard Worker TSXHB, sizeof(*rout_kernel_imag_ptr), BYTE_ALIGN_8);
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
83*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
84*15dc779aSAndroid Build Coastguard Worker
85*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < v_channels; row++) {
86*15dc779aSAndroid Build Coastguard Worker v_real = p_buffer_real;
87*15dc779aSAndroid Build Coastguard Worker v_imag = p_buffer_imag;
88*15dc779aSAndroid Build Coastguard Worker
89*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
90*15dc779aSAndroid Build Coastguard Worker memset(v_real, 0, hybrid_bands * sizeof(v_real[0]));
91*15dc779aSAndroid Build Coastguard Worker memset(v_imag, 0, hybrid_bands * sizeof(v_imag[0]));
92*15dc779aSAndroid Build Coastguard Worker
93*15dc779aSAndroid Build Coastguard Worker v_real += MAX_HYBRID_BANDS;
94*15dc779aSAndroid Build Coastguard Worker v_imag += MAX_HYBRID_BANDS;
95*15dc779aSAndroid Build Coastguard Worker }
96*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
97*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
98*15dc779aSAndroid Build Coastguard Worker }
99*15dc779aSAndroid Build Coastguard Worker
100*15dc779aSAndroid Build Coastguard Worker p_buffer_real = p_array_struct->buf_real;
101*15dc779aSAndroid Build Coastguard Worker p_buffer_imag = p_array_struct->buf_imag;
102*15dc779aSAndroid Build Coastguard Worker
103*15dc779aSAndroid Build Coastguard Worker if (!imag_present) {
104*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < v_channels; row++) {
105*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_real = p_array_struct->x_real;
106*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_imag = p_array_struct->x_imag;
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < x_channels; col++) {
109*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->m1_param_present[row][col]) {
110*15dc779aSAndroid Build Coastguard Worker WORD32 idx = index[col];
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(m1_param->m1_param_real[row][col], rout_real_ptr,
113*15dc779aSAndroid Build Coastguard Worker m1_param_real_prev, pstr_mps_state);
114*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_real_ptr, rout_kernel_real_ptr, params);
115*15dc779aSAndroid Build Coastguard Worker
116*15dc779aSAndroid Build Coastguard Worker p_v_real = p_buffer_real;
117*15dc779aSAndroid Build Coastguard Worker p_v_imag = p_buffer_imag;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker p_x_re = p_x_real;
120*15dc779aSAndroid Build Coastguard Worker p_x_im = p_x_imag;
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
123*15dc779aSAndroid Build Coastguard Worker v_real = p_v_real;
124*15dc779aSAndroid Build Coastguard Worker v_imag = p_v_imag;
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker x_real = p_x_re;
127*15dc779aSAndroid Build Coastguard Worker x_imag = p_x_im;
128*15dc779aSAndroid Build Coastguard Worker
129*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < idx; qs++) {
130*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_real_ptr);
131*15dc779aSAndroid Build Coastguard Worker *v_real = *v_real + temp_1;
132*15dc779aSAndroid Build Coastguard Worker v_real++;
133*15dc779aSAndroid Build Coastguard Worker
134*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_real_ptr);
135*15dc779aSAndroid Build Coastguard Worker rout_kernel_real_ptr++;
136*15dc779aSAndroid Build Coastguard Worker *v_imag = *v_imag + temp_1;
137*15dc779aSAndroid Build Coastguard Worker v_imag++;
138*15dc779aSAndroid Build Coastguard Worker
139*15dc779aSAndroid Build Coastguard Worker x_real++;
140*15dc779aSAndroid Build Coastguard Worker x_imag++;
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker rout_kernel_real_ptr += hyb_bands - idx;
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker p_v_real += MAX_HYBRID_BANDS;
145*15dc779aSAndroid Build Coastguard Worker p_v_imag += MAX_HYBRID_BANDS;
146*15dc779aSAndroid Build Coastguard Worker
147*15dc779aSAndroid Build Coastguard Worker p_x_re += MAX_HYBRID_BANDS;
148*15dc779aSAndroid Build Coastguard Worker p_x_im += MAX_HYBRID_BANDS;
149*15dc779aSAndroid Build Coastguard Worker }
150*15dc779aSAndroid Build Coastguard Worker
151*15dc779aSAndroid Build Coastguard Worker m1_param_real_prev += num_parameter_bands;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
154*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
155*15dc779aSAndroid Build Coastguard Worker } else {
156*15dc779aSAndroid Build Coastguard Worker m1_param_real_prev += num_parameter_bands;
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
159*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
160*15dc779aSAndroid Build Coastguard Worker }
161*15dc779aSAndroid Build Coastguard Worker }
162*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
163*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker } else {
166*15dc779aSAndroid Build Coastguard Worker for (row = 0; row < v_channels; row++) {
167*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_real = p_array_struct->x_real;
168*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_imag = p_array_struct->x_imag;
169*15dc779aSAndroid Build Coastguard Worker
170*15dc779aSAndroid Build Coastguard Worker for (col = 0; col < x_channels; col++) {
171*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->m1_param_present[row][col]) {
172*15dc779aSAndroid Build Coastguard Worker WORD32 idx = index[col];
173*15dc779aSAndroid Build Coastguard Worker
174*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(m1_param->m1_param_real[row][col], rout_real_ptr,
175*15dc779aSAndroid Build Coastguard Worker m1_param_real_prev, pstr_mps_state);
176*15dc779aSAndroid Build Coastguard Worker ixheaacd_dec_interp_umx(m1_param->m1_param_imag[row][col], rout_imag_ptr,
177*15dc779aSAndroid Build Coastguard Worker m1_param_imag_prev, pstr_mps_state);
178*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_real_ptr, rout_kernel_real_ptr, params);
179*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_abs_kernels(rout_imag_ptr, rout_kernel_imag_ptr, params);
180*15dc779aSAndroid Build Coastguard Worker
181*15dc779aSAndroid Build Coastguard Worker p_v_real = p_buffer_real;
182*15dc779aSAndroid Build Coastguard Worker p_v_imag = p_buffer_imag;
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker p_x_re = p_x_real;
185*15dc779aSAndroid Build Coastguard Worker p_x_im = p_x_imag;
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
188*15dc779aSAndroid Build Coastguard Worker v_real = p_v_real;
189*15dc779aSAndroid Build Coastguard Worker v_imag = p_v_imag;
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker x_real = p_x_re;
192*15dc779aSAndroid Build Coastguard Worker x_imag = p_x_im;
193*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < 2; qs++) {
194*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_real_ptr);
195*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_imag_ptr);
196*15dc779aSAndroid Build Coastguard Worker temp_1 += temp_2;
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker *v_real = *v_real + temp_1;
199*15dc779aSAndroid Build Coastguard Worker v_real++;
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_real_ptr);
202*15dc779aSAndroid Build Coastguard Worker rout_kernel_real_ptr++;
203*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_imag_ptr);
204*15dc779aSAndroid Build Coastguard Worker rout_kernel_imag_ptr++;
205*15dc779aSAndroid Build Coastguard Worker temp_1 -= temp_2;
206*15dc779aSAndroid Build Coastguard Worker
207*15dc779aSAndroid Build Coastguard Worker *v_imag = *v_imag + temp_1;
208*15dc779aSAndroid Build Coastguard Worker v_imag++;
209*15dc779aSAndroid Build Coastguard Worker
210*15dc779aSAndroid Build Coastguard Worker x_real++;
211*15dc779aSAndroid Build Coastguard Worker x_imag++;
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker for (; qs < idx; qs++) {
214*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_real_ptr);
215*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_imag_ptr);
216*15dc779aSAndroid Build Coastguard Worker temp_1 -= temp_2;
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker *v_real = *v_real + temp_1;
219*15dc779aSAndroid Build Coastguard Worker v_real++;
220*15dc779aSAndroid Build Coastguard Worker
221*15dc779aSAndroid Build Coastguard Worker temp_1 = ixheaacd_mps_mult32_shr_15(*x_imag, *rout_kernel_real_ptr);
222*15dc779aSAndroid Build Coastguard Worker rout_kernel_real_ptr++;
223*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaacd_mps_mult32_shr_15(*x_real, *rout_kernel_imag_ptr);
224*15dc779aSAndroid Build Coastguard Worker rout_kernel_imag_ptr++;
225*15dc779aSAndroid Build Coastguard Worker temp_1 += temp_2;
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker *v_imag = *v_imag + temp_1;
228*15dc779aSAndroid Build Coastguard Worker v_imag++;
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker x_real++;
231*15dc779aSAndroid Build Coastguard Worker x_imag++;
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker rout_kernel_real_ptr += hyb_bands - idx;
234*15dc779aSAndroid Build Coastguard Worker rout_kernel_imag_ptr += hyb_bands - idx;
235*15dc779aSAndroid Build Coastguard Worker
236*15dc779aSAndroid Build Coastguard Worker p_v_real += MAX_HYBRID_BANDS;
237*15dc779aSAndroid Build Coastguard Worker p_v_imag += MAX_HYBRID_BANDS;
238*15dc779aSAndroid Build Coastguard Worker
239*15dc779aSAndroid Build Coastguard Worker p_x_re += MAX_HYBRID_BANDS;
240*15dc779aSAndroid Build Coastguard Worker p_x_im += MAX_HYBRID_BANDS;
241*15dc779aSAndroid Build Coastguard Worker }
242*15dc779aSAndroid Build Coastguard Worker
243*15dc779aSAndroid Build Coastguard Worker m1_param_real_prev += num_parameter_bands;
244*15dc779aSAndroid Build Coastguard Worker m1_param_imag_prev += num_parameter_bands;
245*15dc779aSAndroid Build Coastguard Worker
246*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
247*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
248*15dc779aSAndroid Build Coastguard Worker } else {
249*15dc779aSAndroid Build Coastguard Worker m1_param_real_prev += num_parameter_bands;
250*15dc779aSAndroid Build Coastguard Worker m1_param_imag_prev += num_parameter_bands;
251*15dc779aSAndroid Build Coastguard Worker
252*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
253*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
254*15dc779aSAndroid Build Coastguard Worker }
255*15dc779aSAndroid Build Coastguard Worker }
256*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
257*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
258*15dc779aSAndroid Build Coastguard Worker }
259*15dc779aSAndroid Build Coastguard Worker }
260*15dc779aSAndroid Build Coastguard Worker return;
261*15dc779aSAndroid Build Coastguard Worker }
262