/src/libxaac/decoder/ixheaacd_block.c
Line | Count | Source (jump to first uncovered line) |
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 <stdlib.h> |
21 | | #include "ixheaacd_sbr_common.h" |
22 | | #include "ixheaac_type_def.h" |
23 | | |
24 | | #include "ixheaac_constants.h" |
25 | | #include "ixheaac_basic_ops32.h" |
26 | | #include "ixheaac_basic_ops16.h" |
27 | | #include "ixheaac_basic_ops40.h" |
28 | | #include "ixheaac_basic_ops.h" |
29 | | #include "ixheaacd_common_rom.h" |
30 | | #include "ixheaacd_basic_funcs.h" |
31 | | #include "ixheaacd_defines.h" |
32 | | #include "ixheaacd_aac_rom.h" |
33 | | #include "ixheaacd_bitbuffer.h" |
34 | | #include "ixheaacd_intrinsics.h" |
35 | | #include "ixheaacd_pulsedata.h" |
36 | | |
37 | | #include "ixheaacd_pns.h" |
38 | | #include "ixheaacd_drc_data_struct.h" |
39 | | |
40 | | #include "ixheaacd_lt_predict.h" |
41 | | |
42 | | #include "ixheaacd_cnst.h" |
43 | | #include "ixheaacd_ec_defines.h" |
44 | | #include "ixheaacd_ec_struct_def.h" |
45 | | #include "ixheaacd_channelinfo.h" |
46 | | #include "ixheaacd_drc_dec.h" |
47 | | |
48 | | #include "ixheaacd_block.h" |
49 | | #include "ixheaacd_channel.h" |
50 | | |
51 | | #include "ixheaac_basic_op.h" |
52 | | |
53 | | #include "ixheaacd_tns.h" |
54 | | #include "ixheaacd_sbrdecoder.h" |
55 | | #include "ixheaacd_error_codes.h" |
56 | | |
57 | | #include "ixheaacd_audioobjtypes.h" |
58 | | #include "ixheaacd_latmdemux.h" |
59 | | |
60 | | #include "ixheaacd_aacdec.h" |
61 | | |
62 | | static PLATFORM_INLINE WORD32 ixheaacd_mac32x16in32_sat(WORD32 a, WORD32 b, |
63 | 51.2M | WORD16 c) { |
64 | 51.2M | WORD32 acc; |
65 | | |
66 | 51.2M | acc = ixheaac_mult32x16in32_sat(b, c); |
67 | | |
68 | 51.2M | acc = ixheaac_add32_sat(a, acc); |
69 | | |
70 | 51.2M | return acc; |
71 | 51.2M | } |
72 | | |
73 | | WORD32 ixheaacd_cnt_leading_ones(WORD32 a); |
74 | | |
75 | | VOID ixheaacd_huff_sfb_table(WORD32 it_bit_buff, WORD16 *huff_index, |
76 | | WORD32 *len, const UWORD16 *code_book_tbl, |
77 | 5.16M | const UWORD32 *idx_table) { |
78 | 5.16M | UWORD32 temp = 0; |
79 | 5.16M | UWORD32 temp1 = 0; |
80 | 5.16M | WORD32 found = 0; |
81 | 5.16M | UWORD32 mask = 0x80000000; |
82 | | |
83 | 5.16M | WORD32 leading_ones; |
84 | 5.16M | WORD32 max_len; |
85 | 5.16M | WORD32 ixheaacd_drc_offset = 0; |
86 | 5.16M | WORD32 length; |
87 | 5.16M | UWORD32 code_word; |
88 | 5.16M | WORD32 len_end; |
89 | | |
90 | 5.16M | max_len = code_book_tbl[0]; |
91 | 5.16M | mask = mask - (1 << (31 - max_len)); |
92 | 5.16M | mask = mask << 1; |
93 | | |
94 | 5.16M | temp = (UWORD32)((it_bit_buff & mask)); |
95 | | |
96 | 5.16M | len_end = code_book_tbl[0]; |
97 | 5.16M | leading_ones = ixheaacd_cnt_leading_ones(temp); |
98 | 8.12M | do { |
99 | 8.12M | ixheaacd_drc_offset = (idx_table[leading_ones] >> 20) & 0x1ff; |
100 | 8.12M | length = code_book_tbl[ixheaacd_drc_offset + 1] & 0x1f; |
101 | 8.12M | code_word = idx_table[leading_ones] & 0xfffff; |
102 | 8.12M | temp1 = temp >> (32 - length); |
103 | 8.12M | if (temp1 <= code_word) { |
104 | 5.16M | ixheaacd_drc_offset = ixheaacd_drc_offset - (code_word - temp1); |
105 | 5.16M | found = 1; |
106 | 5.16M | } else { |
107 | 2.96M | len_end = len_end + ((idx_table[leading_ones] >> 29) & 0x7); |
108 | 2.96M | leading_ones = len_end; |
109 | 2.96M | } |
110 | 8.12M | } while (!found); |
111 | 5.16M | *huff_index = code_book_tbl[ixheaacd_drc_offset + 1] >> 5; |
112 | 5.16M | *len = length; |
113 | 5.16M | } |
114 | | |
115 | | VOID ixheaacd_inverse_quantize(WORD32 *x_invquant, WORD no_band, |
116 | | WORD32 *ixheaacd_pow_table_Q13, |
117 | 18.2k | WORD8 *scratch_in) { |
118 | 18.2k | WORD32 j; |
119 | 18.2k | WORD32 temp; |
120 | 18.2k | WORD32 q_abs; |
121 | | |
122 | 1.38M | for (j = no_band - 1; j >= 0; j--) { |
123 | 1.36M | q_abs = *scratch_in++; |
124 | 1.36M | temp = (ixheaacd_pow_table_Q13[q_abs]); |
125 | 1.36M | *x_invquant++ = -temp; |
126 | 1.36M | } |
127 | 18.2k | } |
128 | | |
129 | | static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word1( |
130 | | ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets, |
131 | | WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl, |
132 | 58.5k | WORD32 *ixheaacd_pow_table_Q13, const UWORD32 *idx_table, WORD32 maximum_bins_short) { |
133 | 58.5k | WORD32 sp1, sp2; |
134 | 58.5k | WORD32 flush_cw; |
135 | 58.5k | WORD32 i, value, norm_val, off; |
136 | 58.5k | WORD idx, grp_idx; |
137 | 58.5k | WORD32 out1, out2; |
138 | 58.5k | WORD32 err_code = 0; |
139 | 58.5k | WORD len_idx = 0; |
140 | 58.5k | UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; |
141 | 58.5k | WORD32 bit_pos = it_bit_buff->bit_pos; |
142 | 58.5k | WORD16 index; |
143 | 58.5k | WORD32 length; |
144 | 58.5k | WORD32 read_word; |
145 | 58.5k | WORD32 increment; |
146 | | |
147 | 58.5k | read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits, |
148 | 58.5k | &increment); |
149 | 58.5k | ptr_read_next += increment; |
150 | | |
151 | 61.6k | do { |
152 | 61.6k | len_idx = offsets[1] - offsets[0]; |
153 | 61.6k | grp_idx = group_len; |
154 | | |
155 | 145k | do { |
156 | 145k | spec_coef = spec_coef + offsets[0]; |
157 | 145k | idx = len_idx; |
158 | 543k | do { |
159 | 543k | { |
160 | 543k | UWORD32 read_word1; |
161 | | |
162 | 543k | read_word1 = read_word << bit_pos; |
163 | 543k | ixheaacd_huff_sfb_table(read_word1, &index, &length, code_book_tbl, |
164 | 543k | idx_table); |
165 | 543k | bit_pos += length; |
166 | 543k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
167 | 543k | it_bit_buff->ptr_bit_buf_end); |
168 | 543k | } |
169 | | |
170 | 543k | out1 = index / 17; |
171 | 543k | out2 = index - out1 * 17; |
172 | 543k | flush_cw = read_word << bit_pos; |
173 | | |
174 | 543k | sp1 = out1; |
175 | 543k | sp2 = out2; |
176 | | |
177 | 543k | if (out1) { |
178 | 288k | if (flush_cw & 0x80000000) { |
179 | 204k | out1 = -out1; |
180 | 204k | } |
181 | 288k | bit_pos++; |
182 | 288k | flush_cw = (WORD32)flush_cw << 1; |
183 | 288k | } |
184 | | |
185 | 543k | if (out2) { |
186 | 278k | bit_pos++; |
187 | 278k | if (flush_cw & 0x80000000) { |
188 | 164k | out2 = -out2; |
189 | 164k | } |
190 | 278k | } |
191 | 543k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
192 | 543k | it_bit_buff->ptr_bit_buf_end); |
193 | | |
194 | 543k | if (sp1 == 16) { |
195 | 22.7k | i = 4; |
196 | 22.7k | value = ixheaac_extu(read_word, bit_pos, 23); |
197 | 22.7k | value = value | 0xfffffe00; |
198 | 22.7k | norm_val = ixheaac_norm32(value); |
199 | | |
200 | 22.7k | i += (norm_val - 22); |
201 | 22.7k | bit_pos += (norm_val - 21); |
202 | 22.7k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
203 | 22.7k | it_bit_buff->ptr_bit_buf_end); |
204 | | |
205 | 22.7k | off = ixheaac_extu(read_word, bit_pos, 32 - i); |
206 | | |
207 | 22.7k | bit_pos += i; |
208 | | |
209 | 22.7k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
210 | 22.7k | it_bit_buff->ptr_bit_buf_end); |
211 | 22.7k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
212 | 22.7k | it_bit_buff->ptr_bit_buf_end); |
213 | | |
214 | 22.7k | i = off + ((WORD32)1 << i); |
215 | | |
216 | 22.7k | if (i <= IQ_TABLE_SIZE_HALF) |
217 | 21.0k | i = ixheaacd_pow_table_Q13[i]; |
218 | 1.71k | else { |
219 | 1.71k | err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13); |
220 | 1.71k | } |
221 | | |
222 | 22.7k | if (out1 < 0) { |
223 | 7.81k | out1 = -i; |
224 | 14.9k | } else { |
225 | 14.9k | out1 = i; |
226 | 14.9k | } |
227 | 22.7k | *spec_coef++ = out1; |
228 | 520k | } else { |
229 | 520k | if (out1 <= 0) { |
230 | 450k | out1 = -out1; |
231 | 450k | out1 = ixheaacd_pow_table_Q13[out1]; |
232 | 450k | *spec_coef++ = -out1; |
233 | 450k | } else { |
234 | 69.7k | out1 = ixheaacd_pow_table_Q13[out1]; |
235 | 69.7k | *spec_coef++ = out1; |
236 | 69.7k | } |
237 | 520k | } |
238 | | |
239 | 543k | if (sp2 == 16) { |
240 | 17.4k | i = 4; |
241 | 17.4k | value = ixheaac_extu(read_word, bit_pos, 23); |
242 | 17.4k | value = value | 0xfffffe00; |
243 | 17.4k | norm_val = ixheaac_norm32(value); |
244 | | |
245 | 17.4k | i += (norm_val - 22); |
246 | | |
247 | 17.4k | bit_pos += (norm_val - 21); |
248 | 17.4k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
249 | 17.4k | it_bit_buff->ptr_bit_buf_end); |
250 | | |
251 | 17.4k | off = ixheaac_extu(read_word, bit_pos, 32 - i); |
252 | | |
253 | 17.4k | bit_pos += i; |
254 | | |
255 | 17.4k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
256 | 17.4k | it_bit_buff->ptr_bit_buf_end); |
257 | 17.4k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
258 | 17.4k | it_bit_buff->ptr_bit_buf_end); |
259 | | |
260 | 17.4k | i = off + ((WORD32)1 << i); |
261 | | |
262 | 17.4k | if (i <= IQ_TABLE_SIZE_HALF) |
263 | 16.0k | i = ixheaacd_pow_table_Q13[i]; |
264 | 1.39k | else { |
265 | 1.39k | err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13); |
266 | 1.39k | } |
267 | | |
268 | 17.4k | if (out2 < 0) { |
269 | 3.74k | out2 = -i; |
270 | 13.7k | } else { |
271 | 13.7k | out2 = i; |
272 | 13.7k | } |
273 | 17.4k | *spec_coef++ = out2; |
274 | 525k | } else { |
275 | 525k | if (out2 <= 0) { |
276 | 425k | out2 = -out2; |
277 | 425k | out2 = ixheaacd_pow_table_Q13[out2]; |
278 | 425k | *spec_coef++ = -out2; |
279 | 425k | } else { |
280 | 100k | out2 = ixheaacd_pow_table_Q13[out2]; |
281 | 100k | *spec_coef++ = out2; |
282 | 100k | } |
283 | 525k | } |
284 | | |
285 | 543k | idx -= 2; |
286 | 543k | } while (idx != 0); |
287 | | |
288 | 145k | if (maximum_bins_short == 120) { |
289 | 122k | spec_coef += (maximum_bins_short - offsets[1]); |
290 | 122k | } else { |
291 | 23.7k | spec_coef += (MAX_BINS_SHORT - offsets[1]); |
292 | 23.7k | } |
293 | | |
294 | 145k | grp_idx--; |
295 | 145k | } while (grp_idx != 0); |
296 | | |
297 | 61.6k | offsets++; |
298 | | |
299 | 61.6k | if (maximum_bins_short == 120) { |
300 | 51.6k | spec_coef -= (maximum_bins_short * group_len); |
301 | 51.6k | } else { |
302 | 9.92k | spec_coef -= (MAX_BINS_SHORT * group_len); |
303 | 9.92k | } |
304 | | |
305 | 61.6k | no_bands--; |
306 | 61.6k | } while (no_bands >= 0); |
307 | | |
308 | 58.5k | ptr_read_next = ptr_read_next - increment; |
309 | 58.5k | ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word, |
310 | 58.5k | it_bit_buff->ptr_bit_buf_end); |
311 | | |
312 | 58.5k | it_bit_buff->bit_pos = bit_pos; |
313 | 58.5k | it_bit_buff->ptr_read_next = ptr_read_next; |
314 | | |
315 | 58.5k | return err_code; |
316 | 58.5k | } |
317 | | |
318 | | static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word2_11( |
319 | | ia_bit_buf_struct *it_bit_buff, WORD32 width, const UWORD16 *code_book_tbl, |
320 | | WORD32 *x_invquant, WORD32 *ixheaacd_pow_table_Q13, WORD8 *ptr_scratch, |
321 | 77.3k | const UWORD32 *idx_table) { |
322 | 77.3k | WORD32 sp1, sp2; |
323 | 77.3k | WORD32 flush_cw; |
324 | 77.3k | WORD32 i, value, norm_val, off; |
325 | 77.3k | WORD idx; |
326 | 77.3k | WORD32 out1, out2; |
327 | 77.3k | WORD32 err_code = 0; |
328 | 77.3k | WORD16 index; |
329 | 77.3k | WORD32 length; |
330 | 77.3k | UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; |
331 | 77.3k | WORD32 bit_pos = it_bit_buff->bit_pos; |
332 | 77.3k | WORD32 read_word; |
333 | 77.3k | WORD32 increment; |
334 | | |
335 | 77.3k | read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits, |
336 | 77.3k | &increment); |
337 | 77.3k | ptr_read_next += increment; |
338 | | |
339 | 1.79M | for (idx = width; idx != 0; idx -= 2) { |
340 | 1.71M | { |
341 | 1.71M | UWORD32 read_word1; |
342 | | |
343 | 1.71M | read_word1 = read_word << bit_pos; |
344 | 1.71M | ixheaacd_huff_sfb_table(read_word1, &index, &length, code_book_tbl, |
345 | 1.71M | idx_table); |
346 | 1.71M | bit_pos += length; |
347 | 1.71M | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
348 | 1.71M | it_bit_buff->ptr_bit_buf_end); |
349 | 1.71M | } |
350 | | |
351 | 1.71M | flush_cw = read_word << bit_pos; |
352 | 1.71M | out1 = index / 17; |
353 | 1.71M | out2 = index - out1 * 17; |
354 | 1.71M | sp1 = out1; |
355 | | |
356 | 1.71M | if (out1) { |
357 | 944k | if (flush_cw & 0x80000000) { |
358 | 595k | out1 = -out1; |
359 | 595k | } |
360 | | |
361 | 944k | bit_pos++; |
362 | 944k | flush_cw = (WORD32)flush_cw << 1; |
363 | 944k | } |
364 | | |
365 | 1.71M | sp2 = out2; |
366 | 1.71M | if (out2) { |
367 | 934k | bit_pos++; |
368 | 934k | if (flush_cw & 0x80000000) { |
369 | 445k | out2 = -out2; |
370 | 445k | } |
371 | 934k | } |
372 | | |
373 | 1.71M | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
374 | 1.71M | it_bit_buff->ptr_bit_buf_end); |
375 | | |
376 | 1.71M | if (sp1 == 16) { |
377 | 80.7k | i = 4; |
378 | 80.7k | value = ixheaac_extu(read_word, bit_pos, 23); |
379 | 80.7k | value = value | 0xfffffe00; |
380 | 80.7k | norm_val = ixheaac_norm32(value); |
381 | 80.7k | i += (norm_val - 22); |
382 | 80.7k | bit_pos += (norm_val - 21); |
383 | | |
384 | 80.7k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
385 | 80.7k | it_bit_buff->ptr_bit_buf_end); |
386 | | |
387 | 80.7k | off = ixheaac_extu(read_word, bit_pos, 32 - i); |
388 | | |
389 | 80.7k | bit_pos += i; |
390 | 80.7k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
391 | 80.7k | it_bit_buff->ptr_bit_buf_end); |
392 | | |
393 | 80.7k | value = *ptr_scratch++; |
394 | | |
395 | 80.7k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
396 | 80.7k | it_bit_buff->ptr_bit_buf_end); |
397 | 80.7k | i = off + ((WORD32)1 << i); |
398 | 80.7k | i += value; |
399 | | |
400 | 80.7k | if (i <= IQ_TABLE_SIZE_HALF) |
401 | 77.1k | i = ixheaacd_pow_table_Q13[i]; |
402 | 3.66k | else { |
403 | 3.66k | err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13); |
404 | 3.66k | } |
405 | 80.7k | if (out1 < 0) { |
406 | 33.9k | i = -i; |
407 | 33.9k | } |
408 | 80.7k | *x_invquant++ = i; |
409 | 1.63M | } else { |
410 | 1.63M | WORD8 temp = *ptr_scratch++; |
411 | 1.63M | if (out1 <= 0) { |
412 | 1.33M | out1 = temp - out1; |
413 | 1.33M | out1 = ixheaacd_pow_table_Q13[out1]; |
414 | 1.33M | *x_invquant++ = -out1; |
415 | 1.33M | } else { |
416 | 301k | out1 += temp; |
417 | 301k | out1 = ixheaacd_pow_table_Q13[out1]; |
418 | 301k | *x_invquant++ = out1; |
419 | 301k | } |
420 | 1.63M | } |
421 | | |
422 | 1.71M | if (sp2 == 16) { |
423 | 76.3k | i = 4; |
424 | 76.3k | value = ixheaac_extu(read_word, bit_pos, 23); |
425 | 76.3k | value = value | 0xfffffe00; |
426 | 76.3k | norm_val = ixheaac_norm32(value); |
427 | | |
428 | 76.3k | i += (norm_val - 22); |
429 | | |
430 | 76.3k | bit_pos += (norm_val - 21); |
431 | 76.3k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
432 | 76.3k | it_bit_buff->ptr_bit_buf_end); |
433 | | |
434 | 76.3k | off = ixheaac_extu(read_word, bit_pos, 32 - i); |
435 | | |
436 | 76.3k | bit_pos += i; |
437 | 76.3k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
438 | 76.3k | it_bit_buff->ptr_bit_buf_end); |
439 | 76.3k | value = *ptr_scratch++; |
440 | 76.3k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
441 | 76.3k | it_bit_buff->ptr_bit_buf_end); |
442 | | |
443 | 76.3k | i = off + ((WORD32)1 << i); |
444 | 76.3k | i += value; |
445 | 76.3k | if (i <= IQ_TABLE_SIZE_HALF) |
446 | 70.7k | i = ixheaacd_pow_table_Q13[i]; |
447 | 5.60k | else { |
448 | 5.60k | err_code |= ixheaacd_inv_quant(&i, ixheaacd_pow_table_Q13); |
449 | 5.60k | } |
450 | | |
451 | 76.3k | if (out2 < 0) { |
452 | 22.8k | i = -i; |
453 | 22.8k | } |
454 | 76.3k | *x_invquant++ = i; |
455 | | |
456 | 1.63M | } else { |
457 | 1.63M | WORD8 temp = *ptr_scratch++; |
458 | 1.63M | if (out2 <= 0) { |
459 | 1.20M | out2 = temp - out2; |
460 | 1.20M | out2 = ixheaacd_pow_table_Q13[out2]; |
461 | 1.20M | *x_invquant++ = -out2; |
462 | 1.20M | } else { |
463 | 435k | out2 += temp; |
464 | 435k | out2 = ixheaacd_pow_table_Q13[out2]; |
465 | 435k | *x_invquant++ = out2; |
466 | 435k | } |
467 | 1.63M | } |
468 | 1.71M | } |
469 | 77.3k | ptr_read_next = ptr_read_next - increment; |
470 | 77.3k | ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word, |
471 | 77.3k | it_bit_buff->ptr_bit_buf_end); |
472 | | |
473 | 77.3k | it_bit_buff->ptr_read_next = ptr_read_next; |
474 | 77.3k | it_bit_buff->bit_pos = bit_pos; |
475 | | |
476 | 77.3k | return err_code; |
477 | 77.3k | } |
478 | | |
479 | | static PLATFORM_INLINE WORD ixheaacd_huffman_dec_quad( |
480 | | ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets, |
481 | | WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl, |
482 | | WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table, |
483 | 5.60k | WORD32 maximum_bins_short) { |
484 | 5.60k | WORD idx, grp_idx; |
485 | 5.60k | WORD idx_len; |
486 | 5.60k | WORD32 *spec_orig; |
487 | 5.60k | WORD16 index, length; |
488 | 5.60k | UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; |
489 | 5.60k | WORD32 bit_pos = it_bit_buff->bit_pos; |
490 | 5.60k | WORD32 read_word; |
491 | 5.60k | WORD32 increment; |
492 | | |
493 | 5.60k | read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits, |
494 | 5.60k | &increment); |
495 | 5.60k | ptr_read_next += increment; |
496 | 5.60k | spec_orig = spec_coef; |
497 | 19.6k | do { |
498 | 19.6k | idx_len = offsets[1] - offsets[0]; |
499 | 19.6k | grp_idx = group_len; |
500 | | |
501 | 37.1k | do { |
502 | 37.1k | spec_coef = spec_coef + offsets[0]; |
503 | 37.1k | idx = idx_len; |
504 | 69.6k | do { |
505 | 69.6k | UWORD32 read_word1; |
506 | | |
507 | 69.6k | read_word1 = read_word << bit_pos; |
508 | 69.6k | ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl, |
509 | 69.6k | idx_table); |
510 | 69.6k | bit_pos += length; |
511 | 69.6k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
512 | 69.6k | it_bit_buff->ptr_bit_buf_end); |
513 | 69.6k | if (tbl_sign) { |
514 | 35.8k | WORD32 temp_word; |
515 | 35.8k | WORD32 w, x, y, z; |
516 | 35.8k | temp_word = read_word << bit_pos; |
517 | 35.8k | w = index / 27; |
518 | 35.8k | index = index - w * 27; |
519 | 35.8k | x = index / 9; |
520 | 35.8k | index = index - x * 9; |
521 | 35.8k | y = index / 3; |
522 | 35.8k | z = index - y * 3; |
523 | 35.8k | if (w) { |
524 | 22.7k | w = ixheaacd_pow_table_Q13[w]; |
525 | 22.7k | if (temp_word & 0x80000000) w = -w; |
526 | 22.7k | temp_word <<= 1; |
527 | 22.7k | bit_pos++; |
528 | 22.7k | } |
529 | 35.8k | *spec_coef++ = w; |
530 | | |
531 | 35.8k | if (x) { |
532 | 23.4k | x = ixheaacd_pow_table_Q13[x]; |
533 | 23.4k | if (temp_word & 0x80000000) x = -x; |
534 | 23.4k | temp_word <<= 1; |
535 | 23.4k | bit_pos++; |
536 | 23.4k | } |
537 | 35.8k | *spec_coef++ = x; |
538 | 35.8k | if (y) { |
539 | 25.1k | y = ixheaacd_pow_table_Q13[y]; |
540 | 25.1k | if (temp_word & 0x80000000) y = -y; |
541 | 25.1k | temp_word <<= 1; |
542 | 25.1k | bit_pos++; |
543 | 25.1k | } |
544 | 35.8k | *spec_coef++ = y; |
545 | 35.8k | if (z) { |
546 | 25.7k | z = ixheaacd_pow_table_Q13[z]; |
547 | 25.7k | if (temp_word & 0x80000000) z = -z; |
548 | 25.7k | temp_word <<= 1; |
549 | 25.7k | bit_pos++; |
550 | 25.7k | } |
551 | 35.8k | *spec_coef++ = z; |
552 | | |
553 | 35.8k | } |
554 | | |
555 | 33.7k | else { |
556 | 33.7k | WORD32 w, x, y, z; |
557 | | |
558 | 33.7k | w = index / 27 - 1; |
559 | 33.7k | index = index - (w + 1) * 27; |
560 | 33.7k | x = index / 9 - 1; |
561 | 33.7k | index = index - (x + 1) * 9; |
562 | 33.7k | y = index / 3 - 1; |
563 | 33.7k | z = index - ((y + 1) * 3) - 1; |
564 | 33.7k | if (w < 0) { |
565 | 4.27k | w = -w; |
566 | 4.27k | w = ixheaacd_pow_table_Q13[w]; |
567 | 4.27k | w = -w; |
568 | 4.27k | } else |
569 | 29.5k | w = ixheaacd_pow_table_Q13[w]; |
570 | | |
571 | 33.7k | *spec_coef++ = w; |
572 | | |
573 | 33.7k | if (x < 0) { |
574 | 2.69k | x = -x; |
575 | 2.69k | x = ixheaacd_pow_table_Q13[x]; |
576 | 2.69k | x = -x; |
577 | 2.69k | } else |
578 | 31.0k | x = ixheaacd_pow_table_Q13[x]; |
579 | | |
580 | 33.7k | *spec_coef++ = x; |
581 | | |
582 | 33.7k | if (y < 0) { |
583 | 4.24k | y = -y; |
584 | 4.24k | y = ixheaacd_pow_table_Q13[y]; |
585 | 4.24k | y = -y; |
586 | 4.24k | } else |
587 | 29.5k | y = ixheaacd_pow_table_Q13[y]; |
588 | | |
589 | 33.7k | *spec_coef++ = y; |
590 | | |
591 | 33.7k | if (z < 0) { |
592 | 5.55k | z = -z; |
593 | 5.55k | z = ixheaacd_pow_table_Q13[z]; |
594 | 5.55k | z = -z; |
595 | 5.55k | } else |
596 | 28.2k | z = ixheaacd_pow_table_Q13[z]; |
597 | | |
598 | 33.7k | *spec_coef++ = z; |
599 | 33.7k | } |
600 | | |
601 | 69.6k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
602 | 69.6k | it_bit_buff->ptr_bit_buf_end); |
603 | 69.6k | idx -= 4; |
604 | 69.6k | } while (idx != 0); |
605 | | |
606 | 37.1k | if (maximum_bins_short == 120) { |
607 | 20.4k | spec_coef += (maximum_bins_short - offsets[1]); |
608 | 20.4k | } else { |
609 | 16.6k | spec_coef += (MAX_BINS_SHORT - offsets[1]); |
610 | 16.6k | } |
611 | | |
612 | 37.1k | grp_idx--; |
613 | 37.1k | } while (grp_idx != 0); |
614 | 19.6k | offsets++; |
615 | 19.6k | spec_coef = spec_orig; |
616 | 19.6k | no_bands--; |
617 | 19.6k | } while (no_bands >= 0); |
618 | | |
619 | 5.60k | ptr_read_next = ptr_read_next - increment; |
620 | 5.60k | ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word, |
621 | 5.60k | it_bit_buff->ptr_bit_buf_end); |
622 | 5.60k | it_bit_buff->ptr_read_next = ptr_read_next; |
623 | 5.60k | it_bit_buff->bit_pos = bit_pos; |
624 | | |
625 | 5.60k | return 0; |
626 | 5.60k | } |
627 | | |
628 | | static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word2_quad( |
629 | | ia_bit_buf_struct *it_bit_buff, WORD32 width, const UWORD16 *code_book_tbl, |
630 | | WORD32 *x_invquant, WORD32 *ixheaacd_pow_table_Q13, WORD8 *ptr_scratch, |
631 | 34.6k | WORD32 tbl_sign, const UWORD32 *idx_table) { |
632 | 34.6k | WORD idx; |
633 | 34.6k | WORD16 index, length; |
634 | 34.6k | UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; |
635 | 34.6k | WORD32 bit_pos = it_bit_buff->bit_pos; |
636 | 34.6k | WORD32 read_word; |
637 | 34.6k | WORD32 increment; |
638 | | |
639 | 34.6k | read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits, |
640 | 34.6k | &increment); |
641 | 34.6k | ptr_read_next += increment; |
642 | | |
643 | 2.07M | for (idx = width; idx != 0; idx -= 4) { |
644 | 2.04M | WORD32 ampres, ampres1; |
645 | 2.04M | WORD32 ampres2, ampres3; |
646 | 2.04M | UWORD32 read_word1; |
647 | | |
648 | 2.04M | read_word1 = read_word << bit_pos; |
649 | 2.04M | ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl, |
650 | 2.04M | idx_table); |
651 | 2.04M | bit_pos += length; |
652 | 2.04M | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
653 | 2.04M | it_bit_buff->ptr_bit_buf_end); |
654 | 2.04M | if (tbl_sign) { |
655 | 1.69M | WORD32 w, x, y, z; |
656 | 1.69M | WORD32 ampout0, ampout1, ampout2, ampout3; |
657 | 1.69M | WORD32 temp_word; |
658 | 1.69M | temp_word = read_word << bit_pos; |
659 | | |
660 | 1.69M | w = index / 27; |
661 | 1.69M | index = index - w * 27; |
662 | 1.69M | x = index / 9; |
663 | 1.69M | index = index - x * 9; |
664 | 1.69M | y = index / 3; |
665 | 1.69M | z = index - y * 3; |
666 | | |
667 | 1.69M | ampout0 = w + *ptr_scratch++; |
668 | 1.69M | ampout0 = ixheaacd_pow_table_Q13[ampout0]; |
669 | | |
670 | 1.69M | if (w) { |
671 | 861k | if (temp_word & 0x80000000) { |
672 | 408k | ampout0 = -ampout0; |
673 | 408k | } |
674 | 861k | temp_word = temp_word << 1; |
675 | 861k | bit_pos++; |
676 | 861k | } else { |
677 | 836k | ampout0 = -ampout0; |
678 | 836k | } |
679 | | |
680 | 1.69M | ampout1 = x + *ptr_scratch++; |
681 | 1.69M | ampout1 = ixheaacd_pow_table_Q13[ampout1]; |
682 | | |
683 | 1.69M | if (x) { |
684 | 679k | if (temp_word & 0x80000000) { |
685 | 287k | ampout1 = -ampout1; |
686 | 287k | } |
687 | 679k | temp_word = temp_word << 1; |
688 | 679k | bit_pos++; |
689 | 1.01M | } else { |
690 | 1.01M | ampout1 = -ampout1; |
691 | 1.01M | } |
692 | | |
693 | 1.69M | ampout2 = y + *ptr_scratch++; |
694 | 1.69M | ampout2 = ixheaacd_pow_table_Q13[ampout2]; |
695 | | |
696 | 1.69M | if (y) { |
697 | 873k | if (temp_word & 0x80000000) { |
698 | 427k | ampout2 = -ampout2; |
699 | 427k | } |
700 | 873k | temp_word = temp_word << 1; |
701 | 873k | bit_pos++; |
702 | 873k | } else { |
703 | 825k | ampout2 = -ampout2; |
704 | 825k | } |
705 | | |
706 | 1.69M | ampout3 = z + *ptr_scratch++; |
707 | 1.69M | ampout3 = ixheaacd_pow_table_Q13[ampout3]; |
708 | | |
709 | 1.69M | if (z) { |
710 | 867k | if (temp_word & 0x80000000) { |
711 | 421k | ampout3 = -ampout3; |
712 | 421k | } |
713 | 867k | temp_word = temp_word << 1; |
714 | 867k | bit_pos++; |
715 | 867k | } else { |
716 | 830k | ampout3 = -ampout3; |
717 | 830k | } |
718 | 1.69M | *x_invquant++ = ampout0; |
719 | 1.69M | *x_invquant++ = ampout1; |
720 | 1.69M | *x_invquant++ = ampout2; |
721 | 1.69M | *x_invquant++ = ampout3; |
722 | 1.69M | } else { |
723 | 346k | WORD32 w, x, y, z; |
724 | 346k | ampres = *ptr_scratch++; |
725 | 346k | ampres1 = *ptr_scratch++; |
726 | 346k | ampres2 = *ptr_scratch++; |
727 | 346k | ampres3 = *ptr_scratch++; |
728 | | |
729 | 346k | w = index / 27 - 1; |
730 | 346k | index = index - (w + 1) * 27; |
731 | 346k | x = index / 9 - 1; |
732 | 346k | index = index - (x + 1) * 9; |
733 | 346k | y = index / 3 - 1; |
734 | 346k | z = index - ((y + 1) * 3) - 1; |
735 | 346k | if (w <= 0) { |
736 | 318k | ampres = ampres - w; |
737 | 318k | ampres = ixheaacd_pow_table_Q13[ampres]; |
738 | 318k | ampres = -ampres; |
739 | 318k | } else { |
740 | 27.9k | ampres += w; |
741 | 27.9k | ampres = ixheaacd_pow_table_Q13[ampres]; |
742 | 27.9k | } |
743 | | |
744 | 346k | if (x <= 0) { |
745 | 312k | ampres1 = ampres1 - x; |
746 | 312k | ampres1 = ixheaacd_pow_table_Q13[ampres1]; |
747 | 312k | ampres1 = -ampres1; |
748 | 312k | } else { |
749 | 33.7k | ampres1 += x; |
750 | 33.7k | ampres1 = ixheaacd_pow_table_Q13[ampres1]; |
751 | 33.7k | } |
752 | | |
753 | 346k | if (y <= 0) { |
754 | 324k | ampres2 = ampres2 - y; |
755 | 324k | ampres2 = ixheaacd_pow_table_Q13[ampres2]; |
756 | 324k | ampres2 = -ampres2; |
757 | 324k | } else { |
758 | 22.3k | ampres2 += y; |
759 | 22.3k | ampres2 = ixheaacd_pow_table_Q13[ampres2]; |
760 | 22.3k | } |
761 | | |
762 | 346k | if (z <= 0) { |
763 | 337k | ampres3 = ampres3 - z; |
764 | 337k | ampres3 = ixheaacd_pow_table_Q13[ampres3]; |
765 | 337k | ampres3 = -ampres3; |
766 | 337k | } else { |
767 | 8.91k | ampres3 += z; |
768 | 8.91k | ampres3 = ixheaacd_pow_table_Q13[ampres3]; |
769 | 8.91k | } |
770 | | |
771 | 346k | *x_invquant++ = ampres; |
772 | 346k | *x_invquant++ = ampres1; |
773 | 346k | *x_invquant++ = ampres2; |
774 | 346k | *x_invquant++ = ampres3; |
775 | 346k | } |
776 | | |
777 | 2.04M | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
778 | 2.04M | it_bit_buff->ptr_bit_buf_end); |
779 | 2.04M | } |
780 | | |
781 | 34.6k | ptr_read_next = ptr_read_next - increment; |
782 | 34.6k | ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word, |
783 | 34.6k | it_bit_buff->ptr_bit_buf_end); |
784 | 34.6k | it_bit_buff->ptr_read_next = ptr_read_next; |
785 | 34.6k | it_bit_buff->bit_pos = bit_pos; |
786 | | |
787 | 34.6k | return 0; |
788 | 34.6k | } |
789 | | |
790 | | static PLATFORM_INLINE WORD ixheaacd_huffman_dec_pair( |
791 | | ia_bit_buf_struct *it_bit_buff, WORD32 *spec_coef, WORD16 *offsets, |
792 | | WORD no_bands, WORD group_len, const UWORD16 *code_book_tbl, |
793 | | WORD32 *ixheaacd_pow_table_Q13, WORD32 tbl_sign, const UWORD32 *idx_table, |
794 | 11.2k | WORD32 huff_mode, WORD32 maximum_bins_short) { |
795 | 11.2k | WORD idx, grp_idx; |
796 | 11.2k | WORD len_idx; |
797 | 11.2k | WORD16 index, length; |
798 | 11.2k | WORD32 y, z; |
799 | 11.2k | WORD32 *spec_orig = spec_coef; |
800 | | |
801 | 11.2k | UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; |
802 | 11.2k | WORD32 bit_pos = it_bit_buff->bit_pos; |
803 | 11.2k | WORD32 read_word; |
804 | 11.2k | WORD32 increment; |
805 | | |
806 | 11.2k | read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits, |
807 | 11.2k | &increment); |
808 | 11.2k | ptr_read_next += increment; |
809 | | |
810 | 45.1k | do { |
811 | 45.1k | len_idx = offsets[1] - offsets[0]; |
812 | 45.1k | grp_idx = group_len; |
813 | 190k | do { |
814 | 190k | spec_coef += offsets[0]; |
815 | 190k | idx = len_idx; |
816 | 553k | do { |
817 | 553k | UWORD32 read_word1; |
818 | 553k | read_word1 = read_word << bit_pos; |
819 | 553k | ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl, |
820 | 553k | idx_table); |
821 | 553k | bit_pos += length; |
822 | 553k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
823 | 553k | it_bit_buff->ptr_bit_buf_end); |
824 | 553k | if (tbl_sign) { |
825 | 188k | WORD32 temp_word; |
826 | 188k | temp_word = read_word << bit_pos; |
827 | 188k | y = index / huff_mode; |
828 | 188k | z = index - huff_mode * y; |
829 | 188k | if (y) { |
830 | 56.5k | y = ixheaacd_pow_table_Q13[y]; |
831 | 56.5k | if (temp_word & 0x80000000) y = -y; |
832 | | |
833 | 56.5k | temp_word = temp_word << 1; |
834 | 56.5k | bit_pos++; |
835 | 56.5k | } |
836 | 188k | *spec_coef++ = y; |
837 | | |
838 | 188k | if (z) { |
839 | 53.2k | z = ixheaacd_pow_table_Q13[z]; |
840 | 53.2k | if (temp_word & 0x80000000) { |
841 | 23.4k | z = -z; |
842 | 23.4k | } |
843 | 53.2k | temp_word <<= 1; |
844 | 53.2k | bit_pos++; |
845 | 53.2k | } |
846 | 188k | *spec_coef++ = z; |
847 | 364k | } else { |
848 | 364k | y = (index / huff_mode) - 4; |
849 | 364k | z = index - ((y + 4) * huff_mode) - 4; |
850 | 364k | if (y < 0) { |
851 | 48.6k | y = -y; |
852 | 48.6k | y = ixheaacd_pow_table_Q13[y]; |
853 | 48.6k | y = -y; |
854 | 48.6k | } else |
855 | 315k | y = ixheaacd_pow_table_Q13[y]; |
856 | | |
857 | 364k | if (z < 0) { |
858 | 39.4k | z = -z; |
859 | 39.4k | z = ixheaacd_pow_table_Q13[z]; |
860 | 39.4k | z = -z; |
861 | 39.4k | } else |
862 | 325k | z = ixheaacd_pow_table_Q13[z]; |
863 | | |
864 | 364k | *spec_coef++ = y; |
865 | 364k | *spec_coef++ = z; |
866 | 364k | } |
867 | 553k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
868 | 553k | it_bit_buff->ptr_bit_buf_end); |
869 | 553k | idx -= 2; |
870 | 553k | } while (idx != 0); |
871 | | |
872 | 190k | if (maximum_bins_short == 120) |
873 | 47.2k | spec_coef += (maximum_bins_short - offsets[1]); |
874 | 143k | else |
875 | 143k | spec_coef += (MAX_BINS_SHORT - offsets[1]); |
876 | | |
877 | 190k | grp_idx--; |
878 | 190k | } while (grp_idx != 0); |
879 | | |
880 | 45.1k | offsets++; |
881 | 45.1k | spec_coef = spec_orig; |
882 | 45.1k | no_bands--; |
883 | 45.1k | } while (no_bands >= 0); |
884 | | |
885 | 11.2k | ptr_read_next = ptr_read_next - increment; |
886 | 11.2k | ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word, |
887 | 11.2k | it_bit_buff->ptr_bit_buf_end); |
888 | 11.2k | it_bit_buff->ptr_read_next = ptr_read_next; |
889 | 11.2k | it_bit_buff->bit_pos = bit_pos; |
890 | | |
891 | 11.2k | return 0; |
892 | 11.2k | } |
893 | | |
894 | | static PLATFORM_INLINE WORD ixheaacd_huffman_dec_word2_pair( |
895 | | ia_bit_buf_struct *it_bit_buff, WORD32 width, const UWORD16 *code_book_tbl, |
896 | | WORD32 *x_invquant, WORD32 *ixheaacd_pow_table_Q13, WORD8 *ptr_scratch, |
897 | | WORD32 tbl_sign, const UWORD32 *idx_table, WORD32 huff_mode) |
898 | | |
899 | 71.0k | { |
900 | 71.0k | WORD32 ampres; |
901 | 71.0k | WORD idx; |
902 | 71.0k | WORD16 index, length; |
903 | 71.0k | UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; |
904 | 71.0k | WORD32 bit_pos = it_bit_buff->bit_pos; |
905 | 71.0k | WORD32 read_word; |
906 | 71.0k | WORD32 increment; |
907 | | |
908 | 71.0k | read_word = ixheaacd_aac_showbits_32(ptr_read_next, it_bit_buff->cnt_bits, |
909 | 71.0k | &increment); |
910 | 71.0k | ptr_read_next += increment; |
911 | | |
912 | 1.11M | for (idx = width; idx != 0; idx -= 2) { |
913 | 1.04M | { |
914 | 1.04M | UWORD32 read_word1; |
915 | 1.04M | read_word1 = read_word << bit_pos; |
916 | 1.04M | ixheaacd_huffman_decode(read_word1, &index, &length, code_book_tbl, |
917 | 1.04M | idx_table); |
918 | 1.04M | bit_pos += length; |
919 | 1.04M | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
920 | 1.04M | it_bit_buff->ptr_bit_buf_end); |
921 | 1.04M | } |
922 | | |
923 | 1.04M | if (tbl_sign) { |
924 | 493k | WORD32 out0, out1, temp_word; |
925 | 493k | WORD32 ampout0, ampout1; |
926 | | |
927 | 493k | ampout0 = *ptr_scratch++; |
928 | 493k | ampout1 = *ptr_scratch++; |
929 | 493k | out0 = index / huff_mode; |
930 | 493k | out1 = index - huff_mode * out0; |
931 | 493k | ampout0 += out0; |
932 | 493k | ampout0 = ixheaacd_pow_table_Q13[ampout0]; |
933 | | |
934 | 493k | ampout1 += out1; |
935 | 493k | ampout1 = ixheaacd_pow_table_Q13[ampout1]; |
936 | 493k | temp_word = read_word << bit_pos; |
937 | 493k | if (out0) { |
938 | 381k | if (temp_word & 0x80000000) { |
939 | 141k | ampout0 = -(ampout0); |
940 | 141k | } |
941 | | |
942 | 381k | bit_pos++; |
943 | 381k | temp_word = temp_word << 1; |
944 | 381k | } else { |
945 | 112k | ampout0 = -(ampout0); |
946 | 112k | } |
947 | | |
948 | 493k | if (out1) { |
949 | 400k | if (temp_word & 0x80000000) { |
950 | 177k | ampout1 = -(ampout1); |
951 | 177k | } |
952 | 400k | bit_pos++; |
953 | 400k | } else { |
954 | 92.8k | ampout1 = -(ampout1); |
955 | 92.8k | } |
956 | | |
957 | 493k | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
958 | 493k | it_bit_buff->ptr_bit_buf_end); |
959 | 493k | *x_invquant++ = ampout0; |
960 | 493k | *x_invquant++ = ampout1; |
961 | 552k | } else { |
962 | 552k | WORD32 y, z; |
963 | 552k | y = (index / huff_mode) - 4; |
964 | 552k | z = index - ((y + 4) * huff_mode) - 4; |
965 | | |
966 | 552k | ampres = *ptr_scratch++; |
967 | 552k | if (y <= 0) { |
968 | 385k | ampres = ampres - y; |
969 | 385k | ampres = ixheaacd_pow_table_Q13[ampres]; |
970 | 385k | *x_invquant++ = -ampres; |
971 | 385k | } else { |
972 | 166k | ampres += y; |
973 | 166k | *x_invquant++ = ixheaacd_pow_table_Q13[ampres]; |
974 | 166k | } |
975 | 552k | ampres = *ptr_scratch++; |
976 | 552k | if (z <= 0) { |
977 | 406k | ampres = ampres - z; |
978 | 406k | ampres = ixheaacd_pow_table_Q13[ampres]; |
979 | 406k | *x_invquant++ = -ampres; |
980 | 406k | } else { |
981 | 146k | ampres += z; |
982 | 146k | *x_invquant++ = ixheaacd_pow_table_Q13[ampres]; |
983 | 146k | } |
984 | 552k | } |
985 | 1.04M | ixheaacd_aac_read_byte_corr(&ptr_read_next, &bit_pos, &read_word, |
986 | 1.04M | it_bit_buff->ptr_bit_buf_end); |
987 | 1.04M | } |
988 | | |
989 | 71.0k | ptr_read_next = ptr_read_next - increment; |
990 | 71.0k | ixheaacd_aac_read_byte_corr1(&ptr_read_next, &bit_pos, &read_word, |
991 | 71.0k | it_bit_buff->ptr_bit_buf_end); |
992 | 71.0k | it_bit_buff->ptr_read_next = ptr_read_next; |
993 | 71.0k | it_bit_buff->bit_pos = bit_pos; |
994 | | |
995 | 71.0k | return 0; |
996 | 71.0k | } |
997 | | |
998 | | WORD ixheaacd_decode_huffman(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no, |
999 | | WORD32 *spec_coef, WORD16 *sfb_offset, WORD start, |
1000 | | WORD sfb, WORD group_len, |
1001 | | ia_aac_dec_tables_struct *ptr_aac_tables, |
1002 | 75.3k | WORD32 maximum_bins_short) { |
1003 | 75.3k | WORD ret_val = 0; |
1004 | 75.3k | WORD start_bit_pos = it_bit_buff->bit_pos; |
1005 | 75.3k | UWORD8 *start_read_pos = it_bit_buff->ptr_read_next; |
1006 | 75.3k | const UWORD16 *cb_table = (UWORD16 *)(ptr_aac_tables->code_book[cb_no]); |
1007 | 75.3k | WORD32 huff_mode; |
1008 | 75.3k | const UWORD32 *idx_table = (UWORD32 *)(ptr_aac_tables->index_table[cb_no]); |
1009 | 75.3k | WORD32 *pow_table = |
1010 | 75.3k | (WORD32 *)ptr_aac_tables->pstr_block_tables->ixheaacd_pow_table_Q13; |
1011 | 75.3k | WORD32 no_bands = sfb - start - 1; |
1012 | 75.3k | WORD16 *band_offset = sfb_offset + start; |
1013 | | |
1014 | 75.3k | if (cb_no == 11) { |
1015 | 58.5k | const UWORD32 *idx_table = |
1016 | 58.5k | ptr_aac_tables->pstr_huffmann_tables->idx_table_hf11; |
1017 | 58.5k | const UWORD16 *cb_table = |
1018 | 58.5k | ptr_aac_tables->pstr_huffmann_tables->input_table_cb11; |
1019 | | |
1020 | 58.5k | ret_val = ixheaacd_huffman_dec_word1(it_bit_buff, spec_coef, band_offset, |
1021 | 58.5k | no_bands, group_len, cb_table, |
1022 | 58.5k | pow_table, idx_table, maximum_bins_short); |
1023 | | |
1024 | 58.5k | } else if (cb_no <= 4) { |
1025 | 5.60k | WORD32 tbl_sign = 0; |
1026 | | |
1027 | 5.60k | if (cb_no > 2) { |
1028 | 4.37k | tbl_sign = 1; |
1029 | 4.37k | } |
1030 | 5.60k | ret_val = ixheaacd_huffman_dec_quad(it_bit_buff, spec_coef, band_offset, |
1031 | 5.60k | no_bands, group_len, cb_table, |
1032 | 5.60k | pow_table, tbl_sign, idx_table, maximum_bins_short); |
1033 | 5.60k | } |
1034 | | |
1035 | 11.2k | else if (cb_no <= 10) { |
1036 | 11.2k | WORD32 tbl_sign = 0; |
1037 | 11.2k | huff_mode = 9; |
1038 | 11.2k | if (cb_no > 6) { |
1039 | 7.03k | if (cb_no > 8) |
1040 | 4.46k | huff_mode = 13; |
1041 | 2.56k | else |
1042 | 2.56k | huff_mode = 8; |
1043 | 7.03k | tbl_sign = 1; |
1044 | 7.03k | } |
1045 | 11.2k | ret_val = ixheaacd_huffman_dec_pair( |
1046 | 11.2k | it_bit_buff, spec_coef, band_offset, no_bands, group_len, cb_table, |
1047 | 11.2k | pow_table, tbl_sign, idx_table, huff_mode, maximum_bins_short); |
1048 | 11.2k | } |
1049 | | |
1050 | 75.3k | { |
1051 | 75.3k | WORD bits_cons; |
1052 | 75.3k | bits_cons = (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) + |
1053 | 75.3k | (it_bit_buff->bit_pos - start_bit_pos)); |
1054 | 75.3k | it_bit_buff->cnt_bits -= bits_cons; |
1055 | 75.3k | } |
1056 | 75.3k | return ret_val; |
1057 | 75.3k | } |
1058 | | |
1059 | | WORD ixheaacd_huffman_dec_word2(ia_bit_buf_struct *it_bit_buff, WORD32 cb_no, |
1060 | | WORD32 width, |
1061 | | ia_aac_dec_tables_struct *ptr_aac_tables, |
1062 | 183k | WORD32 *x_invquant, WORD8 *scratch_ptr) { |
1063 | 183k | WORD ret_val = 0; |
1064 | 183k | WORD32 huff_mode; |
1065 | 183k | WORD start_bit_pos = it_bit_buff->bit_pos; |
1066 | 183k | WORD32 cnt_bits = it_bit_buff->cnt_bits; |
1067 | 183k | WORD32 *pow_table = |
1068 | 183k | (WORD32 *)ptr_aac_tables->pstr_block_tables->ixheaacd_pow_table_Q13; |
1069 | 183k | UWORD8 *start_read_pos = it_bit_buff->ptr_read_next; |
1070 | | |
1071 | 183k | const UWORD16 *cb_table = (UWORD16 *)(ptr_aac_tables->code_book[cb_no]); |
1072 | 183k | const UWORD32 *idx_table = (UWORD32 *)(ptr_aac_tables->index_table[cb_no]); |
1073 | | |
1074 | 183k | if (cb_no == 11) { |
1075 | 77.3k | const UWORD16 *cb_table = |
1076 | 77.3k | ptr_aac_tables->pstr_huffmann_tables->input_table_cb11; |
1077 | | |
1078 | 77.3k | ret_val = ixheaacd_huffman_dec_word2_11( |
1079 | 77.3k | it_bit_buff, width, cb_table, x_invquant, pow_table, scratch_ptr, |
1080 | 77.3k | ptr_aac_tables->pstr_huffmann_tables->idx_table_hf11); |
1081 | 105k | } else if (cb_no <= 4) { |
1082 | 34.6k | WORD32 tbl_sign = 0; |
1083 | 34.6k | if (cb_no > 2) tbl_sign = 1; |
1084 | 34.6k | ret_val = ixheaacd_huffman_dec_word2_quad(it_bit_buff, width, cb_table, |
1085 | 34.6k | x_invquant, pow_table, |
1086 | 34.6k | scratch_ptr, tbl_sign, idx_table); |
1087 | 71.0k | } else if (cb_no <= 10) { |
1088 | 71.0k | WORD32 tbl_sign = 0; |
1089 | 71.0k | huff_mode = 9; |
1090 | 71.0k | if (cb_no > 6) { |
1091 | 64.8k | if (cb_no > 8) { |
1092 | 1.57k | huff_mode = 13; |
1093 | 63.2k | } else { |
1094 | 63.2k | huff_mode = 8; |
1095 | 63.2k | } |
1096 | | |
1097 | 64.8k | tbl_sign = 1; |
1098 | 64.8k | } |
1099 | 71.0k | ret_val = ixheaacd_huffman_dec_word2_pair( |
1100 | 71.0k | it_bit_buff, width, cb_table, x_invquant, pow_table, scratch_ptr, |
1101 | 71.0k | tbl_sign, idx_table, huff_mode); |
1102 | 71.0k | } |
1103 | | |
1104 | 183k | { |
1105 | 183k | WORD bits_cons; |
1106 | 183k | if (it_bit_buff->bit_pos <= 7) { |
1107 | 182k | bits_cons = (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) + |
1108 | 182k | (it_bit_buff->bit_pos - start_bit_pos)); |
1109 | 182k | if (bits_cons > cnt_bits) |
1110 | 35 | { |
1111 | 35 | return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; |
1112 | 35 | } |
1113 | 182k | it_bit_buff->cnt_bits = cnt_bits - bits_cons; |
1114 | 182k | } else { |
1115 | 117 | it_bit_buff->ptr_read_next += (it_bit_buff->bit_pos) >> 3; |
1116 | 117 | it_bit_buff->bit_pos = it_bit_buff->bit_pos & 0x7; |
1117 | 117 | if ((SIZE_T)(it_bit_buff->ptr_read_next) > (SIZE_T)(it_bit_buff->ptr_bit_buf_end + 1)) |
1118 | 117 | { |
1119 | 117 | it_bit_buff->ptr_read_next = it_bit_buff->ptr_bit_buf_end + 1; |
1120 | 117 | return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; |
1121 | 117 | } |
1122 | | |
1123 | 0 | bits_cons = (WORD)(((it_bit_buff->ptr_read_next - start_read_pos) << 3) + |
1124 | 0 | (it_bit_buff->bit_pos - start_bit_pos)); |
1125 | 0 | it_bit_buff->cnt_bits = cnt_bits - bits_cons; |
1126 | 0 | } |
1127 | 183k | } |
1128 | 182k | return ret_val; |
1129 | 183k | } |
1130 | | |
1131 | | VOID ixheaacd_dec_copy_outsample(WORD32 *out_samples, WORD32 *p_overlap_buffer, |
1132 | 1.96k | WORD32 size, WORD16 stride) { |
1133 | 1.96k | WORD32 i; |
1134 | | |
1135 | 826k | for (i = 0; i < size; i++) { |
1136 | 824k | out_samples[stride*i] = (ixheaac_shl16_sat((WORD16)(p_overlap_buffer[i]), 1) << 14); |
1137 | 824k | } |
1138 | 1.96k | } |
1139 | | |
1140 | | VOID ixheaacd_lap1_512_480(WORD32 *coef, WORD32 *prev, VOID *out_tmp, |
1141 | | const WORD16 *window, WORD16 q_shift, WORD16 size, |
1142 | 28.7k | WORD16 stride , WORD slot_element) { |
1143 | 28.7k | WORD32 accu; |
1144 | 28.7k | WORD32 i; |
1145 | 28.7k | WORD16 rounding_fac = -0x2000; |
1146 | | |
1147 | 28.7k | WORD32 *window_i = (WORD32 *)window; |
1148 | | |
1149 | 28.7k | WORD16 *ptr_out1, *ptr_out2; |
1150 | | |
1151 | 28.7k | WORD32 *pwin1, *pwin2; |
1152 | 28.7k | WORD32 *pCoef = &coef[size * 2 - 1 - 0]; |
1153 | | |
1154 | 28.7k | WORD16 * out = (WORD16*)out_tmp - slot_element; |
1155 | | |
1156 | 28.7k | pwin1 = &window_i[size - 1 - 0]; |
1157 | 28.7k | pwin2 = &window_i[size + 0]; |
1158 | | |
1159 | 28.7k | ptr_out1 = &out[stride * (size - 1 - 0)]; |
1160 | 28.7k | ptr_out2 = &out[stride * (size + 0)]; |
1161 | | |
1162 | 7.32M | for (i = 0; i < size; i++) { |
1163 | 7.29M | WORD32 win1, win2, coeff; |
1164 | 7.29M | WORD32 prev_data = *prev++; |
1165 | | |
1166 | 7.29M | win1 = *pwin1--; |
1167 | 7.29M | coeff = *pCoef--; |
1168 | 7.29M | win2 = *pwin2++; |
1169 | | |
1170 | 7.29M | accu = ixheaac_sub32_sat( |
1171 | 7.29M | ixheaac_shl32_dir_sat_limit(ixheaac_mult32_shl(coeff, win1), q_shift), |
1172 | 7.29M | ixheaac_mac32x16in32_shl(rounding_fac, win2, (WORD16)(prev_data))); |
1173 | | |
1174 | 7.29M | accu = ixheaac_add32_sat(accu, accu); |
1175 | 7.29M | accu = ixheaac_add32_sat(accu, accu); |
1176 | | |
1177 | 7.29M | *ptr_out1 = ixheaac_shr32(accu, 16); |
1178 | 7.29M | ptr_out1 -= stride; |
1179 | | |
1180 | 7.29M | accu = ixheaac_sub32_sat( |
1181 | 7.29M | ixheaac_shl32_dir_sat_limit( |
1182 | 7.29M | ixheaac_mult32_shl(ixheaac_negate32_sat(coeff), win2), q_shift), |
1183 | 7.29M | ixheaac_mac32x16in32_shl(rounding_fac, win1, (WORD16)(prev_data))); |
1184 | | |
1185 | 7.29M | accu = ixheaac_add32_sat(accu, accu); |
1186 | 7.29M | accu = ixheaac_add32_sat(accu, accu); |
1187 | | |
1188 | 7.29M | *ptr_out2 = ixheaac_shr32(accu, 16); |
1189 | 7.29M | ptr_out2 += stride; |
1190 | 7.29M | } |
1191 | 28.7k | } |
1192 | | |
1193 | | VOID ixheaacd_over_lap_add1_dec(WORD32 *coef, WORD32 *prev, WORD32 *out, |
1194 | | const WORD16 *window, WORD16 q_shift, |
1195 | 196k | WORD16 size, WORD16 ch_fac) { |
1196 | 196k | WORD32 accu; |
1197 | 196k | WORD32 i; |
1198 | 196k | WORD16 rounding_fac = 0; |
1199 | | |
1200 | 25.8M | for (i = 0; i < size; i++) { |
1201 | 25.6M | WORD16 window1, window2; |
1202 | | |
1203 | 25.6M | window1 = window[2 * size - 2 * i - 1]; |
1204 | 25.6M | window2 = window[2 * size - 2 * i - 2]; |
1205 | 25.6M | accu = ixheaac_sub32_sat( |
1206 | 25.6M | ixheaac_shl32_dir_sat_limit( |
1207 | 25.6M | ixheaac_mult32x16in32(coef[size * 2 - 1 - i], window2), q_shift), |
1208 | 25.6M | ixheaacd_mac32x16in32_sat(rounding_fac, prev[i], window1)); |
1209 | 25.6M | out[ch_fac * (size - i - 1)] = accu; |
1210 | 25.6M | accu = ixheaac_sub32_sat( |
1211 | 25.6M | ixheaac_shl32_dir_sat_limit( |
1212 | 25.6M | ixheaac_mult32x16in32(ixheaac_negate32_sat(coef[size * 2 - 1 - i]), |
1213 | 25.6M | window1), |
1214 | 25.6M | q_shift), |
1215 | 25.6M | ixheaacd_mac32x16in32_sat(rounding_fac, prev[i], window2)); |
1216 | 25.6M | out[ch_fac * (size + i)] = accu; |
1217 | 25.6M | } |
1218 | 196k | } |
1219 | | |
1220 | | VOID ixheaacd_over_lap_add2_dec(WORD32 *coef, WORD32 *prev, WORD32 *out, |
1221 | | const WORD16 *window, WORD16 q_shift, |
1222 | 213k | WORD16 size, WORD16 ch_fac) { |
1223 | 213k | WORD32 accu; |
1224 | 213k | WORD32 i; |
1225 | | |
1226 | 13.6M | for (i = 0; i < size; i++) { |
1227 | 13.4M | accu = ixheaac_sub32_sat( |
1228 | 13.4M | ixheaac_mult32x16in32(coef[size + i], window[2 * i]), |
1229 | 13.4M | ixheaac_mult32x16in32(prev[size - 1 - i], window[2 * i + 1])); |
1230 | 13.4M | out[ch_fac * i] = ixheaac_shr32_sat(accu, 16 - (q_shift + 1)); |
1231 | 13.4M | } |
1232 | | |
1233 | 13.6M | for (i = 0; i < size; i++) { |
1234 | 13.4M | accu = ixheaac_sub32_sat( |
1235 | 13.4M | ixheaac_mult32x16in32(ixheaac_negate32_sat(coef[size * 2 - 1 - i]), |
1236 | 13.4M | window[2 * size - 2 * i - 1]), |
1237 | 13.4M | ixheaac_mult32x16in32(prev[i], window[2 * size - 2 * i - 2])); |
1238 | 13.4M | out[ch_fac * (i + size)] = ixheaac_shr32_sat(accu, 16 - (q_shift + 1)); |
1239 | 13.4M | } |
1240 | 213k | } |
1241 | | |
1242 | | VOID ixheaacd_process_single_scf(WORD32 scale_factor, WORD32 *x_invquant, |
1243 | | WORD32 width, WORD32 *ptr_scale_table, |
1244 | | WORD32 total_channels, WORD32 object_type, |
1245 | 5.48M | WORD32 aac_sf_data_resil_flag) { |
1246 | 5.48M | WORD32 j; |
1247 | | |
1248 | 5.48M | WORD32 temp1; |
1249 | 5.48M | WORD32 q_factor; |
1250 | 5.48M | WORD32 buffer1; |
1251 | 5.48M | WORD16 scale_short; |
1252 | | |
1253 | 5.48M | object_type = 0; |
1254 | 5.48M | aac_sf_data_resil_flag = 0; |
1255 | | |
1256 | 5.48M | if (scale_factor < 24) { |
1257 | 26.3M | for (j = width; j > 0; j--) { |
1258 | 23.8M | *x_invquant++ = 0; |
1259 | 23.8M | } |
1260 | 3.00M | } else { |
1261 | 3.00M | WORD32 shift; |
1262 | | |
1263 | 3.00M | if (total_channels > 2) |
1264 | 206k | q_factor = 34 - (scale_factor >> 2); |
1265 | 2.79M | else |
1266 | 2.79M | q_factor = 37 - (scale_factor >> 2); |
1267 | | |
1268 | 3.00M | scale_short = ptr_scale_table[(scale_factor & 0x0003)]; |
1269 | 3.00M | shift = q_factor; |
1270 | 3.00M | if (shift > 0) { |
1271 | 951k | if (scale_short == (WORD16)0x8000) { |
1272 | 0 | for (j = width; j > 0; j--) { |
1273 | 0 | temp1 = *x_invquant; |
1274 | 0 | buffer1 = ixheaac_mult32x16in32_shl_sat(temp1, scale_short); |
1275 | 0 | buffer1 = ixheaac_shr32(buffer1, shift); |
1276 | 0 | *x_invquant++ = buffer1; |
1277 | 0 | } |
1278 | 951k | } else { |
1279 | 13.0M | for (j = width; j > 0; j--) { |
1280 | 12.1M | temp1 = *x_invquant; |
1281 | 12.1M | buffer1 = ixheaac_mult32x16in32_shl(temp1, scale_short); |
1282 | 12.1M | buffer1 = ixheaac_shr32(buffer1, shift); |
1283 | 12.1M | *x_invquant++ = buffer1; |
1284 | 12.1M | } |
1285 | 951k | } |
1286 | 2.04M | } else { |
1287 | 2.04M | shift = -shift; |
1288 | 2.04M | if (shift > 0) { |
1289 | 2.04M | if (scale_short == (WORD16)0x8000) { |
1290 | 0 | for (j = width; j > 0; j--) { |
1291 | 0 | temp1 = *x_invquant; |
1292 | 0 | temp1 = ixheaac_shl32(temp1, shift - 1); |
1293 | 0 | buffer1 = ixheaac_mult32x16in32_shl_sat(temp1, scale_short); |
1294 | 0 | buffer1 = ixheaac_shl32(buffer1, 1); |
1295 | 0 | *x_invquant++ = buffer1; |
1296 | 0 | } |
1297 | 2.04M | } else { |
1298 | 21.7M | for (j = width; j > 0; j--) { |
1299 | 19.7M | temp1 = *x_invquant; |
1300 | 19.7M | temp1 = ixheaac_shl32(temp1, shift - 1); |
1301 | 19.7M | buffer1 = ixheaac_mult32x16in32_shl(temp1, scale_short); |
1302 | 19.7M | buffer1 = ixheaac_shl32(buffer1, 1); |
1303 | 19.7M | *x_invquant++ = buffer1; |
1304 | 19.7M | } |
1305 | 2.04M | } |
1306 | | |
1307 | 2.04M | } else { |
1308 | 4.22k | if (scale_short == (WORD16)0x8000) { |
1309 | 0 | for (j = width; j > 0; j--) { |
1310 | 0 | temp1 = *x_invquant; |
1311 | 0 | buffer1 = ixheaac_mult32x16in32_shl_sat(temp1, scale_short); |
1312 | 0 | *x_invquant++ = buffer1; |
1313 | 0 | } |
1314 | 4.22k | } else { |
1315 | 39.5k | for (j = width; j > 0; j--) { |
1316 | 35.3k | temp1 = *x_invquant; |
1317 | 35.3k | buffer1 = ixheaac_mult32x16in32_shl(temp1, scale_short); |
1318 | 35.3k | *x_invquant++ = buffer1; |
1319 | 35.3k | } |
1320 | 4.22k | } |
1321 | 4.22k | } |
1322 | 2.04M | } |
1323 | 3.00M | } |
1324 | 5.48M | } |
1325 | | |
1326 | | VOID ixheaacd_scale_factor_process_dec(WORD32 *x_invquant, WORD16 *scale_fact, |
1327 | | WORD no_band, WORD8 *width, |
1328 | | WORD32 *ptr_scale_table, |
1329 | | WORD32 total_channels, |
1330 | | WORD32 object_type, |
1331 | 707k | WORD32 aac_sf_data_resil_flag) { |
1332 | 707k | WORD32 i; |
1333 | 707k | WORD16 scale_factor; |
1334 | | |
1335 | 6.19M | for (i = no_band - 1; i >= 0; i--) { |
1336 | 5.48M | scale_factor = *scale_fact++; |
1337 | 5.48M | ixheaacd_process_single_scf(scale_factor, x_invquant, *width, |
1338 | 5.48M | ptr_scale_table, total_channels, object_type, |
1339 | 5.48M | aac_sf_data_resil_flag); |
1340 | | |
1341 | 5.48M | x_invquant += *width; |
1342 | 5.48M | width++; |
1343 | 5.48M | } |
1344 | 707k | } |
1345 | | |
1346 | | VOID ixheaacd_right_shift_block(WORD32 *p_spectrum, WORD32 length, |
1347 | 19.1k | WORD32 shift_val) { |
1348 | 19.1k | WORD32 i; |
1349 | 19.1k | WORD32 temp1, temp2; |
1350 | 19.1k | WORD32 *temp_ptr = &p_spectrum[0]; |
1351 | 19.1k | length = length >> 2; |
1352 | | |
1353 | 1.01M | for (i = length - 1; i >= 0; i--) { |
1354 | 1.00M | temp1 = *temp_ptr; |
1355 | 1.00M | temp2 = *(temp_ptr + 1); |
1356 | 1.00M | *temp_ptr++ = temp1 >> shift_val; |
1357 | 1.00M | temp1 = *(temp_ptr + 1); |
1358 | 1.00M | *temp_ptr++ = temp2 >> shift_val; |
1359 | 1.00M | temp2 = *(temp_ptr + 1); |
1360 | 1.00M | *temp_ptr++ = temp1 >> shift_val; |
1361 | 1.00M | *temp_ptr++ = temp2 >> shift_val; |
1362 | 1.00M | } |
1363 | 19.1k | } |