/src/libxaac/decoder/ixheaacd_env_extr.c
Line | Count | Source |
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 | | #include <string.h> |
21 | | #include <math.h> |
22 | | #include "ixheaacd_sbr_common.h" |
23 | | #include "ixheaac_type_def.h" |
24 | | |
25 | | #include "ixheaac_constants.h" |
26 | | #include "ixheaac_basic_ops32.h" |
27 | | #include "ixheaac_basic_ops16.h" |
28 | | #include "ixheaac_basic_ops40.h" |
29 | | #include "ixheaac_basic_ops.h" |
30 | | |
31 | | #include "ixheaac_basic_op.h" |
32 | | #include "ixheaacd_intrinsics.h" |
33 | | #include "ixheaacd_common_rom.h" |
34 | | #include "ixheaacd_basic_funcs.h" |
35 | | #include "ixheaacd_bitbuffer.h" |
36 | | #include "ixheaacd_sbr_common.h" |
37 | | #include "ixheaacd_drc_data_struct.h" |
38 | | #include "ixheaacd_drc_dec.h" |
39 | | #include "ixheaacd_sbrdecoder.h" |
40 | | #include "ixheaacd_sbrdecsettings.h" |
41 | | #include "ixheaacd_sbr_scale.h" |
42 | | #include "ixheaacd_lpp_tran.h" |
43 | | #include "ixheaacd_env_extr_part.h" |
44 | | #include "ixheaacd_sbr_rom.h" |
45 | | #include "ixheaacd_hybrid.h" |
46 | | #include "ixheaacd_ps_dec.h" |
47 | | #include "ixheaacd_env_extr.h" |
48 | | |
49 | | #include "ixheaac_sbr_const.h" |
50 | | #include "ixheaacd_intrinsics.h" |
51 | | |
52 | | #include "ixheaacd_pvc_dec.h" |
53 | | |
54 | | #include "ixheaacd_ps_bitdec.h" |
55 | | |
56 | | #include "ixheaacd_audioobjtypes.h" |
57 | | |
58 | | |
59 | | static const int ixheaacd_ld_env_table_512[LD_ENV_TBL_512][LD_ENV_TBL_SIZE] = { |
60 | | {2, 4, -1, 0}, {2, 5, -1, 0}, {3, 2, 6, 1}, {3, 3, 7, 1}, |
61 | | {3, 4, 8, 1}, {3, 5, 9, 1}, {3, 6, 10, 1}, {3, 7, 11, 1}, |
62 | | {3, 8, 12, 1}, {3, 9, 13, 1}, {3, 10, 14, 1}, {2, 11, -1, 1}, |
63 | | {2, 12, -1, 1}, {2, 13, -1, 1}, {2, 14, -1, 1}, {2, 15, -1, 1}, |
64 | | }; |
65 | | |
66 | | static const int ixheaacd_ld_env_table_480[LD_ENV_TBL_480][LD_ENV_TBL_SIZE] = { |
67 | | {2, 4, -1, 0}, {2, 5, -1, 0}, {3, 2, 6, 1}, {3, 3, 7, 1}, |
68 | | {3, 4, 8, 1}, {3, 5, 9, 1}, {3, 6, 10, 1}, {3, 7, 11, 1}, |
69 | | {3, 8, 12, 1}, {3, 9, 13, 1}, {2, 10, -1, 1}, {2, 11, -1, 1}, |
70 | | {2, 12, -1, 1}, {2, 13, -1, 1}, {2, 14, -1, 1}, |
71 | | }; |
72 | | |
73 | | static const int ixheaacd_ld_env_table_time_slot[LD_ENV_TIME_SLOT] = { |
74 | | 8, 5, 0, 0, 0, 0, 0}; |
75 | | |
76 | 24.2M | WORD32 ixheaacd_cnt_leading_ones(WORD32 a) { |
77 | 24.2M | WORD32 count = 0; |
78 | | |
79 | 52.7M | while (a) { |
80 | 48.7M | if (a & 0x80000000) |
81 | 28.5M | count++; |
82 | 20.1M | else |
83 | 20.1M | break; |
84 | 28.5M | a = a << 1; |
85 | 28.5M | } |
86 | 24.2M | return count; |
87 | 24.2M | } |
88 | | VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len, |
89 | | const UWORD16 *input_table, |
90 | 18.9M | const UWORD32 *idx_table) { |
91 | 18.9M | UWORD32 temp = 0; |
92 | 18.9M | UWORD32 temp1 = 0; |
93 | 18.9M | WORD32 found = 0; |
94 | 18.9M | UWORD32 mask = 0x80000000; |
95 | | |
96 | 18.9M | WORD32 clo; |
97 | 18.9M | WORD32 MAX_LEN; |
98 | 18.9M | WORD32 ixheaacd_drc_offset = 0; |
99 | 18.9M | WORD32 length; |
100 | 18.9M | UWORD32 cwrd; |
101 | 18.9M | WORD32 len_end; |
102 | | |
103 | 18.9M | MAX_LEN = input_table[0]; |
104 | 18.9M | mask = mask - (1 << (31 - MAX_LEN)); |
105 | 18.9M | mask = mask << 1; |
106 | 18.9M | temp = (UWORD32)(it_bit_buff & mask); |
107 | | |
108 | 18.9M | len_end = input_table[0]; |
109 | 18.9M | clo = ixheaacd_cnt_leading_ones(temp); |
110 | 20.4M | do { |
111 | 20.4M | ixheaacd_drc_offset = (idx_table[clo] >> 20) & 0xff; |
112 | 20.4M | length = input_table[ixheaacd_drc_offset + 1] & 0x1f; |
113 | 20.4M | cwrd = idx_table[clo] & 0xfffff; |
114 | 20.4M | temp1 = temp >> (32 - length); |
115 | 20.4M | if (temp1 <= cwrd) { |
116 | 18.9M | ixheaacd_drc_offset = ixheaacd_drc_offset - (cwrd - temp1); |
117 | 18.9M | found = 1; |
118 | 18.9M | } else { |
119 | 1.49M | len_end = len_end + ((idx_table[clo] >> 28) & 0xf); |
120 | 1.49M | clo = len_end; |
121 | 1.49M | } |
122 | 20.4M | } while (!found); |
123 | 18.9M | *h_index = input_table[ixheaacd_drc_offset + 1] >> 5; |
124 | 18.9M | *len = length; |
125 | 18.9M | } |
126 | | |
127 | | static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data, |
128 | | ia_bit_buf_struct *it_bit_buff, |
129 | 95.8k | WORD32 indepFlag) { |
130 | 95.8k | WORD32 i, j, k; |
131 | 95.8k | WORD32 fixed_length = 0, num_grid_info = 0, grid_info; |
132 | 95.8k | UWORD8 div_mode, ns_mode; |
133 | 95.8k | UWORD16 pvc_id[PVC_NUM_TIME_SLOTS + 1]; |
134 | 95.8k | UWORD8 num_length; |
135 | 95.8k | UWORD8 length; |
136 | 95.8k | UWORD8 reuse_pvc_id; |
137 | 95.8k | WORD32 sum_length = 0; |
138 | 95.8k | WORD32 length_bits = 4; |
139 | 95.8k | UWORD8 pvc_id_bits = PVC_ID_BITS; |
140 | 95.8k | IA_ERRORCODE err = IA_NO_ERROR; |
141 | | |
142 | 95.8k | div_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_DIV_MODE_BITS); |
143 | 95.8k | ns_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_NS_MODE_BITS); |
144 | | |
145 | 95.8k | if (ptr_pvc_data->pvc_mode == 3) { |
146 | 2.32k | pvc_id_bits = 0; |
147 | 2.32k | } |
148 | | |
149 | 95.8k | if (div_mode <= 3) { |
150 | 71.8k | num_length = div_mode; |
151 | 71.8k | if (indepFlag) { |
152 | 620 | reuse_pvc_id = 0; |
153 | 71.2k | } else { |
154 | 71.2k | reuse_pvc_id = |
155 | 71.2k | (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_REUSE_PVC_ID_BITS); |
156 | 71.2k | } |
157 | 71.8k | if (reuse_pvc_id == 1) { |
158 | 5.52k | pvc_id[0] = ptr_pvc_data->prev_pvc_id; |
159 | 66.3k | } else { |
160 | 66.3k | pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits); |
161 | 66.3k | } |
162 | | |
163 | 71.8k | k = 1; |
164 | 71.8k | if (num_length) { |
165 | 14.5k | sum_length = 0; |
166 | 39.2k | for (i = 0; i < num_length; i++) { |
167 | 24.6k | if (sum_length >= 13) { |
168 | 653 | length_bits = 1; |
169 | 24.0k | } else if (sum_length >= 11) { |
170 | 55 | length_bits = 2; |
171 | 23.9k | } else if (sum_length >= 7) { |
172 | 162 | length_bits = 3; |
173 | 23.8k | } else { |
174 | 23.8k | length_bits = 4; |
175 | 23.8k | } |
176 | 24.6k | length = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, length_bits); |
177 | 24.6k | length += 1; |
178 | 24.6k | sum_length += length; |
179 | 24.6k | if ((k + length - 1) > PVC_NUM_TIME_SLOTS) { |
180 | 22 | return -1; |
181 | 22 | } |
182 | 111k | for (j = 1; j < length; j++, k++) { |
183 | 86.5k | pvc_id[k] = pvc_id[k - 1]; |
184 | 86.5k | } |
185 | 24.6k | pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits); |
186 | 24.6k | } |
187 | 14.5k | } |
188 | | |
189 | 1.03M | for (; k < 16; k++) { |
190 | 966k | pvc_id[k] = pvc_id[k - 1]; |
191 | 966k | } |
192 | | |
193 | 71.8k | } else { |
194 | 23.9k | switch (div_mode) { |
195 | 12.1k | case 4: |
196 | 12.1k | num_grid_info = 2; |
197 | 12.1k | fixed_length = 8; |
198 | 12.1k | break; |
199 | 11.0k | case 5: |
200 | 11.0k | num_grid_info = 4; |
201 | 11.0k | fixed_length = 4; |
202 | 11.0k | break; |
203 | 415 | case 6: |
204 | 415 | num_grid_info = 8; |
205 | 415 | fixed_length = 2; |
206 | 415 | break; |
207 | 379 | case 7: |
208 | 379 | num_grid_info = 16; |
209 | 379 | fixed_length = 1; |
210 | 379 | break; |
211 | 0 | default:; |
212 | 23.9k | } |
213 | 23.9k | if (indepFlag) { |
214 | 580 | grid_info = 1; |
215 | 23.3k | } else { |
216 | 23.3k | grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS); |
217 | 23.3k | } |
218 | 23.9k | if (grid_info) { |
219 | 6.96k | pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits); |
220 | 16.9k | } else { |
221 | 16.9k | pvc_id[0] = ptr_pvc_data->prev_pvc_id; |
222 | 16.9k | } |
223 | 142k | for (j = 1, k = 1; j < fixed_length; j++, k++) { |
224 | 118k | pvc_id[k] = pvc_id[k - 1]; |
225 | 118k | } |
226 | | |
227 | 77.6k | for (i = 1; i < num_grid_info; i++) { |
228 | 53.7k | grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS); |
229 | 53.7k | if (grid_info == 1) { |
230 | 31.8k | pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits); |
231 | 31.8k | } else { |
232 | 21.8k | pvc_id[k] = pvc_id[k - 1]; |
233 | 21.8k | k++; |
234 | 21.8k | } |
235 | 240k | for (j = 1; j < fixed_length; j++, k++) { |
236 | 187k | pvc_id[k] = pvc_id[k - 1]; |
237 | 187k | } |
238 | 53.7k | } |
239 | 23.9k | } |
240 | 95.7k | ptr_pvc_data->div_mode = div_mode; |
241 | 95.7k | ptr_pvc_data->ns_mode = ns_mode; |
242 | 1.62M | for (i = 0; i < PVC_NUM_TIME_SLOTS; i++) { |
243 | 1.53M | ptr_pvc_data->pvc_id[i] = pvc_id[i]; |
244 | 1.53M | } |
245 | 95.7k | return err; |
246 | 95.8k | } |
247 | | |
248 | | static VOID ixheaacd_pvc_env_dtdf_data( |
249 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
250 | 95.8k | ia_bit_buf_struct *it_bit_buff) { |
251 | 95.8k | WORD32 i; |
252 | 95.8k | WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag; |
253 | 95.8k | WORD32 bs_num_noise = ptr_frame_data->str_frame_info_details.num_noise_env; |
254 | | |
255 | 95.8k | if (usac_independency_flag) { |
256 | 1.20k | ptr_frame_data->del_cod_dir_noise_arr[0] = 0; |
257 | 94.6k | } else { |
258 | 94.6k | ptr_frame_data->del_cod_dir_noise_arr[0] = |
259 | 94.6k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS); |
260 | 94.6k | } |
261 | | |
262 | 152k | for (i = 1; i < bs_num_noise; i++) { |
263 | 56.3k | ptr_frame_data->del_cod_dir_noise_arr[i] = |
264 | 56.3k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS); |
265 | 56.3k | } |
266 | 95.8k | } |
267 | | |
268 | | static VOID ixheaacd_read_sbr_addi_data( |
269 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
270 | | ia_sbr_header_data_struct *ptr_header_data, |
271 | 95.7k | ia_bit_buf_struct *it_bit_buff) { |
272 | 95.7k | WORD32 i; |
273 | | |
274 | 95.7k | WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1); |
275 | | |
276 | 95.7k | ptr_frame_data->sin_start_for_cur_top = |
277 | 95.7k | ptr_frame_data->sin_start_for_next_top; |
278 | 95.7k | ptr_frame_data->sin_len_for_cur_top = ptr_frame_data->sin_len_for_next_top; |
279 | 95.7k | ptr_frame_data->sin_start_for_next_top = 0; |
280 | 95.7k | ptr_frame_data->sin_len_for_next_top = 0; |
281 | | |
282 | 95.7k | if (flag) { |
283 | 339k | for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]; |
284 | 319k | i++) { |
285 | 319k | ptr_frame_data->add_harmonics[i] = ixheaacd_read_bits_buf(it_bit_buff, 1); |
286 | 319k | } |
287 | 20.1k | if (ptr_frame_data->pvc_mode != 0) { |
288 | 20.1k | ptr_frame_data->sine_position = ESC_SIN_POS; |
289 | | |
290 | 20.1k | ptr_frame_data->bs_sin_pos_present = |
291 | 20.1k | ixheaacd_read_bits_buf(it_bit_buff, 1); |
292 | | |
293 | 20.1k | if (ptr_frame_data->bs_sin_pos_present == 1) { |
294 | 4.08k | ptr_frame_data->sine_position = ixheaacd_read_bits_buf(it_bit_buff, 5); |
295 | 4.08k | } |
296 | 20.1k | if (ptr_frame_data->var_len > 0) { |
297 | 3.58k | if (ptr_frame_data->sine_position > 16) { |
298 | 2.07k | if (ptr_frame_data->sine_position == 31) { |
299 | 1.85k | ptr_frame_data->sin_start_for_next_top = 0; |
300 | 1.85k | ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len; |
301 | 1.85k | } else { |
302 | 221 | if ((ptr_frame_data->var_len + 16) == |
303 | 221 | ptr_frame_data->sine_position) { |
304 | 4 | ptr_frame_data->sin_start_for_next_top = 0; |
305 | 4 | ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len; |
306 | 217 | } else { |
307 | 217 | ptr_frame_data->sin_start_for_next_top = |
308 | 217 | ptr_frame_data->sine_position - 16; |
309 | 217 | ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len; |
310 | 217 | } |
311 | 221 | } |
312 | 2.07k | } else { |
313 | 1.50k | ptr_frame_data->sin_start_for_next_top = 0; |
314 | 1.50k | ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len; |
315 | 1.50k | } |
316 | 16.5k | } else { |
317 | 16.5k | ptr_frame_data->sin_start_for_next_top = 0; |
318 | 16.5k | ptr_frame_data->sin_len_for_next_top = 0; |
319 | 16.5k | } |
320 | 20.1k | } |
321 | 20.1k | } |
322 | 95.7k | return; |
323 | 95.7k | } |
324 | | |
325 | | WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type t_huff, |
326 | 65.5k | ia_bit_buf_struct *it_bit_buff) { |
327 | 65.5k | WORD32 index; |
328 | 65.5k | WORD32 value, bit; |
329 | 65.5k | WORD16 cw; |
330 | 65.5k | index = 0; |
331 | | |
332 | 192k | while (index >= 0) { |
333 | 126k | cw = t_huff[index]; |
334 | | |
335 | 126k | bit = ixheaacd_read_bits_buf(it_bit_buff, 1); |
336 | | |
337 | 126k | if (bit) { |
338 | 48.4k | WORD sign = (cw & 0x0080); |
339 | 48.4k | if (sign) { |
340 | 24.4k | index = (cw | 0xffffff80); |
341 | 24.4k | } else { |
342 | 24.0k | index = (cw & 0x007f); |
343 | 24.0k | } |
344 | 78.4k | } else { |
345 | 78.4k | index = (cw >> 8); |
346 | 78.4k | } |
347 | 126k | } |
348 | | |
349 | 65.5k | value = (index + 64); |
350 | | |
351 | 65.5k | return (value); |
352 | 65.5k | } |
353 | | |
354 | | WORD32 ixheaacd_sbr_read_header_data( |
355 | | ia_sbr_header_data_struct *pstr_sbr_header, ia_bit_buf_struct *it_bit_buff, |
356 | 252k | FLAG stereo_flag, ia_sbr_header_data_struct *pstr_sbr_dflt_header) { |
357 | 252k | ia_sbr_header_data_struct prev_header_info; |
358 | 252k | prev_header_info.start_freq = 0; |
359 | 252k | prev_header_info.noise_bands = 0; |
360 | 252k | FLAG header_extra_1 = 0, header_extra_2 = 0; |
361 | 252k | WORD32 tmp; |
362 | 252k | WORD32 usac_independency_flag = pstr_sbr_header->usac_independency_flag; |
363 | 252k | WORD32 use_dflt_hdr = 0; |
364 | 252k | WORD32 header_present = 1; |
365 | 252k | WORD32 usac_flag = pstr_sbr_header->usac_flag; |
366 | | |
367 | 252k | if (!usac_flag) { |
368 | 11.9k | memcpy(&prev_header_info, pstr_sbr_header, |
369 | 11.9k | sizeof(ia_sbr_header_data_struct)); |
370 | | |
371 | 11.9k | tmp = ixheaacd_read_bits_buf( |
372 | 11.9k | it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS + SBR_BEGIN_SAMP_FREQ_BITS + |
373 | 11.9k | SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS); |
374 | | |
375 | 11.9k | pstr_sbr_header->amp_res = (WORD16)( |
376 | 11.9k | (tmp & 0x0800) >> (SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS + |
377 | 11.9k | SBR_CROSS_OVER_BND_BITS)); |
378 | | |
379 | 11.9k | pstr_sbr_header->start_freq = (WORD16)( |
380 | 11.9k | (tmp & 0x0780) >> (SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS)); |
381 | | |
382 | 11.9k | pstr_sbr_header->stop_freq = |
383 | 11.9k | (WORD16)((tmp & 0x078) >> (SBR_CROSS_OVER_BND_BITS)); |
384 | | |
385 | 11.9k | pstr_sbr_header->xover_band = (WORD16)((tmp & 0x07)); |
386 | | |
387 | 11.9k | tmp = ixheaacd_read_bits_buf( |
388 | 11.9k | it_bit_buff, |
389 | 11.9k | SBR_HDR_RESERV_BITS + SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS); |
390 | 11.9k | header_extra_1 = (FLAG)((tmp & 0x02) >> (SBR_HDR_EXTR_2_BITS)); |
391 | 11.9k | header_extra_2 = (FLAG)((tmp & 0x01)); |
392 | 11.9k | if (stereo_flag) { |
393 | 7.96k | pstr_sbr_header->channel_mode = SBR_STEREO; |
394 | 7.96k | } else { |
395 | 3.98k | pstr_sbr_header->channel_mode = SBR_MONO; |
396 | 3.98k | } |
397 | 240k | } else { |
398 | 240k | WORD32 info_present = 0; |
399 | 240k | if (pstr_sbr_header->sync_state == SBR_ACTIVE) { |
400 | 226k | memcpy(&prev_header_info, pstr_sbr_header, |
401 | 226k | sizeof(ia_sbr_header_data_struct)); |
402 | 226k | } |
403 | 240k | if (usac_independency_flag) { |
404 | 5.22k | header_present = 1; |
405 | 5.22k | info_present = 1; |
406 | 235k | } else { |
407 | 235k | info_present = ixheaacd_read_bits_buf(it_bit_buff, 1); |
408 | 235k | if (info_present) { |
409 | 64.9k | header_present = ixheaacd_read_bits_buf(it_bit_buff, 1); |
410 | 170k | } else { |
411 | 170k | header_present = 0; |
412 | 170k | } |
413 | 235k | } |
414 | | |
415 | 240k | if (info_present) { |
416 | 70.1k | tmp = ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS + |
417 | 70.1k | ESBR_CROSS_OVER_BND_BITS + |
418 | 70.1k | ESBR_PRE_FLAT_BITS); |
419 | 70.1k | pstr_sbr_header->amp_res = (WORD16)( |
420 | 70.1k | (tmp & 0x0020) >> (ESBR_CROSS_OVER_BND_BITS + ESBR_PRE_FLAT_BITS)); |
421 | 70.1k | pstr_sbr_header->xover_band = |
422 | 70.1k | (WORD16)((tmp & 0x001E) >> (ESBR_PRE_FLAT_BITS)); |
423 | 70.1k | pstr_sbr_header->pre_proc_flag = (WORD16)((tmp & 0x001)); |
424 | 70.1k | if (pstr_sbr_header->pvc_flag) { |
425 | 35.2k | pstr_sbr_header->pvc_mode = |
426 | 35.2k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PVC_MODE_BITS); |
427 | 35.2k | } else { |
428 | 34.9k | pstr_sbr_header->pvc_mode = 0; |
429 | 34.9k | } |
430 | 70.1k | } |
431 | | |
432 | 240k | if (header_present) { |
433 | 21.4k | use_dflt_hdr = ixheaacd_read_bits_buf(it_bit_buff, 1); |
434 | 21.4k | if (use_dflt_hdr) { |
435 | 15.6k | pstr_sbr_header->start_freq = pstr_sbr_dflt_header->start_freq; |
436 | 15.6k | pstr_sbr_header->stop_freq = pstr_sbr_dflt_header->stop_freq; |
437 | 15.6k | pstr_sbr_header->header_extra_1 = pstr_sbr_dflt_header->header_extra_1; |
438 | 15.6k | pstr_sbr_header->header_extra_2 = pstr_sbr_dflt_header->header_extra_2; |
439 | 15.6k | pstr_sbr_header->freq_scale = pstr_sbr_dflt_header->freq_scale; |
440 | 15.6k | pstr_sbr_header->alter_scale = pstr_sbr_dflt_header->alter_scale; |
441 | 15.6k | pstr_sbr_header->noise_bands = pstr_sbr_dflt_header->noise_bands; |
442 | 15.6k | pstr_sbr_header->limiter_bands = pstr_sbr_dflt_header->limiter_bands; |
443 | 15.6k | pstr_sbr_header->limiter_gains = pstr_sbr_dflt_header->limiter_gains; |
444 | 15.6k | pstr_sbr_header->interpol_freq = pstr_sbr_dflt_header->interpol_freq; |
445 | 15.6k | pstr_sbr_header->smoothing_mode = pstr_sbr_dflt_header->smoothing_mode; |
446 | 15.6k | } else { |
447 | 5.84k | tmp = ixheaacd_read_bits_buf( |
448 | 5.84k | it_bit_buff, SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS + |
449 | 5.84k | SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS); |
450 | 5.84k | pstr_sbr_header->start_freq = |
451 | 5.84k | (tmp & 0x03C0) >> (SBR_END_SAMP_FREQ_BITS + SBR_HDR_EXTR_1_BITS + |
452 | 5.84k | SBR_HDR_EXTR_2_BITS); |
453 | 5.84k | pstr_sbr_header->stop_freq = |
454 | 5.84k | (tmp & 0x003C) >> (SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS); |
455 | 5.84k | pstr_sbr_header->header_extra_1 = |
456 | 5.84k | (tmp & 0x0002) >> (SBR_HDR_EXTR_2_BITS); |
457 | 5.84k | pstr_sbr_header->header_extra_2 = (tmp & 0x0001); |
458 | 5.84k | header_extra_1 = pstr_sbr_header->header_extra_1; |
459 | 5.84k | header_extra_2 = pstr_sbr_header->header_extra_2; |
460 | 5.84k | } |
461 | 21.4k | } |
462 | 240k | } |
463 | | |
464 | 252k | if (!use_dflt_hdr && header_present) { |
465 | 17.7k | if (header_extra_1) { |
466 | 6.06k | tmp = ixheaacd_read_bits_buf( |
467 | 6.06k | it_bit_buff, |
468 | 6.06k | SBR_SAMP_FREQ_LVL_BITS + SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS); |
469 | 6.06k | pstr_sbr_header->freq_scale = |
470 | 6.06k | (WORD16)((tmp & 0x018) >> (SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS)); |
471 | 6.06k | pstr_sbr_header->alter_scale = |
472 | 6.06k | (WORD16)((tmp & 0x04) >> (SBR_NOISE_BND_BITS)); |
473 | 6.06k | pstr_sbr_header->noise_bands = (WORD16)((tmp & 0x03)); |
474 | 11.6k | } else { |
475 | 11.6k | pstr_sbr_header->freq_scale = SBR_SAMP_FEQ_LVL_DEF; |
476 | 11.6k | pstr_sbr_header->alter_scale = SBR_CHANGE_LVL_DEF; |
477 | 11.6k | pstr_sbr_header->noise_bands = SBR_NOISE_BND_DEF; |
478 | 11.6k | } |
479 | | |
480 | 17.7k | if (header_extra_2) { |
481 | 7.67k | tmp = ixheaacd_read_bits_buf( |
482 | 7.67k | it_bit_buff, SBR_BND_LIMIT_BITS + SBR_GAIN_LIMIT_BITS + |
483 | 7.67k | SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS); |
484 | 7.67k | pstr_sbr_header->limiter_bands = (WORD16)( |
485 | 7.67k | (tmp & 0x030) >> (SBR_GAIN_LIMIT_BITS + SBR_INTERPOL_SAMP_FREQ_BITS + |
486 | 7.67k | SBR_SMOOTH_LEN_BITS)); |
487 | 7.67k | pstr_sbr_header->limiter_gains = (WORD16)( |
488 | 7.67k | (tmp & 0x0c) >> (SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS)); |
489 | 7.67k | pstr_sbr_header->interpol_freq = |
490 | 7.67k | (WORD16)((tmp & 0x02) >> (SBR_SMOOTH_LEN_BITS)); |
491 | 7.67k | pstr_sbr_header->smoothing_mode = (WORD16)((tmp & 0x01)); |
492 | 10.0k | } else { |
493 | 10.0k | pstr_sbr_header->limiter_bands = SBR_BND_LIMIT_DEF; |
494 | 10.0k | pstr_sbr_header->limiter_gains = SBR_GAIN_LIMIT_DEF; |
495 | 10.0k | pstr_sbr_header->interpol_freq = SBR_INTERPOL_SAMP_FEQ_DEF; |
496 | 10.0k | pstr_sbr_header->smoothing_mode = SBR_SMOOTH_LEN_DEF; |
497 | 10.0k | } |
498 | 17.7k | } |
499 | | |
500 | 252k | if ((pstr_sbr_header->sync_state != SBR_ACTIVE) || |
501 | 235k | (prev_header_info.start_freq != pstr_sbr_header->start_freq) || |
502 | 228k | (prev_header_info.stop_freq != pstr_sbr_header->stop_freq) || |
503 | 226k | (prev_header_info.xover_band != pstr_sbr_header->xover_band) || |
504 | 202k | (prev_header_info.freq_scale != pstr_sbr_header->freq_scale) || |
505 | 202k | (prev_header_info.alter_scale != pstr_sbr_header->alter_scale) || |
506 | 202k | (prev_header_info.noise_bands != pstr_sbr_header->noise_bands)) { |
507 | 49.8k | return SBR_RESET; |
508 | 49.8k | } |
509 | | |
510 | 202k | return 0; |
511 | 252k | } |
512 | | |
513 | | static VOID ixheaacd_sbr_sin_coding_data( |
514 | | ia_sbr_header_data_struct *ptr_header_data, |
515 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
516 | 70.6k | ia_bit_buf_struct *it_bit_buff) { |
517 | 70.6k | FLAG *p_add_harmonic = ptr_frame_data->add_harmonics; |
518 | 70.6k | WORD32 i; |
519 | | |
520 | 70.6k | i = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]; |
521 | 902k | do { |
522 | 902k | *p_add_harmonic++ = |
523 | 902k | (FLAG)ixheaacd_read_bits_buf(it_bit_buff, SBR_ADD_SINE_FLAG_BITS); |
524 | 902k | i--; |
525 | 902k | } while (i != 0); |
526 | | |
527 | 70.6k | return; |
528 | 70.6k | } |
529 | | |
530 | | static WORD16 ixheaacd_validate_frame_info( |
531 | | ia_frame_info_struct *pstr_frame_info, WORD16 num_time_slots, |
532 | 245k | WORD audio_object_type) { |
533 | 245k | WORD32 i, j; |
534 | | |
535 | 245k | WORD32 start_pos, end_pos, transient_env, start_pos_noise, end_pos_noise, |
536 | 245k | num_env_sf, num_noise_env; |
537 | | |
538 | 245k | num_env_sf = pstr_frame_info->num_env; |
539 | 245k | num_noise_env = pstr_frame_info->num_noise_env; |
540 | | |
541 | 245k | if ((num_env_sf < 1) || (num_env_sf > MAX_ENVELOPES)) return 0; |
542 | | |
543 | 245k | if (num_noise_env > MAX_NOISE_ENVELOPES) return 0; |
544 | | |
545 | 245k | start_pos = pstr_frame_info->border_vec[0]; |
546 | 245k | end_pos = pstr_frame_info->border_vec[num_env_sf]; |
547 | 245k | transient_env = pstr_frame_info->transient_env; |
548 | | |
549 | 245k | if (transient_env > num_env_sf) return 0; |
550 | | |
551 | 245k | start_pos_noise = pstr_frame_info->noise_border_vec[0]; |
552 | 245k | end_pos_noise = pstr_frame_info->noise_border_vec[num_noise_env]; |
553 | | |
554 | 245k | if ((start_pos < 0) || (start_pos >= end_pos)) return 0; |
555 | | |
556 | 245k | if (start_pos > SBR_OV_SLOTS) return 0; |
557 | 245k | if (audio_object_type != AOT_ER_AAC_ELD && |
558 | 197k | audio_object_type != AOT_ER_AAC_LD) { |
559 | 197k | if (num_time_slots != 15) { |
560 | 197k | if (end_pos < SBR_TIME_SLOTS) return 0; |
561 | 197k | } else { |
562 | 0 | if (end_pos < num_time_slots) return 0; |
563 | 0 | } |
564 | 197k | } else { |
565 | 48.2k | if (end_pos < num_time_slots) return 0; |
566 | 48.2k | } |
567 | | |
568 | 245k | if (num_time_slots != 15) { |
569 | 228k | if (end_pos > add_d(SBR_TIME_SLOTS, SBR_OV_SLOTS)) return 0; |
570 | 228k | } else { |
571 | 17.7k | if (end_pos > add_d(num_time_slots, SBR_OV_SLOTS)) return 0; |
572 | 17.7k | } |
573 | | |
574 | 695k | for (i = 0; i < num_env_sf; i++) { |
575 | 449k | if (pstr_frame_info->border_vec[i] > pstr_frame_info->border_vec[i + 1]) |
576 | 178 | return 0; |
577 | 449k | } |
578 | | |
579 | 245k | if ((num_env_sf == 1) && (num_noise_env > 1)) return 0; |
580 | | |
581 | 245k | if ((start_pos != start_pos_noise) || (end_pos != end_pos_noise)) return 0; |
582 | | |
583 | 589k | for (i = 0; i < num_noise_env; i++) { |
584 | 343k | start_pos_noise = pstr_frame_info->noise_border_vec[i]; |
585 | | |
586 | 484k | for (j = 0; j < num_env_sf; j++) { |
587 | 484k | if (pstr_frame_info->border_vec[j] == start_pos_noise) break; |
588 | 484k | } |
589 | 343k | if (j == num_env_sf) return 0; |
590 | 343k | } |
591 | | |
592 | 245k | return 1; |
593 | 245k | } |
594 | | |
595 | | static WORD16 ixheaacd_read_enh_sbr_data( |
596 | | ia_sbr_header_data_struct *ptr_header_data, |
597 | | ia_bit_buf_struct *it_bit_buff, |
598 | | VOID *p_frame_data, |
599 | 7.56k | WORD32 ele_id) { |
600 | 7.56k | WORD32 tmp = 0; |
601 | 7.56k | WORD16 num_bits_read = 0; |
602 | 7.56k | tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PRE_FLAT_BITS); |
603 | 7.56k | ptr_header_data->pre_proc_flag = tmp; |
604 | 7.56k | num_bits_read += ESBR_PRE_FLAT_BITS; |
605 | | |
606 | 7.56k | if (ele_id == SBR_ID_SCE) { |
607 | 3.31k | ia_sbr_frame_info_data_struct *ptr_frame_data = |
608 | 3.31k | (ia_sbr_frame_info_data_struct *)p_frame_data; |
609 | | |
610 | 3.31k | tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
611 | 3.31k | ptr_frame_data->sbr_patching_mode = tmp; |
612 | 3.31k | num_bits_read += ESBR_PATCHING_MODE_BITS; |
613 | | |
614 | 3.31k | if (tmp == 0) { |
615 | 2.05k | tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
616 | 2.05k | ptr_frame_data->over_sampling_flag = tmp; |
617 | 2.05k | num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS; |
618 | | |
619 | 2.05k | tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS); |
620 | 2.05k | num_bits_read += ESBR_PITCHIN_FLAG_BITS; |
621 | | |
622 | 2.05k | if (tmp) { |
623 | 77 | tmp = |
624 | 77 | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
625 | 77 | ptr_frame_data->pitch_in_bins = tmp; |
626 | 77 | num_bits_read += ESBR_PITCHIN_BINS_BITS; |
627 | 1.97k | } else { |
628 | 1.97k | ptr_frame_data->pitch_in_bins = 0; |
629 | 1.97k | } |
630 | 2.05k | } else { |
631 | 1.25k | ptr_frame_data->over_sampling_flag = 0; |
632 | 1.25k | ptr_frame_data->pitch_in_bins = 0; |
633 | 1.25k | } |
634 | 4.25k | } else if (ele_id == SBR_ID_CPE) { |
635 | 4.25k | ia_sbr_frame_info_data_struct **ptr_frame_data = |
636 | 4.25k | (ia_sbr_frame_info_data_struct **)p_frame_data; |
637 | 4.25k | if (ptr_frame_data[0]->coupling_mode) { |
638 | 1.59k | ptr_frame_data[0]->sbr_patching_mode = |
639 | 1.59k | ptr_frame_data[1]->sbr_patching_mode = |
640 | 1.59k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
641 | 1.59k | num_bits_read += ESBR_PATCHING_MODE_BITS; |
642 | | |
643 | 1.59k | if (ptr_frame_data[0]->sbr_patching_mode == 0) { |
644 | 356 | ptr_frame_data[0]->over_sampling_flag = |
645 | 356 | ptr_frame_data[1]->over_sampling_flag = |
646 | 356 | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
647 | 356 | num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS; |
648 | 356 | num_bits_read += ESBR_PITCHIN_FLAG_BITS; |
649 | 356 | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) { |
650 | 30 | ptr_frame_data[0]->pitch_in_bins = |
651 | 30 | ptr_frame_data[1]->pitch_in_bins = |
652 | 30 | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
653 | 30 | num_bits_read += ESBR_PITCHIN_BINS_BITS; |
654 | 326 | } else { |
655 | 326 | ptr_frame_data[0]->pitch_in_bins = 0; |
656 | 326 | ptr_frame_data[1]->pitch_in_bins = 0; |
657 | 326 | } |
658 | 1.23k | } else { |
659 | 1.23k | ptr_frame_data[0]->over_sampling_flag = 0; |
660 | 1.23k | ptr_frame_data[0]->pitch_in_bins = 0; |
661 | | |
662 | 1.23k | ptr_frame_data[1]->over_sampling_flag = 0; |
663 | 1.23k | ptr_frame_data[1]->pitch_in_bins = 0; |
664 | 1.23k | } |
665 | 2.66k | } else { |
666 | 2.66k | ptr_frame_data[0]->sbr_patching_mode = |
667 | 2.66k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
668 | 2.66k | num_bits_read += ESBR_PATCHING_MODE_BITS; |
669 | | |
670 | 2.66k | if (ptr_frame_data[0]->sbr_patching_mode == 0) { |
671 | 705 | ptr_frame_data[0]->over_sampling_flag = |
672 | 705 | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
673 | 705 | num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS; |
674 | 705 | num_bits_read += ESBR_PITCHIN_FLAG_BITS; |
675 | 705 | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) { |
676 | 49 | ptr_frame_data[0]->pitch_in_bins = |
677 | 49 | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
678 | 49 | num_bits_read += ESBR_PITCHIN_BINS_BITS; |
679 | 656 | } else { |
680 | 656 | ptr_frame_data[0]->pitch_in_bins = 0; |
681 | 656 | } |
682 | 1.96k | } else { |
683 | 1.96k | ptr_frame_data[0]->over_sampling_flag = 0; |
684 | 1.96k | ptr_frame_data[0]->pitch_in_bins = 0; |
685 | 1.96k | } |
686 | | |
687 | 2.66k | ptr_frame_data[1]->sbr_patching_mode = |
688 | 2.66k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
689 | 2.66k | num_bits_read += ESBR_PATCHING_MODE_BITS; |
690 | | |
691 | 2.66k | if (ptr_frame_data[1]->sbr_patching_mode == 0) { |
692 | 1.05k | ptr_frame_data[1]->over_sampling_flag = |
693 | 1.05k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
694 | 1.05k | num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS; |
695 | 1.05k | num_bits_read += ESBR_PITCHIN_FLAG_BITS; |
696 | 1.05k | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) { |
697 | 237 | ptr_frame_data[1]->pitch_in_bins = |
698 | 237 | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
699 | 237 | num_bits_read += ESBR_PITCHIN_BINS_BITS; |
700 | 817 | } else { |
701 | 817 | ptr_frame_data[1]->pitch_in_bins = 0; |
702 | 817 | } |
703 | 1.61k | } else { |
704 | 1.61k | ptr_frame_data[1]->over_sampling_flag = |
705 | 1.61k | ptr_frame_data[1]->pitch_in_bins = 0; |
706 | 1.61k | } |
707 | 2.66k | } |
708 | 4.25k | } |
709 | 7.56k | if (num_bits_read < 6) { |
710 | 6.93k | ixheaacd_read_bits_buf(it_bit_buff, 6 - num_bits_read); |
711 | 6.93k | num_bits_read = 6; |
712 | 6.93k | } |
713 | 7.56k | return num_bits_read; |
714 | 7.56k | } |
715 | | |
716 | | static IA_ERRORCODE ixheaacd_read_extn_data(ia_sbr_header_data_struct *ptr_header_data, |
717 | | ia_ps_dec_struct *ptr_ps_dec, |
718 | | ia_bit_buf_struct *it_bit_buff, |
719 | | ia_ps_tables_struct *ps_tables_ptr, |
720 | 38.7k | VOID *p_frame_data, WORD32 ele_id) { |
721 | 38.7k | WORD i; |
722 | 38.7k | WORD extended_data; |
723 | 38.7k | WORD no_bits_left; |
724 | | |
725 | 38.7k | extended_data = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENLARGED_DATA_BITS); |
726 | | |
727 | 38.7k | if (extended_data) { |
728 | 11.4k | WORD cnt; |
729 | 11.4k | FLAG ps_read; |
730 | | |
731 | 11.4k | ps_read = 0; |
732 | | |
733 | 11.4k | cnt = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_SIZE_BITS); |
734 | | |
735 | 11.4k | if (cnt == ((1 << SBR_CONT_SIZE_BITS) - 1)) { |
736 | 1.07k | cnt = (cnt + ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ESC_CNT_BITS)); |
737 | 1.07k | } |
738 | | |
739 | 11.4k | no_bits_left = (cnt << 3); |
740 | | |
741 | 11.4k | ptr_header_data->hbe_flag = !ptr_header_data->usac_flag; |
742 | 11.4k | ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1; |
743 | | |
744 | 29.0k | while (no_bits_left > 7) { |
745 | 20.7k | WORD extension_id = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ID_BITS); |
746 | | |
747 | 20.7k | if (extension_id == EXTENSION_ID_ENHSBR_CODING && !ptr_header_data->enh_sbr) |
748 | 0 | { |
749 | 0 | extension_id = -1; |
750 | 0 | } |
751 | 20.7k | no_bits_left = (no_bits_left - SBR_CONT_ID_BITS); |
752 | | |
753 | 20.7k | switch (extension_id) { |
754 | 8.62k | case EXTENSION_ID_PS_CODING: |
755 | | |
756 | 8.62k | if (ptr_ps_dec == NULL) { |
757 | 2.34k | return 0; |
758 | 2.34k | } |
759 | | |
760 | 6.28k | if (!(ptr_ps_dec->force_mono || ps_read)) { |
761 | 4.37k | IA_ERRORCODE ret_val = ixheaacd_read_ps_data(ptr_ps_dec, it_bit_buff, |
762 | 4.37k | (WORD16)no_bits_left, ps_tables_ptr); |
763 | 4.37k | if (ret_val == IA_FATAL_ERROR) { |
764 | 3 | return ret_val; |
765 | 4.37k | } else { |
766 | 4.37k | no_bits_left = no_bits_left - ret_val; |
767 | 4.37k | } |
768 | | |
769 | 4.37k | if (no_bits_left < 0) return 0; |
770 | 3.72k | ptr_header_data->channel_mode = PS_STEREO; |
771 | 3.72k | ps_read = 1; |
772 | 3.72k | break; |
773 | 4.37k | } |
774 | 7.56k | case EXTENSION_ID_ENHSBR_CODING: { |
775 | 7.56k | no_bits_left = |
776 | 7.56k | (no_bits_left - ixheaacd_read_enh_sbr_data(ptr_header_data, it_bit_buff, |
777 | 7.56k | p_frame_data, ele_id)); |
778 | | |
779 | 7.56k | ptr_header_data->hbe_flag = 1; |
780 | 7.56k | ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1; |
781 | 7.56k | break; |
782 | 6.28k | } |
783 | 6.41k | default: |
784 | 6.41k | cnt = (no_bits_left >> 3); |
785 | 160k | for (i = cnt - 1; i >= 0; i--) ixheaacd_read_bits_buf(it_bit_buff, 8); |
786 | 6.41k | no_bits_left = (no_bits_left - (cnt << 3)); |
787 | 6.41k | break; |
788 | 20.7k | } |
789 | 20.7k | } |
790 | | |
791 | 8.29k | if (no_bits_left < 0) return 0; |
792 | 8.27k | ixheaacd_read_bits_buf(it_bit_buff, no_bits_left); |
793 | 8.27k | } |
794 | 35.5k | return 0; |
795 | 38.7k | } |
796 | | |
797 | | WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, |
798 | | ia_bit_buf_struct *it_bit_buff, |
799 | | WORD32 hbe_flag, |
800 | | ia_pvc_data_struct *ptr_pvc_data, |
801 | | ia_sbr_tables_struct *ptr_sbr_tables, |
802 | 95.8k | ia_sbr_header_data_struct *ptr_header_data) { |
803 | 95.8k | WORD32 i; |
804 | 95.8k | WORD32 err_code = 0; |
805 | 95.8k | ia_env_extr_tables_struct *env_extr_tables_ptr = |
806 | 95.8k | ptr_sbr_tables->env_extr_tables_ptr; |
807 | 95.8k | WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag; |
808 | | |
809 | 95.8k | if (hbe_flag) { |
810 | 63.1k | ptr_frame_data->sbr_patching_mode = |
811 | 63.1k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
812 | | |
813 | 63.1k | if (ptr_frame_data->sbr_patching_mode == 0) { |
814 | 46.4k | ptr_frame_data->over_sampling_flag = |
815 | 46.4k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
816 | 46.4k | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) |
817 | 8.12k | ptr_frame_data->pitch_in_bins = |
818 | 8.12k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
819 | 38.3k | else |
820 | 38.3k | ptr_frame_data->pitch_in_bins = 0; |
821 | 46.4k | } else { |
822 | 16.6k | ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0; |
823 | 16.6k | } |
824 | 63.1k | } |
825 | | |
826 | 95.8k | err_code = ixheaacd_pvc_time_freq_grid_info(it_bit_buff, ptr_frame_data); |
827 | 95.8k | if (err_code) return err_code; |
828 | | |
829 | 95.8k | ptr_pvc_data->prev_sbr_mode = PVC_SBR; |
830 | | |
831 | 95.8k | ixheaacd_pvc_env_dtdf_data(ptr_frame_data, it_bit_buff); |
832 | | |
833 | 434k | for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_nf_bands; i++) { |
834 | 338k | ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i]; |
835 | 338k | ptr_frame_data->sbr_invf_mode[i] = |
836 | 338k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS); |
837 | 338k | } |
838 | | |
839 | 95.8k | ptr_pvc_data->pvc_mode = ptr_header_data->pvc_mode; |
840 | | |
841 | 95.8k | err_code = ixheaacd_read_esbr_pvc_envelope(ptr_pvc_data, it_bit_buff, |
842 | 95.8k | usac_independency_flag); |
843 | 95.8k | if (err_code) return err_code; |
844 | | |
845 | 95.7k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data, |
846 | 95.7k | it_bit_buff, env_extr_tables_ptr); |
847 | | |
848 | 95.7k | memset(ptr_frame_data->add_harmonics, 0, |
849 | 95.7k | ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH] * |
850 | 95.7k | sizeof(WORD32)); |
851 | 95.7k | ptr_frame_data->pvc_mode = ptr_header_data->pvc_mode; |
852 | | |
853 | 95.7k | ixheaacd_read_sbr_addi_data(ptr_frame_data, ptr_header_data, it_bit_buff); |
854 | | |
855 | 95.7k | ptr_frame_data->coupling_mode = COUPLING_OFF; |
856 | | |
857 | 95.7k | return err_code; |
858 | 95.8k | } |
859 | | |
860 | | IA_ERRORCODE ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data, |
861 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
862 | | ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff, |
863 | | ia_sbr_tables_struct *ptr_sbr_tables, WORD audio_object_type, |
864 | 87.7k | WORD32 ec_flag) { |
865 | 87.7k | WORD32 bit; |
866 | 87.7k | WORD32 i; |
867 | 87.7k | WORD32 hbe_flag = ptr_header_data->hbe_flag; |
868 | 87.7k | WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands; |
869 | 87.7k | WORD32 usac_flag = ptr_header_data->usac_flag; |
870 | 87.7k | ia_env_extr_tables_struct *env_extr_tables_ptr = |
871 | 87.7k | ptr_sbr_tables->env_extr_tables_ptr; |
872 | 87.7k | IA_ERRORCODE err = IA_NO_ERROR; |
873 | | |
874 | 87.7k | ptr_frame_data->coupling_mode = COUPLING_OFF; |
875 | | |
876 | 87.7k | if (!usac_flag) { |
877 | 14.2k | bit = ixheaacd_read_bits_buf(it_bit_buff, 1); |
878 | | |
879 | 14.2k | if (bit) ixheaacd_read_bits_buf(it_bit_buff, SBR_SCE_RESERV_BITS); |
880 | 14.2k | if (audio_object_type == AOT_ER_AAC_ELD || |
881 | 9.98k | audio_object_type == AOT_ER_AAC_LD) { |
882 | 4.24k | if (ptr_frame_data->eld_sbr_flag == 1) { |
883 | 4.24k | err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data); |
884 | 4.24k | if (err) return err; |
885 | 4.24k | } |
886 | 9.98k | } else { |
887 | 9.98k | if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data, |
888 | 9.98k | env_extr_tables_ptr, |
889 | 9.98k | ptr_header_data->num_time_slots)) |
890 | | |
891 | 278 | return 0; |
892 | 9.98k | } |
893 | 13.9k | if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details, |
894 | 13.9k | ptr_header_data->num_time_slots, |
895 | 13.9k | audio_object_type)) |
896 | 75 | return 0; |
897 | | |
898 | 73.5k | } else { |
899 | 73.5k | if (hbe_flag) { |
900 | 46.0k | ptr_frame_data->sbr_patching_mode = |
901 | 46.0k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
902 | 46.0k | if (ptr_frame_data->sbr_patching_mode == 0) { |
903 | 22.0k | ptr_frame_data->over_sampling_flag = |
904 | 22.0k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
905 | 22.0k | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) |
906 | 2.83k | ptr_frame_data->pitch_in_bins = |
907 | 2.83k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
908 | 19.2k | else |
909 | 19.2k | ptr_frame_data->pitch_in_bins = 0; |
910 | 23.9k | } else { |
911 | 23.9k | ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0; |
912 | 23.9k | } |
913 | 46.0k | } |
914 | 73.5k | ptr_frame_data->num_time_slots = ptr_header_data->num_time_slots; |
915 | 73.5k | if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data, |
916 | 73.5k | env_extr_tables_ptr, |
917 | 73.5k | ptr_header_data->num_time_slots)) |
918 | 67 | return 0; |
919 | | |
920 | 73.5k | if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details, |
921 | 73.5k | ptr_header_data->num_time_slots, |
922 | 73.5k | audio_object_type)) |
923 | 42 | return 0; |
924 | | |
925 | 73.4k | ptr_frame_data->prev_sbr_mode = ORIG_SBR; |
926 | 73.4k | } |
927 | | |
928 | 87.3k | ixheaacd_sbr_env_dtdf_data(ptr_frame_data, it_bit_buff, |
929 | 87.3k | ptr_header_data->usac_flag); |
930 | | |
931 | 87.3k | if (ptr_frame_data->del_cod_dir_arr[0] == DTDF_DIR_FREQ) { |
932 | 65.9k | ptr_header_data->err_flag = 0; |
933 | 65.9k | } |
934 | | |
935 | 304k | for (i = 0; i < num_if_bands; i++) { |
936 | 217k | ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i]; |
937 | 217k | ptr_frame_data->sbr_invf_mode[i] = |
938 | 217k | ixheaacd_read_bits_buf(it_bit_buff, SBR_INVERSE_FILT_MODE_BITS); |
939 | 217k | } |
940 | | |
941 | 87.3k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data, it_bit_buff, |
942 | 87.3k | env_extr_tables_ptr, audio_object_type)) |
943 | 0 | return 0; |
944 | | |
945 | 87.3k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data, |
946 | 87.3k | it_bit_buff, env_extr_tables_ptr); |
947 | | |
948 | 87.3k | if (usac_flag) { |
949 | 73.3k | memset( |
950 | 73.3k | ptr_frame_data->add_harmonics, 0, |
951 | 73.3k | ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32)); |
952 | 73.3k | ptr_frame_data->coupling_mode = COUPLING_OFF; |
953 | 73.3k | } |
954 | | |
955 | 87.3k | bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1); |
956 | 87.3k | if (bit) { |
957 | 20.9k | ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data, it_bit_buff); |
958 | 66.3k | } else { |
959 | 66.3k | memset(ptr_frame_data->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS); |
960 | 66.3k | } |
961 | | |
962 | 87.3k | if (!usac_flag) { |
963 | 13.8k | IA_ERRORCODE err = |
964 | 13.8k | ixheaacd_read_extn_data(ptr_header_data, ptr_ps_dec, it_bit_buff, |
965 | 13.8k | ptr_sbr_tables->ps_tables_ptr, ptr_frame_data, SBR_ID_SCE); |
966 | 13.8k | if (err == IA_FATAL_ERROR) { |
967 | 3 | if (ec_flag) |
968 | 0 | return 0; |
969 | 3 | else |
970 | 3 | return err; |
971 | 3 | } |
972 | 13.8k | } |
973 | | |
974 | 87.3k | return 1; |
975 | 87.3k | } |
976 | | |
977 | | IA_ERRORCODE ixheaacd_sbr_read_cpe( |
978 | | ia_sbr_header_data_struct *ptr_header_data, |
979 | | ia_sbr_frame_info_data_struct **ptr_frame_data, |
980 | | ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables, |
981 | 95.9k | WORD audio_object_type) { |
982 | 95.9k | WORD32 i, k, bit, num_ch = 2; |
983 | 95.9k | WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands; |
984 | 95.9k | WORD32 hbe_flag = ptr_header_data->hbe_flag; |
985 | 95.9k | WORD32 usac_flag = ptr_header_data->usac_flag; |
986 | 95.9k | IA_ERRORCODE err = IA_NO_ERROR; |
987 | 95.9k | ia_env_extr_tables_struct *env_extr_tables_ptr = |
988 | 95.9k | ptr_sbr_tables->env_extr_tables_ptr; |
989 | 95.9k | bit = ixheaacd_read_bits_buf(it_bit_buff, 1); |
990 | | |
991 | 95.9k | if (usac_flag) { |
992 | 70.7k | if (bit) { |
993 | 26.9k | if (hbe_flag) { |
994 | 16.5k | ptr_frame_data[0]->sbr_patching_mode = |
995 | 16.5k | ptr_frame_data[1]->sbr_patching_mode = |
996 | 16.5k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
997 | 16.5k | if (ptr_frame_data[0]->sbr_patching_mode == 0) { |
998 | 9.23k | ptr_frame_data[0]->over_sampling_flag = |
999 | 9.23k | ptr_frame_data[1]->over_sampling_flag = ixheaacd_read_bits_buf( |
1000 | 9.23k | it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
1001 | 9.23k | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) |
1002 | 1.35k | ptr_frame_data[0]->pitch_in_bins = |
1003 | 1.35k | ptr_frame_data[1]->pitch_in_bins = |
1004 | 1.35k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
1005 | 7.88k | else |
1006 | 7.88k | ptr_frame_data[0]->pitch_in_bins = |
1007 | 7.88k | ptr_frame_data[1]->pitch_in_bins = 0; |
1008 | 9.23k | } else { |
1009 | 7.33k | ptr_frame_data[0]->over_sampling_flag = 0; |
1010 | 7.33k | ptr_frame_data[1]->over_sampling_flag = 0; |
1011 | 7.33k | ptr_frame_data[0]->pitch_in_bins = 0; |
1012 | 7.33k | ptr_frame_data[1]->pitch_in_bins = 0; |
1013 | 7.33k | } |
1014 | 16.5k | } |
1015 | 26.9k | ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL; |
1016 | 26.9k | ptr_frame_data[1]->coupling_mode = COUPLING_BAL; |
1017 | 43.7k | } else { |
1018 | 43.7k | if (hbe_flag) { |
1019 | 23.8k | ptr_frame_data[0]->sbr_patching_mode = |
1020 | 23.8k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
1021 | 23.8k | if (ptr_frame_data[0]->sbr_patching_mode == 0) { |
1022 | 17.4k | ptr_frame_data[0]->over_sampling_flag = |
1023 | 17.4k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
1024 | 17.4k | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) |
1025 | 4.49k | ptr_frame_data[0]->pitch_in_bins = |
1026 | 4.49k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
1027 | 13.0k | else |
1028 | 13.0k | ptr_frame_data[0]->pitch_in_bins = 0; |
1029 | 17.4k | } else { |
1030 | 6.34k | ptr_frame_data[0]->over_sampling_flag = 0; |
1031 | 6.34k | ptr_frame_data[0]->pitch_in_bins = 0; |
1032 | 6.34k | } |
1033 | 23.8k | ptr_frame_data[1]->sbr_patching_mode = |
1034 | 23.8k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS); |
1035 | 23.8k | if (ptr_frame_data[1]->sbr_patching_mode == 0) { |
1036 | 14.0k | ptr_frame_data[1]->over_sampling_flag = |
1037 | 14.0k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS); |
1038 | 14.0k | if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) |
1039 | 4.98k | ptr_frame_data[1]->pitch_in_bins = |
1040 | 4.98k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS); |
1041 | 9.06k | else |
1042 | 9.06k | ptr_frame_data[1]->pitch_in_bins = 0; |
1043 | 14.0k | } else { |
1044 | 9.79k | ptr_frame_data[1]->over_sampling_flag = |
1045 | 9.79k | ptr_frame_data[1]->pitch_in_bins = 0; |
1046 | 9.79k | } |
1047 | 23.8k | } |
1048 | | |
1049 | 43.7k | ptr_frame_data[0]->coupling_mode = COUPLING_OFF; |
1050 | 43.7k | ptr_frame_data[1]->coupling_mode = COUPLING_OFF; |
1051 | 43.7k | } |
1052 | 70.7k | } else { |
1053 | 25.2k | if (bit) { |
1054 | 5.43k | ixheaacd_read_bits_buf(it_bit_buff, |
1055 | 5.43k | SBR_SCE_RESERV_BITS + SBR_SCE_RESERV_BITS); |
1056 | 5.43k | } |
1057 | 25.2k | if ((audio_object_type != AOT_ER_AAC_ELD) && |
1058 | 40 | (ptr_header_data->channel_mode != SBR_STEREO)) { |
1059 | 0 | ptr_header_data->sync_state = UPSAMPLING; |
1060 | 0 | return 0; |
1061 | 0 | } |
1062 | | |
1063 | 25.2k | bit = ixheaacd_read_bits_buf(it_bit_buff, SBR_COUPLNG_MODE_BITS); |
1064 | | |
1065 | 25.2k | if (bit) { |
1066 | 6.29k | ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL; |
1067 | 6.29k | ptr_frame_data[1]->coupling_mode = COUPLING_BAL; |
1068 | 18.9k | } else { |
1069 | 18.9k | ptr_frame_data[0]->coupling_mode = COUPLING_OFF; |
1070 | 18.9k | ptr_frame_data[1]->coupling_mode = COUPLING_OFF; |
1071 | 18.9k | } |
1072 | 25.2k | } |
1073 | | |
1074 | 254k | for (i = 0; i < num_ch; i++) { |
1075 | 158k | ptr_frame_data[i]->num_time_slots = ptr_header_data->num_time_slots; |
1076 | 158k | if (audio_object_type == AOT_ER_AAC_ELD || |
1077 | 114k | audio_object_type == AOT_ER_AAC_LD) { |
1078 | 44.0k | if (ptr_frame_data[i]->eld_sbr_flag == 1) { |
1079 | 44.0k | err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data[i]); |
1080 | 44.0k | if (err) return err; |
1081 | 44.0k | } |
1082 | 114k | } else { |
1083 | 114k | if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data[i], |
1084 | 114k | env_extr_tables_ptr, |
1085 | 114k | ptr_header_data->num_time_slots)) |
1086 | 53 | return 0; |
1087 | 114k | } |
1088 | | |
1089 | 158k | if (!ixheaacd_validate_frame_info( |
1090 | 158k | &ptr_frame_data[i]->str_frame_info_details, |
1091 | 158k | ptr_header_data->num_time_slots, audio_object_type)) |
1092 | 61 | return 0; |
1093 | | |
1094 | 158k | if (ptr_frame_data[0]->coupling_mode) { |
1095 | 33.2k | memcpy(&ptr_frame_data[1]->str_frame_info_details, |
1096 | 33.2k | &ptr_frame_data[0]->str_frame_info_details, |
1097 | 33.2k | sizeof(ia_frame_info_struct)); |
1098 | 33.2k | if (audio_object_type == AOT_ER_AAC_ELD || |
1099 | 26.9k | audio_object_type == AOT_ER_AAC_LD) { |
1100 | 6.27k | ptr_frame_data[1]->amp_res = ptr_frame_data[0]->amp_res; |
1101 | 6.27k | } |
1102 | 33.2k | num_ch = 1; |
1103 | 33.2k | } |
1104 | 158k | } |
1105 | | |
1106 | 95.8k | if (ptr_frame_data[0]->coupling_mode && usac_flag) { |
1107 | 26.9k | ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff, |
1108 | 26.9k | ptr_header_data->usac_flag); |
1109 | 26.9k | ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff, |
1110 | 26.9k | ptr_header_data->usac_flag); |
1111 | | |
1112 | 96.6k | for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_if_bands; i++) { |
1113 | 69.7k | ptr_frame_data[0]->sbr_invf_mode_prev[i] = |
1114 | 69.7k | ptr_frame_data[0]->sbr_invf_mode[i]; |
1115 | 69.7k | ptr_frame_data[1]->sbr_invf_mode_prev[i] = |
1116 | 69.7k | ptr_frame_data[1]->sbr_invf_mode[i]; |
1117 | | |
1118 | 69.7k | ptr_frame_data[0]->sbr_invf_mode[i] = |
1119 | 69.7k | ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS); |
1120 | 69.7k | ptr_frame_data[1]->sbr_invf_mode[i] = ptr_frame_data[0]->sbr_invf_mode[i]; |
1121 | 69.7k | } |
1122 | | |
1123 | 26.9k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0], |
1124 | 26.9k | it_bit_buff, env_extr_tables_ptr, |
1125 | 26.9k | audio_object_type)) { |
1126 | 0 | return 0; |
1127 | 0 | } |
1128 | 26.9k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0], |
1129 | 26.9k | it_bit_buff, env_extr_tables_ptr); |
1130 | | |
1131 | 26.9k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1], |
1132 | 26.9k | it_bit_buff, env_extr_tables_ptr, |
1133 | 26.9k | audio_object_type)) { |
1134 | 0 | return 0; |
1135 | 0 | } |
1136 | 26.9k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1], |
1137 | 26.9k | it_bit_buff, env_extr_tables_ptr); |
1138 | | |
1139 | 26.9k | memset( |
1140 | 26.9k | ptr_frame_data[0]->add_harmonics, 0, |
1141 | 26.9k | ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32)); |
1142 | 26.9k | memset( |
1143 | 26.9k | ptr_frame_data[1]->add_harmonics, 0, |
1144 | 26.9k | ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32)); |
1145 | | |
1146 | 68.8k | } else { |
1147 | 68.8k | ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff, |
1148 | 68.8k | ptr_header_data->usac_flag); |
1149 | 68.8k | ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff, |
1150 | 68.8k | ptr_header_data->usac_flag); |
1151 | | |
1152 | 68.8k | if ((ptr_frame_data[0]->del_cod_dir_arr[0] == DTDF_DIR_FREQ) && |
1153 | 45.3k | (ptr_frame_data[1]->del_cod_dir_arr[0] == DTDF_DIR_FREQ)) { |
1154 | 34.8k | ptr_header_data->err_flag = 0; |
1155 | 34.8k | } |
1156 | | |
1157 | 200k | for (k = 0; k < num_ch; k++) { |
1158 | 423k | for (i = 0; i < num_if_bands; i++) { |
1159 | 292k | ptr_frame_data[k]->sbr_invf_mode_prev[i] = |
1160 | 292k | ptr_frame_data[k]->sbr_invf_mode[i]; |
1161 | 292k | ptr_frame_data[k]->sbr_invf_mode[i] = ixheaacd_read_bits_buf( |
1162 | 292k | it_bit_buff, SBR_INVERSE_FILT_MODE_BITS); |
1163 | 292k | } |
1164 | 131k | } |
1165 | | |
1166 | 68.8k | if (ptr_frame_data[0]->coupling_mode) { |
1167 | 6.29k | memcpy(ptr_frame_data[1]->sbr_invf_mode_prev, ptr_frame_data[1]->sbr_invf_mode, |
1168 | 6.29k | sizeof(ptr_frame_data[1]->sbr_invf_mode_prev[0]) * num_if_bands); |
1169 | 6.29k | memcpy(ptr_frame_data[1]->sbr_invf_mode, ptr_frame_data[0]->sbr_invf_mode, |
1170 | 6.29k | sizeof(WORD32) * num_if_bands); |
1171 | | |
1172 | 6.29k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0], |
1173 | 6.29k | it_bit_buff, env_extr_tables_ptr, |
1174 | 6.29k | audio_object_type)) { |
1175 | 0 | return 0; |
1176 | 0 | } |
1177 | | |
1178 | 6.29k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0], |
1179 | 6.29k | it_bit_buff, env_extr_tables_ptr); |
1180 | | |
1181 | 6.29k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1], |
1182 | 6.29k | it_bit_buff, env_extr_tables_ptr, |
1183 | 6.29k | audio_object_type)) { |
1184 | 0 | return 0; |
1185 | 0 | } |
1186 | 62.5k | } else { |
1187 | 62.5k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0], |
1188 | 62.5k | it_bit_buff, env_extr_tables_ptr, |
1189 | 62.5k | audio_object_type)) |
1190 | 0 | return 0; |
1191 | | |
1192 | 62.5k | if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1], |
1193 | 62.5k | it_bit_buff, env_extr_tables_ptr, |
1194 | 62.5k | audio_object_type)) |
1195 | 0 | return 0; |
1196 | | |
1197 | 62.5k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0], |
1198 | 62.5k | it_bit_buff, env_extr_tables_ptr); |
1199 | 62.5k | } |
1200 | 68.8k | ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1], |
1201 | 68.8k | it_bit_buff, env_extr_tables_ptr); |
1202 | 68.8k | } |
1203 | | |
1204 | 95.8k | bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1); |
1205 | 95.8k | if (bit) { |
1206 | 23.3k | ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[0], |
1207 | 23.3k | it_bit_buff); |
1208 | 72.4k | } else { |
1209 | 72.4k | memset(ptr_frame_data[0]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS); |
1210 | 72.4k | } |
1211 | | |
1212 | 95.8k | bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1); |
1213 | 95.8k | if (bit) { |
1214 | 26.3k | ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[1], |
1215 | 26.3k | it_bit_buff); |
1216 | 69.4k | } else { |
1217 | 69.4k | memset(ptr_frame_data[1]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS); |
1218 | 69.4k | } |
1219 | | |
1220 | 95.8k | if (!usac_flag) { |
1221 | 24.9k | IA_ERRORCODE err = |
1222 | 24.9k | ixheaacd_read_extn_data(ptr_header_data, NULL, it_bit_buff, ptr_sbr_tables->ps_tables_ptr, |
1223 | 24.9k | (VOID *)ptr_frame_data, SBR_ID_CPE); |
1224 | 24.9k | if (err == IA_FATAL_ERROR) { |
1225 | 0 | return err; |
1226 | 0 | } |
1227 | 24.9k | } |
1228 | 95.8k | return 1; |
1229 | 95.8k | } |
1230 | | |
1231 | | VOID ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct *ptr_frame_data, |
1232 | | ia_bit_buf_struct *it_bit_buff, |
1233 | 278k | WORD32 usac_flag) { |
1234 | 278k | WORD32 i; |
1235 | 278k | WORD32 num_env = ptr_frame_data->str_frame_info_details.num_env; |
1236 | 278k | WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env; |
1237 | 278k | WORD16 *p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr; |
1238 | 278k | WORD16 *p_coding_dir_noise_vec = ptr_frame_data->del_cod_dir_noise_arr; |
1239 | 278k | WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag; |
1240 | | |
1241 | 278k | if (usac_flag) { |
1242 | 214k | if (usac_independency_flag) { |
1243 | 4.88k | *p_coding_dir_vec = 0; |
1244 | 4.88k | p_coding_dir_vec++; |
1245 | 209k | } else { |
1246 | 209k | *p_coding_dir_vec = |
1247 | 209k | (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS); |
1248 | 209k | p_coding_dir_vec++; |
1249 | 209k | } |
1250 | 353k | for (i = num_env - 1; i >= 1; i--) { |
1251 | 138k | *p_coding_dir_vec++ = |
1252 | 138k | (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS); |
1253 | 138k | } |
1254 | 214k | if (usac_independency_flag) { |
1255 | 4.88k | *p_coding_dir_noise_vec = 0; |
1256 | 4.88k | p_coding_dir_noise_vec++; |
1257 | 209k | } else { |
1258 | 209k | *p_coding_dir_noise_vec = |
1259 | 209k | (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS); |
1260 | 209k | p_coding_dir_noise_vec++; |
1261 | 209k | } |
1262 | 289k | for (i = num_noise_env - 1; i >= 1; i--) { |
1263 | 75.0k | *p_coding_dir_noise_vec++ = |
1264 | 75.0k | (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS); |
1265 | 75.0k | } |
1266 | 214k | } else { |
1267 | 229k | for (i = num_env - 1; i >= 0; i--) { |
1268 | 165k | *p_coding_dir_vec++ = |
1269 | 165k | (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS); |
1270 | 165k | } |
1271 | | |
1272 | 173k | for (i = num_noise_env - 1; i >= 0; i--) { |
1273 | 108k | *p_coding_dir_noise_vec++ = |
1274 | 108k | (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS); |
1275 | 108k | } |
1276 | 64.2k | } |
1277 | 278k | } |
1278 | | |
1279 | | VOID ixheaacd_read_env_data(ia_sbr_frame_info_data_struct *ptr_frame_data, |
1280 | | ia_bit_buf_struct *it_bit_buff, |
1281 | | ia_huffman_data_type hcb_t, |
1282 | | ia_huffman_data_type hcb_f, WORD32 *idx_t, |
1283 | | WORD32 *idx_f, WORD16 *no_band, WORD32 num_env, |
1284 | | WORD32 env_data_tbl_comp_factor, WORD32 start_bits, |
1285 | | WORD32 start_bits_balance, WORD32 num_noise_env, |
1286 | 652k | WORD32 lav, WORD32 usac_flag) { |
1287 | 652k | WORD32 j, i, ixheaacd_drc_offset = 0, |
1288 | 652k | coupling_mode = ptr_frame_data->coupling_mode, delta, bits, |
1289 | 652k | shift; |
1290 | 652k | WORD16 *p_coding_dir_vec, *p_sbr_sf; |
1291 | 652k | WORD16 index, length; |
1292 | 652k | WORD32 readword; |
1293 | 652k | FLOAT32 *p_sbr_sf_float; |
1294 | | |
1295 | 652k | if (num_noise_env) { |
1296 | 374k | p_coding_dir_vec = ptr_frame_data->del_cod_dir_noise_arr; |
1297 | 374k | p_sbr_sf = ptr_frame_data->int_noise_floor; |
1298 | 374k | p_sbr_sf_float = ptr_frame_data->flt_noise_floor; |
1299 | 374k | } else { |
1300 | 278k | p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr; |
1301 | 278k | p_sbr_sf = ptr_frame_data->int_env_sf_arr; |
1302 | 278k | p_sbr_sf_float = ptr_frame_data->flt_env_sf_arr; |
1303 | 278k | } |
1304 | | |
1305 | 652k | if (coupling_mode == COUPLING_BAL) { |
1306 | 66.3k | bits = start_bits_balance; |
1307 | 66.3k | shift = env_data_tbl_comp_factor; |
1308 | | |
1309 | 586k | } else { |
1310 | 586k | bits = start_bits; |
1311 | 586k | shift = 0; |
1312 | 586k | } |
1313 | | |
1314 | 1.72M | for (j = 0; j < num_env; j++) { |
1315 | 1.06M | ia_huffman_data_type h; |
1316 | 1.06M | const WORD32 *idx_tab; |
1317 | 1.06M | WORD32 dtdf_dir_flag = p_coding_dir_vec[j]; |
1318 | | |
1319 | 1.06M | if (dtdf_dir_flag == DTDF_DIR_FREQ) { |
1320 | 729k | p_sbr_sf[ixheaacd_drc_offset] = |
1321 | 729k | (WORD16)(ixheaacd_read_bits_buf(it_bit_buff, bits) << shift); |
1322 | 729k | p_sbr_sf_float[ixheaacd_drc_offset] = p_sbr_sf[ixheaacd_drc_offset]; |
1323 | 729k | h = hcb_f; |
1324 | 729k | idx_tab = idx_f; |
1325 | 729k | } else { |
1326 | 338k | h = hcb_t; |
1327 | 338k | idx_tab = idx_t; |
1328 | 338k | } |
1329 | | |
1330 | 6.50M | for (i = (1 - dtdf_dir_flag); i < no_band[j]; i++) { |
1331 | 5.43M | if (it_bit_buff->cnt_bits < 20) { |
1332 | 3.18k | readword = ixheaacd_show_bits_buf(it_bit_buff, it_bit_buff->cnt_bits); |
1333 | 3.18k | readword = readword << (32 - it_bit_buff->cnt_bits); |
1334 | 5.43M | } else { |
1335 | 5.43M | readword = ixheaacd_show_bits_buf(it_bit_buff, 20); |
1336 | 5.43M | readword = readword << 12; |
1337 | 5.43M | } |
1338 | 5.43M | ixheaacd_huffman_decode(readword, &index, &length, (const UWORD16 *)h, |
1339 | 5.43M | (const UWORD32 *)idx_tab); |
1340 | 5.43M | delta = index - lav; |
1341 | 5.43M | ixheaacd_read_bits_buf(it_bit_buff, length); |
1342 | 5.43M | p_sbr_sf[ixheaacd_drc_offset + i] = |
1343 | 5.43M | (WORD16)(delta << env_data_tbl_comp_factor); |
1344 | 5.43M | p_sbr_sf_float[ixheaacd_drc_offset + i] = |
1345 | 5.43M | p_sbr_sf[ixheaacd_drc_offset + i]; |
1346 | 5.43M | } |
1347 | 1.06M | if (usac_flag && (num_noise_env == 0)) { |
1348 | 353k | ptr_frame_data->inter_temp_shape_mode[j] = 0; |
1349 | 353k | if (ptr_frame_data->inter_tes_flag) { |
1350 | 76.5k | WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1); |
1351 | 76.5k | if (flag) { |
1352 | 20.1k | ptr_frame_data->inter_temp_shape_mode[j] = |
1353 | 20.1k | ixheaacd_read_bits_buf(it_bit_buff, 2); |
1354 | 20.1k | } |
1355 | 76.5k | } |
1356 | 353k | } |
1357 | 1.06M | ixheaacd_drc_offset += (no_band[j]); |
1358 | 1.06M | } |
1359 | 652k | } |
1360 | | |
1361 | | VOID ixheaacd_read_sbr_noise_floor_data( |
1362 | | ia_sbr_header_data_struct *ptr_header_data, |
1363 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
1364 | | ia_bit_buf_struct *it_bit_buff, |
1365 | 374k | ia_env_extr_tables_struct *env_extr_tables_ptr) { |
1366 | 374k | WORD32 i; |
1367 | 374k | WORD32 coupling_mode; |
1368 | 374k | WORD16 num_noise_bands[MAX_NOISE_ENVELOPES]; |
1369 | 374k | ia_huffman_data_type hcb_noise_env; |
1370 | 374k | ia_huffman_data_type hcb_noise; |
1371 | 374k | WORD32 *idx_noise_env; |
1372 | 374k | WORD32 *idx_noise; |
1373 | 374k | WORD32 lav; |
1374 | 374k | WORD32 env_data_tbl_comp_factor; |
1375 | | |
1376 | 374k | WORD32 start_bits; |
1377 | 374k | WORD32 start_bits_balance; |
1378 | 374k | WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env; |
1379 | | |
1380 | 924k | for (i = 0; i < num_noise_env; i++) |
1381 | 549k | num_noise_bands[i] = ptr_header_data->pstr_freq_band_data->num_nf_bands; |
1382 | | |
1383 | 374k | start_bits = SBR_BEGIN_NOISE_BITS_AMPLITUDE_RESOLUTION_3_0; |
1384 | 374k | start_bits_balance = SBR_BEGIN_NOISE_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0; |
1385 | | |
1386 | 374k | coupling_mode = ptr_frame_data->coupling_mode; |
1387 | | |
1388 | 374k | if (coupling_mode == COUPLING_BAL) { |
1389 | 33.1k | lav = 12; |
1390 | 33.1k | hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr |
1391 | 33.1k | ->ixheaacd_t_huffman_noise_bal_3_0db_inp_table; |
1392 | 33.1k | idx_noise = |
1393 | 33.1k | env_extr_tables_ptr->ixheaacd_t_huffman_noise_bal_3_0db_idx_table; |
1394 | 33.1k | hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr |
1395 | 33.1k | ->ixheaacd_f_huffman_env_bal_3_0db_inp_table; |
1396 | 33.1k | idx_noise_env = |
1397 | 33.1k | env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table; |
1398 | 33.1k | env_data_tbl_comp_factor = 1; |
1399 | 341k | } else { |
1400 | 341k | lav = 31; |
1401 | 341k | hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr |
1402 | 341k | ->ixheaacd_t_huffman_noise_3_0db_inp_table; |
1403 | 341k | idx_noise = env_extr_tables_ptr->ixheaacd_t_huffman_noise_3_0db_idx_table; |
1404 | 341k | hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr |
1405 | 341k | ->ixheaacd_f_huffman_env_3_0db_inp_table; |
1406 | 341k | idx_noise_env = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table; |
1407 | 341k | env_data_tbl_comp_factor = 0; |
1408 | 341k | } |
1409 | | |
1410 | 374k | ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_noise, hcb_noise_env, |
1411 | 374k | idx_noise, idx_noise_env, &num_noise_bands[0], |
1412 | 374k | num_noise_env, env_data_tbl_comp_factor, start_bits, |
1413 | 374k | start_bits_balance, 1, lav, |
1414 | 374k | ptr_header_data->usac_flag); |
1415 | 374k | } |
1416 | | |
1417 | | WORD16 ixheaacd_read_sbr_env_data( |
1418 | | ia_sbr_header_data_struct *ptr_header_data, |
1419 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
1420 | | ia_bit_buf_struct *it_bit_buff, |
1421 | 278k | ia_env_extr_tables_struct *env_extr_tables_ptr, WORD audio_object_type) { |
1422 | 278k | WORD32 coupling_mode = ptr_frame_data->coupling_mode; |
1423 | 278k | WORD32 *idx_t, *idx_f; |
1424 | 278k | WORD32 lav; |
1425 | 278k | WORD32 i; |
1426 | 278k | WORD16 no_band[MAX_ENVELOPES]; |
1427 | 278k | WORD32 amp_res, num_env, env_data_tbl_comp_factor, start_bits, |
1428 | 278k | start_bits_balance; |
1429 | 278k | WORD16 *p_freq_res = ptr_frame_data->str_frame_info_details.freq_res; |
1430 | 278k | WORD16 *p_num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands; |
1431 | 278k | ia_huffman_data_type hcb_t, hcb_f; |
1432 | | |
1433 | 278k | amp_res = ptr_header_data->amp_res; |
1434 | 278k | num_env = ptr_frame_data->str_frame_info_details.num_env; |
1435 | | |
1436 | 278k | ptr_frame_data->num_env_sfac = 0; |
1437 | | |
1438 | 278k | if ((ptr_frame_data->str_frame_info_details.frame_class == FIXFIX) && |
1439 | 186k | (num_env == 1)) { |
1440 | 122k | if (audio_object_type != AOT_ER_AAC_ELD && |
1441 | 106k | audio_object_type != AOT_ER_AAC_LD) { |
1442 | 106k | amp_res = SBR_AMPLITUDE_RESOLUTION_1_5; |
1443 | 106k | } else { |
1444 | 16.0k | amp_res = ptr_frame_data->amp_res; |
1445 | 16.0k | } |
1446 | 122k | } |
1447 | 278k | ptr_frame_data->amp_res = amp_res; |
1448 | | |
1449 | 278k | if (amp_res == SBR_AMPLITUDE_RESOLUTION_3_0) { |
1450 | 61.1k | start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_3_0; |
1451 | 61.1k | start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0; |
1452 | 217k | } else { |
1453 | 217k | start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_1_5; |
1454 | 217k | start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_1_5; |
1455 | 217k | } |
1456 | | |
1457 | 797k | for (i = 0; i < num_env; i++) { |
1458 | 518k | no_band[i] = p_num_sf_bands[*p_freq_res++]; |
1459 | 518k | ptr_frame_data->num_env_sfac = |
1460 | 518k | ixheaac_add16(ptr_frame_data->num_env_sfac, no_band[i]); |
1461 | 518k | } |
1462 | | |
1463 | 278k | if (ptr_frame_data->num_env_sfac > MAX_NUM_ENVELOPE_VALUES) return 0; |
1464 | | |
1465 | 278k | if (coupling_mode == COUPLING_BAL) { |
1466 | 33.1k | env_data_tbl_comp_factor = 1; |
1467 | | |
1468 | 33.1k | if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) { |
1469 | 24.1k | lav = 24; |
1470 | 24.1k | hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr |
1471 | 24.1k | ->ixheaacd_t_huffman_env_bal_1_5db_inp_table; |
1472 | 24.1k | idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_1_5db_idx_table; |
1473 | 24.1k | hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr |
1474 | 24.1k | ->ixheaacd_f_huffman_env_bal_1_5db_inp_table; |
1475 | 24.1k | idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_1_5db_idx_table; |
1476 | 24.1k | } else { |
1477 | 9.04k | lav = 12; |
1478 | 9.04k | hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr |
1479 | 9.04k | ->ixheaacd_t_huffman_env_bal_3_0db_inp_table; |
1480 | 9.04k | idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_3_0db_idx_table; |
1481 | 9.04k | hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr |
1482 | 9.04k | ->ixheaacd_f_huffman_env_bal_3_0db_inp_table; |
1483 | 9.04k | idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table; |
1484 | 9.04k | } |
1485 | 245k | } else { |
1486 | 245k | env_data_tbl_comp_factor = 0; |
1487 | | |
1488 | 245k | if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) { |
1489 | 193k | lav = 60; |
1490 | 193k | hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr |
1491 | 193k | ->ixheaacd_t_huffman_env_1_5db_inp_table; |
1492 | 193k | idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_1_5db_idx_table; |
1493 | 193k | hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr |
1494 | 193k | ->ixheaacd_f_huffman_env_1_5db_inp_table; |
1495 | 193k | idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_1_5db_idx_table; |
1496 | 193k | } else { |
1497 | 52.1k | lav = 31; |
1498 | 52.1k | hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr |
1499 | 52.1k | ->ixheaacd_t_huffman_env_3_0db_inp_table; |
1500 | 52.1k | idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_3_0db_idx_table; |
1501 | 52.1k | hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr |
1502 | 52.1k | ->ixheaacd_f_huffman_env_3_0db_inp_table; |
1503 | 52.1k | idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table; |
1504 | 52.1k | } |
1505 | 245k | } |
1506 | | |
1507 | 278k | ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_t, hcb_f, idx_t, |
1508 | 278k | idx_f, &no_band[0], num_env, env_data_tbl_comp_factor, |
1509 | 278k | start_bits, start_bits_balance, 0, lav, |
1510 | 278k | ptr_header_data->usac_flag); |
1511 | | |
1512 | 278k | return 1; |
1513 | 278k | } |
1514 | | |
1515 | | IA_ERRORCODE ixheaacd_extract_frame_info_ld( |
1516 | | ia_bit_buf_struct *it_bit_buff, |
1517 | 48.2k | ia_sbr_frame_info_data_struct *h_frame_data) { |
1518 | 48.2k | int abs_bord_lead = 0, num_rel_lead = 0, bs_num_env = 0, |
1519 | 48.2k | frame_class, temp, env, k, abs_bord_trail = 0, middle_bord = 0, |
1520 | 48.2k | bs_num_noise, transient_env_temp = 0, bs_transient_position = 0; |
1521 | | |
1522 | 48.2k | IA_ERRORCODE err = IA_NO_ERROR; |
1523 | 48.2k | WORD16 time_border[MAX_ENVELOPES + 1]; |
1524 | 48.2k | WORD16 time_border_noise[2 + 1]; |
1525 | 48.2k | WORD16 f[MAX_ENVELOPES + 1]; |
1526 | 48.2k | int rel_bord_lead[7] = {0}; |
1527 | | |
1528 | 48.2k | ia_frame_info_struct *v_frame_info = &h_frame_data->str_frame_info_details; |
1529 | | |
1530 | 48.2k | int numTimeSlots = h_frame_data->num_time_slots; |
1531 | | |
1532 | 48.2k | v_frame_info->frame_class = frame_class = |
1533 | 48.2k | ixheaacd_read_bits_buf(it_bit_buff, SBRLD_CLA_BITS); |
1534 | | |
1535 | 48.2k | switch (frame_class) { |
1536 | 31.1k | case FIXFIX: |
1537 | 31.1k | temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS); |
1538 | 31.1k | bs_num_env = 1 << temp; |
1539 | | |
1540 | 31.1k | if (bs_num_env == 1) |
1541 | 15.2k | h_frame_data->amp_res = |
1542 | 15.2k | ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS); |
1543 | | |
1544 | 31.1k | f[0] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS); |
1545 | | |
1546 | 71.4k | for (env = 1; env < bs_num_env; env++) f[env] = f[0]; |
1547 | 31.1k | break; |
1548 | 17.1k | case LD_TRAN: |
1549 | 17.1k | bs_transient_position = |
1550 | 17.1k | ixheaacd_read_bits_buf(it_bit_buff, SBR_TRAN_BITS); |
1551 | 17.1k | v_frame_info->frame_class = 0; |
1552 | 17.1k | if ((numTimeSlots != 16) && (bs_transient_position >= LD_ENV_TBL_480)) { |
1553 | 16 | return -1; |
1554 | 16 | } |
1555 | 17.1k | bs_num_env = (numTimeSlots == 16) |
1556 | 17.1k | ? ixheaacd_ld_env_table_512[bs_transient_position] |
1557 | 11.1k | [SBR_ENVT_NUMENV] |
1558 | 17.1k | : ixheaacd_ld_env_table_480[bs_transient_position] |
1559 | 5.99k | [SBR_ENVT_NUMENV]; |
1560 | 61.2k | for (env = 0; env < bs_num_env; env++) |
1561 | 44.0k | f[env] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS); |
1562 | 17.1k | break; |
1563 | 48.2k | } |
1564 | | |
1565 | 48.2k | switch (frame_class) { |
1566 | 31.1k | case FIXFIX: |
1567 | 31.1k | abs_bord_lead = 0; |
1568 | 31.1k | abs_bord_trail = numTimeSlots; |
1569 | 31.1k | num_rel_lead = bs_num_env - 1; |
1570 | | |
1571 | 71.4k | for (k = 0; k < num_rel_lead; k++) { |
1572 | 40.3k | rel_bord_lead[k] = ixheaacd_ld_env_table_time_slot[num_rel_lead - 1]; |
1573 | 40.3k | } |
1574 | | |
1575 | 31.1k | time_border[0] = abs_bord_lead; |
1576 | 31.1k | time_border[bs_num_env] = abs_bord_trail; |
1577 | 71.4k | for (env = 1; env <= num_rel_lead; env++) { |
1578 | 40.3k | time_border[env] = abs_bord_lead; |
1579 | 160k | for (k = 0; k <= env - 1; k++) time_border[env] += rel_bord_lead[k]; |
1580 | 40.3k | } |
1581 | 31.1k | break; |
1582 | | |
1583 | 17.1k | case LD_TRAN: |
1584 | 17.1k | time_border[0] = 0; |
1585 | 17.1k | time_border[bs_num_env] = numTimeSlots; |
1586 | 44.0k | for (k = 1; k < bs_num_env; k++) |
1587 | 26.9k | time_border[k] = |
1588 | 26.9k | (numTimeSlots == 16) |
1589 | 26.9k | ? ixheaacd_ld_env_table_512[bs_transient_position][k] |
1590 | 26.9k | : ixheaacd_ld_env_table_480[bs_transient_position][k]; |
1591 | 17.1k | break; |
1592 | | |
1593 | 0 | default: |
1594 | 0 | time_border[0] = 0; |
1595 | |
|
1596 | 0 | break; |
1597 | 48.2k | }; |
1598 | | |
1599 | 48.2k | switch (frame_class) { |
1600 | 31.1k | case FIXFIX: |
1601 | 31.1k | middle_bord = bs_num_env / 2; |
1602 | 31.1k | break; |
1603 | 17.1k | case LD_TRAN: |
1604 | 17.1k | middle_bord = 1; |
1605 | 17.1k | break; |
1606 | 48.2k | }; |
1607 | | |
1608 | 48.2k | time_border_noise[0] = time_border[0]; |
1609 | 48.2k | if (bs_num_env > 1) { |
1610 | 33.0k | time_border_noise[1] = time_border[middle_bord]; |
1611 | 33.0k | time_border_noise[2] = time_border[bs_num_env]; |
1612 | 33.0k | bs_num_noise = 2; |
1613 | 33.0k | } else { |
1614 | 15.2k | time_border_noise[1] = time_border[bs_num_env]; |
1615 | 15.2k | bs_num_noise = 1; |
1616 | 15.2k | } |
1617 | | |
1618 | 48.2k | switch (frame_class) { |
1619 | 31.1k | case FIXFIX: |
1620 | 31.1k | transient_env_temp = -1; |
1621 | 31.1k | break; |
1622 | 17.1k | case LD_TRAN: |
1623 | 17.1k | transient_env_temp = |
1624 | 17.1k | (numTimeSlots == 16) |
1625 | 17.1k | ? ixheaacd_ld_env_table_512[bs_transient_position] |
1626 | 11.1k | [SBR_ENVT_TRANIDX] |
1627 | 17.1k | : ixheaacd_ld_env_table_480[bs_transient_position] |
1628 | 5.99k | [SBR_ENVT_TRANIDX]; |
1629 | 17.1k | break; |
1630 | 48.2k | }; |
1631 | | |
1632 | 48.2k | v_frame_info->num_env = bs_num_env; |
1633 | 48.2k | memcpy(v_frame_info->border_vec, time_border, |
1634 | 48.2k | (bs_num_env + 1) * sizeof(WORD16)); |
1635 | 48.2k | memcpy(v_frame_info->freq_res, f, bs_num_env * sizeof(WORD16)); |
1636 | 48.2k | v_frame_info->transient_env = transient_env_temp; |
1637 | 48.2k | v_frame_info->num_noise_env = bs_num_noise; |
1638 | 48.2k | memcpy(v_frame_info->noise_border_vec, time_border_noise, |
1639 | 48.2k | (bs_num_noise + 1) * sizeof(WORD16)); |
1640 | | |
1641 | 48.2k | return err; |
1642 | 48.2k | } |
1643 | | |
1644 | | WORD32 ixheaacd_pvc_time_freq_grid_info( |
1645 | | ia_bit_buf_struct *it_bit_buff, |
1646 | 95.8k | ia_sbr_frame_info_data_struct *ptr_frame_data) { |
1647 | 95.8k | WORD32 bs_num_env = 0, bs_num_noise = 0; |
1648 | 95.8k | WORD32 time_border[MAX_ENVELOPES + 1]; |
1649 | 95.8k | WORD32 time_border_noise[2 + 1]; |
1650 | 95.8k | WORD32 pvc_time_border[MAX_ENVELOPES + 1]; |
1651 | 95.8k | WORD32 pvc_time_border_noise[2 + 1]; |
1652 | 95.8k | WORD32 bs_freq_res[MAX_ENVELOPES + 1]; |
1653 | 95.8k | WORD32 var_len; |
1654 | 95.8k | ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details; |
1655 | 95.8k | ia_frame_info_struct *pvc_frame_info = &ptr_frame_data->str_pvc_frame_info; |
1656 | 95.8k | WORD32 i; |
1657 | 95.8k | WORD32 prev_sbr_mode = ptr_frame_data->prev_sbr_mode; |
1658 | | |
1659 | 95.8k | WORD32 tmp; |
1660 | 95.8k | WORD32 bs_noise_pos; |
1661 | 95.8k | bs_noise_pos = ixheaacd_read_bits_buf(it_bit_buff, 4); |
1662 | | |
1663 | 95.8k | tmp = ixheaacd_read_bits_buf(it_bit_buff, 1); |
1664 | 95.8k | if (tmp == 0) { |
1665 | 85.4k | ptr_frame_data->var_len = 0; |
1666 | 85.4k | } else { |
1667 | 10.4k | tmp = ixheaacd_read_bits_buf(it_bit_buff, 2); |
1668 | 10.4k | ptr_frame_data->var_len = tmp + 1; |
1669 | 10.4k | if (ptr_frame_data->var_len > 3) { |
1670 | 64 | return -1; |
1671 | 64 | } |
1672 | 10.4k | } |
1673 | 95.8k | var_len = ptr_frame_data->var_len; |
1674 | | |
1675 | 95.8k | if (p_frame_info->num_env > 0) { |
1676 | 95.3k | time_border[0] = p_frame_info->border_vec[p_frame_info->num_env] - 16; |
1677 | 95.3k | } else { |
1678 | 492 | time_border[0] = 0; |
1679 | 492 | } |
1680 | 95.8k | if (time_border[0] < 0) return -1; |
1681 | 95.8k | pvc_time_border[0] = 0; |
1682 | 95.8k | bs_freq_res[0] = 0; |
1683 | | |
1684 | 95.8k | if (ptr_frame_data->prev_sbr_mode == 0) { |
1685 | 491 | pvc_time_border[0] = time_border[0]; |
1686 | 491 | } |
1687 | | |
1688 | 95.8k | if (bs_noise_pos == 0) { |
1689 | 39.4k | time_border[1] = 16 + var_len; |
1690 | 39.4k | pvc_time_border[1] = 16; |
1691 | 39.4k | bs_num_noise = 1; |
1692 | 39.4k | bs_num_env = 1; |
1693 | 56.3k | } else { |
1694 | 56.3k | time_border[1] = bs_noise_pos; |
1695 | 56.3k | pvc_time_border[1] = bs_noise_pos; |
1696 | 56.3k | time_border[2] = 16 + var_len; |
1697 | 56.3k | pvc_time_border[2] = 16; |
1698 | 56.3k | bs_freq_res[1] = 0; |
1699 | 56.3k | bs_num_noise = 2; |
1700 | 56.3k | bs_num_env = 2; |
1701 | 56.3k | } |
1702 | | |
1703 | 383k | for (i = 0; i < 3; i++) { |
1704 | 287k | time_border_noise[i] = time_border[i]; |
1705 | 287k | pvc_time_border_noise[i] = pvc_time_border[i]; |
1706 | 287k | } |
1707 | | |
1708 | 95.8k | if (prev_sbr_mode == ORIG_SBR) { |
1709 | 1.52k | pvc_time_border[0] = time_border[0]; |
1710 | 1.52k | pvc_time_border_noise[0] = time_border[0]; |
1711 | 1.52k | } |
1712 | | |
1713 | 95.8k | pvc_frame_info->num_env = bs_num_env; |
1714 | 343k | for (i = 0; i < (bs_num_env + 1); i++) { |
1715 | 248k | pvc_frame_info->border_vec[i] = pvc_time_border[i]; |
1716 | 248k | } |
1717 | 248k | for (i = 0; i < (bs_num_env); i++) { |
1718 | 152k | pvc_frame_info->freq_res[i] = bs_freq_res[i]; |
1719 | 152k | } |
1720 | 95.8k | pvc_frame_info->transient_env = -1; |
1721 | 95.8k | pvc_frame_info->num_noise_env = bs_num_noise; |
1722 | 343k | for (i = 0; i < (bs_num_noise + 1); i++) { |
1723 | 248k | pvc_frame_info->noise_border_vec[i] = pvc_time_border_noise[i]; |
1724 | 248k | } |
1725 | 95.8k | p_frame_info->num_env = bs_num_env; |
1726 | 343k | for (i = 0; i < (bs_num_env + 1); i++) { |
1727 | 248k | p_frame_info->border_vec[i] = time_border[i]; |
1728 | 248k | } |
1729 | 248k | for (i = 0; i < (bs_num_env); i++) { |
1730 | 152k | p_frame_info->freq_res[i] = bs_freq_res[i]; |
1731 | 152k | } |
1732 | 95.8k | p_frame_info->transient_env = -1; |
1733 | 95.8k | p_frame_info->num_noise_env = bs_num_noise; |
1734 | 343k | for (i = 0; i < (bs_num_noise + 1); i++) { |
1735 | 248k | p_frame_info->noise_border_vec[i] = time_border_noise[i]; |
1736 | 248k | } |
1737 | 95.8k | return 0; |
1738 | 95.8k | } |
1739 | | |
1740 | | WORD16 ixheaacd_sbr_time_freq_grid_info( |
1741 | | ia_bit_buf_struct *it_bit_buff, |
1742 | | ia_sbr_frame_info_data_struct *ptr_frame_data, |
1743 | 198k | ia_env_extr_tables_struct *env_extr_tables_ptr, WORD16 number_of_time_slots) { |
1744 | 198k | WORD32 i, k, bs_num_rel = 0; |
1745 | 198k | WORD32 bs_pointer_bits = 0, bs_num_env = 0, border, bs_pointer, |
1746 | 198k | bs_var_bord = 0, temp = 0; |
1747 | 198k | WORD32 freq_res_0 = 0, frame_class; |
1748 | 198k | WORD32 abs_bord_lead, abs_bord_trail, num_rel_trail, num_rel_lead; |
1749 | 198k | static const WORD32 pointer_bits_array[7] = {1, 2, 2, 3, 3, 3, 3}; |
1750 | 198k | ia_frame_info_struct *p_fixfix_tab; |
1751 | 198k | ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details; |
1752 | | |
1753 | 198k | frame_class = ixheaacd_read_bits_buf(it_bit_buff, SBR_FRAME_CLASS_BITS); |
1754 | 198k | p_frame_info->frame_class = frame_class; |
1755 | | |
1756 | 198k | switch (frame_class) { |
1757 | 117k | case FIXFIX: |
1758 | 117k | temp = |
1759 | 117k | ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS + SBR_FRQ_RES_BITS); |
1760 | 117k | bs_num_env = (temp & 0x6) >> SBR_FRQ_RES_BITS; |
1761 | | |
1762 | 117k | if (number_of_time_slots != 15) { |
1763 | 117k | p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env]; |
1764 | 117k | } else { |
1765 | 1 | if (bs_num_env > 2) return 0; |
1766 | 1 | p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env + 4]; |
1767 | 1 | } |
1768 | | |
1769 | 117k | memcpy(p_frame_info, p_fixfix_tab, sizeof(ia_frame_info_struct)); |
1770 | 117k | bs_num_env = (1 << bs_num_env); |
1771 | 117k | freq_res_0 = temp & 0x1; |
1772 | | |
1773 | 117k | if (!freq_res_0) { |
1774 | 95.2k | memset(&p_frame_info->freq_res[0], 0, sizeof(WORD16) * bs_num_env); |
1775 | 95.2k | } |
1776 | 117k | break; |
1777 | 36.4k | case FIXVAR: |
1778 | 36.4k | bs_var_bord = |
1779 | 36.4k | ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS); |
1780 | 36.4k | bs_num_rel = bs_var_bord & 3; |
1781 | 36.4k | bs_var_bord = bs_var_bord >> SBR_NUM_BITS; |
1782 | 36.4k | bs_num_env = bs_num_rel + 1; |
1783 | 36.4k | p_frame_info->border_vec[0] = 0; |
1784 | | |
1785 | 36.4k | if (number_of_time_slots != 15) { |
1786 | 36.4k | border = bs_var_bord + SBR_TIME_SLOTS; |
1787 | 36.4k | } else { |
1788 | 2 | border = bs_var_bord + number_of_time_slots; |
1789 | 2 | } |
1790 | | |
1791 | 36.4k | p_frame_info->border_vec[bs_num_env] = border; |
1792 | 73.9k | for (k = bs_num_rel; k > 0; k--) { |
1793 | 37.4k | temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS); |
1794 | 37.4k | border = border - ((temp << 1) + 2); |
1795 | 37.4k | if (border < 0) border = 0; |
1796 | 37.4k | p_frame_info->border_vec[k] = border; |
1797 | 37.4k | } |
1798 | | |
1799 | 36.4k | bs_pointer_bits = pointer_bits_array[bs_num_rel]; |
1800 | 36.4k | bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits); |
1801 | | |
1802 | 36.4k | if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0; |
1803 | | |
1804 | 109k | for (k = bs_num_rel; k >= 0; k--) { |
1805 | 72.9k | p_frame_info->freq_res[k] = |
1806 | 72.9k | ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS); |
1807 | 72.9k | } |
1808 | 36.2k | if (bs_pointer) { |
1809 | 13.1k | p_frame_info->transient_env = bs_num_env + 1 - bs_pointer; |
1810 | 23.0k | } else { |
1811 | 23.0k | p_frame_info->transient_env = -1; |
1812 | 23.0k | } |
1813 | 36.2k | if ((bs_pointer == 0) || (bs_pointer == 1)) |
1814 | 31.7k | p_frame_info->noise_border_vec[1] = |
1815 | 31.7k | p_frame_info->border_vec[bs_num_rel]; |
1816 | 4.44k | else |
1817 | 4.44k | p_frame_info->noise_border_vec[1] = |
1818 | 4.44k | p_frame_info->border_vec[p_frame_info->transient_env]; |
1819 | | |
1820 | 36.2k | break; |
1821 | | |
1822 | 35.1k | case VARFIX: |
1823 | 35.1k | bs_var_bord = |
1824 | 35.1k | ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS); |
1825 | 35.1k | bs_num_rel = bs_var_bord & 3; |
1826 | 35.1k | bs_var_bord = bs_var_bord >> SBR_NUM_BITS; |
1827 | 35.1k | bs_num_env = bs_num_rel + 1; |
1828 | | |
1829 | 35.1k | border = bs_var_bord; |
1830 | 35.1k | p_frame_info->border_vec[0] = border; |
1831 | 59.2k | for (k = 1; k <= bs_num_rel; k++) { |
1832 | 24.0k | temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS); |
1833 | 24.0k | border = border + ((temp << 1) + 2); |
1834 | | |
1835 | 24.0k | if (number_of_time_slots != 15) { |
1836 | 24.0k | if (border > SBR_TIME_SLOTS) border = SBR_TIME_SLOTS; |
1837 | 24.0k | } else { |
1838 | 1 | if (border > number_of_time_slots) border = number_of_time_slots; |
1839 | 1 | } |
1840 | | |
1841 | 24.0k | p_frame_info->border_vec[k] = border; |
1842 | 24.0k | } |
1843 | | |
1844 | 35.1k | if (number_of_time_slots != 15) { |
1845 | 35.1k | p_frame_info->border_vec[k] = SBR_TIME_SLOTS; |
1846 | 35.1k | } else { |
1847 | 1 | p_frame_info->border_vec[k] = number_of_time_slots; |
1848 | 1 | } |
1849 | | |
1850 | 35.1k | bs_pointer_bits = pointer_bits_array[bs_num_rel]; |
1851 | | |
1852 | 35.1k | bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits); |
1853 | | |
1854 | 35.1k | if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0; |
1855 | | |
1856 | 35.1k | if (bs_pointer == 0 || (bs_pointer - 1) == 0) { |
1857 | 21.6k | p_frame_info->transient_env = -1; |
1858 | 21.6k | } else { |
1859 | 13.5k | p_frame_info->transient_env = bs_pointer - 1; |
1860 | 13.5k | } |
1861 | | |
1862 | 94.2k | for (k = 0; k <= bs_num_rel; k++) { |
1863 | 59.1k | p_frame_info->freq_res[k] = |
1864 | 59.1k | ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS); |
1865 | 59.1k | } |
1866 | | |
1867 | 35.1k | switch (bs_pointer) { |
1868 | 17.0k | case 0: |
1869 | 17.0k | p_frame_info->noise_border_vec[1] = p_frame_info->border_vec[1]; |
1870 | 17.0k | break; |
1871 | 4.55k | case 1: |
1872 | 4.55k | p_frame_info->noise_border_vec[1] = |
1873 | 4.55k | p_frame_info->border_vec[bs_num_rel]; |
1874 | 4.55k | break; |
1875 | 13.5k | default: |
1876 | 13.5k | p_frame_info->noise_border_vec[1] = |
1877 | 13.5k | p_frame_info->border_vec[(WORD32)p_frame_info->transient_env]; |
1878 | 13.5k | break; |
1879 | 35.1k | } |
1880 | | |
1881 | 35.1k | break; |
1882 | | |
1883 | 35.1k | case VARVAR: |
1884 | 8.86k | abs_bord_lead = ixheaacd_read_bits_buf( |
1885 | 8.86k | it_bit_buff, 2 * SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS); |
1886 | | |
1887 | 8.86k | if (number_of_time_slots != 15) { |
1888 | 8.86k | abs_bord_trail = |
1889 | 8.86k | (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + SBR_TIME_SLOTS); |
1890 | 8.86k | } else { |
1891 | 3 | abs_bord_trail = |
1892 | 3 | (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + number_of_time_slots); |
1893 | 3 | } |
1894 | | |
1895 | 8.86k | num_rel_trail = ((abs_bord_lead & 0xc) >> SBR_NUM_BITS); |
1896 | 8.86k | num_rel_lead = (abs_bord_lead & 0x3); |
1897 | 8.86k | abs_bord_lead = abs_bord_lead >> (SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS); |
1898 | 8.86k | bs_num_env = ((num_rel_trail + num_rel_lead) + 1); |
1899 | 8.86k | border = abs_bord_lead; |
1900 | 8.86k | p_frame_info->border_vec[0] = border; |
1901 | | |
1902 | 25.4k | for (k = 1; k <= num_rel_trail; k++) { |
1903 | 16.6k | temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS); |
1904 | 16.6k | border = border + ((temp << 1) + 2); |
1905 | 16.6k | p_frame_info->border_vec[k] = border; |
1906 | 16.6k | } |
1907 | | |
1908 | 8.86k | border = abs_bord_trail; |
1909 | 8.86k | i = bs_num_env; |
1910 | | |
1911 | 8.86k | p_frame_info->border_vec[i] = border; |
1912 | | |
1913 | 21.6k | for (k = 0; k < num_rel_lead; k++) { |
1914 | 12.8k | temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS); |
1915 | 12.8k | border = border - ((temp << 1) + 2); |
1916 | 12.8k | i--; |
1917 | 12.8k | p_frame_info->border_vec[i] = border; |
1918 | 12.8k | } |
1919 | 8.86k | bs_pointer_bits = pointer_bits_array[num_rel_trail + num_rel_lead]; |
1920 | | |
1921 | 8.86k | bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits); |
1922 | 8.86k | if ((bs_pointer - ((num_rel_trail + num_rel_lead) + 1)) > 0) return 0; |
1923 | | |
1924 | 8.74k | if (bs_pointer) { |
1925 | 5.04k | p_frame_info->transient_env = bs_num_env + 1 - bs_pointer; |
1926 | 5.04k | } else { |
1927 | 3.70k | p_frame_info->transient_env = -1; |
1928 | 3.70k | } |
1929 | | |
1930 | 46.4k | for (k = 0; k < bs_num_env; k++) { |
1931 | 37.7k | p_frame_info->freq_res[k] = |
1932 | 37.7k | ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS); |
1933 | 37.7k | } |
1934 | 8.74k | p_frame_info->noise_border_vec[0] = abs_bord_lead; |
1935 | 8.74k | if (bs_num_env == 1) { |
1936 | 1.03k | p_frame_info->noise_border_vec[1] = abs_bord_trail; |
1937 | 7.70k | } else { |
1938 | 7.70k | if (bs_pointer == 0 || (bs_pointer - 1) == 0) |
1939 | 3.42k | p_frame_info->noise_border_vec[1] = |
1940 | 3.42k | p_frame_info->border_vec[bs_num_env - 1]; |
1941 | 4.27k | else |
1942 | 4.27k | p_frame_info->noise_border_vec[1] = |
1943 | 4.27k | p_frame_info->border_vec[(WORD32)p_frame_info->transient_env]; |
1944 | | |
1945 | 7.70k | p_frame_info->noise_border_vec[2] = abs_bord_trail; |
1946 | 7.70k | } |
1947 | 8.74k | break; |
1948 | 198k | } |
1949 | 197k | p_frame_info->num_env = bs_num_env; |
1950 | | |
1951 | 197k | if (bs_num_env == 1) |
1952 | 132k | p_frame_info->num_noise_env = 1; |
1953 | 65.3k | else |
1954 | 65.3k | p_frame_info->num_noise_env = 2; |
1955 | | |
1956 | 197k | if (frame_class == VARFIX || frame_class == FIXVAR) { |
1957 | 71.3k | p_frame_info->noise_border_vec[0] = p_frame_info->border_vec[0]; |
1958 | 71.3k | p_frame_info->noise_border_vec[p_frame_info->num_noise_env] = |
1959 | 71.3k | p_frame_info->border_vec[bs_num_env]; |
1960 | 71.3k | } |
1961 | 197k | return 1; |
1962 | 198k | } |