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