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 "iusace_block_switch_const.h"
23*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
24*15dc779aSAndroid Build Coastguard Worker #include "iusace_rom.h"
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
26*15dc779aSAndroid Build Coastguard Worker
27*15dc779aSAndroid Build Coastguard Worker /* DRC */
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
35*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
36*15dc779aSAndroid Build Coastguard Worker
37*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
38*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
39*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
40*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_fft.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_tcx_mdct.h"
43*15dc779aSAndroid Build Coastguard Worker
iusace_tcx_mdct_main(FLOAT32 * ptr_in,FLOAT32 * ptr_out,WORD32 l,WORD32 m,WORD32 r,iusace_scratch_mem * pstr_scratch)44*15dc779aSAndroid Build Coastguard Worker VOID iusace_tcx_mdct_main(FLOAT32 *ptr_in, FLOAT32 *ptr_out, WORD32 l, WORD32 m, WORD32 r,
45*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch) {
46*15dc779aSAndroid Build Coastguard Worker WORD32 length = l / 2 + m + r / 2;
47*15dc779aSAndroid Build Coastguard Worker FLOAT32 *input = pstr_scratch->p_tcx_input;
48*15dc779aSAndroid Build Coastguard Worker WORD32 i;
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < m / 2; i++) {
51*15dc779aSAndroid Build Coastguard Worker input[m / 2 + r / 2 + i] = -ptr_in[l + m / 2 - 1 - i];
52*15dc779aSAndroid Build Coastguard Worker }
53*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < l / 2; i++) {
54*15dc779aSAndroid Build Coastguard Worker input[m / 2 + r / 2 + m / 2 + i] = ptr_in[i] - ptr_in[l - 1 - i];
55*15dc779aSAndroid Build Coastguard Worker }
56*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < m / 2; i++) {
57*15dc779aSAndroid Build Coastguard Worker input[m / 2 + r / 2 - 1 - i] = -ptr_in[l + m / 2 + i];
58*15dc779aSAndroid Build Coastguard Worker }
59*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < r / 2; i++) {
60*15dc779aSAndroid Build Coastguard Worker input[m / 2 + r / 2 - 1 - m / 2 - i] = -ptr_in[l + m + i] - ptr_in[l + m + r - 1 - i];
61*15dc779aSAndroid Build Coastguard Worker }
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct(input, ptr_out, length, pstr_scratch);
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker return;
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker
iusace_tcx_imdct(FLOAT32 * ptr_in,FLOAT32 * ptr_out,WORD32 l,WORD32 m,WORD32 r,iusace_scratch_mem * pstr_scratch)68*15dc779aSAndroid Build Coastguard Worker VOID iusace_tcx_imdct(FLOAT32 *ptr_in, FLOAT32 *ptr_out, WORD32 l, WORD32 m, WORD32 r,
69*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch) {
70*15dc779aSAndroid Build Coastguard Worker WORD32 length = l / 2 + m + r / 2;
71*15dc779aSAndroid Build Coastguard Worker FLOAT32 *output = pstr_scratch->p_tcx_output;
72*15dc779aSAndroid Build Coastguard Worker iusace_tcx_mdct(ptr_in, output, length, pstr_scratch);
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker WORD32 i;
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < m / 2; i++) {
77*15dc779aSAndroid Build Coastguard Worker ptr_out[l + m / 2 - 1 - i] = -1.0f * output[m / 2 + r / 2 + i];
78*15dc779aSAndroid Build Coastguard Worker }
79*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < l / 2; i++) {
80*15dc779aSAndroid Build Coastguard Worker ptr_out[i] = output[m / 2 + r / 2 + m / 2 + i];
81*15dc779aSAndroid Build Coastguard Worker ptr_out[l - 1 - i] = -1.0f * output[m / 2 + r / 2 + m / 2 + i];
82*15dc779aSAndroid Build Coastguard Worker }
83*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < m / 2; i++) {
84*15dc779aSAndroid Build Coastguard Worker ptr_out[l + m / 2 + i] = -1.0f * output[m / 2 + r / 2 - 1 - i];
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < r / 2; i++) {
87*15dc779aSAndroid Build Coastguard Worker ptr_out[l + m + i] = -1.0f * output[m / 2 + r / 2 - 1 - m / 2 - i];
88*15dc779aSAndroid Build Coastguard Worker ptr_out[l + m + r - 1 - i] = -1.0f * output[m / 2 + r / 2 - 1 - m / 2 - i];
89*15dc779aSAndroid Build Coastguard Worker }
90*15dc779aSAndroid Build Coastguard Worker return;
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker
iusace_get_pre_post_twid(FLOAT32 ** ptr_pre_twid_re,FLOAT32 ** ptr_pre_twid_im,FLOAT32 ** ptr_post_twid_re,FLOAT32 ** ptr_post_twid_im,WORD32 length)93*15dc779aSAndroid Build Coastguard Worker static VOID iusace_get_pre_post_twid(FLOAT32 **ptr_pre_twid_re, FLOAT32 **ptr_pre_twid_im,
94*15dc779aSAndroid Build Coastguard Worker FLOAT32 **ptr_post_twid_re, FLOAT32 **ptr_post_twid_im,
95*15dc779aSAndroid Build Coastguard Worker WORD32 length) {
96*15dc779aSAndroid Build Coastguard Worker switch (length) {
97*15dc779aSAndroid Build Coastguard Worker case 512:
98*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_256[0][0];
99*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_256[1][0];
100*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_256[2][0];
101*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_256[3][0];
102*15dc779aSAndroid Build Coastguard Worker break;
103*15dc779aSAndroid Build Coastguard Worker case 256:
104*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_128[0][0];
105*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_128[1][0];
106*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_128[2][0];
107*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_128[3][0];
108*15dc779aSAndroid Build Coastguard Worker break;
109*15dc779aSAndroid Build Coastguard Worker case 128:
110*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_64[0][0];
111*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_64[1][0];
112*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_64[2][0];
113*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_64[3][0];
114*15dc779aSAndroid Build Coastguard Worker break;
115*15dc779aSAndroid Build Coastguard Worker case 64:
116*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_32[0][0];
117*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_32[1][0];
118*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_32[2][0];
119*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_32[3][0];
120*15dc779aSAndroid Build Coastguard Worker break;
121*15dc779aSAndroid Build Coastguard Worker default:
122*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_512[0][0];
123*15dc779aSAndroid Build Coastguard Worker *ptr_pre_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_512[1][0];
124*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_re = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_512[2][0];
125*15dc779aSAndroid Build Coastguard Worker *ptr_post_twid_im = (FLOAT32 *)&iusace_pre_post_twid_cos_sin_512[3][0];
126*15dc779aSAndroid Build Coastguard Worker }
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker return;
129*15dc779aSAndroid Build Coastguard Worker }
130*15dc779aSAndroid Build Coastguard Worker
iusace_pre_twid(FLOAT32 * ptr_twid_re,FLOAT32 * ptr_twid_im,FLOAT32 * ptr_in,WORD32 length)131*15dc779aSAndroid Build Coastguard Worker static VOID iusace_pre_twid(FLOAT32 *ptr_twid_re, FLOAT32 *ptr_twid_im, FLOAT32 *ptr_in,
132*15dc779aSAndroid Build Coastguard Worker WORD32 length) {
133*15dc779aSAndroid Build Coastguard Worker WORD32 i;
134*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
135*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp = ptr_in[2 * i] * ptr_twid_re[i] - ptr_in[2 * i + 1] * ptr_twid_im[i];
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker ptr_in[2 * i + 1] = ptr_in[2 * i] * ptr_twid_im[i] + ptr_in[2 * i + 1] * ptr_twid_re[i];
138*15dc779aSAndroid Build Coastguard Worker
139*15dc779aSAndroid Build Coastguard Worker ptr_in[2 * i] = temp;
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker return;
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker
iusace_post_twid(FLOAT32 * ptr_twid_re,FLOAT32 * ptr_twid_im,FLOAT32 * ptr_in,WORD32 length)144*15dc779aSAndroid Build Coastguard Worker static VOID iusace_post_twid(FLOAT32 *ptr_twid_re, FLOAT32 *ptr_twid_im, FLOAT32 *ptr_in,
145*15dc779aSAndroid Build Coastguard Worker WORD32 length) {
146*15dc779aSAndroid Build Coastguard Worker WORD32 i;
147*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
148*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp = ptr_in[2 * i] * ptr_twid_re[i] - ptr_in[2 * i + 1] * ptr_twid_im[i];
149*15dc779aSAndroid Build Coastguard Worker
150*15dc779aSAndroid Build Coastguard Worker ptr_in[2 * i + 1] = -ptr_in[2 * i] * ptr_twid_im[i] - ptr_in[2 * i + 1] * ptr_twid_re[i];
151*15dc779aSAndroid Build Coastguard Worker ptr_in[2 * i] = temp;
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker return;
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker
iusace_tcx_mdct(FLOAT32 * ptr_in,FLOAT32 * ptr_out,WORD32 length,iusace_scratch_mem * pstr_scratch)156*15dc779aSAndroid Build Coastguard Worker VOID iusace_tcx_mdct(FLOAT32 *ptr_in, FLOAT32 *ptr_out, WORD32 length,
157*15dc779aSAndroid Build Coastguard Worker iusace_scratch_mem *pstr_scratch) {
158*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_pre_twid_re, *ptr_pre_twid_im;
159*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_post_twid_re, *ptr_post_twid_im;
160*15dc779aSAndroid Build Coastguard Worker WORD32 i;
161*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_real = pstr_scratch->p_temp_mdct;
162*15dc779aSAndroid Build Coastguard Worker WORD32 len_by_2 = length >> 1;
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker iusace_get_pre_post_twid(&ptr_pre_twid_re, &ptr_pre_twid_im, &ptr_post_twid_re,
165*15dc779aSAndroid Build Coastguard Worker &ptr_post_twid_im, length);
166*15dc779aSAndroid Build Coastguard Worker
167*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < len_by_2; i++) {
168*15dc779aSAndroid Build Coastguard Worker ptr_real[2 * i] = ptr_in[2 * i];
169*15dc779aSAndroid Build Coastguard Worker ptr_real[2 * i + 1] = ptr_in[length - 1 - 2 * i];
170*15dc779aSAndroid Build Coastguard Worker }
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker /* pre twiddle */
173*15dc779aSAndroid Build Coastguard Worker iusace_pre_twid(ptr_pre_twid_re, ptr_pre_twid_im, ptr_real, len_by_2);
174*15dc779aSAndroid Build Coastguard Worker
175*15dc779aSAndroid Build Coastguard Worker iusace_complex_fft(ptr_real, len_by_2, pstr_scratch);
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker /* post twiddle */
178*15dc779aSAndroid Build Coastguard Worker iusace_post_twid(ptr_post_twid_re, ptr_post_twid_im, ptr_real, len_by_2);
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < len_by_2; i++) {
181*15dc779aSAndroid Build Coastguard Worker ptr_out[2 * i] = ptr_real[2 * i];
182*15dc779aSAndroid Build Coastguard Worker ptr_out[length - 1 - 2 * i] = ptr_real[2 * i + 1];
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker return;
186*15dc779aSAndroid Build Coastguard Worker }
187