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