xref: /aosp_15_r20/external/libxaac/encoder/iusace_psy_mod.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 #include <stdio.h>
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #define MAX_NUM_GROUPED_SFB (60)
25*15dc779aSAndroid Build Coastguard Worker #define MAX_BARK_VALUE (24.0f)
26*15dc779aSAndroid Build Coastguard Worker #define MASK_LOW_FAC (3.0f)
27*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_FAC (1.5f)
28*15dc779aSAndroid Build Coastguard Worker #define MASK_LOW_SP_ENERGY_L (3.0f)
29*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_SP_ENERGY_L (2.0f)
30*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_SP_ENERGY_L_LBR (1.5f)
31*15dc779aSAndroid Build Coastguard Worker #define MASK_LOW_SP_ENERGY_S (2.0f)
32*15dc779aSAndroid Build Coastguard Worker #define MASK_HIGH_SP_ENERGY_S (1.5f)
33*15dc779aSAndroid Build Coastguard Worker #define C_RATIO (0.001258925f)
34*15dc779aSAndroid Build Coastguard Worker 
35*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_SCALE_FACTOR_BAND_LONG 51
36*15dc779aSAndroid Build Coastguard Worker #define MAXIMUM_SCALE_FACTOR_BAND_SHORT 15
37*15dc779aSAndroid Build Coastguard Worker 
38*15dc779aSAndroid Build Coastguard Worker #define MAX_GROUPED_SFB 51
39*15dc779aSAndroid Build Coastguard Worker #define MAX_GROUPED_SFB_TEMP 60
40*15dc779aSAndroid Build Coastguard Worker #define BLOCK_SWITCHING_OFFSET (1 * 1024 + 3 * 128 + 64 + 128)
41*15dc779aSAndroid Build Coastguard Worker #define MAX_CHANNEL_BITS 6144
42*15dc779aSAndroid Build Coastguard Worker #define MAX_SFB_SHORT 15
43*15dc779aSAndroid Build Coastguard Worker 
44*15dc779aSAndroid Build Coastguard Worker #define TRANS_FAC 8
45*15dc779aSAndroid Build Coastguard Worker #ifndef FRAME_LEN_SHORT_128
46*15dc779aSAndroid Build Coastguard Worker #define FRAME_LEN_SHORT_128 (FRAME_LEN_LONG / TRANS_FAC)
47*15dc779aSAndroid Build Coastguard Worker #endif
48*15dc779aSAndroid Build Coastguard Worker 
49*15dc779aSAndroid Build Coastguard Worker typedef struct {
50*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_count;
51*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_active;
52*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_offset[MAXIMUM_SCALE_FACTOR_BAND_LONG + 1];
53*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_thr_quiet[MAXIMUM_SCALE_FACTOR_BAND_LONG];
54*15dc779aSAndroid Build Coastguard Worker   FLOAT32 max_allowed_inc_fac;
55*15dc779aSAndroid Build Coastguard Worker   FLOAT32 min_remaining_thr_fac;
56*15dc779aSAndroid Build Coastguard Worker   WORD32 low_pass_line;
57*15dc779aSAndroid Build Coastguard Worker   FLOAT32 clip_energy;
58*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ratio;
59*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_low_fac[MAXIMUM_SCALE_FACTOR_BAND_LONG];
60*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_high_fac[MAXIMUM_SCALE_FACTOR_BAND_LONG];
61*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_low_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_LONG];
62*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_high_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_LONG];
63*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_min_snr[MAXIMUM_SCALE_FACTOR_BAND_LONG];
64*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_long_config_struct;
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker typedef struct {
67*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_count;
68*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_active;
69*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_offset[MAXIMUM_SCALE_FACTOR_BAND_SHORT + 1];
70*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_thr_quiet[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
71*15dc779aSAndroid Build Coastguard Worker   FLOAT32 max_allowed_inc_fac;
72*15dc779aSAndroid Build Coastguard Worker   FLOAT32 min_remaining_thr_fac;
73*15dc779aSAndroid Build Coastguard Worker   WORD32 low_pass_line;
74*15dc779aSAndroid Build Coastguard Worker   FLOAT32 clip_energy;
75*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ratio;
76*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_low_fac[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
77*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_high_fac[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
78*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_low_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
79*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_mask_high_fac_spr_ener[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
80*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_min_snr[MAXIMUM_SCALE_FACTOR_BAND_SHORT];
81*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_short_config_struct;
82*15dc779aSAndroid Build Coastguard Worker 
83*15dc779aSAndroid Build Coastguard Worker typedef struct {
84*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_count;
85*15dc779aSAndroid Build Coastguard Worker   WORD32 max_sfb_per_grp;
86*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_per_group;
87*15dc779aSAndroid Build Coastguard Worker   WORD32 window_sequence;
88*15dc779aSAndroid Build Coastguard Worker   WORD32 window_shape;
89*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_offsets[100];
90*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_energy;
91*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_spread_energy;
92*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_thr;
93*15dc779aSAndroid Build Coastguard Worker   FLOAT64 *ptr_spec_coeffs;
94*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_sum_lr_energy;
95*15dc779aSAndroid Build Coastguard Worker   FLOAT32 pe;
96*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_min_snr[100];
97*15dc779aSAndroid Build Coastguard Worker   WORD32 ms_used[100];
98*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_out_data_struct;
99*15dc779aSAndroid Build Coastguard Worker 
100*15dc779aSAndroid Build Coastguard Worker typedef struct {
101*15dc779aSAndroid Build Coastguard Worker   WORD32 window_sequence;
102*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_thr_nm1[MAX_GROUPED_SFB_TEMP];
103*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_thr_long;
104*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_thr_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT];
105*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_energy_long;
106*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ptr_sfb_energy_long_ms[MAX_GROUPED_SFB_TEMP];
107*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ptr_sfb_energy_short_ms[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT];
108*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_energy_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT];
109*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ptr_sfb_spreaded_energy_long;
110*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sfb_spreaded_energy_short[TRANS_FAC][MAXIMUM_SCALE_FACTOR_BAND_SHORT];
111*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_data_struct;
112*15dc779aSAndroid Build Coastguard Worker 
113*15dc779aSAndroid Build Coastguard Worker typedef struct ia_psy_mod_struct {
114*15dc779aSAndroid Build Coastguard Worker   ia_psy_mod_long_config_struct str_psy_long_config[MAX_TIME_CHANNELS];
115*15dc779aSAndroid Build Coastguard Worker   ia_psy_mod_short_config_struct str_psy_short_config[MAX_TIME_CHANNELS];
116*15dc779aSAndroid Build Coastguard Worker   ia_psy_mod_data_struct str_psy_data[MAX_TIME_CHANNELS];
117*15dc779aSAndroid Build Coastguard Worker   ia_psy_mod_out_data_struct str_psy_out_data[MAX_TIME_CHANNELS];
118*15dc779aSAndroid Build Coastguard Worker   FLOAT32 mdct_spec_coeff_buf[MAX_TIME_CHANNELS][1024];
119*15dc779aSAndroid Build Coastguard Worker } ia_psy_mod_struct;
120*15dc779aSAndroid Build Coastguard Worker 
121*15dc779aSAndroid Build Coastguard Worker typedef struct ia_sfb_params_struct {
122*15dc779aSAndroid Build Coastguard Worker   WORD32 num_sfb[MAX_TIME_CHANNELS];
123*15dc779aSAndroid Build Coastguard Worker   WORD32 max_sfb[MAX_TIME_CHANNELS];
124*15dc779aSAndroid Build Coastguard Worker   WORD32 max_sfb_ste;
125*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_width_table[MAX_TIME_CHANNELS][MAX_SFB_LONG];
126*15dc779aSAndroid Build Coastguard Worker   WORD32 grouped_sfb_offset[MAX_TIME_CHANNELS][MAX_SF_BANDS + 1];
127*15dc779aSAndroid Build Coastguard Worker   WORD32 sfb_offset[MAX_TIME_CHANNELS][MAX_SF_BANDS + 1];
128*15dc779aSAndroid Build Coastguard Worker   WORD32 num_window_groups[MAX_TIME_CHANNELS];
129*15dc779aSAndroid Build Coastguard Worker   WORD32 window_group_length[MAX_TIME_CHANNELS][8];
130*15dc779aSAndroid Build Coastguard Worker   WORD32 window_shape[MAX_TIME_CHANNELS];
131*15dc779aSAndroid Build Coastguard Worker   WORD32 window_sequence[MAX_TIME_CHANNELS];
132*15dc779aSAndroid Build Coastguard Worker   WORD32 common_win[MAX_TIME_CHANNELS];
133*15dc779aSAndroid Build Coastguard Worker 
134*15dc779aSAndroid Build Coastguard Worker } ia_sfb_params_struct;
135*15dc779aSAndroid Build Coastguard Worker 
136*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_init(ia_psy_mod_struct *pstr_psy_mod, WORD32 sample_rate, WORD32 bit_rate,
137*15dc779aSAndroid Build Coastguard Worker                          WORD32 band_width, WORD32 num_channels, WORD32 ch, WORD32 ele_id,
138*15dc779aSAndroid Build Coastguard Worker                          WORD32 ccfl);
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_sb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms,
141*15dc779aSAndroid Build Coastguard Worker                        FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS],
142*15dc779aSAndroid Build Coastguard Worker                        WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type,
143*15dc779aSAndroid Build Coastguard Worker                        FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch,
144*15dc779aSAndroid Build Coastguard Worker                        WORD32 ccfl);
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker VOID iusace_psy_mod_lb(ia_psy_mod_struct *pstr_psy_mod, ia_sfb_params_struct *pstr_sfb_prms,
147*15dc779aSAndroid Build Coastguard Worker                        FLOAT64 *ptr_spec_in, ia_tns_info *pstr_tns_info[MAX_TIME_CHANNELS],
148*15dc779aSAndroid Build Coastguard Worker                        WORD32 tns_select, WORD32 i_ch, WORD32 chn, WORD32 channel_type,
149*15dc779aSAndroid Build Coastguard Worker                        FLOAT64 *scratch_tns_filter, WORD32 elem_idx, FLOAT64 *ptr_tns_scratch,
150*15dc779aSAndroid Build Coastguard Worker                        WORD32 ccfl);
151