aboutsummaryrefslogtreecommitdiff
path: root/decoder/ixheaacd_channelinfo.h
blob: 1e451c915bf85cb5f3a118a865c85fbd992f0cb1 (plain)
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
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
/******************************************************************************
 *                                                                            *
 * 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_CHANNELINFO_H
#define IXHEAACD_CHANNELINFO_H

#include "ixheaacd_lt_predict.h"

#define MAX_SFB_SHORT 16
#define MAX_QUANTIZED_VALUE 8191

#define OVERLAP_BUFFER_SIZE 512

#define JOINT_STEREO_MAX_GROUPS 8
#define JOINT_STEREO_MAX_BANDS 64

typedef struct {
  WORD16 window_shape;
  WORD16 window_sequence;
  WORD16 max_sfb;
  WORD16 num_swb_window;
  WORD16 sampling_rate_index;
  WORD16 num_window_groups;
  WORD8 window_group_length[8];
  WORD16 frame_length;
  WORD32 frame_size;
  WORD16 predictor_data_present;
  ltp_info ltp;
  ltp_info ltp2;
} ia_ics_info_struct;

typedef struct {
  WORD32 aac_sect_data_resil_flag;
  WORD32 aac_sf_data_resil_flag;
  WORD32 aac_spect_data_resil_flag;
  WORD32 ep_config;
} ia_aac_err_config_struct;

typedef struct {
  WORD32 ld_sbr_flag_present;
  WORD32 ld_sbr_samp_rate;
  WORD32 ld_sbr_crc_flag;
  WORD32 ldSbrHeaderPresent;

  WORD32 aac_sect_data_resil_flag;
  WORD32 aac_sf_data_resil_flag;
  WORD32 aac_spect_data_resil_flag;
  WORD32 ep_config;

} ia_eld_specific_config_struct;

typedef struct {
  UWORD8 ms_used[JOINT_STEREO_MAX_GROUPS][JOINT_STEREO_MAX_BANDS];
} ia_stereo_info_struct;

typedef struct {
  WORD16 start_band;
  WORD16 stop_band;
  WORD8 direction;
  WORD8 resolution;
  WORD8 order;
  WORD8 coef[MAX_ORDER];
} ia_filter_info_struct;

typedef struct {
  FLAG tns_data_present;
  WORD8 n_filt[MAX_WINDOWS];
  ia_filter_info_struct str_filter[MAX_WINDOWS][MAX_FILTERS];
} ia_tns_info_aac_struct;

typedef struct {
  const WORD16 *ptr_long_window[2];
  const WORD16 *ptr_short_window[2];
  WORD16 window_shape;
  WORD16 window_sequence;
  WORD32 *ptr_overlap_buf;

  WORD16 rvlc_prev_sf[128];
  WORD16 rvlc_prev_cb[128];
  WORD8 rvlc_prev_blk_type;
  WORD8 rvlc_prev_sf_ok;

} ia_aac_dec_overlap_info;

typedef struct {
  WORD32 sf_concealment;
  WORD32 rev_global_gain;
  WORD16 rvlc_sf_len;
  WORD32 dpcm_noise_nrg;
  WORD32 sf_esc_present;
  WORD16 rvlc_esc_len;
  WORD32 dpcm_noise_last_pos;

  WORD32 dpcm_is_last_pos;

  WORD16 rvlc_sf_fwd_len;
  WORD16 rvlc_sf_bwd_len;

  WORD16 *ptr_rvl_bit_cnt;
  UWORD16 *ptr_rvl_bit_str_idx;

  WORD16 num_wind_grps;
  WORD16 max_sfb_transmitted;
  UWORD8 first_noise_group;
  UWORD8 first_noise_band;
  UWORD8 direction;

  UWORD16 rvl_fwd_bit_str_idx;
  UWORD16 rvl_bwd_bit_str_idx;
  UWORD16 esc_bit_str_idx;

  const UWORD32 *ptr_huff_tree_rvl_cw;
  const UWORD32 *ptr_huff_tree_rvl_esc;

  UWORD8 num_fwd_esc_words_decoded;
  UWORD8 num_bwd_esc_words_decoded;
  UWORD8 num_esc_words_decoded;

  WORD8 noise_used;
  WORD8 intensity_used;
  WORD8 sf_used;

  WORD16 firt_scale_fac;
  WORD16 last_scale_fac;
  WORD16 first_nrg;
  WORD16 last_nrg;
  WORD16 is_first;
  WORD16 is_last;

  UWORD32 rvlc_err_log;
  WORD16 conceal_min;
  WORD16 conceal_max;
  WORD16 conceal_min_esc;
  WORD16 conceal_max_esc;
} ia_rvlc_info_struct;

#define LINES_PER_UNIT 4

#define MAX_SFB_HCR (((1024 / 8) / LINES_PER_UNIT) * 8)
#define NUMBER_OF_UNIT_GROUPS (LINES_PER_UNIT * 8)
#define LINES_PER_UNIT_GROUP (1024 / NUMBER_OF_UNIT_GROUPS)

#define FROM_LEFT_TO_RIGHT 0
#define FROM_RIGHT_TO_LEFT 1

#define MAX_CB_PAIRS 23
#define MAX_HCR_SETS 14

#define ESCAPE_VALUE 16
#define POSITION_OF_FLAG_A 21
#define POSITION_OF_FLAG_B 20

#define MAX_CB 32

#define MAX_CB_CHECK 32
#define WORD_BITS 32

#define THIRTYTWO_LOG_DIV_TWO_LOG 5
#define EIGHT_LOG_DIV_TWO_LOG 3
#define FOUR_LOG_DIV_TWO_LOG 2

#define CPE_TOP_LENGTH 12288
#define SCE_TOP_LENGTH 6144
#define LEN_OF_LONGEST_CW_TOP_LENGTH 49
#define Q_VALUE_INVALID 8192
#define NODE_MASK 0x400

#define ERROR_POS 0x00000001
#define HCR_FATAL_PCW_ERROR_MASK 0x100E01FC

typedef enum { PCW, PCW_SIGN, PCW_ESC_SIGN } ia_pcw_type_struct;

typedef struct {
  UWORD32 err_log;
  WORD32 *ptr_quant_spec_coeff_base;
  WORD32 quant_spec_coeff_idx;
  WORD16 reordered_spec_data_len;
  WORD16 num_sect;
  WORD16 *ptr_num_line_in_sect;
  UWORD16 bit_str_idx;
  WORD8 longest_cw_len;
  UWORD8 *ptr_cb;
} ia_huff_code_reorder_io_struct;

typedef struct {
  const UWORD8 *ptr_min_cb_pair_tbl;
  const UWORD8 *ptr_max_cb_pair_tbl;
} ia_huff_code_reorder_cb_pairs_struct;

typedef struct {
  const UWORD16 *ptr_lav_tbl;
  const UWORD8 *ptr_max_cw_len_tbl;
  const UWORD8 *ptr_cb_dimension_tbl;
  const UWORD8 *ptr_cb_dim_shift_tbl;
  const UWORD8 *ptr_cb_sign_tbl;
  const UWORD8 *ptr_cb_priority;
} ia_huff_code_reorder_tbl_struct;

typedef struct {
  WORD32 num_segment;
  UWORD32 segment_offset;
  WORD32 arr_temp_values[1024];
  UWORD16 arr_seg_start_l[1024 >> 1];
  UWORD16 arr_seg_start_r[1024 >> 1];
  WORD8 p_remaining_bits_in_seg[1024 >> 1];
  WORD32 code[512];
  WORD32 code_extra[512];
  WORD8 p_num_bits[512];
  UWORD8 read_direction;
  WORD32 is_decoded[512];
} ia_huff_code_reord_seg_info_struct;

typedef struct {
  UWORD32 num_code_word;
  UWORD32 current_codeword;
  UWORD32 num_sorted_section;
  UWORD16 ptr_num_cw_in_sect[MAX_SFB_HCR];
  UWORD16 ptr_num_sorted_cw_in_sect[MAX_SFB_HCR];
  UWORD16 ptr_num_ext_sorted_cw_in_sect[MAX_SFB_HCR + MAX_HCR_SETS];
  WORD32 num_ext_sorted_cw_in_sect_idx;
  UWORD16 ptr_num_ext_sorted_sect_in_sets[MAX_HCR_SETS];
  WORD32 num_ext_sorted_sect_in_sets_idx;
  UWORD16 ptr_reorder_offset[MAX_SFB_HCR];
  UWORD8 ptr_sorted_cb[MAX_SFB_HCR];

  UWORD8 ptr_ext_sorted_cw[MAX_SFB_HCR + MAX_HCR_SETS];
  WORD32 ext_sorted_cw_idx;
  UWORD8 ptr_ext_sorted_sect_max_cb_len[MAX_SFB_HCR + MAX_HCR_SETS];
  WORD32 ext_sorted_sect_max_cb_len_idx;
  UWORD8 ptr_cb_switch[MAX_SFB_HCR];
} ia_huff_code_reord_sect_info_struct;

typedef UWORD32 (*ixheaacd_ptr_state_func)(ia_bit_buf_struct *, pVOID);

typedef struct {
  WORD32 *ptr_result_base;
  UWORD16 res_ptr_idx[1024 >> 2];
  UWORD32 cw_offset;
  UWORD8 ptr_cb[1024 >> 2];
} ia_hcr_non_pcw_sideinfo_struct;

typedef struct {
  ia_huff_code_reorder_io_struct str_dec_io;
  ia_huff_code_reorder_cb_pairs_struct codebook_pairs;
  ia_huff_code_reorder_tbl_struct table_info;
  ia_huff_code_reord_seg_info_struct str_segment_info;
  ia_huff_code_reord_sect_info_struct sect_info;
  ia_hcr_non_pcw_sideinfo_struct str_non_pcw_side_info;

  WORD32 global_hcr_type;
} ia_hcr_info_struct;

typedef struct {
  WORD16 scale_factor[MAX_WINDOWS * MAX_SFB_SHORT];
  WORD8 code_book[MAX_WINDOWS * MAX_SFB_SHORT];
} ia_aac_sfb_code_book_struct;

typedef struct {
  ia_stereo_info_struct str_stereo_info;
  ia_pns_correlation_info_struct str_pns_corr_info;
} ia_pns_stereo_data_struct;

typedef struct {
  WORD16 win_shape;
  WORD16 win_seq;

  WORD32 *ptr_overlap_buf;

} ia_aac_dec_ola_data;

typedef struct {
  const WORD16 *ptr_long_window[2];
  const WORD16 *ptr_short_window[2];

  ia_aac_dec_ola_data overlap_add_data;

  WORD16 *ltp_buf;
  UWORD16 ltp_lag;

} ia_aac_dec_channel_info;

typedef struct {
  WORD16 *ptr_scale_factor;
  WORD8 *ptr_code_book;
  WORD32 *ptr_spec_coeff;
  ia_stereo_info_struct *pstr_stereo_info;
  ia_pns_correlation_info_struct *pstr_pns_corr_info;
  ia_pns_rand_vec_struct *pstr_pns_rand_vec_data;
  ia_ics_info_struct str_ics_info;
  ia_tns_info_aac_struct str_tns_info;
  ia_pulse_info_struct str_pulse_info;
  ia_pns_info_struct str_pns_info;
  WORD16 common_window;
  WORD16 element_instance_tag;
  WORD16 global_gain;
  WORD32 *scratch_buf_ptr;
  WORD32 *pulse_scratch;
  ia_rvlc_info_struct ptr_rvlc_info;
  ia_hcr_info_struct str_hcr_info;
  WORD16 reorder_spect_data_len;
  WORD8 longest_cw_len;
  WORD16 rvlc_scf_esc_arr[128];
  WORD16 rvlc_scf_fwd_arr[128];
  WORD16 rvlc_scf_bwd_arr[128];
  WORD8 rvlc_intensity_used;
  WORD16 num_line_in_sec4_hcr_arr[32 * 8];
  UWORD8 cb4_hcr_arr[32 * 8];
  WORD32 number_sect;
  WORD32 granule_len;
  WORD16 rvlc_curr_sf_flag;
  WORD16 *ltp_buf;
  UWORD16 ltp_lag;
} ia_aac_dec_channel_info_struct;
WORD16 ixheaacd_ics_read(ia_bit_buf_struct *it_bit_buff,
                         ia_ics_info_struct *ptr_ics_info,
                         WORD8 num_swb_window[2], WORD32 object_type,
                         WORD32 common_window, WORD32 frame_size);

WORD16 ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff,
                           ia_ics_info_struct *ptr_ics_info, WORD32 object_type,
                           WORD32 frame_size, WORD32 ch);

#endif /* #ifndef IXHEAACD_CHANNELINFO_H */