xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_thumb_ps_dec.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops_arr.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker 
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
42*15dc779aSAndroid Build Coastguard Worker 
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
58*15dc779aSAndroid Build Coastguard Worker 
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_calc.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_dec.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_function_selector.h"
68*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_apply_ps(ia_ps_dec_struct * ptr_ps_dec,WORD32 ** p_buf_left_real,WORD32 ** p_buf_left_imag,WORD32 * p_buf_right_real,WORD32 * p_buf_right_imag,ia_sbr_scale_fact_struct * sbr_scale_factor,WORD16 slot,ia_sbr_tables_struct * sbr_tables_ptr,WORD no_col)69*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_apply_ps(ia_ps_dec_struct *ptr_ps_dec, WORD32 **p_buf_left_real,
70*15dc779aSAndroid Build Coastguard Worker                        WORD32 **p_buf_left_imag, WORD32 *p_buf_right_real,
71*15dc779aSAndroid Build Coastguard Worker                        WORD32 *p_buf_right_imag,
72*15dc779aSAndroid Build Coastguard Worker                        ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 slot,
73*15dc779aSAndroid Build Coastguard Worker                        ia_sbr_tables_struct *sbr_tables_ptr, WORD no_col) {
74*15dc779aSAndroid Build Coastguard Worker 
75*15dc779aSAndroid Build Coastguard Worker   WORD16 shiftdelay;
76*15dc779aSAndroid Build Coastguard Worker 
77*15dc779aSAndroid Build Coastguard Worker   if (no_col != 30) {
78*15dc779aSAndroid Build Coastguard Worker     shiftdelay =
79*15dc779aSAndroid Build Coastguard Worker         (WORD16)((slot < (32 - MAX_OV_COLS)) ? 0 : (sbr_scale_factor->lb_scale -
80*15dc779aSAndroid Build Coastguard Worker             sbr_scale_factor->ps_scale));
81*15dc779aSAndroid Build Coastguard Worker   } else {
82*15dc779aSAndroid Build Coastguard Worker   shiftdelay =
83*15dc779aSAndroid Build Coastguard Worker       (WORD16)((slot < (no_col - MAX_OV_COLS)) ? 0 : (sbr_scale_factor->lb_scale -
84*15dc779aSAndroid Build Coastguard Worker           sbr_scale_factor->ps_scale));
85*15dc779aSAndroid Build Coastguard Worker   }
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker   ixheaacd_hybrid_analysis(p_buf_left_real[HYBRID_FILTER_DELAY],
88*15dc779aSAndroid Build Coastguard Worker                            ptr_ps_dec->ptr_hyb_left_re,
89*15dc779aSAndroid Build Coastguard Worker                            ptr_ps_dec->ptr_hyb_left_im, &ptr_ps_dec->str_hybrid,
90*15dc779aSAndroid Build Coastguard Worker                            shiftdelay, sbr_tables_ptr);
91*15dc779aSAndroid Build Coastguard Worker 
92*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_decorrelation)(ptr_ps_dec, p_buf_left_real[0], p_buf_left_imag[0],
93*15dc779aSAndroid Build Coastguard Worker                             p_buf_right_real, p_buf_right_imag,
94*15dc779aSAndroid Build Coastguard Worker                             sbr_tables_ptr->ps_tables_ptr);
95*15dc779aSAndroid Build Coastguard Worker 
96*15dc779aSAndroid Build Coastguard Worker   (*ixheaacd_apply_rot)(ptr_ps_dec, p_buf_left_real[0], p_buf_left_imag[0],
97*15dc779aSAndroid Build Coastguard Worker                         p_buf_right_real, p_buf_right_imag, sbr_tables_ptr,
98*15dc779aSAndroid Build Coastguard Worker                         ptr_ps_dec->str_hybrid.ptr_resol);
99*15dc779aSAndroid Build Coastguard Worker }
100*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_scale_ps_states(ia_ps_dec_struct * ptr_ps_dec,WORD16 scale)101*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_scale_ps_states(ia_ps_dec_struct *ptr_ps_dec, WORD16 scale) {
102*15dc779aSAndroid Build Coastguard Worker   WORD i, m;
103*15dc779aSAndroid Build Coastguard Worker   WORD32 delay;
104*15dc779aSAndroid Build Coastguard Worker 
105*15dc779aSAndroid Build Coastguard Worker   if (scale > 0) {
106*15dc779aSAndroid Build Coastguard Worker     WORD16 scale1 = scale;
107*15dc779aSAndroid Build Coastguard Worker     if (scale > 15) scale1 = 15;
108*15dc779aSAndroid Build Coastguard Worker 
109*15dc779aSAndroid Build Coastguard Worker     for (m = 0; m < 2; m++)
110*15dc779aSAndroid Build Coastguard Worker       ixheaacd_scale_short_vec_left(
111*15dc779aSAndroid Build Coastguard Worker           (WORD16 *)&ptr_ps_dec->delay_buf_qmf_ap_re_im[m][3 * 2],
112*15dc779aSAndroid Build Coastguard Worker           2 * NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS, scale1);
113*15dc779aSAndroid Build Coastguard Worker 
114*15dc779aSAndroid Build Coastguard Worker     delay = 2 * HIGH_DEL * SMALL_DEL_STRT +
115*15dc779aSAndroid Build Coastguard Worker             2 * SMALL_DEL *
116*15dc779aSAndroid Build Coastguard Worker                 (NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS -
117*15dc779aSAndroid Build Coastguard Worker                  (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT));
118*15dc779aSAndroid Build Coastguard Worker     ixheaacd_scale_short_vec_left((WORD16 *)ptr_ps_dec->delay_buf_qmf_ld_re_im,
119*15dc779aSAndroid Build Coastguard Worker                                   delay, scale1);
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker     delay = 2 * 16 * DEL_ALL_PASS + 2 * NUM_SER_AP_LINKS * 5 * 16;
122*15dc779aSAndroid Build Coastguard Worker     ixheaacd_scale_short_vec_left((WORD16 *)ptr_ps_dec->delay_buf_qmf_sub_re_im,
123*15dc779aSAndroid Build Coastguard Worker                                   delay, scale1);
124*15dc779aSAndroid Build Coastguard Worker 
125*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < NUM_SER_AP_LINKS; i++) {
126*15dc779aSAndroid Build Coastguard Worker       for (m = 0; m < ptr_ps_dec->delay_sample_ser[i]; m++) {
127*15dc779aSAndroid Build Coastguard Worker         ixheaacd_scale_short_vec_left(
128*15dc779aSAndroid Build Coastguard Worker             (WORD16 *)&ptr_ps_dec->delay_buf_qmf_ser_re_im[m][i][2 * 3],
129*15dc779aSAndroid Build Coastguard Worker             2 * NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS, scale1);
130*15dc779aSAndroid Build Coastguard Worker       }
131*15dc779aSAndroid Build Coastguard Worker     }
132*15dc779aSAndroid Build Coastguard Worker 
133*15dc779aSAndroid Build Coastguard Worker     ixheaacd_scale_int_vec_left(
134*15dc779aSAndroid Build Coastguard Worker         ptr_ps_dec->str_hybrid.ptr_qmf_buf_re[0],
135*15dc779aSAndroid Build Coastguard Worker         2 * NO_QMF_CHANNELS_IN_HYBRID * ptr_ps_dec->str_hybrid.ptr_qmf_buf,
136*15dc779aSAndroid Build Coastguard Worker         scale);
137*15dc779aSAndroid Build Coastguard Worker 
138*15dc779aSAndroid Build Coastguard Worker     scale = (scale + scale);
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker     ixheaacd_scale_int_vec_left(ptr_ps_dec->peak_decay_diff, 3 * NUM_OF_BINS,
141*15dc779aSAndroid Build Coastguard Worker                                 scale);
142*15dc779aSAndroid Build Coastguard Worker 
143*15dc779aSAndroid Build Coastguard Worker   } else {
144*15dc779aSAndroid Build Coastguard Worker     if (scale != 0) {
145*15dc779aSAndroid Build Coastguard Worker       scale = -scale;
146*15dc779aSAndroid Build Coastguard Worker       for (m = 0; m < 2; m++)
147*15dc779aSAndroid Build Coastguard Worker         ixheaacd_scale_short_vec_right(
148*15dc779aSAndroid Build Coastguard Worker             (WORD16 *)&ptr_ps_dec->delay_buf_qmf_ap_re_im[m][3 * 2],
149*15dc779aSAndroid Build Coastguard Worker             2 * NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS, scale);
150*15dc779aSAndroid Build Coastguard Worker 
151*15dc779aSAndroid Build Coastguard Worker       delay = 2 * HIGH_DEL * SMALL_DEL_STRT +
152*15dc779aSAndroid Build Coastguard Worker               2 * SMALL_DEL *
153*15dc779aSAndroid Build Coastguard Worker                   (NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS -
154*15dc779aSAndroid Build Coastguard Worker                    (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT));
155*15dc779aSAndroid Build Coastguard Worker       ixheaacd_scale_short_vec_right(
156*15dc779aSAndroid Build Coastguard Worker           (WORD16 *)ptr_ps_dec->delay_buf_qmf_ld_re_im, delay, scale);
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker       delay = 2 * 16 * DEL_ALL_PASS + 2 * NUM_SER_AP_LINKS * 5 * 16;
159*15dc779aSAndroid Build Coastguard Worker       ixheaacd_scale_short_vec_right(
160*15dc779aSAndroid Build Coastguard Worker           (WORD16 *)ptr_ps_dec->delay_buf_qmf_sub_re_im, delay, scale);
161*15dc779aSAndroid Build Coastguard Worker 
162*15dc779aSAndroid Build Coastguard Worker       for (i = 0; i < NUM_SER_AP_LINKS; i++) {
163*15dc779aSAndroid Build Coastguard Worker         for (m = 0; m < ptr_ps_dec->delay_sample_ser[i]; m++) {
164*15dc779aSAndroid Build Coastguard Worker           ixheaacd_scale_short_vec_right(
165*15dc779aSAndroid Build Coastguard Worker               (WORD16 *)&ptr_ps_dec->delay_buf_qmf_ser_re_im[m][i][3 * 2],
166*15dc779aSAndroid Build Coastguard Worker               2 * NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS, scale);
167*15dc779aSAndroid Build Coastguard Worker         }
168*15dc779aSAndroid Build Coastguard Worker       }
169*15dc779aSAndroid Build Coastguard Worker 
170*15dc779aSAndroid Build Coastguard Worker       ixheaacd_scale_int_vec_right(
171*15dc779aSAndroid Build Coastguard Worker           ptr_ps_dec->str_hybrid.ptr_qmf_buf_re[0],
172*15dc779aSAndroid Build Coastguard Worker           2 * NO_QMF_CHANNELS_IN_HYBRID * ptr_ps_dec->str_hybrid.ptr_qmf_buf,
173*15dc779aSAndroid Build Coastguard Worker           scale);
174*15dc779aSAndroid Build Coastguard Worker 
175*15dc779aSAndroid Build Coastguard Worker       scale = (scale + scale);
176*15dc779aSAndroid Build Coastguard Worker 
177*15dc779aSAndroid Build Coastguard Worker       ixheaacd_scale_int_vec_right(ptr_ps_dec->peak_decay_diff, 3 * NUM_OF_BINS,
178*15dc779aSAndroid Build Coastguard Worker                                    scale);
179*15dc779aSAndroid Build Coastguard Worker     }
180*15dc779aSAndroid Build Coastguard Worker   }
181*15dc779aSAndroid Build Coastguard Worker }
182