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 "ixheaacd_sbr_common.h"
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
28*15dc779aSAndroid Build Coastguard Worker
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
38*15dc779aSAndroid Build Coastguard Worker
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
40*15dc779aSAndroid Build Coastguard Worker
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
57*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mac32_tns_sat(WORD32 a,WORD32 b,WORD32 c)58*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mac32_tns_sat(WORD32 a, WORD32 b,
59*15dc779aSAndroid Build Coastguard Worker WORD32 c) {
60*15dc779aSAndroid Build Coastguard Worker WORD32 result;
61*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
64*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(temp_result >> 32);
65*15dc779aSAndroid Build Coastguard Worker result = ixheaac_add32_sat(c, result);
66*15dc779aSAndroid Build Coastguard Worker return (result);
67*15dc779aSAndroid Build Coastguard Worker }
68*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_decode_coefficients(const ia_filter_info_struct * filter,WORD32 * a,ia_aac_dec_tables_struct * ptr_aac_tables)69*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_decode_coefficients(
70*15dc779aSAndroid Build Coastguard Worker const ia_filter_info_struct *filter, WORD32 *a,
71*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_tables_struct *ptr_aac_tables) {
72*15dc779aSAndroid Build Coastguard Worker WORD32 i;
73*15dc779aSAndroid Build Coastguard Worker WORD32 tmp;
74*15dc779aSAndroid Build Coastguard Worker WORD32 *aptr = a;
75*15dc779aSAndroid Build Coastguard Worker WORD32 *tns_coeff_ptr;
76*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_drc_offset;
77*15dc779aSAndroid Build Coastguard Worker
78*15dc779aSAndroid Build Coastguard Worker tmp = filter->resolution;
79*15dc779aSAndroid Build Coastguard Worker if (tmp == 0) {
80*15dc779aSAndroid Build Coastguard Worker tns_coeff_ptr = ptr_aac_tables->pstr_block_tables->tns_coeff3;
81*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset = 4;
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker } else {
84*15dc779aSAndroid Build Coastguard Worker tns_coeff_ptr = ptr_aac_tables->pstr_block_tables->tns_coeff4;
85*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset = 8;
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker
88*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < filter->order; i++) {
89*15dc779aSAndroid Build Coastguard Worker *aptr++ = tns_coeff_ptr[filter->coef[i] + ixheaacd_drc_offset];
90*15dc779aSAndroid Build Coastguard Worker }
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_parcor_to_lpc(WORD32 * parcor,WORD32 * lpc,WORD16 * scale,WORD32 order)93*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_parcor_to_lpc(WORD32 *parcor, WORD32 *lpc, WORD16 *scale,
94*15dc779aSAndroid Build Coastguard Worker WORD32 order)
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker {
97*15dc779aSAndroid Build Coastguard Worker WORD i, j, status;
98*15dc779aSAndroid Build Coastguard Worker WORD32 z1;
99*15dc779aSAndroid Build Coastguard Worker WORD32 z[MAX_ORDER + 1];
100*15dc779aSAndroid Build Coastguard Worker WORD32 w[MAX_ORDER + 1];
101*15dc779aSAndroid Build Coastguard Worker WORD32 accu1, accu2;
102*15dc779aSAndroid Build Coastguard Worker
103*15dc779aSAndroid Build Coastguard Worker status = 1;
104*15dc779aSAndroid Build Coastguard Worker *scale = 1;
105*15dc779aSAndroid Build Coastguard Worker
106*15dc779aSAndroid Build Coastguard Worker while (status) {
107*15dc779aSAndroid Build Coastguard Worker status = 0;
108*15dc779aSAndroid Build Coastguard Worker
109*15dc779aSAndroid Build Coastguard Worker for (i = MAX_ORDER; i >= 0; i--) {
110*15dc779aSAndroid Build Coastguard Worker z[i] = 0;
111*15dc779aSAndroid Build Coastguard Worker w[i] = 0;
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker accu1 = (0x40000000 >> (*scale - 1));
115*15dc779aSAndroid Build Coastguard Worker
116*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= order; i++) {
117*15dc779aSAndroid Build Coastguard Worker z1 = accu1;
118*15dc779aSAndroid Build Coastguard Worker
119*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < order; j++) {
120*15dc779aSAndroid Build Coastguard Worker w[j] = (accu1);
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker accu1 = ixheaac_add32_sat(accu1,
123*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32_shl_sat(parcor[j], (z[j])));
124*15dc779aSAndroid Build Coastguard Worker if (ixheaac_abs32_sat(accu1) == 0x7fffffff) status = 1;
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker for (j = (order - 1); j >= 0; j--) {
127*15dc779aSAndroid Build Coastguard Worker accu2 = (z[j]);
128*15dc779aSAndroid Build Coastguard Worker accu2 = ixheaac_add32_sat(accu2,
129*15dc779aSAndroid Build Coastguard Worker ixheaac_mult32_shl_sat(parcor[j], (w[j])));
130*15dc779aSAndroid Build Coastguard Worker z[j + 1] = (accu2);
131*15dc779aSAndroid Build Coastguard Worker if (ixheaac_abs32_sat(accu2) == 0x7fffffff) status = 1;
132*15dc779aSAndroid Build Coastguard Worker }
133*15dc779aSAndroid Build Coastguard Worker
134*15dc779aSAndroid Build Coastguard Worker z[0] = (z1);
135*15dc779aSAndroid Build Coastguard Worker lpc[i] = (accu1);
136*15dc779aSAndroid Build Coastguard Worker accu1 = 0;
137*15dc779aSAndroid Build Coastguard Worker }
138*15dc779aSAndroid Build Coastguard Worker
139*15dc779aSAndroid Build Coastguard Worker accu1 = (status - 1);
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker if (accu1 == 0) {
142*15dc779aSAndroid Build Coastguard Worker *scale = *scale + 1;
143*15dc779aSAndroid Build Coastguard Worker }
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker }
146*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_parcor_lpc_convert_dec(WORD16 * parcor,WORD16 * lpc,WORD16 * scale,WORD order)147*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_parcor_lpc_convert_dec(WORD16 *parcor, WORD16 *lpc,
148*15dc779aSAndroid Build Coastguard Worker WORD16 *scale, WORD order)
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker {
151*15dc779aSAndroid Build Coastguard Worker WORD i, j, status;
152*15dc779aSAndroid Build Coastguard Worker WORD32 accu;
153*15dc779aSAndroid Build Coastguard Worker WORD16 temp_buf1[MAX_ORDER + 1];
154*15dc779aSAndroid Build Coastguard Worker WORD16 temp_buf2[MAX_ORDER + 1];
155*15dc779aSAndroid Build Coastguard Worker WORD32 accu1, accu2;
156*15dc779aSAndroid Build Coastguard Worker
157*15dc779aSAndroid Build Coastguard Worker status = 1;
158*15dc779aSAndroid Build Coastguard Worker *scale = 0;
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker while (status) {
161*15dc779aSAndroid Build Coastguard Worker status = 0;
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker for (i = MAX_ORDER; i >= 0; i--) {
164*15dc779aSAndroid Build Coastguard Worker temp_buf1[i] = 0;
165*15dc779aSAndroid Build Coastguard Worker temp_buf2[i] = 0;
166*15dc779aSAndroid Build Coastguard Worker }
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker accu1 = (0x7fffffff >> *scale);
169*15dc779aSAndroid Build Coastguard Worker
170*15dc779aSAndroid Build Coastguard Worker for (i = 0; i <= order; i++) {
171*15dc779aSAndroid Build Coastguard Worker accu = accu1;
172*15dc779aSAndroid Build Coastguard Worker
173*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < order; j++) {
174*15dc779aSAndroid Build Coastguard Worker temp_buf2[j] = ixheaac_round16(accu1);
175*15dc779aSAndroid Build Coastguard Worker accu1 = ixheaac_mac16x16in32_shl_sat(accu1, parcor[j], temp_buf1[j]);
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker if (ixheaac_abs32_sat(accu1) == 0x7fffffff) {
178*15dc779aSAndroid Build Coastguard Worker status = 1;
179*15dc779aSAndroid Build Coastguard Worker }
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker for (j = (order - 1); j >= 0; j--) {
183*15dc779aSAndroid Build Coastguard Worker accu2 = ixheaac_deposit16h_in32(temp_buf1[j]);
184*15dc779aSAndroid Build Coastguard Worker accu2 = ixheaac_mac16x16in32_shl_sat(accu2, parcor[j], temp_buf2[j]);
185*15dc779aSAndroid Build Coastguard Worker temp_buf1[j + 1] = ixheaac_round16(accu2);
186*15dc779aSAndroid Build Coastguard Worker if (ixheaac_abs32_sat(accu2) == 0x7fffffff) {
187*15dc779aSAndroid Build Coastguard Worker status = 1;
188*15dc779aSAndroid Build Coastguard Worker }
189*15dc779aSAndroid Build Coastguard Worker }
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker temp_buf1[0] = ixheaac_round16(accu);
192*15dc779aSAndroid Build Coastguard Worker lpc[i] = ixheaac_round16(accu1);
193*15dc779aSAndroid Build Coastguard Worker accu1 = 0;
194*15dc779aSAndroid Build Coastguard Worker }
195*15dc779aSAndroid Build Coastguard Worker
196*15dc779aSAndroid Build Coastguard Worker accu1 = (status - 1);
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker if (accu1 == 0) {
199*15dc779aSAndroid Build Coastguard Worker *scale = *scale + 1;
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker }
203*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_ar_filter_fixed_dec(WORD32 * spectrum,WORD32 size,WORD32 inc,WORD32 * lpc,WORD32 order,WORD32 shift_value,WORD scale_spec)204*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_ar_filter_fixed_dec(WORD32 *spectrum, WORD32 size, WORD32 inc,
205*15dc779aSAndroid Build Coastguard Worker WORD32 *lpc, WORD32 order,
206*15dc779aSAndroid Build Coastguard Worker WORD32 shift_value, WORD scale_spec)
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker {
209*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
210*15dc779aSAndroid Build Coastguard Worker WORD32 y, state[MAX_ORDER + 1];
211*15dc779aSAndroid Build Coastguard Worker WORD32 acc;
212*15dc779aSAndroid Build Coastguard Worker
213*15dc779aSAndroid Build Coastguard Worker if ((order & 3) != 0) {
214*15dc779aSAndroid Build Coastguard Worker for (i = order + 1; i < ((WORD32)(order & 0xfffffffc) + 4); i++) {
215*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
218*15dc779aSAndroid Build Coastguard Worker order = ((order & 0xfffffffc) + 4);
219*15dc779aSAndroid Build Coastguard Worker order = order & 31;
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker {
222*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < order; i++) {
223*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
224*15dc779aSAndroid Build Coastguard Worker acc = 0;
225*15dc779aSAndroid Build Coastguard Worker
226*15dc779aSAndroid Build Coastguard Worker for (j = i; j > 0; j--) {
227*15dc779aSAndroid Build Coastguard Worker acc = ixheaacd_mac32_tns_sat(state[j - 1], lpc[j], acc);
228*15dc779aSAndroid Build Coastguard Worker state[j] = state[j - 1];
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc, 1));
231*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_sat(y, shift_value);
232*15dc779aSAndroid Build Coastguard Worker
233*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
234*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
235*15dc779aSAndroid Build Coastguard Worker }
236*15dc779aSAndroid Build Coastguard Worker for (i = order; i < size; i++) {
237*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
238*15dc779aSAndroid Build Coastguard Worker acc = 0;
239*15dc779aSAndroid Build Coastguard Worker for (j = order; j > 0; j--) {
240*15dc779aSAndroid Build Coastguard Worker acc = ixheaacd_mac32_tns_sat(state[j - 1], lpc[j], acc);
241*15dc779aSAndroid Build Coastguard Worker state[j] = state[j - 1];
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc, 1));
244*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_sat(y, shift_value);
245*15dc779aSAndroid Build Coastguard Worker
246*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
247*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
248*15dc779aSAndroid Build Coastguard Worker }
249*15dc779aSAndroid Build Coastguard Worker }
250*15dc779aSAndroid Build Coastguard Worker }
251*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_ar_filter_fixed_non_neon_armv7(WORD32 * spectrum,WORD32 size,WORD32 inc,WORD32 * lpc,WORD32 order,WORD32 shift_value,WORD scale_spec)252*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_ar_filter_fixed_non_neon_armv7(WORD32 *spectrum, WORD32 size,
253*15dc779aSAndroid Build Coastguard Worker WORD32 inc, WORD32 *lpc,
254*15dc779aSAndroid Build Coastguard Worker WORD32 order,
255*15dc779aSAndroid Build Coastguard Worker WORD32 shift_value,
256*15dc779aSAndroid Build Coastguard Worker WORD scale_spec) {
257*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
258*15dc779aSAndroid Build Coastguard Worker WORD32 y, state[MAX_ORDER + 1];
259*15dc779aSAndroid Build Coastguard Worker WORD32 acc;
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker if ((order & 3) != 0) {
262*15dc779aSAndroid Build Coastguard Worker for (i = order + 1; i < ((WORD32)(order & 0xfffffffc) + 4); i++) {
263*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
266*15dc779aSAndroid Build Coastguard Worker order = ((order & 0xfffffffc) + 4);
267*15dc779aSAndroid Build Coastguard Worker }
268*15dc779aSAndroid Build Coastguard Worker {
269*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < order; i++) {
270*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
271*15dc779aSAndroid Build Coastguard Worker acc = 0;
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker for (j = i; j > 0; j--) {
274*15dc779aSAndroid Build Coastguard Worker acc = ixheaacd_mac32_tns_sat(state[j - 1], lpc[j], acc);
275*15dc779aSAndroid Build Coastguard Worker state[j] = state[j - 1];
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc, 1));
278*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_sat(y, shift_value);
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
281*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
282*15dc779aSAndroid Build Coastguard Worker }
283*15dc779aSAndroid Build Coastguard Worker for (i = order; i < size; i++) {
284*15dc779aSAndroid Build Coastguard Worker WORD64 acc = 0;
285*15dc779aSAndroid Build Coastguard Worker WORD32 acc1;
286*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
287*15dc779aSAndroid Build Coastguard Worker for (j = order; j > 0; j--) {
288*15dc779aSAndroid Build Coastguard Worker acc = ixheaac_mac32x32in64_dual(state[j - 1], lpc[j], acc);
289*15dc779aSAndroid Build Coastguard Worker state[j] = state[j - 1];
290*15dc779aSAndroid Build Coastguard Worker }
291*15dc779aSAndroid Build Coastguard Worker acc1 = (WORD32)(acc >> 32);
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc1, 1));
294*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_sat(y, shift_value);
295*15dc779aSAndroid Build Coastguard Worker
296*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
297*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
298*15dc779aSAndroid Build Coastguard Worker }
299*15dc779aSAndroid Build Coastguard Worker }
300*15dc779aSAndroid Build Coastguard Worker }
301*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_ar_filter_fixed_armv8(WORD32 * spectrum,WORD32 size,WORD32 inc,WORD32 * lpc,WORD32 order,WORD32 shift_value,WORD scale_spec)302*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_ar_filter_fixed_armv8(WORD32 *spectrum, WORD32 size,
303*15dc779aSAndroid Build Coastguard Worker WORD32 inc, WORD32 *lpc, WORD32 order,
304*15dc779aSAndroid Build Coastguard Worker WORD32 shift_value, WORD scale_spec) {
305*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
306*15dc779aSAndroid Build Coastguard Worker WORD32 y, state[MAX_ORDER + 1];
307*15dc779aSAndroid Build Coastguard Worker WORD32 acc;
308*15dc779aSAndroid Build Coastguard Worker
309*15dc779aSAndroid Build Coastguard Worker if ((order & 3) != 0) {
310*15dc779aSAndroid Build Coastguard Worker for (i = order + 1; i < ((WORD32)(order & 0xfffffffc) + 4); i++) {
311*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
312*15dc779aSAndroid Build Coastguard Worker }
313*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
314*15dc779aSAndroid Build Coastguard Worker order = ((order & 0xfffffffc) + 4);
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker {
317*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < order; i++) {
318*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
319*15dc779aSAndroid Build Coastguard Worker acc = 0;
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker for (j = i; j > 0; j--) {
322*15dc779aSAndroid Build Coastguard Worker acc = ixheaacd_mac32_tns_sat(state[j - 1], lpc[j], acc);
323*15dc779aSAndroid Build Coastguard Worker state[j] = state[j - 1];
324*15dc779aSAndroid Build Coastguard Worker }
325*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc, 1));
326*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_sat(y, shift_value);
327*15dc779aSAndroid Build Coastguard Worker
328*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
329*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
330*15dc779aSAndroid Build Coastguard Worker }
331*15dc779aSAndroid Build Coastguard Worker for (i = order; i < size; i++) {
332*15dc779aSAndroid Build Coastguard Worker WORD64 acc = 0;
333*15dc779aSAndroid Build Coastguard Worker WORD32 acc1;
334*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
335*15dc779aSAndroid Build Coastguard Worker for (j = order; j > 0; j--) {
336*15dc779aSAndroid Build Coastguard Worker acc = ixheaac_mac32x32in64_dual(state[j - 1], lpc[j], acc);
337*15dc779aSAndroid Build Coastguard Worker state[j] = state[j - 1];
338*15dc779aSAndroid Build Coastguard Worker }
339*15dc779aSAndroid Build Coastguard Worker acc1 = (WORD32)(acc >> 32);
340*15dc779aSAndroid Build Coastguard Worker
341*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc1, 1));
342*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_sat(y, shift_value);
343*15dc779aSAndroid Build Coastguard Worker
344*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
345*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
346*15dc779aSAndroid Build Coastguard Worker }
347*15dc779aSAndroid Build Coastguard Worker }
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_ma_filter_fixed_ld(WORD32 * spectrum,WORD32 size,WORD32 inc,WORD32 * lpc,WORD32 order,WORD16 shift_value)350*15dc779aSAndroid Build Coastguard Worker void ixheaacd_tns_ma_filter_fixed_ld(WORD32 *spectrum, WORD32 size, WORD32 inc,
351*15dc779aSAndroid Build Coastguard Worker WORD32 *lpc, WORD32 order,
352*15dc779aSAndroid Build Coastguard Worker WORD16 shift_value) {
353*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
354*15dc779aSAndroid Build Coastguard Worker WORD32 y, state[MAX_ORDER];
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < order; i++) state[i] = 0;
357*15dc779aSAndroid Build Coastguard Worker
358*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < size; i++) {
359*15dc779aSAndroid Build Coastguard Worker y = *spectrum;
360*15dc779aSAndroid Build Coastguard Worker
361*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < order; j++) y += ixheaac_mult32_shl(state[j], lpc[j + 1]);
362*15dc779aSAndroid Build Coastguard Worker
363*15dc779aSAndroid Build Coastguard Worker for (j = order - 1; j > 0; j--) state[j] = state[j - 1];
364*15dc779aSAndroid Build Coastguard Worker
365*15dc779aSAndroid Build Coastguard Worker state[0] = ixheaac_shl32_dir_sat(*spectrum, shift_value);
366*15dc779aSAndroid Build Coastguard Worker *spectrum = y;
367*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tns_ar_filter_dec(WORD32 * spectrum,WORD32 size,WORD32 inc,WORD16 * lpc,WORD32 order,WORD32 shift_value,WORD scale_spec,WORD32 * ptr_filter_state)371*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tns_ar_filter_dec(WORD32 *spectrum, WORD32 size, WORD32 inc,
372*15dc779aSAndroid Build Coastguard Worker WORD16 *lpc, WORD32 order, WORD32 shift_value,
373*15dc779aSAndroid Build Coastguard Worker WORD scale_spec, WORD32 *ptr_filter_state) {
374*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
375*15dc779aSAndroid Build Coastguard Worker WORD32 y;
376*15dc779aSAndroid Build Coastguard Worker WORD32 acc;
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker if ((order & 3) != 0) {
379*15dc779aSAndroid Build Coastguard Worker for (i = order + 1; i < ((WORD32)(order & (~3)) + 4); i++) {
380*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
381*15dc779aSAndroid Build Coastguard Worker }
382*15dc779aSAndroid Build Coastguard Worker if (i < (MAX_ORDER + 1)) {
383*15dc779aSAndroid Build Coastguard Worker lpc[i] = 0;
384*15dc779aSAndroid Build Coastguard Worker order = ((order & (~3)) + 4);
385*15dc779aSAndroid Build Coastguard Worker } else {
386*15dc779aSAndroid Build Coastguard Worker order = MAX_ORDER;
387*15dc779aSAndroid Build Coastguard Worker }
388*15dc779aSAndroid Build Coastguard Worker }
389*15dc779aSAndroid Build Coastguard Worker
390*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < order; i++) {
391*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
392*15dc779aSAndroid Build Coastguard Worker acc = 0;
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker for (j = i; j > 0; j--) {
395*15dc779aSAndroid Build Coastguard Worker acc = ixheaac_add32_sat(
396*15dc779aSAndroid Build Coastguard Worker acc, ixheaac_mult32x16in32(ptr_filter_state[j - 1], lpc[j]));
397*15dc779aSAndroid Build Coastguard Worker ptr_filter_state[j] = ptr_filter_state[j - 1];
398*15dc779aSAndroid Build Coastguard Worker }
399*15dc779aSAndroid Build Coastguard Worker
400*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc, 1));
401*15dc779aSAndroid Build Coastguard Worker ptr_filter_state[0] = ixheaac_shl32_sat(y, shift_value);
402*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
403*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
404*15dc779aSAndroid Build Coastguard Worker }
405*15dc779aSAndroid Build Coastguard Worker
406*15dc779aSAndroid Build Coastguard Worker for (i = order; i < size; i++) {
407*15dc779aSAndroid Build Coastguard Worker y = ixheaac_shl32_sat((*spectrum), scale_spec);
408*15dc779aSAndroid Build Coastguard Worker acc = 0;
409*15dc779aSAndroid Build Coastguard Worker for (j = order; j > 0; j--) {
410*15dc779aSAndroid Build Coastguard Worker acc = ixheaac_add32_sat(
411*15dc779aSAndroid Build Coastguard Worker acc, ixheaac_mult32x16in32(ptr_filter_state[j - 1], lpc[j]));
412*15dc779aSAndroid Build Coastguard Worker ptr_filter_state[j] = ptr_filter_state[j - 1];
413*15dc779aSAndroid Build Coastguard Worker }
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker y = ixheaac_sub32_sat(y, ixheaac_shl32_sat(acc, 1));
416*15dc779aSAndroid Build Coastguard Worker ptr_filter_state[0] = ixheaac_shl32_sat(y, shift_value);
417*15dc779aSAndroid Build Coastguard Worker *spectrum = y >> scale_spec;
418*15dc779aSAndroid Build Coastguard Worker spectrum += inc;
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker }
421*15dc779aSAndroid Build Coastguard Worker
ixheaacd_calc_max_spectral_line_dec(WORD32 * ptr_tmp,WORD32 size)422*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_calc_max_spectral_line_dec(WORD32 *ptr_tmp, WORD32 size) {
423*15dc779aSAndroid Build Coastguard Worker WORD32 max_spec_line = 0, i;
424*15dc779aSAndroid Build Coastguard Worker WORD unroll_cnt, rem;
425*15dc779aSAndroid Build Coastguard Worker
426*15dc779aSAndroid Build Coastguard Worker unroll_cnt = size >> 3;
427*15dc779aSAndroid Build Coastguard Worker for (i = unroll_cnt; i--;) {
428*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
429*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
430*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
431*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
432*15dc779aSAndroid Build Coastguard Worker
433*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
434*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
435*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
436*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
437*15dc779aSAndroid Build Coastguard Worker }
438*15dc779aSAndroid Build Coastguard Worker
439*15dc779aSAndroid Build Coastguard Worker rem = size - (unroll_cnt << 3);
440*15dc779aSAndroid Build Coastguard Worker
441*15dc779aSAndroid Build Coastguard Worker if (rem) {
442*15dc779aSAndroid Build Coastguard Worker for (i = rem; i--;) {
443*15dc779aSAndroid Build Coastguard Worker max_spec_line = ixheaac_abs32_nrm(*ptr_tmp++) | max_spec_line;
444*15dc779aSAndroid Build Coastguard Worker }
445*15dc779aSAndroid Build Coastguard Worker }
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker return ixheaac_norm32(max_spec_line);
448*15dc779aSAndroid Build Coastguard Worker }