1 /******************************************************************************
2  *                                                                            *
3  * Copyright (C) 2018 The Android Open Source Project
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at:
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *****************************************************************************
18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #ifndef IXHEAACD_ENV_EXTR_H
21 #define IXHEAACD_ENV_EXTR_H
22 #include "ixheaacd_error_standards.h"
23 #define ENV_EXP_FRACT 0
24 
25 #define EXP_BITS 6
26 
27 #define MASK_M (((1 << (SHORT_BITS - EXP_BITS)) - 1) << EXP_BITS)
28 #define MASK_FOR_EXP ((1 << EXP_BITS) - 1)
29 
30 #define SIGN_EXT (((WORD8)-1) ^ MASK_FOR_EXP)
31 #define ROUNDING (1 << (EXP_BITS - 1))
32 #define NRG_EXP_OFFSET 16
33 #define NOISE_EXP_OFFSET 38
34 #define MAX_QMF_SUB_BANDS 64
35 
36 typedef const UWORD16 *ia_huffman_data_type;
37 
38 #define COUPLING_OFF 0
39 #define COUPLING_LEVEL 1
40 #define COUPLING_BAL 2
41 
42 #define MAX_INVF_BANDS MAX_NOISE_COEFFS
43 
44 typedef struct {
45   WORD16 sfb_nrg_prev[MAX_FREQ_COEFFS];
46   WORD16 prev_noise_level[MAX_NOISE_COEFFS];
47   WORD16 amp_res;
48   WORD16 end_position;
49   WORD32 max_qmf_subband_aac;
50   WORD32 coupling_mode;
51   WORD32 sbr_invf_mode[MAX_NUM_NOISE_VALUES];
52 } ia_sbr_prev_frame_data_struct;
53 
54 typedef struct {
55   WORD16 num_env_sfac;
56   ia_frame_info_struct str_frame_info_details;
57   WORD16 del_cod_dir_arr[MAX_ENVELOPES];
58   WORD16 del_cod_dir_noise_arr[MAX_NOISE_ENVELOPES];
59   WORD32 sbr_invf_mode[MAX_NUM_NOISE_VALUES];
60   WORD32 coupling_mode;
61   WORD16 amp_res;
62   WORD32 max_qmf_subband_aac;
63   FLAG add_harmonics[MAX_FREQ_COEFFS];
64   WORD16 int_env_sf_arr[MAX_NUM_ENVELOPE_VALUES];
65   WORD16 int_noise_floor[MAX_NUM_NOISE_VALUES];
66   WORD32 num_noise_sfac;
67   ia_frame_info_struct str_pvc_frame_info;
68   WORD32 env_short_flag_prev;
69   ia_sbr_header_data_struct *pstr_sbr_header;
70   WORD32 num_time_slots;
71   WORD32 rate;
72   WORD32 sbr_patching_mode;
73   WORD32 prev_sbr_patching_mode;
74   WORD32 over_sampling_flag;
75   WORD32 pitch_in_bins;
76   WORD32 pvc_mode;
77 
78   WORD32 sbr_invf_mode_prev[MAX_NUM_NOISE_VALUES];
79   FLOAT32 flt_env_sf_arr[MAX_NUM_ENVELOPE_VALUES];
80   FLOAT32 flt_noise_floor[MAX_NUM_NOISE_VALUES];
81   FLOAT32 sfb_nrg_prev[MAX_FREQ_COEFFS];
82   FLOAT32 prev_noise_level[MAX_NUM_NOISE_VALUES];
83   WORD32 inter_temp_shape_mode[MAX_ENVELOPES];
84   WORD32 var_len;
85   WORD32 bs_sin_pos_present;
86   WORD32 sine_position;
87   WORD32 sin_start_for_next_top;
88   WORD32 sin_len_for_next_top;
89   WORD32 sin_start_for_cur_top;
90   WORD32 sin_len_for_cur_top;
91   WORD32 var_len_id_prev;
92   ia_frame_info_struct str_frame_info_prev;
93   FLOAT32 bw_array_prev[MAX_NUM_PATCHES];
94   struct ixheaacd_lpp_trans_patch patch_param;
95   WORD32 harm_index;
96   WORD32 phase_index;
97   WORD8 harm_flag_prev[64];
98   FLOAT32 e_gain[5][64];
99   FLOAT32 noise_buf[5][64];
100   WORD32 lim_table[4][12 + 1];
101   WORD32 gate_mode[4];
102   WORD8 harm_flag_varlen_prev[64];
103   WORD8 harm_flag_varlen[64];
104   FLOAT32 qmapped_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
105   FLOAT32 env_tmp[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
106   FLOAT32 noise_level_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
107   FLOAT32 nrg_est_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
108   FLOAT32 nrg_ref_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
109   FLOAT32 nrg_gain_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
110   FLOAT32 nrg_tone_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR];
111   WORD32 stereo_config_idx;
112   FLAG reset_flag;
113   FLAG mps_sbr_flag;
114   FLAG usac_independency_flag;
115   FLAG inter_tes_flag;
116   FLAG sbr_mode;
117   FLAG prev_sbr_mode;
118   WORD32 eld_sbr_flag;
119 
120 } ia_sbr_frame_info_data_struct;
121 
122 IA_ERRORCODE ixheaacd_sbr_read_sce(
123     ia_sbr_header_data_struct *ptr_header_data,
124     ia_sbr_frame_info_data_struct *ptr_frame_data, ia_ps_dec_struct *ptr_ps_dec,
125     ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables,
126     WORD audio_object_type);
127 
128 IA_ERRORCODE ixheaacd_sbr_read_cpe(
129     ia_sbr_header_data_struct *ptr_header_data,
130     ia_sbr_frame_info_data_struct **ptr_frame_data,
131     ia_bit_buf_struct *itt_bit_buf, ia_sbr_tables_struct *ptr_sbr_tables,
132     WORD audio_object_type);
133 
134 WORD32 ixheaacd_sbr_read_header_data(
135     ia_sbr_header_data_struct *ptr_sbr_header, ia_bit_buf_struct *it_bit_buf,
136     FLAG stereo_flag, ia_sbr_header_data_struct *ptr_sbr_dflt_header);
137 
138 WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type h,
139                              ia_bit_buf_struct *it_bit_buff);
140 
141 IA_ERRORCODE ixheaacd_extract_frame_info_ld(
142     ia_bit_buf_struct *it_bit_buff,
143     ia_sbr_frame_info_data_struct *h_frame_data);
144 
145 WORD32 ixheaacd_pvc_time_freq_grid_info(
146     ia_bit_buf_struct *it_bit_buff,
147     ia_sbr_frame_info_data_struct *ptr_frame_data);
148 
149 WORD16 ixheaacd_sbr_time_freq_grid_info(
150     ia_bit_buf_struct *it_bit_buff,
151     ia_sbr_frame_info_data_struct *ptr_frame_data,
152     ia_env_extr_tables_struct *env_extr_tables_ptr);
153 
154 WORD16 ixheaacd_read_sbr_env_data(
155     ia_sbr_header_data_struct *ptr_header_data,
156     ia_sbr_frame_info_data_struct *ptr_frame_data,
157     ia_bit_buf_struct *it_bit_buff,
158     ia_env_extr_tables_struct *env_extr_tables_ptr, WORD audio_object_type);
159 
160 VOID ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
161                                 ia_bit_buf_struct *it_bit_buff,
162                                 WORD32 usac_flag);
163 
164 VOID ixheaacd_read_sbr_noise_floor_data(
165     ia_sbr_header_data_struct *ptr_header_data,
166     ia_sbr_frame_info_data_struct *ptr_frame_data,
167     ia_bit_buf_struct *it_bit_buff,
168     ia_env_extr_tables_struct *env_extr_tables_ptr);
169 
170 VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len,
171                              const UWORD16 *input_table,
172                              const UWORD32 *idx_table);
173 
174 IA_ERRORCODE ixheaacd_createlimiterbands(
175     WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4], WORD16 *freq_band_tbl,
176     WORD32 ixheaacd_num_bands, WORD32 x_over_qmf[MAX_NUM_PATCHES],
177     WORD32 b_patching_mode, WORD32 upsamp_4_flag,
178     struct ixheaacd_lpp_trans_patch *patch_param);
179 
180 VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1,
181                               FLOAT32 *qmf_real, FLOAT32 *qmf_imag,
182                               WORD32 num_sample, WORD32 sub_band_start,
183                               WORD32 num_subband, WORD32 gamma_idx);
184 
185 #endif
186