xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_rom.h (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 #pragma once
22*15dc779aSAndroid Build Coastguard Worker #define AACENC_MAX_CHANNELS 2 /* encoder max channels */
23*15dc779aSAndroid Build Coastguard Worker #define AACENC_TRANS_FAC 8    /* encoder WORD16 long ratio */
24*15dc779aSAndroid Build Coastguard Worker #define AACENC_PCM_LEVEL 1.0  /* encoder pcm 0db refernence */
25*15dc779aSAndroid Build Coastguard Worker 
26*15dc779aSAndroid Build Coastguard Worker #define LD_FFT_TWIDDLE_TABLE_SIZE 9
27*15dc779aSAndroid Build Coastguard Worker #define FFT_TWIDDLE_TABLE_SIZE (1 << LD_FFT_TWIDDLE_TABLE_SIZE)
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker /*MDCT Tables*/
30*15dc779aSAndroid Build Coastguard Worker typedef struct {
31*15dc779aSAndroid Build Coastguard Worker   UWORD8 re_arr_tab_16[240];
32*15dc779aSAndroid Build Coastguard Worker   UWORD8 re_arr_tab_sml_240[240];
33*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 cosine_array_960[480];
34*15dc779aSAndroid Build Coastguard Worker   WORD32 dig_rev_tab_16[2];
35*15dc779aSAndroid Build Coastguard Worker   WORD16 w_16[24];
36*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 cosine_array_1024[512];
37*15dc779aSAndroid Build Coastguard Worker   const WORD16 w_256[512];
38*15dc779aSAndroid Build Coastguard Worker   const WORD32 dig_rev_table_512[32];
39*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 win_512_ld[1920];
40*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 win_480_ld[1800];
41*15dc779aSAndroid Build Coastguard Worker } ixheaace_mdct_tables;
42*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_mdct_tables ixheaace_enc_mdct_tab;
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker /*Huffman Tables*/
45*15dc779aSAndroid Build Coastguard Worker typedef struct {
46*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltab1_2[3][3][3][3];
47*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltab3_4[3][3][3][3];
48*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltab5_6[9][27];
49*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltab7_8[8][27];
50*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltab9_10[13][27];
51*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltab11[17][27];
52*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ltabscf[121];
53*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab1[3][3][3][3];
54*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab2[3][3][3][3];
55*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab3[3][3][3][3];
56*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab4[3][3][3][3];
57*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab5[9][9];
58*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab6[9][9];
59*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab7[8][8];
60*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab8[8][8];
61*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab9[13][13];
62*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab10[13][13];
63*15dc779aSAndroid Build Coastguard Worker   const UWORD16 huff_ctab11[17][17];
64*15dc779aSAndroid Build Coastguard Worker   const UWORD32 huff_ctabscf[121];
65*15dc779aSAndroid Build Coastguard Worker } ixheaace_huffman_tables;
66*15dc779aSAndroid Build Coastguard Worker 
67*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_huffman_tables ixheaace_enc_huff_tab;
68*15dc779aSAndroid Build Coastguard Worker 
69*15dc779aSAndroid Build Coastguard Worker typedef struct {
70*15dc779aSAndroid Build Coastguard Worker   WORD32 sample_rate;
71*15dc779aSAndroid Build Coastguard Worker   const UWORD8 param_long[MAXIMUM_SCALE_FACTOR_BAND_LONG];
72*15dc779aSAndroid Build Coastguard Worker   const UWORD8 param_short[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
73*15dc779aSAndroid Build Coastguard Worker   const UWORD8 param_long_960[MAXIMUM_SCALE_FACTOR_BAND_LONG];
74*15dc779aSAndroid Build Coastguard Worker   const UWORD8 param_short_120[1 + MAXIMUM_SCALE_FACTOR_BAND_SHORT];
75*15dc779aSAndroid Build Coastguard Worker   const UWORD8 param_long_512_ld[MAXIMUM_SCALE_FACTOR_BAND_LONG];
76*15dc779aSAndroid Build Coastguard Worker   const UWORD8 param_long_480_ld[MAXIMUM_SCALE_FACTOR_BAND_LONG];
77*15dc779aSAndroid Build Coastguard Worker } ixheaace_sfb_info_tab;
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker /*Psychoacostics Tables*/
80*15dc779aSAndroid Build Coastguard Worker typedef struct {
81*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 ixheaace_bark_quiet_thr_val[25];
82*15dc779aSAndroid Build Coastguard Worker   const WORD32 pow_point_25_Q23[128];
83*15dc779aSAndroid Build Coastguard Worker   const WORD32 q_mod_4_inv_pow_point_25_Q32[4];
84*15dc779aSAndroid Build Coastguard Worker   const ixheaace_sfb_info_tab sfb_info_tab[12];
85*15dc779aSAndroid Build Coastguard Worker } ixheaace_psycho_tables;
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_psycho_tables ixheaace_enc_psycho_tab;
88*15dc779aSAndroid Build Coastguard Worker 
89*15dc779aSAndroid Build Coastguard Worker /*Quantizer tables*/
90*15dc779aSAndroid Build Coastguard Worker typedef struct {
91*15dc779aSAndroid Build Coastguard Worker   const WORD q_quant_table_E_fix[17];
92*15dc779aSAndroid Build Coastguard Worker   const WORD q_inv_quant_table_E_fix[17];
93*15dc779aSAndroid Build Coastguard Worker   const WORD32 quant_table_q_Q30[16];
94*15dc779aSAndroid Build Coastguard Worker   const WORD32 inv_quant_table_q_Q27[16];
95*15dc779aSAndroid Build Coastguard Worker   const WORD32 power_3_by_4_tab[512];
96*15dc779aSAndroid Build Coastguard Worker   const WORD32 power_4_by_3_tab_fix[64];
97*15dc779aSAndroid Build Coastguard Worker   const WORD16 power_2_n_4_by_3_tab[10];
98*15dc779aSAndroid Build Coastguard Worker } ixheaace_quant_tables;
99*15dc779aSAndroid Build Coastguard Worker 
100*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_quant_tables ixheaace_enc_quant_tab;
101*15dc779aSAndroid Build Coastguard Worker typedef struct {
102*15dc779aSAndroid Build Coastguard Worker   const ixheaace_temporal_noise_shaping_max_table tns_max_bands_table[12];
103*15dc779aSAndroid Build Coastguard Worker   const ixheaace_temporal_noise_shaping_info_tab tns_info_tab[5];
104*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 tns_coeff_3[8];
105*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 tns_coeff_3_borders[8];
106*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 tns_coeff_4[16];
107*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 tns_coeff_4_borders[16];
108*15dc779aSAndroid Build Coastguard Worker } ixheaace_temporal_noise_shaping_tables;
109*15dc779aSAndroid Build Coastguard Worker 
110*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_temporal_noise_shaping_tables ixheaace_enhaacplus_enc_tns_tab;
111*15dc779aSAndroid Build Coastguard Worker 
112*15dc779aSAndroid Build Coastguard Worker typedef struct {
113*15dc779aSAndroid Build Coastguard Worker   ixheaace_mdct_tables *pstr_mdct_tab;
114*15dc779aSAndroid Build Coastguard Worker   ixheaace_huffman_tables *pstr_huff_tab;
115*15dc779aSAndroid Build Coastguard Worker   ixheaace_psycho_tables *pstr_psycho_tab;
116*15dc779aSAndroid Build Coastguard Worker   ixheaace_quant_tables *pstr_quant_tab;
117*15dc779aSAndroid Build Coastguard Worker   ixheaace_temporal_noise_shaping_tables *pstr_tns_tab;
118*15dc779aSAndroid Build Coastguard Worker } ixheaace_aac_tables;
119*15dc779aSAndroid Build Coastguard Worker 
120*15dc779aSAndroid Build Coastguard Worker extern ixheaace_aac_tables ixheaace_enc_aac_tab;
121*15dc779aSAndroid Build Coastguard Worker 
122*15dc779aSAndroid Build Coastguard Worker /***************/
123*15dc779aSAndroid Build Coastguard Worker /*
124*15dc779aSAndroid Build Coastguard Worker input buffer (1ch)
125*15dc779aSAndroid Build Coastguard Worker 
126*15dc779aSAndroid Build Coastguard Worker   |------- 288 --------|--------------- 2048 -------------|
127*15dc779aSAndroid Build Coastguard Worker   spectral_band_replication_2core delay      Read, SBR, downmix and ds area
128*15dc779aSAndroid Build Coastguard Worker   (downsampled)
129*15dc779aSAndroid Build Coastguard Worker */
130*15dc779aSAndroid Build Coastguard Worker #define CORE_DELAY_LC (1600)
131*15dc779aSAndroid Build Coastguard Worker // LC Delay = (Core-delay LC) * 2 + SBR Decoder Delay - SBR Encoder Delay + Magic
132*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_LC ((CORE_DELAY_LC)*2 + 6 * 64 - 2048 + 1)
133*15dc779aSAndroid Build Coastguard Worker #define CORE_DELAY_LD_512 (512)
134*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_LD_512 ((CORE_DELAY_LD_512)*2 - 1024 + 1)
135*15dc779aSAndroid Build Coastguard Worker // ELD Delay = (Core-delay LD) * 2 + SBR Decoder Delay - SBR Encoder Delay
136*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_ELD_512 ((CORE_DELAY_LD_512)*2 + 0 - (16 * 64))
137*15dc779aSAndroid Build Coastguard Worker // Original ELD delay value retained for multichannel files with MPS
138*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_ELD_512_MPS ((CORE_DELAY_LD_512)*2 + 1)
139*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_ELDV2_512 ((CORE_DELAY_LD_512 * 2) + 128 + 1)
140*15dc779aSAndroid Build Coastguard Worker 
141*15dc779aSAndroid Build Coastguard Worker #define CORE_DELAY_LD_480 (480)
142*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_LD_480 ((CORE_DELAY_LD_480)*2 - 1024 + 1)
143*15dc779aSAndroid Build Coastguard Worker // ELD Delay = (Core-delay LD / 2) * 2 + SBR Decoder Delay - SBR Encoder Delay
144*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_ELD_480 ((CORE_DELAY_LD_480 / 2) * 2 + 0 - (15 * 64) + 576)
145*15dc779aSAndroid Build Coastguard Worker // Original ELD delay value retained for multichannel files with MPS
146*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_ELD_480_MPS (CORE_DELAY_LD_480 * 2 + 1)
147*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY_ELDV2_480 ((CORE_DELAY_LD_480 * 2) + 128 + 1)
148*15dc779aSAndroid Build Coastguard Worker #define CORE_DELAY (1600)
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker /* ((1600 (core codec)*2 (multi rate) + 6 *(spectral_band_replication_ dec delay) -
151*15dc779aSAndroid Build Coastguard Worker  * (spectral_band_replication_ enc delay) + magic*/
152*15dc779aSAndroid Build Coastguard Worker #define INPUT_DELAY ((CORE_DELAY)*2 + 6 * 64 - 2048 + 1)
153*15dc779aSAndroid Build Coastguard Worker 
154*15dc779aSAndroid Build Coastguard Worker /* For 2:1 resampler -> max phase delay * resamp_fac */
155*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_DS_2_1_FILTER_DELAY (16)
156*15dc779aSAndroid Build Coastguard Worker 
157*15dc779aSAndroid Build Coastguard Worker /* For 4:1 resampler -> max phase delay * resamp_fac */
158*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_DS_4_1_FILTER_DELAY (64)
159*15dc779aSAndroid Build Coastguard Worker 
160*15dc779aSAndroid Build Coastguard Worker /* For 8:1 resampler -> max phase delay * resamp_fac */
161*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_DS_8_1_FILTER_DELAY (248)
162*15dc779aSAndroid Build Coastguard Worker 
163*15dc779aSAndroid Build Coastguard Worker /* For 1:3 resampler -> max phase delay * resamp_fac */
164*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_DS_1_3_FILTER_DELAY (36)
165*15dc779aSAndroid Build Coastguard Worker 
166*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_fd_quant_table[257];
167*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_fd_inv_quant_table[257];
168*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_pow_4_3_table[64];
169*15dc779aSAndroid Build Coastguard Worker extern const WORD32 ixheaace_huffman_code_table[121][2];
170*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 long_window_KBD[1024];
171*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 long_window_sine_960[960];
172*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 fft_twiddle_tab[FFT_TWIDDLE_TABLE_SIZE + 1];
173*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 long_window_sine[1024];
174*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 long_window_sine_ld[512];
175*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 long_window_sine_ld_480[480];
176*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 short_window_sine[FRAME_LEN_SHORT_128];
177*15dc779aSAndroid Build Coastguard Worker 
178*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 short_window_sine_120[FRAME_LEN_SHORT_120];
179*15dc779aSAndroid Build Coastguard Worker 
180*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 iaace_iir_hipass_coeffs[2];
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker extern const WORD32 iaace_suggested_grouping_table[TRANS_FAC][MAXIMUM_NO_OF_GROUPS];
183*15dc779aSAndroid Build Coastguard Worker 
184*15dc779aSAndroid Build Coastguard Worker extern const WORD32 iaace_synchronized_block_types[4][4];
185*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_mix_rad_twid_tbl[TRANS_FAC];
186*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_mix_rad_twid_tbl_h[TRANS_FAC];
187*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 cos_sin_table_flt[960];
188*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_fft_mix_rad_twid_tbl_32[(FFT16 - 1) * (FFT2 - 1)];
189*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_fft_mix_rad_twid_tbl_h_32[(FFT16 - 1) * (FFT2 - 1)];
190*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_fft_mix_rad_twid_tbl_480[(FFT15 - 1) * (FFT32 - 1)];
191*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_fft_mix_rad_twid_h_tbl_480[(FFT15 - 1) * (FFT32 - 1)];
192*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 ixheaace_cosine_array_240[120];
193*15dc779aSAndroid Build Coastguard Worker extern const WORD16 re_arr_tab_5[16];
194*15dc779aSAndroid Build Coastguard Worker extern const WORD16 re_arr_tab_3[16];
195*15dc779aSAndroid Build Coastguard Worker extern const WORD16 re_arr_tab_sml[16];
196*15dc779aSAndroid Build Coastguard Worker extern const WORD16 re_arr_tab_4[60];
197*15dc779aSAndroid Build Coastguard Worker extern const WORD16 re_arr_tab_120[60];
198*15dc779aSAndroid Build Coastguard Worker extern const WORD16 re_arr_tab_15_4[60];
199*15dc779aSAndroid Build Coastguard Worker extern const FLOAT32 low_delay_window_eld[2048];
200*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_bandwidth_table bandwidth_table_lc[9];
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_bandwidth_table bandwidth_table_ld_22050[11];
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_bandwidth_table bandwidth_table_ld_24000[11];
205*15dc779aSAndroid Build Coastguard Worker 
206*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_bandwidth_table bandwidth_table_ld_32000[11];
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_bandwidth_table bandwidth_table_ld_44100[11];
209*15dc779aSAndroid Build Coastguard Worker 
210*15dc779aSAndroid Build Coastguard Worker extern const ixheaace_bandwidth_table bandwidth_table_ld_48000[11];
211