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
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_fix.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_defines.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
28*15dc779aSAndroid Build Coastguard Worker
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_fft.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_dct.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_buf.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_lib.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_main_structure.h"
40*15dc779aSAndroid Build Coastguard Worker
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_bitstream.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_frame_windowing.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_param_extract.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_static_gain.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_filter.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_delay.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_dmx_tdom_enh.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_tools_rom.h"
49*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_dct_iv(FLOAT32 * ptr_data,WORD32 length,WORD8 * ptr_scratch)50*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_dct_iv(FLOAT32 *ptr_data, WORD32 length, WORD8 *ptr_scratch) {
51*15dc779aSAndroid Build Coastguard Worker WORD32 sin_step = 0;
52*15dc779aSAndroid Build Coastguard Worker WORD32 length_by_2 = length >> 1;
53*15dc779aSAndroid Build Coastguard Worker WORD32 step, idx;
54*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu_1, accu_2, accu_3, accu_4;
55*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_data_0;
56*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_data_1;
57*15dc779aSAndroid Build Coastguard Worker const ixheaace_cmplx_str *ptr_cmplx_twiddle;
58*15dc779aSAndroid Build Coastguard Worker const ixheaace_cmplx_str *ptr_cmplx_sin_twiddle;
59*15dc779aSAndroid Build Coastguard Worker ixheaace_scratch_mem *pstr_scratch = (ixheaace_scratch_mem *)ptr_scratch;
60*15dc779aSAndroid Build Coastguard Worker
61*15dc779aSAndroid Build Coastguard Worker if (length == 64) {
62*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_twiddle = sine_window_64;
63*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_sin_twiddle = sine_table_1024;
64*15dc779aSAndroid Build Coastguard Worker sin_step = 32;
65*15dc779aSAndroid Build Coastguard Worker } else {
66*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_twiddle = sine_window_32;
67*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_sin_twiddle = sine_table_1024;
68*15dc779aSAndroid Build Coastguard Worker sin_step = 64;
69*15dc779aSAndroid Build Coastguard Worker }
70*15dc779aSAndroid Build Coastguard Worker
71*15dc779aSAndroid Build Coastguard Worker ptr_data_0 = &ptr_data[0];
72*15dc779aSAndroid Build Coastguard Worker ptr_data_1 = &ptr_data[length - 2];
73*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < length_by_2 - 1; idx += 2, ptr_data_0 += 2, ptr_data_1 -= 2) {
74*15dc779aSAndroid Build Coastguard Worker accu_1 =
75*15dc779aSAndroid Build Coastguard Worker (ptr_data_1[1] * ptr_cmplx_twiddle[idx].re) - (ptr_data_0[0] * ptr_cmplx_twiddle[idx].im);
76*15dc779aSAndroid Build Coastguard Worker accu_2 =
77*15dc779aSAndroid Build Coastguard Worker (ptr_data_1[1] * ptr_cmplx_twiddle[idx].im) + (ptr_data_0[0] * ptr_cmplx_twiddle[idx].re);
78*15dc779aSAndroid Build Coastguard Worker accu_3 = (ptr_data_1[0] * ptr_cmplx_twiddle[idx + 1].re) -
79*15dc779aSAndroid Build Coastguard Worker (ptr_data_0[1] * ptr_cmplx_twiddle[idx + 1].im);
80*15dc779aSAndroid Build Coastguard Worker accu_4 = (ptr_data_1[0] * ptr_cmplx_twiddle[idx + 1].im) +
81*15dc779aSAndroid Build Coastguard Worker (ptr_data_0[1] * ptr_cmplx_twiddle[idx + 1].re);
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker ptr_data_0[0] = accu_2 / 4;
84*15dc779aSAndroid Build Coastguard Worker ptr_data_0[1] = accu_1 / 4;
85*15dc779aSAndroid Build Coastguard Worker ptr_data_1[0] = accu_4 / 4;
86*15dc779aSAndroid Build Coastguard Worker ptr_data_1[1] = -(accu_3 / 4);
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_complex_fft(ptr_data, length_by_2, pstr_scratch);
89*15dc779aSAndroid Build Coastguard Worker if (length_by_2 == 32) {
90*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < length; idx++) {
91*15dc779aSAndroid Build Coastguard Worker ptr_data[idx] = (ptr_data[idx] / (1 << (4)));
92*15dc779aSAndroid Build Coastguard Worker }
93*15dc779aSAndroid Build Coastguard Worker } else {
94*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < length; idx++) {
95*15dc779aSAndroid Build Coastguard Worker ptr_data[idx] = (ptr_data[idx] / (1 << (3)));
96*15dc779aSAndroid Build Coastguard Worker }
97*15dc779aSAndroid Build Coastguard Worker }
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker ptr_data_0 = &ptr_data[0];
100*15dc779aSAndroid Build Coastguard Worker ptr_data_1 = &ptr_data[length - 2];
101*15dc779aSAndroid Build Coastguard Worker accu_1 = ptr_data_1[0];
102*15dc779aSAndroid Build Coastguard Worker accu_2 = ptr_data_1[1];
103*15dc779aSAndroid Build Coastguard Worker ptr_data_1[1] = -ptr_data_0[1];
104*15dc779aSAndroid Build Coastguard Worker
105*15dc779aSAndroid Build Coastguard Worker for (step = sin_step, idx = 1; idx<(length_by_2 + 1)>> 1; idx++, step += sin_step) {
106*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str twd = ptr_cmplx_sin_twiddle[step];
107*15dc779aSAndroid Build Coastguard Worker accu_3 = (accu_1 * twd.re) - (accu_2 * twd.im);
108*15dc779aSAndroid Build Coastguard Worker accu_4 = (accu_1 * twd.im) + (accu_2 * twd.re);
109*15dc779aSAndroid Build Coastguard Worker ptr_data_0[1] = accu_3;
110*15dc779aSAndroid Build Coastguard Worker ptr_data_1[0] = accu_4;
111*15dc779aSAndroid Build Coastguard Worker
112*15dc779aSAndroid Build Coastguard Worker ptr_data_0 += 2;
113*15dc779aSAndroid Build Coastguard Worker ptr_data_1 -= 2;
114*15dc779aSAndroid Build Coastguard Worker
115*15dc779aSAndroid Build Coastguard Worker accu_3 = (ptr_data_0[1] * twd.re) - (ptr_data_0[0] * twd.im);
116*15dc779aSAndroid Build Coastguard Worker accu_4 = (ptr_data_0[1] * twd.im) + (ptr_data_0[0] * twd.re);
117*15dc779aSAndroid Build Coastguard Worker accu_1 = ptr_data_1[0];
118*15dc779aSAndroid Build Coastguard Worker accu_2 = ptr_data_1[1];
119*15dc779aSAndroid Build Coastguard Worker
120*15dc779aSAndroid Build Coastguard Worker ptr_data_1[1] = -accu_3;
121*15dc779aSAndroid Build Coastguard Worker ptr_data_0[0] = accu_4;
122*15dc779aSAndroid Build Coastguard Worker }
123*15dc779aSAndroid Build Coastguard Worker accu_1 = (accu_1 * SQUARE_ROOT_TWO);
124*15dc779aSAndroid Build Coastguard Worker accu_2 = (accu_2 * SQUARE_ROOT_TWO);
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker ptr_data_1[0] = (accu_1 + accu_2) / 2;
127*15dc779aSAndroid Build Coastguard Worker ptr_data_0[1] = (accu_1 - accu_2) / 2;
128*15dc779aSAndroid Build Coastguard Worker
129*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
130*15dc779aSAndroid Build Coastguard Worker }
131*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_dst_iv(FLOAT32 * ptr_data,WORD32 length,WORD8 * ptr_scratch)132*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_dst_iv(FLOAT32 *ptr_data, WORD32 length, WORD8 *ptr_scratch) {
133*15dc779aSAndroid Build Coastguard Worker WORD32 sin_step = 0;
134*15dc779aSAndroid Build Coastguard Worker WORD32 step, idx;
135*15dc779aSAndroid Build Coastguard Worker WORD32 length_by_2 = length >> 1;
136*15dc779aSAndroid Build Coastguard Worker FLOAT32 accu_1, accu_2, accu_3, accu_4;
137*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_data_0;
138*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_data_1;
139*15dc779aSAndroid Build Coastguard Worker const ixheaace_cmplx_str *ptr_cmplx_twiddle;
140*15dc779aSAndroid Build Coastguard Worker const ixheaace_cmplx_str *ptr_cmplx_sin_twiddle;
141*15dc779aSAndroid Build Coastguard Worker ixheaace_scratch_mem *pstr_scratch = (ixheaace_scratch_mem *)ptr_scratch;
142*15dc779aSAndroid Build Coastguard Worker if (length == 64) {
143*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_twiddle = sine_window_64;
144*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_sin_twiddle = sine_table_1024;
145*15dc779aSAndroid Build Coastguard Worker sin_step = 32;
146*15dc779aSAndroid Build Coastguard Worker } else {
147*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_twiddle = sine_window_32;
148*15dc779aSAndroid Build Coastguard Worker ptr_cmplx_sin_twiddle = sine_table_1024;
149*15dc779aSAndroid Build Coastguard Worker sin_step = 64;
150*15dc779aSAndroid Build Coastguard Worker }
151*15dc779aSAndroid Build Coastguard Worker
152*15dc779aSAndroid Build Coastguard Worker ptr_data_0 = &ptr_data[0];
153*15dc779aSAndroid Build Coastguard Worker ptr_data_1 = &ptr_data[length - 2];
154*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < length_by_2 - 1; idx += 2, ptr_data_0 += 2, ptr_data_1 -= 2) {
155*15dc779aSAndroid Build Coastguard Worker accu_1 = (ptr_data_1[1] * ptr_cmplx_twiddle[idx].re) -
156*15dc779aSAndroid Build Coastguard Worker ((-ptr_data_0[0]) * ptr_cmplx_twiddle[idx].im);
157*15dc779aSAndroid Build Coastguard Worker accu_2 = (ptr_data_1[1] * ptr_cmplx_twiddle[idx].im) +
158*15dc779aSAndroid Build Coastguard Worker ((-ptr_data_0[0]) * ptr_cmplx_twiddle[idx].re);
159*15dc779aSAndroid Build Coastguard Worker accu_3 = ((-ptr_data_1[0]) * ptr_cmplx_twiddle[idx + 1].re) -
160*15dc779aSAndroid Build Coastguard Worker (ptr_data_0[1] * ptr_cmplx_twiddle[idx + 1].im);
161*15dc779aSAndroid Build Coastguard Worker accu_4 = ((-ptr_data_1[0]) * ptr_cmplx_twiddle[idx + 1].im) +
162*15dc779aSAndroid Build Coastguard Worker (ptr_data_0[1] * ptr_cmplx_twiddle[idx + 1].re);
163*15dc779aSAndroid Build Coastguard Worker ptr_data_0[0] = accu_2 / 4;
164*15dc779aSAndroid Build Coastguard Worker ptr_data_0[1] = accu_1 / 4;
165*15dc779aSAndroid Build Coastguard Worker ptr_data_1[0] = accu_4 / 4;
166*15dc779aSAndroid Build Coastguard Worker ptr_data_1[1] = -(accu_3) / 4;
167*15dc779aSAndroid Build Coastguard Worker }
168*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_complex_fft(ptr_data, length_by_2, pstr_scratch);
169*15dc779aSAndroid Build Coastguard Worker if (length_by_2 == 32) {
170*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < length; idx++) {
171*15dc779aSAndroid Build Coastguard Worker ptr_data[idx] = (ptr_data[idx] / (1 << (4)));
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker } else {
174*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < length; idx++) {
175*15dc779aSAndroid Build Coastguard Worker ptr_data[idx] = (ptr_data[idx] / (1 << (3)));
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker }
178*15dc779aSAndroid Build Coastguard Worker ptr_data_0 = &ptr_data[0];
179*15dc779aSAndroid Build Coastguard Worker ptr_data_1 = &ptr_data[length - 2];
180*15dc779aSAndroid Build Coastguard Worker accu_1 = ptr_data_1[0];
181*15dc779aSAndroid Build Coastguard Worker accu_2 = ptr_data_1[1];
182*15dc779aSAndroid Build Coastguard Worker ptr_data_1[1] = -ptr_data_0[0];
183*15dc779aSAndroid Build Coastguard Worker ptr_data_0[0] = ptr_data_0[1];
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker for (step = sin_step, idx = 1; idx<(length_by_2 + 1)>> 1; idx++, step += sin_step) {
186*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str twd = ptr_cmplx_sin_twiddle[step];
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker accu_3 = (accu_1 * twd.re) - (accu_2 * twd.im);
189*15dc779aSAndroid Build Coastguard Worker accu_4 = (accu_1 * twd.im) + (accu_2 * twd.re);
190*15dc779aSAndroid Build Coastguard Worker ptr_data_1[0] = -accu_3;
191*15dc779aSAndroid Build Coastguard Worker ptr_data_0[1] = -accu_4;
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker ptr_data_0 += 2;
194*15dc779aSAndroid Build Coastguard Worker ptr_data_1 -= 2;
195*15dc779aSAndroid Build Coastguard Worker
196*15dc779aSAndroid Build Coastguard Worker accu_3 = (ptr_data_0[1] * twd.re) - (ptr_data_0[0] * twd.im);
197*15dc779aSAndroid Build Coastguard Worker accu_4 = (ptr_data_0[1] * twd.im) + (ptr_data_0[0] * twd.re);
198*15dc779aSAndroid Build Coastguard Worker accu_1 = ptr_data_1[0];
199*15dc779aSAndroid Build Coastguard Worker accu_2 = ptr_data_1[1];
200*15dc779aSAndroid Build Coastguard Worker
201*15dc779aSAndroid Build Coastguard Worker ptr_data_0[0] = accu_3;
202*15dc779aSAndroid Build Coastguard Worker ptr_data_1[1] = -accu_4;
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker
205*15dc779aSAndroid Build Coastguard Worker accu_1 = (accu_1 * SQUARE_ROOT_TWO);
206*15dc779aSAndroid Build Coastguard Worker accu_2 = (accu_2 * SQUARE_ROOT_TWO);
207*15dc779aSAndroid Build Coastguard Worker ptr_data_1[0] = (accu_1 + accu_2) / 2;
208*15dc779aSAndroid Build Coastguard Worker ptr_data_0[1] = (accu_1 - accu_2) / 2;
209*15dc779aSAndroid Build Coastguard Worker
210*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
211*15dc779aSAndroid Build Coastguard Worker }
212