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
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
35typedef const UWORD16 *ia_huffman_data_type;
36
37#define COUPLING_OFF 0
38#define COUPLING_LEVEL 1
39#define COUPLING_BAL 2
40
41#define MAX_INVF_BANDS MAX_NOISE_COEFFS
42
43typedef struct {
44  WORD16 sfb_nrg_prev[MAX_FREQ_COEFFS];
45  WORD16 prev_noise_level[MAX_NOISE_COEFFS];
46  WORD16 amp_res;
47  WORD16 end_position;
48  WORD32 max_qmf_subband_aac;
49  WORD32 coupling_mode;
50  WORD32 sbr_invf_mode[MAX_NUM_NOISE_VALUES];
51} ia_sbr_prev_frame_data_struct;
52
53typedef struct {
54  WORD16 num_env_sfac;
55  ia_frame_info_struct str_frame_info_details;
56  WORD16 del_cod_dir_arr[MAX_ENVELOPES];
57  WORD16 del_cod_dir_noise_arr[MAX_NOISE_ENVELOPES];
58  WORD32 sbr_invf_mode[MAX_NUM_NOISE_VALUES];
59  WORD32 coupling_mode;
60  WORD16 amp_res;
61  WORD32 max_qmf_subband_aac;
62  FLAG add_harmonics[MAX_FREQ_COEFFS];
63  WORD16 int_env_sf_arr[MAX_NUM_ENVELOPE_VALUES];
64  WORD16 int_noise_floor[MAX_NUM_NOISE_VALUES];
65  WORD32 num_noise_sfac;
66  ia_frame_info_struct str_pvc_frame_info;
67  WORD32 env_short_flag_prev;
68  ia_sbr_header_data_struct *pstr_sbr_header;
69  WORD32 num_time_slots;
70  WORD32 rate;
71  WORD32 sbr_patching_mode;
72  WORD32 prev_sbr_patching_mode;
73  WORD32 over_sampling_flag;
74  WORD32 pitch_in_bins;
75  WORD32 pvc_mode;
76
77  WORD32 sbr_invf_mode_prev[MAX_NUM_NOISE_VALUES];
78  FLOAT32 flt_env_sf_arr[MAX_NUM_ENVELOPE_VALUES];
79  FLOAT32 flt_noise_floor[MAX_NUM_NOISE_VALUES];
80  FLOAT32 sfb_nrg_prev[MAX_FREQ_COEFFS];
81  FLOAT32 prev_noise_level[MAX_NUM_NOISE_VALUES];
82  WORD32 inter_temp_shape_mode[MAX_ENVELOPES];
83  WORD32 var_len;
84  WORD32 bs_sin_pos_present;
85  WORD32 sine_position;
86  WORD32 sin_start_for_next_top;
87  WORD32 sin_len_for_next_top;
88  WORD32 sin_start_for_cur_top;
89  WORD32 sin_len_for_cur_top;
90  WORD32 var_len_id_prev;
91  ia_frame_info_struct str_frame_info_prev;
92  FLOAT32 bw_array_prev[MAX_NUM_PATCHES];
93  struct ixheaacd_lpp_trans_patch patch_param;
94  WORD32 harm_index;
95  WORD32 phase_index;
96  WORD8 harm_flag_prev[64];
97  FLOAT32 e_gain[5][64];
98  FLOAT32 noise_buf[5][64];
99  WORD32 lim_table[4][12 + 1];
100  WORD32 gate_mode[4];
101  WORD8 harm_flag_varlen_prev[64];
102  WORD8 harm_flag_varlen[64];
103  FLOAT32 qmapped_pvc[64][48];
104  FLOAT32 env_tmp[64][48];
105  FLOAT32 noise_level_pvc[64][48];
106  FLOAT32 nrg_est_pvc[64][48];
107  FLOAT32 nrg_ref_pvc[64][48];
108  FLOAT32 nrg_gain_pvc[64][48];
109  FLOAT32 nrg_tone_pvc[64][48];
110  WORD32 stereo_config_idx;
111  FLAG reset_flag;
112  FLAG mps_sbr_flag;
113  FLAG usac_independency_flag;
114  FLAG inter_tes_flag;
115  FLAG sbr_mode;
116  FLAG prev_sbr_mode;
117  WORD32 eld_sbr_flag;
118
119} ia_sbr_frame_info_data_struct;
120
121WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data,
122                            ia_sbr_frame_info_data_struct *ptr_frame_data,
123                            ia_ps_dec_struct *ptr_ps_dec,
124                            ia_bit_buf_struct *it_bit_buff,
125                            ia_sbr_tables_struct *ptr_sbr_tables,
126                            WORD audio_object_type);
127
128WORD8 ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct *ptr_header_data,
129                            ia_sbr_frame_info_data_struct **ptr_frame_data,
130                            ia_bit_buf_struct *itt_bit_buf,
131                            ia_sbr_tables_struct *ptr_sbr_tables,
132                            WORD audio_object_type);
133
134WORD32 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
138WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type h,
139                             ia_bit_buf_struct *it_bit_buff);
140
141int ixheaacd_extract_frame_info_ld(ia_bit_buf_struct *it_bit_buff,
142                                   ia_sbr_frame_info_data_struct *h_frame_data);
143
144WORD32 ixheaacd_pvc_time_freq_grid_info(
145    ia_bit_buf_struct *it_bit_buff,
146    ia_sbr_frame_info_data_struct *ptr_frame_data);
147
148WORD16 ixheaacd_sbr_time_freq_grid_info(
149    ia_bit_buf_struct *it_bit_buff,
150    ia_sbr_frame_info_data_struct *ptr_frame_data,
151    ia_env_extr_tables_struct *env_extr_tables_ptr);
152
153WORD16 ixheaacd_read_sbr_env_data(
154    ia_sbr_header_data_struct *ptr_header_data,
155    ia_sbr_frame_info_data_struct *ptr_frame_data,
156    ia_bit_buf_struct *it_bit_buff,
157    ia_env_extr_tables_struct *env_extr_tables_ptr, WORD audio_object_type);
158
159VOID ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
160                                ia_bit_buf_struct *it_bit_buff,
161                                WORD32 usac_flag);
162
163VOID ixheaacd_read_sbr_noise_floor_data(
164    ia_sbr_header_data_struct *ptr_header_data,
165    ia_sbr_frame_info_data_struct *ptr_frame_data,
166    ia_bit_buf_struct *it_bit_buff,
167    ia_env_extr_tables_struct *env_extr_tables_ptr);
168
169VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len,
170                             const UWORD16 *input_table,
171                             const UWORD32 *idx_table);
172
173VOID ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1],
174                                 WORD32 gate_mode[4], WORD16 *freq_band_tbl,
175                                 WORD32 ixheaacd_num_bands,
176                                 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
180VOID 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