xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_ps_enc_init.c (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 #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_enc.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
35*15dc779aSAndroid Build Coastguard Worker 
ixheaace_get_ps_mode(WORD32 bitrate)36*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaace_get_ps_mode(WORD32 bitrate) {
37*15dc779aSAndroid Build Coastguard Worker   WORD32 ps_mode = 0;
38*15dc779aSAndroid Build Coastguard Worker 
39*15dc779aSAndroid Build Coastguard Worker   if (bitrate < 21000) {
40*15dc779aSAndroid Build Coastguard Worker     ps_mode = PS_MODE_LOW_FREQ_RES_IID_ICC;
41*15dc779aSAndroid Build Coastguard Worker   }
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker   return ps_mode;
44*15dc779aSAndroid Build Coastguard Worker }
45*15dc779aSAndroid Build Coastguard Worker 
46*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_create_ps_enc(ixheaace_pstr_ps_enc pstr_ps_enc,WORD32 ps_mode,FLOAT32 * ptr_common_buffer,FLOAT32 * ptr_common_buffer2,FLOAT32 * ptr_ps_buf3)47*15dc779aSAndroid Build Coastguard Worker ixheaace_create_ps_enc(ixheaace_pstr_ps_enc pstr_ps_enc, WORD32 ps_mode,
48*15dc779aSAndroid Build Coastguard Worker                        FLOAT32 *ptr_common_buffer, FLOAT32 *ptr_common_buffer2,
49*15dc779aSAndroid Build Coastguard Worker                        FLOAT32 *ptr_ps_buf3) {
50*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
51*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err = IA_NO_ERROR;
52*15dc779aSAndroid Build Coastguard Worker 
53*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr1, *ptr2, *ptr3, *ptr4;
54*15dc779aSAndroid Build Coastguard Worker 
55*15dc779aSAndroid Build Coastguard Worker   if (pstr_ps_enc == NULL) {
56*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_INIT_FATAL_PS_INIT_FAILED;
57*15dc779aSAndroid Build Coastguard Worker   }
58*15dc779aSAndroid Build Coastguard Worker   ptr1 = &ptr_common_buffer2[IXHEAACE_QMF_TIME_SLOTS * IXHEAACE_QMF_CHANNELS];
59*15dc779aSAndroid Build Coastguard Worker   ptr2 = pstr_ps_enc->ps_buf2;
60*15dc779aSAndroid Build Coastguard Worker   ptr3 = ptr_ps_buf3;
61*15dc779aSAndroid Build Coastguard Worker   ptr4 = &ptr_common_buffer[5 * NO_OF_ESTIMATES * MAXIMUM_FREQ_COEFFS];
62*15dc779aSAndroid Build Coastguard Worker 
63*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->ps_mode = ps_mode;
64*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->b_prev_zero_iid = 0;
65*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->b_prev_zero_icc = 0;
66*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->b_hi_freq_res_iid_icc = ((ps_mode & PS_MODE_LOW_FREQ_RES_IID_ICC) != 0) ? 0 : 1;
67*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->iid_icc_bins =
68*15dc779aSAndroid Build Coastguard Worker       (pstr_ps_enc->b_hi_freq_res_iid_icc) ? NUMBER_OF_IID_BINS : NUMBER_OF_LOW_RES_IID_BINS;
69*15dc779aSAndroid Build Coastguard Worker 
70*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->aaa_ICC_data_buf = (FLOAT32 **)ptr1;
71*15dc779aSAndroid Build Coastguard Worker   ptr1 += NUMBER_OF_BINS * sizeof(FLOAT32 *) / sizeof(FLOAT32);
72*15dc779aSAndroid Build Coastguard Worker 
73*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->aaa_IID_data_buf = (FLOAT32 **)ptr1;
74*15dc779aSAndroid Build Coastguard Worker   ptr1 += NUMBER_OF_BINS * sizeof(FLOAT32 *) / sizeof(FLOAT32);
75*15dc779aSAndroid Build Coastguard Worker 
76*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < NUMBER_OF_BINS; i++) {
77*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->aaa_ICC_data_buf[i] = ptr1;
78*15dc779aSAndroid Build Coastguard Worker     ptr1 += SYSTEMLOOKAHEAD + 1;
79*15dc779aSAndroid Build Coastguard Worker 
80*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->aaa_ICC_data_buf[i], 0,
81*15dc779aSAndroid Build Coastguard Worker            (SYSTEMLOOKAHEAD + 1) * sizeof(pstr_ps_enc->aaa_ICC_data_buf[0]));
82*15dc779aSAndroid Build Coastguard Worker 
83*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->aaa_IID_data_buf[i] = ptr1;
84*15dc779aSAndroid Build Coastguard Worker     ptr1 += SYSTEMLOOKAHEAD + 1;
85*15dc779aSAndroid Build Coastguard Worker 
86*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->aaa_IID_data_buf[i], 0,
87*15dc779aSAndroid Build Coastguard Worker            (SYSTEMLOOKAHEAD + 1) * sizeof(pstr_ps_enc->aaa_IID_data_buf[0]));
88*15dc779aSAndroid Build Coastguard Worker   }
89*15dc779aSAndroid Build Coastguard Worker 
90*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->ptr_hybrid_left = &pstr_ps_enc->hybrid_left;
91*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->ptr_hybrid_right = &pstr_ps_enc->hybrid_right;
92*15dc779aSAndroid Build Coastguard Worker 
93*15dc779aSAndroid Build Coastguard Worker   err = ixheaace_create_hybrid_filter_bank(pstr_ps_enc->ptr_hybrid_left, &ptr4);
94*15dc779aSAndroid Build Coastguard Worker 
95*15dc779aSAndroid Build Coastguard Worker   if (err) {
96*15dc779aSAndroid Build Coastguard Worker     return err;
97*15dc779aSAndroid Build Coastguard Worker   }
98*15dc779aSAndroid Build Coastguard Worker 
99*15dc779aSAndroid Build Coastguard Worker   err = ixheaace_create_hybrid_filter_bank(pstr_ps_enc->ptr_hybrid_right, &ptr4);
100*15dc779aSAndroid Build Coastguard Worker 
101*15dc779aSAndroid Build Coastguard Worker   if (err) {
102*15dc779aSAndroid Build Coastguard Worker     return err;
103*15dc779aSAndroid Build Coastguard Worker   }
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < NUMBER_OF_SUBSAMPLES; i++) {
106*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->m_hybrid_real_left[i] = ptr3;
107*15dc779aSAndroid Build Coastguard Worker     ptr3 += IXHEAACE_NUM_HYBRID_BANDS;
108*15dc779aSAndroid Build Coastguard Worker 
109*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->m_hybrid_real_left[i], 0,
110*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_NUM_HYBRID_BANDS * sizeof(pstr_ps_enc->m_hybrid_real_left[0]));
111*15dc779aSAndroid Build Coastguard Worker 
112*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->m_hybrid_imag_left[i] = ptr3;
113*15dc779aSAndroid Build Coastguard Worker     ptr3 += IXHEAACE_NUM_HYBRID_BANDS;
114*15dc779aSAndroid Build Coastguard Worker 
115*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->m_hybrid_imag_left[i], 0,
116*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_NUM_HYBRID_BANDS * sizeof(pstr_ps_enc->m_hybrid_imag_left[0]));
117*15dc779aSAndroid Build Coastguard Worker 
118*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->m_hybrid_real_right[i] = ptr1;
119*15dc779aSAndroid Build Coastguard Worker     ptr1 += IXHEAACE_NUM_HYBRID_BANDS;
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->m_hybrid_real_right[i], 0,
122*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_NUM_HYBRID_BANDS * sizeof(pstr_ps_enc->m_hybrid_real_right[0]));
123*15dc779aSAndroid Build Coastguard Worker 
124*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->m_hybrid_imag_right[i] = ptr1;
125*15dc779aSAndroid Build Coastguard Worker     ptr1 += IXHEAACE_NUM_HYBRID_BANDS;
126*15dc779aSAndroid Build Coastguard Worker 
127*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->m_hybrid_imag_right[i], 0,
128*15dc779aSAndroid Build Coastguard Worker            IXHEAACE_NUM_HYBRID_BANDS * sizeof(pstr_ps_enc->m_hybrid_imag_right[0]));
129*15dc779aSAndroid Build Coastguard Worker   }
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->temp_qmf_left_real = (FLOAT32 **)ptr1;
132*15dc779aSAndroid Build Coastguard Worker   ptr1 += IXHEAACE_HYBRID_FILTER_DELAY * sizeof(FLOAT32 *) / sizeof(FLOAT32);
133*15dc779aSAndroid Build Coastguard Worker 
134*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->temp_qmf_left_imag = (FLOAT32 **)ptr1;
135*15dc779aSAndroid Build Coastguard Worker   ptr1 += IXHEAACE_HYBRID_FILTER_DELAY * sizeof(WORD32 *) / sizeof(WORD32);
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->hist_qmf_left_real = (FLOAT32 **)ptr2;
138*15dc779aSAndroid Build Coastguard Worker   ptr2 += IXHEAACE_HYBRID_FILTER_DELAY * sizeof(FLOAT32 *) / sizeof(FLOAT32);
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->hist_qmf_left_imag = (FLOAT32 **)ptr2;
141*15dc779aSAndroid Build Coastguard Worker   ptr2 += IXHEAACE_HYBRID_FILTER_DELAY * sizeof(FLOAT32 *) / sizeof(FLOAT32);
142*15dc779aSAndroid Build Coastguard Worker 
143*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->hist_qmf_right_real = (FLOAT32 **)ptr2;
144*15dc779aSAndroid Build Coastguard Worker   ptr2 += IXHEAACE_HYBRID_FILTER_DELAY * sizeof(FLOAT32 *) / sizeof(FLOAT32);
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->hist_qmf_right_imag = (FLOAT32 **)ptr2;
147*15dc779aSAndroid Build Coastguard Worker   ptr2 += IXHEAACE_HYBRID_FILTER_DELAY * sizeof(FLOAT32 *) / sizeof(FLOAT32);
148*15dc779aSAndroid Build Coastguard Worker 
149*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < IXHEAACE_HYBRID_FILTER_DELAY; i++) {
150*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->temp_qmf_left_real[i] = ptr1;
151*15dc779aSAndroid Build Coastguard Worker     ptr1 += NUMBER_OF_QMF_BANDS;
152*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->temp_qmf_left_real[i], 0,
153*15dc779aSAndroid Build Coastguard Worker            NUMBER_OF_QMF_BANDS * sizeof(pstr_ps_enc->temp_qmf_left_real[0]));
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->temp_qmf_left_imag[i] = ptr1;
156*15dc779aSAndroid Build Coastguard Worker     ptr1 += NUMBER_OF_QMF_BANDS;
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->temp_qmf_left_imag[i], 0,
159*15dc779aSAndroid Build Coastguard Worker            NUMBER_OF_QMF_BANDS * sizeof(pstr_ps_enc->temp_qmf_left_imag[0]));
160*15dc779aSAndroid Build Coastguard Worker 
161*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->hist_qmf_left_real[i] = ptr2;
162*15dc779aSAndroid Build Coastguard Worker     ptr2 += NUMBER_OF_QMF_BANDS;
163*15dc779aSAndroid Build Coastguard Worker 
164*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->hist_qmf_left_real[i], 0,
165*15dc779aSAndroid Build Coastguard Worker            NUMBER_OF_QMF_BANDS * sizeof(pstr_ps_enc->hist_qmf_left_real[0]));
166*15dc779aSAndroid Build Coastguard Worker 
167*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->hist_qmf_left_imag[i] = ptr2;
168*15dc779aSAndroid Build Coastguard Worker     ptr2 += NUMBER_OF_QMF_BANDS;
169*15dc779aSAndroid Build Coastguard Worker 
170*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->hist_qmf_left_imag[i], 0,
171*15dc779aSAndroid Build Coastguard Worker            NUMBER_OF_QMF_BANDS * sizeof(pstr_ps_enc->hist_qmf_left_imag[0]));
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->hist_qmf_right_real[i] = ptr2;
174*15dc779aSAndroid Build Coastguard Worker     ptr2 += NUMBER_OF_QMF_BANDS;
175*15dc779aSAndroid Build Coastguard Worker 
176*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->hist_qmf_right_real[i], 0,
177*15dc779aSAndroid Build Coastguard Worker            NUMBER_OF_QMF_BANDS * sizeof(pstr_ps_enc->hist_qmf_right_real[0]));
178*15dc779aSAndroid Build Coastguard Worker 
179*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->hist_qmf_right_imag[i] = ptr2;
180*15dc779aSAndroid Build Coastguard Worker     ptr2 += NUMBER_OF_QMF_BANDS;
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker     memset(pstr_ps_enc->hist_qmf_right_imag[i], 0,
183*15dc779aSAndroid Build Coastguard Worker            NUMBER_OF_QMF_BANDS * sizeof(pstr_ps_enc->hist_qmf_right_imag[0]));
184*15dc779aSAndroid Build Coastguard Worker   }
185*15dc779aSAndroid Build Coastguard Worker 
186*15dc779aSAndroid Build Coastguard Worker   memset(pstr_ps_enc->pow_left_right, 0, sizeof(pstr_ps_enc->pow_left_right));
187*15dc779aSAndroid Build Coastguard Worker   memset(pstr_ps_enc->pow_corr_real_imag, 0, sizeof(pstr_ps_enc->pow_corr_real_imag));
188*15dc779aSAndroid Build Coastguard Worker 
189*15dc779aSAndroid Build Coastguard Worker   if ((pstr_ps_enc->hist_qmf_left_real == NULL) || (pstr_ps_enc->hist_qmf_left_imag == NULL) ||
190*15dc779aSAndroid Build Coastguard Worker       (pstr_ps_enc->hist_qmf_right_real == NULL) || (pstr_ps_enc->hist_qmf_right_imag == NULL)) {
191*15dc779aSAndroid Build Coastguard Worker     return IA_EXHEAACE_INIT_FATAL_PS_INIT_FAILED;
192*15dc779aSAndroid Build Coastguard Worker   }
193*15dc779aSAndroid Build Coastguard Worker 
194*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < pstr_ps_enc->iid_icc_bins; i++) {
195*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->aaa_IID_data_buf[i][0] = 0;
196*15dc779aSAndroid Build Coastguard Worker     pstr_ps_enc->aaa_ICC_data_buf[i][0] = -1.0f;
197*15dc779aSAndroid Build Coastguard Worker   }
198*15dc779aSAndroid Build Coastguard Worker 
199*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->bit_buf_read_offset = 0;
200*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->bit_buf_write_offset = 0;
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_enc_create_bitbuffer(&pstr_ps_enc->ps_bit_buf, (UWORD8 *)ptr1, 255 + 15);
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->ps_bit_buf.ptr_read_next =
205*15dc779aSAndroid Build Coastguard Worker       pstr_ps_enc->ps_bit_buf.ptr_bit_buf_base + pstr_ps_enc->bit_buf_read_offset;
206*15dc779aSAndroid Build Coastguard Worker   pstr_ps_enc->ps_bit_buf.ptr_write_next =
207*15dc779aSAndroid Build Coastguard Worker       pstr_ps_enc->ps_bit_buf.ptr_bit_buf_base + pstr_ps_enc->bit_buf_write_offset;
208*15dc779aSAndroid Build Coastguard Worker 
209*15dc779aSAndroid Build Coastguard Worker   return err;
210*15dc779aSAndroid Build Coastguard Worker }
211