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