1 /****************************************************************************** 2 * * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 #include <string.h> 21 #include "ixheaacd_sbr_common.h" 22 #include <ixheaacd_type_def.h> 23 24 #include "ixheaacd_constants.h" 25 #include <ixheaacd_basic_ops32.h> 26 #include <ixheaacd_basic_ops16.h> 27 #include <ixheaacd_basic_ops40.h> 28 #include "ixheaacd_basic_ops_arr.h" 29 #include "ixheaacd_basic_ops.h" 30 31 #include "ixheaacd_defines.h" 32 #include <ixheaacd_basic_op.h> 33 #include "ixheaacd_intrinsics.h" 34 #include "ixheaacd_common_rom.h" 35 #include "ixheaacd_basic_funcs.h" 36 #include "ixheaacd_bitbuffer.h" 37 #include "ixheaacd_sbrdecsettings.h" 38 #include "ixheaacd_defines.h" 39 40 #include "ixheaacd_pns.h" 41 42 #include <ixheaacd_aac_rom.h> 43 #include "ixheaacd_pulsedata.h" 44 45 #include "ixheaacd_drc_data_struct.h" 46 #include "ixheaacd_lt_predict.h" 47 #include "ixheaacd_channelinfo.h" 48 #include "ixheaacd_drc_dec.h" 49 50 #include "ixheaacd_sbrdecoder.h" 51 #include "ixheaacd_sbr_scale.h" 52 #include "ixheaacd_lpp_tran.h" 53 #include "ixheaacd_env_extr_part.h" 54 #include <ixheaacd_sbr_rom.h> 55 56 #include "ixheaacd_hybrid.h" 57 #include "ixheaacd_ps_dec.h" 58 59 #include "ixheaacd_env_extr.h" 60 61 #include "ixheaacd_ps_dec.h" 62 63 #include "ixheaacd_qmf_dec.h" 64 #include "ixheaacd_env_calc.h" 65 #include "ixheaacd_sbr_const.h" 66 67 #include "ixheaacd_pvc_dec.h" 68 #include "ixheaacd_sbr_dec.h" 69 #include "ixheaacd_function_selector.h" 70 71 static PLATFORM_INLINE WORD16 ixheaacd_shl16_saturate(WORD16 op1, 72 WORD16 shift) { 73 WORD16 var_out; 74 WORD32 temp; 75 76 temp = (WORD32)(op1 << shift); 77 var_out = ixheaacd_sat16(temp); 78 return (var_out); 79 } 80 81 static PLATFORM_INLINE VOID ixheaacd_shl16_arr_saturate(WORD16 *word16_arr, 82 WORD16 shift, WORD n) { 83 WORD i; 84 85 for (i = n - 1; i >= 0; i--) { 86 *word16_arr = ixheaacd_shl16_saturate(*word16_arr, shift); 87 word16_arr++; 88 } 89 90 return; 91 } 92 93 VOID ixheaacd_scale_short_vec_left(WORD16 *word16_arr, WORD32 n, WORD16 shift) { 94 ixheaacd_shl16_arr_saturate(word16_arr, shift, n); 95 } 96 97 VOID ixheaacd_scale_int_vec_left(WORD32 *word32_arr, WORD32 n, WORD16 shift) { 98 ixheaacd_shl32_arr_sat(word32_arr, shift, n); 99 } 100 101 VOID ixheaacd_scale_int_vec_right(WORD32 *word32_arr, WORD32 n, WORD16 shift) { 102 ixheaacd_shr32_arr(word32_arr, shift, n); 103 } 104 105 VOID ixheaacd_scale_short_vec_right(WORD16 *word16_arr, WORD32 n, 106 WORD16 shift) { 107 ixheaacd_shr16_arr(word16_arr, shift, n); 108 } 109 110 WORD32 ixheaacd_calc_max(WORD16 *array, WORD32 size) { 111 WORD n; 112 WORD32 max_val = 0; 113 WORD16 temp1, temp2; 114 115 for (n = size; n != 0; n--) { 116 temp1 = *array++; 117 temp2 = *array++; 118 119 max_val = max_val | ixheaacd_abs32_nrm(temp1); 120 max_val = max_val | ixheaacd_abs32_nrm(temp2); 121 } 122 123 return max_val; 124 } 125 126 static WORD ixheaacd_get_ps_scale(ia_ps_dec_struct *ptr_ps_dec) { 127 WORD i, m, n, len; 128 WORD32 max_val = 0; 129 WORD16 *ptr_re; 130 WORD32 *ptr_re_temp, *ptr_im; 131 132 for (m = 0; m < 2; m++) { 133 ptr_re = &ptr_ps_dec->delay_buf_qmf_ap_re_im[m][2 * 3]; 134 max_val |= 135 ixheaacd_calc_max(ptr_re, NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS); 136 } 137 138 ptr_re = (WORD16 *)ptr_ps_dec->delay_buf_qmf_ld_re_im; 139 140 max_val |= ixheaacd_calc_max(ptr_re, HIGH_DEL * SMALL_DEL_STRT); 141 142 ptr_re = (WORD16 *)ptr_ps_dec->delay_buf_qmf_sd_re_im; 143 144 max_val |= ixheaacd_calc_max( 145 ptr_re, (SMALL_DEL * 146 (NUM_OF_QUAD_MIRROR_FILTER_ICC_CHNLS - 147 (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT)))); 148 149 ptr_re = (WORD16 *)ptr_ps_dec->delay_buf_qmf_sub_re_im; 150 151 max_val |= ixheaacd_calc_max(ptr_re, 16 * DEL_ALL_PASS); 152 153 for (i = 0; i < NUM_SER_AP_LINKS; i++) { 154 for (m = 0; m < ptr_ps_dec->delay_sample_ser[i]; m++) { 155 ptr_re = &ptr_ps_dec->delay_buf_qmf_ser_re_im[m][i][2 * 3]; 156 157 max_val |= 158 ixheaacd_calc_max(ptr_re, NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS); 159 } 160 } 161 162 ptr_re = (WORD16 *)ptr_ps_dec->delay_buf_qmf_sub_ser_re_im; 163 max_val |= ixheaacd_calc_max(ptr_re, NUM_SER_AP_LINKS * 5 * 16); 164 165 max_val = max_val << 16; 166 167 len = ptr_ps_dec->str_hybrid.ptr_qmf_buf; 168 169 for (i = 0; i < NO_QMF_CHANNELS_IN_HYBRID; i++) { 170 ptr_re_temp = &ptr_ps_dec->str_hybrid.ptr_qmf_buf_re[i][0]; 171 ptr_im = &ptr_ps_dec->str_hybrid.ptr_qmf_buf_im[i][0]; 172 173 for (n = len; n != 0; n--) { 174 WORD32 temp3 = *ptr_re_temp++; 175 WORD32 temp4 = *ptr_im++; 176 177 max_val = max_val | ixheaacd_abs32_nrm(temp3); 178 max_val = max_val | ixheaacd_abs32_nrm(temp4); 179 } 180 } 181 182 return ixheaacd_pnorm32(max_val); 183 } 184 185 VOID ixheaacd_init_ps_scale(ia_ps_dec_struct *ptr_ps_dec, 186 ia_sbr_scale_fact_struct *sbr_scale_factor) 187 188 { 189 WORD32 reserve, change; 190 WORD16 temp; 191 192 reserve = ixheaacd_get_ps_scale(ptr_ps_dec); 193 194 ptr_ps_dec->delay_buffer_scale = (ptr_ps_dec->delay_buffer_scale + reserve); 195 temp = 196 ixheaacd_min16(sbr_scale_factor->lb_scale, sbr_scale_factor->ov_lb_scale); 197 temp = ixheaacd_min16(temp, sbr_scale_factor->hb_scale); 198 temp = ixheaacd_min16(temp, ptr_ps_dec->delay_buffer_scale); 199 sbr_scale_factor->ps_scale = (temp - 1); 200 201 change = (sbr_scale_factor->ps_scale - ptr_ps_dec->delay_buffer_scale); 202 change = (change + reserve); 203 204 ixheaacd_scale_ps_states(ptr_ps_dec, (WORD16)change); 205 206 ptr_ps_dec->delay_buffer_scale = sbr_scale_factor->ps_scale; 207 } 208 209 WORD32 ixheaacd_divide16_pos_dec(WORD32 op1, WORD32 op2) { 210 UWORD32 v; 211 UWORD32 u; 212 WORD k, nrm; 213 214 nrm = ixheaacd_norm32(op2); 215 u = (op1 << nrm); 216 v = (op2 << nrm); 217 u = (u & 0xffff0000); 218 v = (v & 0xffff0000); 219 220 if (u != 0) { 221 for (k = 16; k > 0; k--) { 222 if (u >= (UWORD32)v) { 223 u = ((u - v) << 1) + 1; 224 } else { 225 u = (u << 1); 226 } 227 } 228 } 229 230 return (u); 231 } 232 233 VOID ixheaacd_decorr_filter1_dec(ia_ps_dec_struct *ptr_ps_dec, 234 ia_ps_tables_struct *ps_tables_ptr, 235 WORD16 *transient_ratio) { 236 WORD sb; 237 WORD m; 238 239 WORD16 delay_buf_idx; 240 WORD16 *p_delay_buf_sub_re_im; 241 WORD16 *p_frac_delay_phase_fac_ser_re_im, *p_frac_delay_phase_fac_ser_re_im1; 242 243 const WORD16 *p_frac_delay_phase_fac_re_im; 244 REVERB_BUFFERS_CH_RI *p_delay_buf_ser_sub_re_im; 245 246 WORD32 *p_left_real; 247 WORD32 *p_left_imag; 248 WORD32 *p_right_real; 249 WORD32 *p_right_imag; 250 251 p_frac_delay_phase_fac_re_im = 252 &ps_tables_ptr->frac_delay_phase_fac_qmf_sub_re_im[0]; 253 p_delay_buf_ser_sub_re_im = &ptr_ps_dec->delay_buf_qmf_sub_ser_re_im; 254 p_frac_delay_phase_fac_ser_re_im = 255 &ps_tables_ptr->frac_delay_phase_fac_qmf_sub_ser_re_im[0][0]; 256 257 p_left_real = ptr_ps_dec->ptr_hyb_left_re; 258 p_left_imag = ptr_ps_dec->ptr_hyb_left_im; 259 p_right_real = ptr_ps_dec->ptr_hyb_right_re; 260 p_right_imag = ptr_ps_dec->ptr_hyb_right_im; 261 262 delay_buf_idx = ptr_ps_dec->delay_buf_idx; 263 p_delay_buf_sub_re_im = 264 &ptr_ps_dec->delay_buf_qmf_sub_re_im[delay_buf_idx][0]; 265 for (sb = 0; sb < SUBQMF_GROUPS; sb++) { 266 WORD16 real_tmp, imag_tmp, real_tmp0, imag_tmp0, real_in, imag_in, bin; 267 268 real_tmp0 = p_delay_buf_sub_re_im[0]; 269 imag_tmp0 = p_delay_buf_sub_re_im[1]; 270 271 real_in = (WORD16)( 272 ixheaacd_sub32_sat( 273 ixheaacd_mult16x16in32(real_tmp0, p_frac_delay_phase_fac_re_im[0]), 274 ixheaacd_mult16x16in32(imag_tmp0, 275 p_frac_delay_phase_fac_re_im[1])) >> 276 15); 277 imag_in = (WORD16)( 278 ixheaacd_add32_sat( 279 ixheaacd_mult16x16in32(real_tmp0, p_frac_delay_phase_fac_re_im[1]), 280 ixheaacd_mult16x16in32(imag_tmp0, 281 p_frac_delay_phase_fac_re_im[0])) >> 282 15); 283 *p_delay_buf_sub_re_im++ = ixheaacd_round16(p_left_real[sb]); 284 *p_delay_buf_sub_re_im++ = ixheaacd_round16(p_left_imag[sb]); 285 p_frac_delay_phase_fac_re_im += 2; 286 287 p_frac_delay_phase_fac_ser_re_im1 = p_frac_delay_phase_fac_ser_re_im; 288 p_frac_delay_phase_fac_ser_re_im += 2; 289 290 for (m = 0; m < NUM_SER_AP_LINKS; m++) { 291 WORD16 decay; 292 WORD16 delay_buf_idx_ser; 293 delay_buf_idx_ser = ptr_ps_dec->delay_buf_idx_ser[m]; 294 real_tmp0 = (*p_delay_buf_ser_sub_re_im)[delay_buf_idx_ser][m][2 * sb]; 295 imag_tmp0 = 296 (*p_delay_buf_ser_sub_re_im)[delay_buf_idx_ser][m][2 * sb + 1]; 297 298 real_tmp = 299 (WORD16)(ixheaacd_sub32_sat( 300 ixheaacd_mult16x16in32( 301 real_tmp0, p_frac_delay_phase_fac_ser_re_im1[0]), 302 ixheaacd_mult16x16in32( 303 imag_tmp0, p_frac_delay_phase_fac_ser_re_im1[1])) >> 304 15); 305 imag_tmp = 306 (WORD16)(ixheaacd_add32_sat( 307 ixheaacd_mult16x16in32( 308 real_tmp0, p_frac_delay_phase_fac_ser_re_im1[1]), 309 ixheaacd_mult16x16in32( 310 imag_tmp0, p_frac_delay_phase_fac_ser_re_im1[0])) >> 311 15); 312 313 decay = ps_tables_ptr->rev_link_decay_ser[m]; 314 315 real_tmp = ixheaacd_sub16(real_tmp, ixheaacd_mult16_shl(real_in, decay)); 316 imag_tmp = ixheaacd_sub16(imag_tmp, ixheaacd_mult16_shl(imag_in, decay)); 317 318 (*p_delay_buf_ser_sub_re_im)[delay_buf_idx_ser][m][sb * 2] = 319 ixheaacd_add16(real_in, ixheaacd_mult16_shl(real_tmp, decay)); 320 (*p_delay_buf_ser_sub_re_im)[delay_buf_idx_ser][m][sb * 2 + 1] = 321 ixheaacd_add16(imag_in, ixheaacd_mult16_shl(imag_tmp, decay)); 322 323 real_in = real_tmp; 324 imag_in = imag_tmp; 325 p_frac_delay_phase_fac_ser_re_im1 += 32; 326 } 327 328 bin = ps_tables_ptr->hybrid_to_bin[sb]; 329 p_right_real[sb] = 330 ixheaacd_mult16x16in32_shl(real_in, transient_ratio[bin]); 331 p_right_imag[sb] = 332 ixheaacd_mult16x16in32_shl(imag_in, transient_ratio[bin]); 333 } 334 } 335 336 VOID ixheaacd_decorr_filter2_dec( 337 ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_buf_left_real, 338 WORD32 *p_buf_left_imag, WORD32 *p_buf_right_real, WORD32 *p_buf_right_imag, 339 ia_ps_tables_struct *ps_tables_ptr, WORD16 *transient_ratio) { 340 WORD sb, di, sb_delay; 341 WORD m, bin; 342 WORD32 *p_left_real; 343 WORD32 *p_left_imag; 344 WORD32 *p_right_real; 345 WORD32 *p_right_imag; 346 WORD16 delay_buf_idx; 347 REVERB_BUFFERS_RI *p_delay_buf_ser_re_im; 348 WORD16 *p_delay_buf_ap_re_im; 349 const WORD16 *p_frac_delay_phase_fac_re_im; 350 WORD16 *p_frac_delay_phase_fac_ser_ap_re_im, 351 *p_frac_delay_phase_fac_ser_ap_re_im_temp; 352 353 p_left_real = p_buf_left_real; 354 p_left_imag = p_buf_left_imag; 355 p_right_real = p_buf_right_real; 356 p_right_imag = p_buf_right_imag; 357 358 p_delay_buf_ser_re_im = &ptr_ps_dec->delay_buf_qmf_ser_re_im; 359 p_frac_delay_phase_fac_re_im = ps_tables_ptr->frac_delay_phase_fac_qmf_re_im; 360 p_frac_delay_phase_fac_ser_ap_re_im = 361 &ps_tables_ptr->frac_delay_phase_fac_qmf_ser_re_im[0][0]; 362 363 delay_buf_idx = ptr_ps_dec->delay_buf_idx; 364 365 p_delay_buf_ap_re_im = &ptr_ps_dec->delay_buf_qmf_ap_re_im[delay_buf_idx][0]; 366 p_frac_delay_phase_fac_re_im += 6; 367 p_frac_delay_phase_fac_ser_ap_re_im += 6; 368 p_delay_buf_ap_re_im += 6; 369 370 for (sb = 3, di = 9; sb < 23; sb++) { 371 WORD16 real_tmp, imag_tmp, real_tmp0, imag_tmp0, real_in, imag_in; 372 373 sb_delay = sb; 374 375 real_tmp0 = p_delay_buf_ap_re_im[0]; 376 imag_tmp0 = p_delay_buf_ap_re_im[1]; 377 378 real_in = (WORD16)( 379 ixheaacd_sub32_sat( 380 ixheaacd_mult16x16in32(real_tmp0, p_frac_delay_phase_fac_re_im[0]), 381 ixheaacd_mult16x16in32(imag_tmp0, 382 p_frac_delay_phase_fac_re_im[1])) >> 383 15); 384 imag_in = (WORD16)( 385 ixheaacd_add32_sat( 386 ixheaacd_mult16x16in32(real_tmp0, p_frac_delay_phase_fac_re_im[1]), 387 ixheaacd_mult16x16in32(imag_tmp0, 388 p_frac_delay_phase_fac_re_im[0])) >> 389 15); 390 391 *p_delay_buf_ap_re_im++ = ixheaacd_round16(p_left_real[sb]); 392 *p_delay_buf_ap_re_im++ = ixheaacd_round16(p_left_imag[sb]); 393 394 p_frac_delay_phase_fac_re_im += 2; 395 396 p_frac_delay_phase_fac_ser_ap_re_im_temp = 397 p_frac_delay_phase_fac_ser_ap_re_im; 398 p_frac_delay_phase_fac_ser_ap_re_im += 2; 399 400 for (m = 0; m < NUM_SER_AP_LINKS; m++, di++) { 401 WORD16 decay; 402 WORD16 delay_buf_idx_ser; 403 delay_buf_idx_ser = ptr_ps_dec->delay_buf_idx_ser[m]; 404 405 real_tmp0 = (*p_delay_buf_ser_re_im)[delay_buf_idx_ser][m][sb_delay * 2]; 406 imag_tmp0 = 407 (*p_delay_buf_ser_re_im)[delay_buf_idx_ser][m][sb_delay * 2 + 1]; 408 409 real_tmp = (WORD16)( 410 ixheaacd_sub32_sat( 411 ixheaacd_mult16x16in32( 412 real_tmp0, p_frac_delay_phase_fac_ser_ap_re_im_temp[0]), 413 ixheaacd_mult16x16in32( 414 imag_tmp0, p_frac_delay_phase_fac_ser_ap_re_im_temp[1])) >> 415 15); 416 imag_tmp = (WORD16)( 417 ixheaacd_add32_sat( 418 ixheaacd_mult16x16in32( 419 real_tmp0, p_frac_delay_phase_fac_ser_ap_re_im_temp[1]), 420 ixheaacd_mult16x16in32( 421 imag_tmp0, p_frac_delay_phase_fac_ser_ap_re_im_temp[0])) >> 422 15); 423 424 decay = ps_tables_ptr->decay_scale_factor[di]; 425 426 real_tmp = ixheaacd_sub16(real_tmp, ixheaacd_mult16_shl(real_in, decay)); 427 imag_tmp = ixheaacd_sub16(imag_tmp, ixheaacd_mult16_shl(imag_in, decay)); 428 429 (*p_delay_buf_ser_re_im)[delay_buf_idx_ser][m][sb_delay * 2] = 430 ixheaacd_add16(real_in, ixheaacd_mult16_shl(real_tmp, decay)); 431 (*p_delay_buf_ser_re_im)[delay_buf_idx_ser][m][sb_delay * 2 + 1] = 432 ixheaacd_add16(imag_in, ixheaacd_mult16_shl(imag_tmp, decay)); 433 434 real_in = real_tmp; 435 imag_in = imag_tmp; 436 p_frac_delay_phase_fac_ser_ap_re_im_temp += 64; 437 } 438 439 bin = ps_tables_ptr->delay_to_bin[sb_delay]; 440 p_right_real[sb] = 441 ixheaacd_mult16x16in32_shl(real_in, transient_ratio[bin]); 442 p_right_imag[sb] = 443 ixheaacd_mult16x16in32_shl(imag_in, transient_ratio[bin]); 444 } 445 } 446 447 VOID ixheaacd_decorrelation_dec(ia_ps_dec_struct *ptr_ps_dec, 448 WORD32 *p_buf_left_real, 449 WORD32 *p_buf_left_imag, 450 WORD32 *p_buf_right_real, 451 WORD32 *p_buf_right_imag, 452 ia_ps_tables_struct *ps_tables_ptr) { 453 WORD sb; 454 455 WORD gr, bin, sband, maxsband; 456 457 WORD32 peak_diff, nrg; 458 WORD32 power_buf[NUM_OF_BINS]; 459 WORD16 transient_ratio[NUM_OF_BINS + 1]; 460 461 WORD32 *p_left_real; 462 WORD32 *p_left_imag; 463 WORD32 *p_right_real; 464 WORD32 *p_right_imag; 465 466 WORD16 *p_delay_buf_re_im_ld; 467 WORD16 *p_delay_buf_re_im_sd; 468 469 WORD usb = ptr_ps_dec->usb; 470 WORD16 delay_buf_idx; 471 472 p_left_real = ptr_ps_dec->ptr_hyb_left_re; 473 p_left_imag = ptr_ps_dec->ptr_hyb_left_im; 474 p_right_real = ptr_ps_dec->ptr_hyb_right_re; 475 p_right_imag = ptr_ps_dec->ptr_hyb_right_im; 476 477 { 478 WORD32 re0, im0, re1, im1; 479 480 re0 = (p_left_real[0]); 481 im0 = (p_left_imag[0]); 482 re1 = (p_left_real[5]); 483 im1 = (p_left_imag[5]); 484 485 power_buf[0] = ixheaacd_mult32x16in32(re0, (WORD16)(re0 >> 16)); 486 power_buf[0] = ixheaacd_add32_sat( 487 power_buf[0], ixheaacd_mult32x16in32(im0, (WORD16)(im0 >> 16))); 488 power_buf[0] = ixheaacd_add32_sat( 489 power_buf[0], ixheaacd_mult32x16in32(re1, (WORD16)(re1 >> 16))); 490 power_buf[0] = ixheaacd_add32_sat( 491 power_buf[0], ixheaacd_mult32x16in32(im1, (WORD16)(im1 >> 16))); 492 493 re0 = (p_left_real[4]); 494 im0 = (p_left_imag[4]); 495 re1 = (p_left_real[1]); 496 im1 = (p_left_imag[1]); 497 498 power_buf[1] = ixheaacd_mult32x16in32(re0, (WORD16)(re0 >> 16)); 499 power_buf[1] = ixheaacd_add32_sat( 500 power_buf[1], ixheaacd_mult32x16in32(im0, (WORD16)(im0 >> 16))); 501 power_buf[1] = ixheaacd_add32_sat( 502 power_buf[1], ixheaacd_mult32x16in32(re1, (WORD16)(re1 >> 16))); 503 power_buf[1] = ixheaacd_add32_sat( 504 power_buf[1], ixheaacd_mult32x16in32(im1, (WORD16)(im1 >> 16))); 505 } 506 507 bin = 4 - 2; 508 for (gr = 4; gr < SUBQMF_GROUPS; gr++) { 509 WORD32 re, im; 510 sb = ps_tables_ptr->borders_group[gr]; 511 re = (p_left_real[sb]); 512 im = (p_left_imag[sb]); 513 power_buf[bin] = ixheaacd_mult32x16in32(re, (WORD16)(re >> 16)); 514 power_buf[bin] = ixheaacd_add32_sat( 515 power_buf[bin], ixheaacd_mult32x16in32(im, (WORD16)(im >> 16))); 516 bin++; 517 } 518 519 p_left_real = p_buf_left_real; 520 p_left_imag = p_buf_left_imag; 521 522 bin = NO_QMF_CHANNELS_IN_HYBRID + 5; 523 for (sband = NO_QMF_CHANNELS_IN_HYBRID; sband < NO_QMF_CHANNELS_IN_HYBRID + 6; 524 sband++) { 525 WORD32 re = (p_left_real[sband]); 526 WORD32 im = (p_left_imag[sband]); 527 power_buf[bin] = ixheaacd_mult32x16in32(re, (WORD16)(re >> 16)); 528 power_buf[bin] = ixheaacd_add32_sat( 529 power_buf[bin], ixheaacd_mult32x16in32(im, (WORD16)(im >> 16))); 530 bin++; 531 } 532 533 bin = 16 - 2; 534 for (gr = 16; gr < NO_IID_GROUPS; gr++) { 535 WORD32 accu = 0, tmp; 536 WORD32 re, im; 537 538 maxsband = ixheaacd_min32(usb, ps_tables_ptr->borders_group[gr + 1]); 539 540 for (sband = ps_tables_ptr->borders_group[gr]; sband < maxsband; sband++) { 541 re = (p_left_real[sband]); 542 im = (p_left_imag[sband]); 543 544 tmp = ixheaacd_mult32x16in32(re, (WORD16)(re >> 16)); 545 tmp = ixheaacd_add32_sat(tmp, 546 ixheaacd_mult32x16in32(im, (WORD16)(im >> 16))); 547 tmp = (tmp >> ps_tables_ptr->group_shift[gr - (SUBQMF_GROUPS + 6)]); 548 549 accu = ixheaacd_add32_sat(accu, tmp); 550 } 551 power_buf[bin] = accu; 552 bin++; 553 } 554 555 p_left_real = ptr_ps_dec->ptr_hyb_left_re; 556 p_left_imag = ptr_ps_dec->ptr_hyb_left_im; 557 558 for (bin = 0; bin < NUM_OF_BINS; bin++) { 559 power_buf[bin] = ixheaacd_shl32(power_buf[bin], 1); 560 561 power_buf[bin] = ixheaacd_max32(0, power_buf[bin]); 562 563 ptr_ps_dec->peak_decay_diff[bin] = ixheaacd_mult32x16in32_shl( 564 ptr_ps_dec->peak_decay_diff[bin], PEAK_DECAYING_FACT); 565 566 ptr_ps_dec->peak_decay_diff[bin] = 567 ixheaacd_max32(ptr_ps_dec->peak_decay_diff[bin], power_buf[bin]); 568 569 peak_diff = ixheaacd_add32_sat( 570 ixheaacd_mult32x16in32_shl(ptr_ps_dec->peak_decay_diff_prev[bin], 571 0x6000), 572 ((ixheaacd_sub32_sat(ptr_ps_dec->peak_decay_diff[bin], 573 power_buf[bin]) >> 574 2))); 575 576 ptr_ps_dec->peak_decay_diff_prev[bin] = peak_diff; 577 578 nrg = ixheaacd_add32_sat( 579 ixheaacd_mult32x16in32_shl(ptr_ps_dec->energy_prev[bin], 0x6000), 580 (power_buf[bin] >> 2)); 581 ptr_ps_dec->energy_prev[bin] = nrg; 582 583 peak_diff = ixheaacd_add32_sat(peak_diff, (peak_diff >> 1)); 584 585 if (peak_diff <= nrg) { 586 transient_ratio[bin] = 0x7fff; 587 } else { 588 transient_ratio[bin] = 589 ixheaacd_extract16l((*ixheaacd_divide16_pos)(nrg, peak_diff)); 590 } 591 } 592 593 (*ixheaacd_decorr_filter1)(ptr_ps_dec, ps_tables_ptr, transient_ratio); 594 595 transient_ratio[20] = 0; 596 597 (*ixheaacd_decorr_filter2)(ptr_ps_dec, p_buf_left_real, p_buf_left_imag, 598 p_buf_right_real, p_buf_right_imag, ps_tables_ptr, 599 transient_ratio); 600 601 { 602 WORD16 trans_ratio = transient_ratio[18]; 603 604 p_left_real = p_buf_left_real; 605 p_left_imag = p_buf_left_imag; 606 p_right_real = p_buf_right_real; 607 p_right_imag = p_buf_right_imag; 608 609 maxsband = ixheaacd_min32((WORD16)usb, ps_tables_ptr->borders_group[21]); 610 delay_buf_idx = ptr_ps_dec->delay_buf_idx_long; 611 p_delay_buf_re_im_ld = 612 &ptr_ps_dec->delay_buf_qmf_ld_re_im[delay_buf_idx][0]; 613 614 for (sband = ps_tables_ptr->borders_group[20]; sband < maxsband; sband++) { 615 WORD16 real_in, imag_in; 616 617 real_in = p_delay_buf_re_im_ld[0]; 618 imag_in = p_delay_buf_re_im_ld[1]; 619 *p_delay_buf_re_im_ld++ = ixheaacd_round16(p_left_real[sband]); 620 *p_delay_buf_re_im_ld++ = ixheaacd_round16(p_left_imag[sband]); 621 622 p_right_real[sband] = ixheaacd_mult16x16in32_shl(real_in, trans_ratio); 623 p_right_imag[sband] = ixheaacd_mult16x16in32_shl(imag_in, trans_ratio); 624 } 625 626 ptr_ps_dec->delay_buf_idx_long = 627 ixheaacd_add16(ptr_ps_dec->delay_buf_idx_long, 1); 628 629 if (ptr_ps_dec->delay_buf_idx_long >= 14) { 630 ptr_ps_dec->delay_buf_idx_long = 0; 631 } 632 633 p_delay_buf_re_im_sd = &ptr_ps_dec->delay_buf_qmf_sd_re_im[0][0]; 634 635 trans_ratio = transient_ratio[19]; 636 maxsband = ixheaacd_min32((WORD16)usb, ps_tables_ptr->borders_group[22]); 637 for (sband = ps_tables_ptr->borders_group[21]; sband < maxsband; sband++) { 638 WORD16 real_in, imag_in; 639 640 real_in = p_delay_buf_re_im_sd[0]; 641 imag_in = p_delay_buf_re_im_sd[1]; 642 *p_delay_buf_re_im_sd++ = ixheaacd_round16(p_left_real[sband]); 643 *p_delay_buf_re_im_sd++ = ixheaacd_round16(p_left_imag[sband]); 644 645 p_right_real[sband] = ixheaacd_mult16x16in32_shl(real_in, trans_ratio); 646 p_right_imag[sband] = ixheaacd_mult16x16in32_shl(imag_in, trans_ratio); 647 } 648 } 649 650 for (sband = usb; sband < NO_SYNTHESIS_CHANNELS; sband++) { 651 p_right_real[sband] = 0; 652 p_right_imag[sband] = 0; 653 } 654 655 ptr_ps_dec->delay_buf_idx = (WORD16)(ptr_ps_dec->delay_buf_idx + 1); 656 if (ptr_ps_dec->delay_buf_idx >= DEL_ALL_PASS) { 657 ptr_ps_dec->delay_buf_idx = 0; 658 } 659 660 { 661 WORD delay_m; 662 663 for (delay_m = 0; delay_m < NUM_SER_AP_LINKS; delay_m++) { 664 ptr_ps_dec->delay_buf_idx_ser[delay_m] = 665 (ptr_ps_dec->delay_buf_idx_ser[delay_m] + 1); 666 if (ptr_ps_dec->delay_buf_idx_ser[delay_m] >= 667 ptr_ps_dec->delay_sample_ser[delay_m]) { 668 ptr_ps_dec->delay_buf_idx_ser[delay_m] = 0; 669 } 670 } 671 } 672 } 673 674 static WORD16 ixheaacd_cos512(WORD phi_by_4, const WORD16 *cos_sin_lookup_tab) { 675 WORD index; 676 index = ixheaacd_round16(ixheaacd_abs32_sat(phi_by_4)); 677 678 index = (index & 0x3FF); 679 680 if (index < 512) { 681 return cos_sin_lookup_tab[512 - index]; 682 } else { 683 return (WORD16)(-(cos_sin_lookup_tab[index - 512])); 684 } 685 } 686 687 static WORD16 ixheaacd_sin512(WORD phi_by_4, const WORD16 *cos_sin_lookup_tab) { 688 WORD index; 689 690 index = ixheaacd_round16(phi_by_4); 691 692 if (index < 0) { 693 index = (-(index)&0x3FF); 694 695 if (index < 512) { 696 return (WORD16)(-cos_sin_lookup_tab[index]); 697 } else { 698 return (WORD16)(-cos_sin_lookup_tab[1024 - index]); 699 } 700 } else { 701 index = (index & 0x3FF); 702 703 if (index < 512) { 704 return cos_sin_lookup_tab[index]; 705 } else { 706 return cos_sin_lookup_tab[1024 - index]; 707 } 708 } 709 } 710 711 VOID ixheaacd_init_rot_env(ia_ps_dec_struct *ptr_ps_dec, WORD16 env, WORD16 usb, 712 ia_sbr_tables_struct *sbr_tables_ptr, 713 const WORD16 *cos_sin_lookup_tab) { 714 WORD group, bin, num_iid_steps; 715 WORD16 c2, c1; 716 WORD32 alpha, beta; 717 WORD16 h11, h12, h21, h22; 718 WORD16 inv_env_len; 719 const WORD16 *p_scale_factors; 720 WORD16 *p_iid_idx; 721 WORD indexplusa, indexminusa; 722 723 const WORD32 rescale = (0x0517cc1b << 1); 724 725 if (env == 0) { 726 WORD usb_prev = ptr_ps_dec->usb; 727 WORD16 *ptr_tmp; 728 ptr_ps_dec->usb = usb; 729 730 if ((usb > usb_prev) && usb_prev) { 731 WORD i, j, delay, offset1; 732 WORD ixheaacd_drc_offset = 733 (usb < NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS 734 ? usb 735 : NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS); 736 737 if (ixheaacd_drc_offset > usb_prev) { 738 for (i = 0; i < NUM_SER_AP_LINKS; i++) { 739 for (j = 0; j < ptr_ps_dec->delay_sample_ser[i]; j++) { 740 ptr_tmp = &ptr_ps_dec->delay_buf_qmf_ser_re_im[j][i][usb_prev * 2]; 741 742 memset(ptr_tmp, 0, 743 sizeof(WORD16) * (ixheaacd_drc_offset - usb_prev) * 2); 744 } 745 } 746 } 747 748 offset1 = 749 (usb < (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT) 750 ? usb 751 : (NUM_OF_QUAD_MIRROR_FILTER_ALL_PASS_CHNLS + SMALL_DEL_STRT)); 752 delay = HIGH_DEL; 753 754 if ((offset1 >= ixheaacd_drc_offset) && (offset1 <= SMALL_DEL_STRT)) { 755 for (i = 0; i < delay; i++) { 756 ptr_tmp = 757 &ptr_ps_dec->delay_buf_qmf_ld_re_im[i][ixheaacd_drc_offset * 2]; 758 759 memset(ptr_tmp, 0, 760 sizeof(WORD16) * 2 * (offset1 - ixheaacd_drc_offset)); 761 } 762 } 763 764 delay = SMALL_DEL; 765 766 if ((usb >= offset1) && (usb <= 16)) { 767 for (i = 0; i < delay; i++) { 768 ptr_tmp = &ptr_ps_dec->delay_buf_qmf_sd_re_im[i][offset1 * 2]; 769 770 memset(ptr_tmp, 0, sizeof(WORD16) * 2 * (usb - offset1)); 771 } 772 } 773 } 774 } 775 776 if (ptr_ps_dec->iid_quant) { 777 num_iid_steps = NUM_IID_LEVELS_FINE; 778 p_scale_factors = sbr_tables_ptr->ps_tables_ptr->scale_factors_fine; 779 } else { 780 num_iid_steps = NUM_IID_LEVELS; 781 p_scale_factors = sbr_tables_ptr->ps_tables_ptr->scale_factors; 782 } 783 784 inv_env_len = 785 sbr_tables_ptr->env_calc_tables_ptr->sbr_inv_int_table[ixheaacd_abs16( 786 ixheaacd_sub16_sat(ptr_ps_dec->border_position[env + 1], 787 ptr_ps_dec->border_position[env]))]; 788 789 p_iid_idx = &ptr_ps_dec->iid_par_table[env][0]; 790 791 for (group = 0; group < NO_IID_GROUPS; group++) { 792 WORD16 bplusa, bminusa; 793 WORD num_iid_idx, num_icc_idx; 794 795 bin = sbr_tables_ptr->ps_tables_ptr->group_to_bin[group]; 796 797 num_iid_idx = p_iid_idx[bin]; 798 num_icc_idx = p_iid_idx[bin + 238]; 799 800 c1 = p_scale_factors[(num_iid_steps + num_iid_idx)]; 801 c2 = p_scale_factors[(num_iid_steps - num_iid_idx)]; 802 803 beta = ixheaacd_mult32x16in32_shl( 804 ixheaacd_mult16x16in32_shl( 805 sbr_tables_ptr->ps_tables_ptr->alpha_values[num_icc_idx], 806 ixheaacd_sub16(c1, c2)), 807 PSC_SQRT05F); 808 alpha = ixheaacd_shr32_dir_sat_limit( 809 ixheaacd_deposit16h_in32( 810 sbr_tables_ptr->ps_tables_ptr->alpha_values[num_icc_idx]), 811 1); 812 813 bplusa = ixheaacd_round16(ixheaacd_add32_sat(beta, alpha)); 814 bminusa = ixheaacd_round16(ixheaacd_sub32_sat(beta, alpha)); 815 816 indexplusa = ixheaacd_mult32x16in32(rescale, bplusa); 817 indexminusa = ixheaacd_mult32x16in32(rescale, bminusa); 818 819 h11 = ixheaacd_mult16_shl(ixheaacd_cos512(indexplusa, cos_sin_lookup_tab), 820 c2); 821 h12 = ixheaacd_mult16_shl(ixheaacd_cos512(indexminusa, cos_sin_lookup_tab), 822 c1); 823 h21 = ixheaacd_mult16_shl(ixheaacd_sin512(indexplusa, cos_sin_lookup_tab), 824 c2); 825 h22 = ixheaacd_mult16_shl(ixheaacd_sin512(indexminusa, cos_sin_lookup_tab), 826 c1); 827 828 ptr_ps_dec->delta_h11_h12[2 * group + 0] = ixheaacd_mult16_shl( 829 inv_env_len, 830 ixheaacd_sub16(h11, ptr_ps_dec->h11_h12_vec[2 * group + 0])); 831 ptr_ps_dec->delta_h11_h12[2 * group + 1] = ixheaacd_mult16_shl( 832 inv_env_len, 833 ixheaacd_sub16(h12, ptr_ps_dec->h11_h12_vec[2 * group + 1])); 834 ptr_ps_dec->delta_h21_h22[2 * group + 0] = ixheaacd_mult16_shl( 835 inv_env_len, 836 ixheaacd_sub16(h21, ptr_ps_dec->h21_h22_vec[2 * group + 0])); 837 ptr_ps_dec->delta_h21_h22[2 * group + 1] = ixheaacd_mult16_shl( 838 inv_env_len, 839 ixheaacd_sub16(h22, ptr_ps_dec->h21_h22_vec[2 * group + 1])); 840 841 ptr_ps_dec->H11_H12[2 * group + 0] = ptr_ps_dec->h11_h12_vec[2 * group + 0]; 842 ptr_ps_dec->H11_H12[2 * group + 1] = ptr_ps_dec->h11_h12_vec[2 * group + 1]; 843 ptr_ps_dec->H21_H22[2 * group + 0] = ptr_ps_dec->h21_h22_vec[2 * group + 0]; 844 ptr_ps_dec->H21_H22[2 * group + 1] = ptr_ps_dec->h21_h22_vec[2 * group + 1]; 845 846 ptr_ps_dec->h11_h12_vec[2 * group + 0] = h11; 847 ptr_ps_dec->h11_h12_vec[2 * group + 1] = h12; 848 ptr_ps_dec->h21_h22_vec[2 * group + 0] = h21; 849 ptr_ps_dec->h21_h22_vec[2 * group + 1] = h22; 850 } 851 } 852 853 VOID ixheaacd_apply_rot_dec(ia_ps_dec_struct *ptr_ps_dec, WORD32 *p_qmf_left_re, 854 WORD32 *p_qmf_left_im, WORD32 *p_qmf_right_re, 855 WORD32 *p_qmf_right_im, 856 ia_sbr_tables_struct *sbr_tables_ptr, 857 const WORD16 *ptr_res) { 858 WORD group, subband, max_subband, usb, k; 859 WORD32 *p_hyb_left_re, *p_hyb_left_re1; 860 WORD32 *p_hyb_left_im, *p_hyb_left_im1; 861 WORD32 *p_hyb_right_re, *p_hyb_right_re1; 862 WORD32 *p_hyb_right_im, *p_hyb_right_im1; 863 WORD32 temp_left_real, temp_left_imag; 864 WORD32 temp_right_real, temp_right_imag; 865 WORD16 hybrid_resol; 866 WORD32 tmp_real, tmp_img; 867 WORD32 tmp_real1, tmp_img1; 868 WORD32 loopcnt; 869 WORD16 H11_H12[128 * 2]; 870 871 usb = ptr_ps_dec->usb; 872 873 p_hyb_left_re1 = ptr_ps_dec->ptr_hyb_left_re; 874 p_hyb_left_im1 = ptr_ps_dec->ptr_hyb_left_im; 875 p_hyb_right_re1 = ptr_ps_dec->ptr_hyb_right_re; 876 p_hyb_right_im1 = ptr_ps_dec->ptr_hyb_right_im; 877 878 for (group = 0; group < NO_IID_GROUPS; group++) { 879 ptr_ps_dec->H11_H12[2 * group + 0] = 880 ixheaacd_add16(ptr_ps_dec->H11_H12[2 * group + 0], 881 ptr_ps_dec->delta_h11_h12[2 * group + 0]); 882 ptr_ps_dec->H11_H12[2 * group + 1] = 883 ixheaacd_add16(ptr_ps_dec->H11_H12[2 * group + 1], 884 ptr_ps_dec->delta_h11_h12[2 * group + 1]); 885 886 ptr_ps_dec->H21_H22[2 * group + 0] = 887 ixheaacd_add16(ptr_ps_dec->H21_H22[2 * group + 0], 888 ptr_ps_dec->delta_h21_h22[2 * group + 0]); 889 ptr_ps_dec->H21_H22[2 * group + 1] = 890 ixheaacd_add16(ptr_ps_dec->H21_H22[2 * group + 1], 891 ptr_ps_dec->delta_h21_h22[2 * group + 1]); 892 } 893 894 for (subband = 0; subband < SUBQMF_GROUPS; subband++) { 895 temp_left_real = ixheaacd_add32_sat( 896 ixheaacd_mult32x16in32(p_hyb_left_re1[subband], 897 ptr_ps_dec->H11_H12[2 * subband + 0]), 898 ixheaacd_mult32x16in32(p_hyb_right_re1[subband], 899 ptr_ps_dec->H21_H22[2 * subband + 0])); 900 temp_left_imag = ixheaacd_add32_sat( 901 ixheaacd_mult32x16in32(p_hyb_left_im1[subband], 902 ptr_ps_dec->H11_H12[2 * subband + 0]), 903 ixheaacd_mult32x16in32(p_hyb_right_im1[subband], 904 ptr_ps_dec->H21_H22[2 * subband + 0])); 905 temp_right_real = ixheaacd_add32_sat( 906 ixheaacd_mult32x16in32(p_hyb_left_re1[subband], 907 ptr_ps_dec->H11_H12[2 * subband + 1]), 908 ixheaacd_mult32x16in32(p_hyb_right_re1[subband], 909 ptr_ps_dec->H21_H22[2 * subband + 1])); 910 temp_right_imag = ixheaacd_add32_sat( 911 ixheaacd_mult32x16in32(p_hyb_left_im1[subband], 912 ptr_ps_dec->H11_H12[2 * subband + 1]), 913 ixheaacd_mult32x16in32(p_hyb_right_im1[subband], 914 ptr_ps_dec->H21_H22[2 * subband + 1])); 915 p_hyb_left_re1[subband] = ixheaacd_shl32(temp_left_real, 2); 916 p_hyb_left_im1[subband] = ixheaacd_shl32(temp_left_imag, 2); 917 p_hyb_right_re1[subband] = ixheaacd_shl32(temp_right_real, 2); 918 p_hyb_right_im1[subband] = ixheaacd_shl32(temp_right_imag, 2); 919 } 920 921 p_hyb_left_re = p_qmf_left_re; 922 p_hyb_left_im = p_qmf_left_im; 923 p_hyb_right_re = p_qmf_right_re; 924 p_hyb_right_im = p_qmf_right_im; 925 926 { 927 WORD32 *h11_h12_src = (WORD32 *)ptr_ps_dec->H11_H12; 928 WORD32 *h21_h22_src = (WORD32 *)ptr_ps_dec->H21_H22; 929 WORD32 *h11_h12_dst = (WORD32 *)H11_H12; 930 931 for (group = SUBQMF_GROUPS; group < NO_IID_GROUPS; group++) { 932 max_subband = ixheaacd_min32( 933 usb, sbr_tables_ptr->ps_tables_ptr->borders_group[group + 1]); 934 for (subband = sbr_tables_ptr->ps_tables_ptr->borders_group[group]; 935 subband < max_subband; subband++) { 936 h11_h12_dst[2 * subband] = h11_h12_src[group]; 937 h11_h12_dst[2 * subband + 1] = h21_h22_src[group]; 938 } 939 } 940 } 941 loopcnt = (usb + 15) >> 4; 942 943 for (subband = 0; subband < NO_QMF_CHANNELS_IN_HYBRID; subband++) { 944 tmp_real = *p_hyb_left_re1++; 945 tmp_img = *p_hyb_left_im1++; 946 tmp_real1 = *p_hyb_right_re1++; 947 tmp_img1 = *p_hyb_right_im1++; 948 949 hybrid_resol = ixheaacd_min16(*ptr_res++, 6); 950 951 for (k = hybrid_resol - 2; k >= 0; k--) { 952 tmp_real = ixheaacd_add32_sat(tmp_real, *p_hyb_left_re1++); 953 tmp_img = ixheaacd_add32_sat(tmp_img, *p_hyb_left_im1++); 954 tmp_real1 = ixheaacd_add32_sat(tmp_real1, *p_hyb_right_re1++); 955 tmp_img1 = ixheaacd_add32_sat(tmp_img1, *p_hyb_right_im1++); 956 } 957 958 p_hyb_left_re[subband] = tmp_real; 959 p_hyb_left_im[subband] = tmp_img; 960 p_hyb_right_re[subband] = tmp_real1; 961 p_hyb_right_im[subband] = tmp_img1; 962 } 963 964 for (; subband < usb; subband++) { 965 temp_left_real = 966 ixheaacd_add32_sat(ixheaacd_mult32x16in32(p_hyb_left_re[subband], 967 H11_H12[4 * subband + 0]), 968 ixheaacd_mult32x16in32(p_hyb_right_re[subband], 969 H11_H12[4 * subband + 2])); 970 temp_left_imag = 971 ixheaacd_add32_sat(ixheaacd_mult32x16in32(p_hyb_left_im[subband], 972 H11_H12[4 * subband + 0]), 973 ixheaacd_mult32x16in32(p_hyb_right_im[subband], 974 H11_H12[4 * subband + 2])); 975 temp_right_real = 976 ixheaacd_add32_sat(ixheaacd_mult32x16in32(p_hyb_left_re[subband], 977 H11_H12[4 * subband + 1]), 978 ixheaacd_mult32x16in32(p_hyb_right_re[subband], 979 H11_H12[4 * subband + 3])); 980 temp_right_imag = 981 ixheaacd_add32_sat(ixheaacd_mult32x16in32(p_hyb_left_im[subband], 982 H11_H12[4 * subband + 1]), 983 ixheaacd_mult32x16in32(p_hyb_right_im[subband], 984 H11_H12[4 * subband + 3])); 985 p_hyb_left_re[subband] = ixheaacd_shl32(temp_left_real, 2); 986 p_hyb_left_im[subband] = ixheaacd_shl32(temp_left_imag, 2); 987 p_hyb_right_re[subband] = ixheaacd_shl32(temp_right_real, 2); 988 p_hyb_right_im[subband] = ixheaacd_shl32(temp_right_imag, 2); 989 } 990 } 991