huangcm
2024-08-23 d76fb8c8c6d079a3cee81da7072347dcb8bbbc70
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
/******************************************************************************
 *                                                                            *
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#ifndef IXHEAACD_STRUCT_DEF_H
#define IXHEAACD_STRUCT_DEF_H
 
#include <setjmp.h>
 
#define MAX_OUTPUT_CHANNELS (8)
#define MAX_NUM_OTT (1)
 
#define MAX_ARBITRARY_TREE_LEVELS (2)
#define MAX_PARAMETER_SETS (8)
#define MAX_ARBITRARY_TREE_INDEX ((1 << (MAX_ARBITRARY_TREE_LEVELS + 1)) - 1)
#define MAX_NUM_QMF_BANDS (64)
#define MAX_NUM_OTT_AT \
  (MAX_OUTPUT_CHANNELS * ((1 << MAX_ARBITRARY_TREE_LEVELS) - 1))
#define MAX_PARAMETER_BANDS (28)
 
#define MAX_HYBRID_BANDS (MAX_NUM_QMF_BANDS - 3 + 10)
 
#define MAX_TIME_SLOTS (72)
 
#define MAX_M2_OUTPUT (8)
#define QMF_BANDS_TO_HYBRID (3)
#define PROTO_LEN (13)
#define BUFFER_LEN_LF (PROTO_LEN - 1 + MAX_TIME_SLOTS)
#define BUFFER_LEN_HF ((PROTO_LEN - 1) / 2)
#define MAX_TIME_SLOTS (72)
#define MAX_NO_TIME_SLOTS_DELAY (14)
 
typedef struct {
  WORD8 element_instance_tag;
  WORD32 object_type;
  WORD32 samp_freq_index;
  WORD32 num_front_channel_elements;
  WORD32 num_side_channel_elements;
  WORD32 num_back_channel_elements;
  WORD32 num_lfe_channel_elements;
  WORD32 num_assoc_data_elements;
  WORD32 num_valid_cc_elements;
 
  WORD8 front_element_is_cpe[16];
  WORD8 front_element_tag_select[16];
  WORD8 side_element_is_cpe[16];
  WORD8 side_element_tag_select[16];
  WORD8 back_element_is_cpe[16];
  WORD8 back_element_tag_select[16];
  WORD8 lfe_element_tag_select[16];
 
  WORD32 channels;
  WORD32 alignment_bits;
 
} ia_program_config_struct;
 
typedef struct ia_enhaacplus_dec_ind_cc {
  WORD8 cc_target_is_cpe[MAX_BS_ELEMENT];
  WORD8 cc_target_tag_select[MAX_BS_ELEMENT];
  WORD8 cc_l[MAX_BS_ELEMENT];
  WORD8 cc_r[MAX_BS_ELEMENT];
  WORD32 cc_gain[2 * MAX_BS_ELEMENT];
  WORD8 elements_coupled[MAX_BS_ELEMENT];
  WORD num_coupled_elements;
 
} ia_enhaacplus_dec_ind_cc;
 
typedef struct {
  UWORD32 ui_pcm_wdsz;
  UWORD32 ui_samp_freq;
  UWORD32 ui_n_channels;
  WORD32 i_channel_mask;
  UWORD32 ui_channel_mode;
  UWORD32 ui_sbr_mode;
  WORD32 ui_effect_type;
  WORD32 ui_target_loudness;
  WORD32 ui_loud_norm_flag;
 
  UWORD32 flag_downmix;
  UWORD32 flag_08khz_out;
  UWORD32 flag_16khz_out;
  UWORD32 flag_to_stereo;
  UWORD32 down_sample_flag;
  UWORD32 header_dec_done;
  UWORD32 ui_mp4_flag;
  UWORD32 ui_disable_sync;
  UWORD32 ui_auto_sbr_upsample;
  WORD32 frame_status;
  UWORD32 ui_max_channels;
  UWORD32 ui_pce_found_in_hdr;
  UWORD32 ui_n_memtabs;
 
  WORD32 ui_drc_enable;
  WORD32 ui_drc_boost;
  WORD32 ui_drc_cut;
  WORD32 ui_drc_target_level;
  WORD32 ui_drc_set;
  WORD32 ui_drc_heavy_comp;
 
  ia_program_config_struct str_prog_config;
  WORD32 element_type[MAX_BS_ELEMENT + 1];
  WORD32 slot_element[MAX_BS_ELEMENT + 1];
 
  WORD element_instance_order[MAX_BS_ELEMENT];
  WORD ui_coupling_channel;
  WORD downmix;
  WORD32 loas_present;
 
  WORD framesize_480;
  WORD ld_decoder;
 
  WORD eld_sbr_present;
 
  UWORD32 ui_out_channels;
  WORD32 ui_channel_mask;
 
  WORD32 ui_dec_type;
 
  UWORD32 ui_qmf_bands;
 
  WORD32 ui_flush_cmd;
 
  ia_drc_config drc_config_struct;
 
} ia_aac_dec_config_struct;
 
typedef struct ia_aac_dec_state_struct {
  ia_aac_dec_config_struct *p_config;
 
  AUDIO_OBJECT_TYPE audio_object_type;
 
  UWORD32 ui_in_bytes;
  UWORD32 ui_out_bytes;
  UWORD32 ui_exec_done;
 
  WORD16 b_n_raw_data_blk;
  WORD16 s_adts_hdr_present;
  WORD16 s_adif_hdr_present;
  WORD16 num_channel_last;
  UWORD32 sampling_rate;
  UWORD32 extension_samp_rate;
  UWORD32 bit_rate;
  UWORD32 ui_init_done;
  UWORD32 ui_input_over;
  UWORD32 header_dec_done;
  WORD32 frame_counter;
  ia_aac_decoder_struct *pstr_aac_dec_info[MAX_BS_ELEMENT];
 
  UWORD32 ch_config;
  struct ia_bit_buf_struct str_bit_buf, *pstr_bit_buf;
  ia_aac_dec_sbr_bitstream_struct (*pstr_stream_sbr)[2];
  ia_handle_sbr_dec_inst_struct str_sbr_dec_info[MAX_BS_ELEMENT];
  WORD32 sbr_present_flag;
  WORD32 ps_present;
 
  ia_bit_buf_struct *ptr_bit_stream;
 
  VOID *aac_scratch_mem_v;
  VOID *aac_persistent_mem_v;
 
  VOID *sbr_persistent_mem_v;
  WORD32 *ptr_overlap_buf;
  WORD16 num_of_out_samples;
  WORD32 last_frame_ok;
  WORD32 i_bytes_consumed;
 
  WORD16 *coup_ch_output;
  ia_enhaacplus_dec_ind_cc ind_cc_info;
 
  WORD8 protection_absent;
  WORD32 crc_check;
  WORD32 ui_flush_cmd;
 
  WORD32 frame_len_flag;
  WORD32 depends_on_core_coder;
  WORD32 extension_flag;
 
  WORD32 bs_format;
  WORD32 bit_count;
  WORD32 sync_status;
  WORD32 extension_flag_3;
 
  ixheaacd_latm_struct latm_struct_element;
  WORD32 latm_initialized;
 
  ia_drc_dec_struct str_drc_dec_info;
  ia_drc_dec_struct drc_dummy;
  ia_drc_dec_struct *pstr_drc_dec;
  ixheaac_drc_data_struct *pstr_hdrc_data[MAX_BS_ELEMENT * 3];
 
  WORD32 prev_channel_mode;
  WORD32 drc_cut_fac;
  WORD32 drc_boost_fac;
 
  WORD32 first_drc_frame;
 
  ia_aac_err_config_struct str_err_config;
  WORD32 frame_size;
  WORD32 frame_length;
 
  WORD32 dwnsmp_signal;
  ia_eld_specific_config_struct eld_specific_config;
  FLAG usac_flag;
 
  WORD32 num_of_output_ch;
  VOID *ia_audio_specific_config;
  ia_mps_dec_state_struct mps_dec_handle;
 
  UWORD16 *huffman_code_book_scl;
  UWORD32 *huffman_code_book_scl_index;
 
  ia_aac_dec_tables_struct *pstr_aac_tables;
 
  VOID *pstr_dec_data;
  VOID *sbr_persistent_mem_u;
  VOID *sbr_scratch_mem_u;
  UWORD8 *header_ptr;
  WORD32 header_length;
  ia_sbr_header_data_struct str_sbr_config;
  jmp_buf xaac_jmp_buf;
  WORD32 decode_create_done;
} ia_aac_dec_state_struct;
 
typedef struct ia_exhaacplus_dec_api_struct {
  ia_aac_dec_state_struct *p_state_aac;
 
  ia_aac_dec_config_struct aac_config;
 
  ia_mem_info_struct *p_mem_info_aac;
 
  pVOID *pp_mem_aac;
 
  ia_aac_dec_tables_struct aac_tables;
  ixheaacd_misc_tables *common_tables;
  ia_sbr_tables_struct str_sbr_tables;
 
} ia_exhaacplus_dec_api_struct;
 
WORD32 ixheaacd_aacdec_decodeframe(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
    ia_aac_dec_scratch_struct *aac_scratch_ptrs, WORD16 *time_data,
    FLAG frame_status, WORD *type, WORD *ch_idx, WORD init_flag, WORD channel,
    WORD *element_index_order, WORD skip_full_decode, WORD ch_fac,
    WORD slot_element, WORD max_channels, WORD32 total_channels,
    WORD32 frame_length, WORD32 frame_size, ia_drc_dec_struct *pstr_drc_dec,
    WORD32 object_type, WORD32 ch_config,
    ia_eld_specific_config_struct eld_specific_config, WORD16 adtsheader,
    ia_drc_dec_struct *drc_dummy);
 
WORD ixheaacd_get_channel_mask(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
 
VOID ixheaacd_allocate_mem_persistent(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
    ia_aac_dec_state_struct *p_state_enhaacplus_dec, WORD channels,
    WORD *persistent_used_total, WORD *sbr_persistent_start, WORD ps_enable);
 
WORD32 ixheaacd_dec_mem_api(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec,
                            WORD32 i_cmd, WORD32 i_idx, VOID *pv_value);
 
WORD32 ixheaacd_fill_aac_mem_tables(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
 
WORD32 ixheaacd_decoder_2_ga_hdr(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
 
WORD32 ixheaacd_decoder_flush_api(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
 
WORD32 ixheaacd_fill_usac_mem_tables(ia_exhaacplus_dec_api_struct *self);
 
WORD32 ixheaacd_dec_init(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
 
WORD32 ixheaacd_dec_execute(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec);
 
WORD32 ixheaacd_dec_table_api(
    ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd,
    WORD32 i_idx, VOID *pv_value);
 
#endif /* IXHEAACD_STRUCT_DEF_H */