1 /****************************************************************************** 2 * * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 #include <string.h> 21 #include <math.h> 22 #include "ixheaacd_sbr_common.h" 23 #include "ixheaacd_type_def.h" 24 #include "ixheaacd_error_standards.h" 25 #include "ixheaacd_constants.h" 26 #include "ixheaacd_basic_ops32.h" 27 #include "ixheaacd_basic_ops16.h" 28 #include "ixheaacd_basic_ops40.h" 29 #include "ixheaacd_basic_ops.h" 30 #include "ixheaacd_basic_op.h" 31 #include "ixheaacd_intrinsics.h" 32 #include "ixheaacd_bitbuffer.h" 33 #include "ixheaacd_sbrdecsettings.h" 34 #include "ixheaacd_sbr_scale.h" 35 #include "ixheaacd_lpp_tran.h" 36 #include "ixheaacd_env_extr_part.h" 37 #include "ixheaacd_sbr_rom.h" 38 #include "ixheaacd_hybrid.h" 39 #include "ixheaacd_ps_dec.h" 40 #include "ixheaacd_env_extr.h" 41 #include "ixheaacd_common_rom.h" 42 #include "ixheaacd_env_dec.h" 43 #include "ixheaacd_sbr_const.h" 44 #include "ixheaacd_basic_funcs.h" 45 46 #define add16_m(a, b) ((a) + (b)) 47 #define sub16_m(a, b) ((a) - (b)) 48 49 #define mult16x16_16(a, b) ixheaacd_mult16((a), (b)) 50 51 static VOID ixheaacd_dequant_esbr_env_data(FLOAT32 *ptr_env_sf, 52 WORD32 num_env_sf, 53 WORD32 num_noise_fac, WORD32 amp_res, 54 FLOAT32 *ptr_noise_floor) { 55 WORD32 i; 56 static const FLOAT32 array[2] = {0.5f, 1.0f}; 57 FLOAT32 a_flt = array[amp_res]; 58 59 for (i = 0; i < num_env_sf; i++) { 60 ptr_env_sf[i] = (FLOAT32)(pow(2, ptr_env_sf[i] * a_flt) * 64); 61 } 62 63 for (i = 0; i < num_noise_fac; i++) { 64 FLOAT32 temp = ptr_noise_floor[i]; 65 66 temp = NOISE_FLOOR_OFFSET - temp; 67 temp = (FLOAT32)pow(2.0f, temp); 68 69 ptr_noise_floor[i] = temp; 70 } 71 } 72 73 static VOID ixheaacd_dequant_pvc_env_data(WORD32 num_noise_fac, 74 FLOAT32 *ptr_noise_floor) { 75 WORD32 i; 76 77 for (i = 0; i < num_noise_fac; i++) { 78 FLOAT32 temp = ptr_noise_floor[i]; 79 80 temp = NOISE_FLOOR_OFFSET - temp; 81 temp = (FLOAT32)pow(2.0f, temp); 82 83 ptr_noise_floor[i] = temp; 84 } 85 } 86 87 VOID ixheaacd_map_res_energy(WORD16 curr_val, WORD16 *prev_data, 88 WORD32 ixheaacd_drc_offset, WORD32 index, 89 WORD32 res) { 90 if (res == LOW) { 91 if (ixheaacd_drc_offset >= 0) { 92 if (index < ixheaacd_drc_offset) { 93 prev_data[index] = curr_val; 94 } else { 95 WORD32 index_2; 96 index_2 = ((index + index) - ixheaacd_drc_offset); 97 prev_data[index_2] = curr_val; 98 prev_data[index_2 + 1] = curr_val; 99 } 100 } else { 101 ixheaacd_drc_offset = -(ixheaacd_drc_offset); 102 103 if (index < ixheaacd_drc_offset) { 104 WORD32 index_3; 105 index_3 = ((index + index) + index); 106 prev_data[index_3] = curr_val; 107 prev_data[index_3 + 1] = curr_val; 108 prev_data[index_3 + 2] = curr_val; 109 } else { 110 WORD32 index_2; 111 index_2 = ((index + index) + ixheaacd_drc_offset); 112 prev_data[index_2] = curr_val; 113 prev_data[index_2 + 1] = curr_val; 114 } 115 } 116 } else { 117 prev_data[index] = curr_val; 118 } 119 } 120 121 VOID ixheaacd_process_del_cod_env_data( 122 ia_sbr_header_data_struct *ptr_header_data, 123 ia_sbr_frame_info_data_struct *ptr_sbr_data, 124 ia_sbr_prev_frame_data_struct *ptr_prev_data) { 125 WORD32 i, dtdf_dir, num_sf_bands, band, freq_res; 126 WORD16 temp_val; 127 WORD16 *ptr_prev_env_sf = ptr_prev_data->sfb_nrg_prev; 128 WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr; 129 130 FLOAT32 *ptr_env_sf_float = ptr_sbr_data->flt_env_sf_arr; 131 132 WORD32 ixheaacd_drc_offset; 133 band = 0; 134 135 ixheaacd_drc_offset = 136 ((ptr_header_data->pstr_freq_band_data->num_sf_bands[LOW] << 1) - 137 ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]); 138 139 for (i = 0; i < ptr_sbr_data->str_frame_info_details.num_env; i++) { 140 dtdf_dir = ptr_sbr_data->del_cod_dir_arr[i]; 141 freq_res = ptr_sbr_data->str_frame_info_details.freq_res[i]; 142 143 num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands[freq_res]; 144 145 if (dtdf_dir == DTDF_DIR_FREQ) { 146 ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf, ixheaacd_drc_offset, 147 0, freq_res); 148 ptr_env_sf++; 149 150 ptr_env_sf_float++; 151 152 for (band = 1; band < num_sf_bands; band++) { 153 *ptr_env_sf = *ptr_env_sf + *(ptr_env_sf - 1); 154 ixheaacd_map_res_energy(*ptr_env_sf, ptr_prev_env_sf, 155 ixheaacd_drc_offset, band, freq_res); 156 157 *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf); 158 ptr_env_sf_float++; 159 160 ptr_env_sf++; 161 } 162 163 } else { 164 if (freq_res == LOW) { 165 if (ixheaacd_drc_offset < 0) { 166 WORD32 tar, index_3; 167 ixheaacd_drc_offset = -ixheaacd_drc_offset; 168 tar = ixheaacd_min32(ixheaacd_drc_offset, band); 169 170 for (band = 0; band < tar; band++) { 171 index_3 = ((band + band) + band); 172 temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_3]); 173 174 ptr_prev_env_sf[index_3] = temp_val; 175 ptr_prev_env_sf[index_3 + 1] = temp_val; 176 ptr_prev_env_sf[index_3 + 2] = temp_val; 177 *ptr_env_sf++ = temp_val; 178 179 *ptr_env_sf_float = (FLOAT32)temp_val; 180 ptr_env_sf_float++; 181 } 182 183 for (; band < num_sf_bands; band++) { 184 index_3 = (band << 1) + ixheaacd_drc_offset; 185 temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_3]); 186 ptr_prev_env_sf[index_3] = temp_val; 187 ptr_prev_env_sf[index_3 + 1] = temp_val; 188 *ptr_env_sf++ = temp_val; 189 *ptr_env_sf_float = (FLOAT32)temp_val; 190 ptr_env_sf_float++; 191 } 192 } else { 193 WORD32 tar, index_2; 194 WORD16 *ptr2 = ptr_prev_env_sf; 195 tar = ixheaacd_min32(ixheaacd_drc_offset, band); 196 for (band = 0; band < tar; band++) { 197 *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2); 198 *ptr2 = *ptr_env_sf; 199 200 *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf); 201 ptr_env_sf_float++; 202 203 ptr2++; 204 ptr_env_sf++; 205 } 206 207 for (; band < num_sf_bands; band++) { 208 index_2 = (band < ixheaacd_drc_offset) 209 ? band 210 : ((band << 1) - ixheaacd_drc_offset); 211 temp_val = add16_m(*ptr_env_sf, ptr_prev_env_sf[index_2]); 212 ptr_prev_env_sf[index_2] = temp_val; 213 ptr_prev_env_sf[index_2 + 1] = temp_val; 214 *ptr_env_sf++ = temp_val; 215 216 *ptr_env_sf_float = (FLOAT32)temp_val; 217 ptr_env_sf_float++; 218 } 219 } 220 221 } else { 222 WORD16 *ptr2 = ptr_prev_env_sf; 223 for (band = num_sf_bands - 1; band >= 0; band--) { 224 *ptr_env_sf = add16_m(*ptr_env_sf, *ptr2); 225 *ptr2 = *ptr_env_sf; 226 *ptr_env_sf_float = (FLOAT32)(*ptr_env_sf); 227 ptr_env_sf_float++; 228 ptr2++; 229 ptr_env_sf++; 230 } 231 band = num_sf_bands; 232 } 233 } 234 } 235 } 236 237 static PLATFORM_INLINE WORD32 238 ixheaacd_wrong_timing_compensate(ia_sbr_header_data_struct *ptr_header_data, 239 ia_sbr_frame_info_data_struct *ptr_sbr_data, 240 ia_sbr_prev_frame_data_struct *ptr_prev_data, 241 ixheaacd_misc_tables *pstr_common_tables) { 242 WORD32 i, num_env_sf; 243 ia_frame_info_struct *p_frame_info = &ptr_sbr_data->str_frame_info_details; 244 WORD16 *num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands; 245 WORD32 start_pos_est; 246 WORD32 ref_len, new_len, shift; 247 WORD16 delta_exp; 248 249 start_pos_est = 250 (ptr_prev_data->end_position - ptr_header_data->num_time_slots); 251 252 ref_len = (p_frame_info->border_vec[1] - p_frame_info->border_vec[0]); 253 254 new_len = (p_frame_info->border_vec[1] - start_pos_est); 255 256 if (new_len <= 0) { 257 new_len = ref_len; 258 start_pos_est = p_frame_info->border_vec[0]; 259 } 260 261 delta_exp = pstr_common_tables->log_dual_is_table[ref_len]; 262 delta_exp -= pstr_common_tables->log_dual_is_table[new_len]; 263 264 shift = (SHORT_BITS - ENV_EXP_FRACT - 3 - ptr_sbr_data->amp_res); 265 delta_exp = ixheaacd_shr16(delta_exp, (WORD16)shift); 266 p_frame_info->border_vec[0] = start_pos_est; 267 p_frame_info->noise_border_vec[0] = start_pos_est; 268 269 if (start_pos_est < 0) return -1; 270 271 if (ptr_sbr_data->coupling_mode != COUPLING_BAL) { 272 num_env_sf = 273 ((p_frame_info->freq_res[0]) ? num_sf_bands[HIGH] : num_sf_bands[LOW]); 274 275 for (i = 0; i < num_env_sf; i++) { 276 ptr_sbr_data->int_env_sf_arr[i] = 277 add16_m(ptr_sbr_data->int_env_sf_arr[i], delta_exp); 278 } 279 } 280 281 return 0; 282 } 283 284 WORD16 ixheaacd_check_env_data(ia_sbr_header_data_struct *ptr_header_data, 285 ia_sbr_frame_info_data_struct *ptr_sbr_data, 286 ia_sbr_prev_frame_data_struct *ptr_prev_data) { 287 WORD16 *ptr_evn_sf = ptr_sbr_data->int_env_sf_arr; 288 WORD16 *ptr_prev_evn_sf = ptr_prev_data->sfb_nrg_prev; 289 WORD32 i; 290 FLAG error_code = 0; 291 WORD16 sbr_max_env_sf; 292 WORD32 amp_res = ptr_sbr_data->amp_res; 293 294 sbr_max_env_sf = (SBR_ENV_SF_MAX_VAL_1_5 >> amp_res); 295 296 for (i = 0; i < ptr_sbr_data->num_env_sfac; i++) { 297 if (ptr_evn_sf[i] > sbr_max_env_sf) { 298 error_code = 1; 299 } 300 if (ptr_evn_sf[i] < 0) { 301 ptr_evn_sf[i] = 0; 302 } 303 } 304 305 for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]; 306 i++) { 307 if (ptr_prev_evn_sf[i] < 0) { 308 ptr_prev_evn_sf[i] = 0; 309 } else { 310 if (ptr_prev_evn_sf[i] > sbr_max_env_sf) 311 ptr_prev_evn_sf[i] = sbr_max_env_sf; 312 } 313 } 314 return (WORD16)(error_code); 315 } 316 317 VOID ixheaacd_dequant_env_data(ia_sbr_frame_info_data_struct *ptr_sbr_data, 318 WORD32 amp_res) { 319 WORD32 i; 320 WORD32 num_env_sf = ptr_sbr_data->num_env_sfac; 321 WORD32 mantissa; 322 WORD32 amp_res_1; 323 WORD32 exponent; 324 WORD32 exp_add = (7 + NRG_EXP_OFFSET); 325 WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr; 326 static const WORD32 mant_arr[2] = {0x4000, 0x5a80}; 327 328 amp_res_1 = (1 - amp_res); 329 330 for (i = num_env_sf - 1; i >= 0; i--) { 331 exponent = *ptr_env_sf; 332 mantissa = mant_arr[(exponent & amp_res_1)]; 333 exponent = (exponent >> amp_res_1); 334 exponent = (exponent + exp_add); 335 *ptr_env_sf++ = (WORD16)(mantissa | (exponent & MASK_FOR_EXP)); 336 } 337 } 338 339 static PLATFORM_INLINE VOID 340 ixheaacd_limit_noise_floor_fac(ia_sbr_header_data_struct *ptr_header_data, 341 ia_sbr_frame_info_data_struct *ptr_sbr_data) { 342 WORD32 i, tot_nf_bands; 343 WORD32 value; 344 WORD32 num_nf_bands; 345 WORD16 *ptr_noise_floor; 346 347 num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands; 348 349 tot_nf_bands = 350 ptr_sbr_data->str_frame_info_details.num_noise_env * num_nf_bands; 351 352 ptr_noise_floor = ptr_sbr_data->int_noise_floor; 353 354 for (i = tot_nf_bands - 1; i >= 0; i--) { 355 value = *ptr_noise_floor; 356 if (value > MAX_NOISE_FLOOR_FAC_VAL) { 357 *ptr_noise_floor = MAX_NOISE_FLOOR_FAC_VAL; 358 } else { 359 if (value < MIN_NOISE_FLOOR_FAC_VAL) { 360 *ptr_noise_floor = MIN_NOISE_FLOOR_FAC_VAL; 361 } 362 } 363 ptr_noise_floor++; 364 } 365 } 366 367 VOID ixheaacd_add_arr(WORD16 *ptr1, WORD16 *ptr2, WORD32 num) { 368 WORD32 i; 369 for (i = num - 1; i >= 0; i--) { 370 *ptr2 = (*ptr2 + *ptr1); 371 ptr2++; 372 ptr1++; 373 } 374 } 375 376 IA_ERRORCODE ixheaacd_calc_noise_floor( 377 ia_sbr_header_data_struct *ptr_header_data, 378 ia_sbr_frame_info_data_struct *ptr_sbr_data, 379 ia_sbr_prev_frame_data_struct *ptr_prev_data) { 380 WORD32 i; 381 WORD32 num_nf_bands; 382 WORD32 num_noise_env; 383 WORD32 ixheaacd_drc_offset; 384 WORD16 *ptr_noise_floor = ptr_sbr_data->int_noise_floor; 385 386 WORD16 *ptr_prev_noise_floor = ptr_prev_data->prev_noise_level; 387 WORD16 *ptr1, *ptr2; 388 WORD32 num; 389 FLOAT32 *ptr_noise_floor_float = ptr_sbr_data->flt_noise_floor; 390 391 num_nf_bands = ptr_header_data->pstr_freq_band_data->num_nf_bands; 392 num_noise_env = ptr_sbr_data->str_frame_info_details.num_noise_env; 393 394 if (ptr_sbr_data->del_cod_dir_noise_arr[0] == DTDF_DIR_FREQ) { 395 ptr1 = ptr_noise_floor++; 396 ptr2 = ptr_noise_floor; 397 num = num_nf_bands - 1; 398 } else { 399 ptr1 = ptr_prev_noise_floor; 400 ptr2 = ptr_sbr_data->int_noise_floor; 401 num = num_nf_bands; 402 } 403 404 ixheaacd_add_arr(ptr1, ptr2, num); 405 406 if (num_noise_env > 1) { 407 if (ptr_sbr_data->del_cod_dir_noise_arr[1] == DTDF_DIR_FREQ) { 408 ptr1 = &ptr_sbr_data->int_noise_floor[num_nf_bands]; 409 ptr2 = &ptr_sbr_data->int_noise_floor[(num_nf_bands + 1)]; 410 411 num = num_nf_bands - 1; 412 } else { 413 ptr1 = &ptr_sbr_data->int_noise_floor[0]; 414 ptr2 = &ptr_sbr_data->int_noise_floor[num_nf_bands]; 415 416 num = num_nf_bands; 417 } 418 ixheaacd_add_arr(ptr1, ptr2, num); 419 } 420 421 ixheaacd_limit_noise_floor_fac(ptr_header_data, ptr_sbr_data); 422 423 ixheaacd_drc_offset = num_nf_bands * (num_noise_env - 1); 424 if (ixheaacd_drc_offset < 0 || ixheaacd_drc_offset >= MAX_NUM_NOISE_VALUES) 425 return IA_FATAL_ERROR; 426 ptr1 = &ptr_sbr_data->int_noise_floor[ixheaacd_drc_offset]; 427 ptr2 = ptr_prev_noise_floor; 428 429 memcpy(ptr2, ptr1, sizeof(WORD16) * (num_nf_bands)); 430 431 if ((ptr_sbr_data->coupling_mode != COUPLING_BAL) || 432 (ptr_header_data->usac_flag)) { 433 WORD32 noise_floor_exp, tot_nf_bands; 434 435 tot_nf_bands = (num_nf_bands * num_noise_env); 436 ptr_noise_floor = &ptr_sbr_data->int_noise_floor[0]; 437 438 for (i = 0; i < tot_nf_bands; i++) { 439 noise_floor_exp = 440 (NOISE_FLOOR_OFFSET_INT + 1 + NOISE_EXP_OFFSET - *ptr_noise_floor); 441 442 *ptr_noise_floor_float++ = *ptr_noise_floor; 443 *ptr_noise_floor++ = (WORD16)(0x4000 + (noise_floor_exp & MASK_FOR_EXP)); 444 } 445 } 446 return IA_NO_ERROR; 447 } 448 449 IA_ERRORCODE ixheaacd_dec_sbrdata_for_pvc( 450 ia_sbr_header_data_struct *ptr_header_data, 451 ia_sbr_frame_info_data_struct *ptr_sbr_data, 452 ia_sbr_prev_frame_data_struct *ptr_prev_data) { 453 WORD32 err = 0; 454 err = ixheaacd_calc_noise_floor(ptr_header_data, ptr_sbr_data, ptr_prev_data); 455 if (err) return err; 456 457 if (!ptr_sbr_data->coupling_mode) { 458 ptr_sbr_data->num_noise_sfac = 459 ptr_header_data->pstr_freq_band_data->num_nf_bands * 460 ptr_sbr_data->str_frame_info_details.num_noise_env; 461 ixheaacd_dequant_pvc_env_data(ptr_sbr_data->num_noise_sfac, 462 ptr_sbr_data->flt_noise_floor); 463 } 464 return IA_NO_ERROR; 465 } 466 467 VOID ixheaacd_sbr_env_dequant_coup_fix( 468 ia_sbr_header_data_struct *ptr_header_data, 469 ia_sbr_frame_info_data_struct *ptr_data_left, 470 ia_sbr_frame_info_data_struct *ptr_data_right, 471 ixheaacd_misc_tables *pstr_common_tables) { 472 WORD32 i; 473 WORD32 num_env_sf = ptr_data_left->num_env_sfac; 474 WORD16 temp_left_mant, temp_right_mant, temp_right_plus1_mant, new_left_mant, 475 new_right_mant; 476 WORD16 temp_left_exp, temp_right_exp, temp_rightplus1_exp, new_left_exp, 477 new_right_exp; 478 WORD32 i_end; 479 WORD16 *r_data = ptr_data_right->int_env_sf_arr; 480 WORD16 *l_data = ptr_data_left->int_env_sf_arr; 481 482 for (i = 0; i < num_env_sf; i++) { 483 temp_right_mant = (WORD16)(*r_data & MASK_M); 484 temp_right_exp = (WORD16)(*r_data & MASK_FOR_EXP); 485 486 temp_right_exp = sub16_m(temp_right_exp, add16_m(18, NRG_EXP_OFFSET)); 487 temp_left_mant = (WORD16)(*l_data & MASK_M); 488 temp_left_exp = (WORD16)(*l_data & MASK_FOR_EXP); 489 490 temp_left_exp = sub16_m(temp_left_exp, NRG_EXP_OFFSET); 491 492 ixheaacd_fix_mant_exp_add(temp_right_mant, temp_right_exp, 0x4000, 1, 493 &temp_right_plus1_mant, &temp_rightplus1_exp); 494 495 new_right_exp = ixheaacd_fix_mant_div(temp_left_mant, temp_right_plus1_mant, 496 &new_right_mant, pstr_common_tables); 497 498 new_right_exp += temp_left_exp - temp_rightplus1_exp + 2; 499 500 new_left_mant = ixheaacd_mult16_shl(temp_right_mant, new_right_mant); 501 502 new_left_exp = add16_m(temp_right_exp, new_right_exp); 503 504 *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) + 505 ((new_right_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP)); 506 *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) + 507 ((new_left_exp + NRG_EXP_OFFSET) & MASK_FOR_EXP)); 508 } 509 510 i_end = ptr_header_data->pstr_freq_band_data->num_nf_bands * 511 ptr_data_left->str_frame_info_details.num_noise_env; 512 r_data = ptr_data_right->int_noise_floor; 513 l_data = ptr_data_left->int_noise_floor; 514 515 for (i = i_end - 1; i >= 0; i--) { 516 temp_left_exp = 517 sub16_m((WORD16)(*l_data & (WORD16)MASK_FOR_EXP), NOISE_EXP_OFFSET); 518 temp_right_exp = sub16_m(*r_data, 12); 519 520 ixheaacd_fix_mant_exp_add(0x4000, ixheaacd_add16(1, temp_right_exp), 0x4000, 521 1, &temp_right_plus1_mant, &temp_rightplus1_exp); 522 523 new_right_exp = ixheaacd_fix_mant_div(0x4000, temp_right_plus1_mant, 524 &new_right_mant, pstr_common_tables); 525 526 new_right_exp += temp_left_exp - temp_rightplus1_exp + 2; 527 528 new_left_mant = new_right_mant; 529 new_left_exp = add16_m(new_right_exp, temp_right_exp); 530 *r_data++ = (WORD16)(((new_right_mant + ROUNDING) & MASK_M) + 531 ((new_right_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP)); 532 *l_data++ = (WORD16)(((new_left_mant + ROUNDING) & MASK_M) + 533 ((new_left_exp + NOISE_EXP_OFFSET) & MASK_FOR_EXP)); 534 } 535 } 536 537 VOID ixheaacd_sbr_env_dequant_coup( 538 ia_sbr_frame_info_data_struct *ptr_data_ch_0, 539 ia_sbr_frame_info_data_struct *ptr_data_ch_1) { 540 FLOAT32 *ptr_env_sf_left = ptr_data_ch_0->flt_env_sf_arr; 541 FLOAT32 *ptr_env_sf_right = ptr_data_ch_1->flt_env_sf_arr; 542 FLOAT32 *ptr_noise_floor_left = ptr_data_ch_0->flt_noise_floor; 543 FLOAT32 *ptr_noise_floor_right = ptr_data_ch_1->flt_noise_floor; 544 WORD32 num_env_sf = ptr_data_ch_0->num_env_sfac; 545 WORD32 num_noise_fac = ptr_data_ch_0->num_noise_sfac; 546 WORD32 amp_res = ptr_data_ch_0->amp_res; 547 548 WORD32 i; 549 FLOAT32 temp_l, temp_r; 550 static const FLOAT32 pan_offset[2] = {24.0f, 12.0f}; 551 static const FLOAT32 a_arr[2] = {0.5f, 1.0f}; 552 553 FLOAT32 a = a_arr[amp_res]; 554 555 for (i = 0; i < num_env_sf; i++) { 556 temp_l = ptr_env_sf_left[i]; 557 temp_r = ptr_env_sf_right[i]; 558 559 ptr_env_sf_left[i] = 560 (FLOAT32)(64 * (pow(2, temp_l * a + 1) / 561 (1 + pow(2, (pan_offset[amp_res] - temp_r) * a)))); 562 ptr_env_sf_right[i] = 563 (FLOAT32)(64 * (pow(2, temp_l * a + 1) / 564 (1 + pow(2, (temp_r - pan_offset[amp_res]) * a)))); 565 } 566 567 for (i = 0; i < num_noise_fac; i++) { 568 temp_l = ptr_noise_floor_left[i]; 569 temp_r = ptr_noise_floor_right[i]; 570 571 ptr_noise_floor_left[i] = 572 (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) / 573 (1 + pow(2, pan_offset[1] - temp_r))); 574 ptr_noise_floor_right[i] = 575 (FLOAT32)(pow(2, NOISE_FLOOR_OFFSET - temp_l + 1) / 576 (1 + pow(2, temp_r - pan_offset[1]))); 577 } 578 } 579 WORD32 ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0, 580 ia_sbr_header_data_struct *ptr_header_data_ch_1, 581 ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_0, 582 ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0, 583 ia_sbr_frame_info_data_struct *ptr_sbr_data_ch_1, 584 ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1, 585 ixheaacd_misc_tables *ptr_common_tables) { 586 FLAG error_code; 587 WORD32 err = 0; 588 WORD32 usac_flag = ptr_header_data_ch_0->usac_flag; 589 590 err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, 591 ptr_prev_data_ch_0, ptr_prev_data_ch_1, 592 ptr_common_tables); 593 594 if (err) return err; 595 596 err = ixheaacd_calc_noise_floor(ptr_header_data_ch_0, ptr_sbr_data_ch_0, 597 ptr_prev_data_ch_0); 598 599 if (err == (WORD32)IA_FATAL_ERROR) return (WORD32)IA_FATAL_ERROR; 600 601 if (!ptr_sbr_data_ch_0->coupling_mode && usac_flag) { 602 ptr_sbr_data_ch_0->num_noise_sfac = 603 ptr_header_data_ch_0->pstr_freq_band_data->num_nf_bands * 604 ptr_sbr_data_ch_0->str_frame_info_details.num_noise_env; 605 606 ixheaacd_dequant_esbr_env_data( 607 ptr_sbr_data_ch_0->flt_env_sf_arr, ptr_sbr_data_ch_0->num_env_sfac, 608 ptr_sbr_data_ch_0->num_noise_sfac, ptr_sbr_data_ch_0->amp_res, 609 ptr_sbr_data_ch_0->flt_noise_floor); 610 } 611 612 if (ptr_sbr_data_ch_1 != NULL) { 613 error_code = ptr_header_data_ch_0->err_flag; 614 err = ixheaacd_dec_envelope(ptr_header_data_ch_1, ptr_sbr_data_ch_1, 615 ptr_prev_data_ch_1, ptr_prev_data_ch_0, 616 ptr_common_tables); 617 618 if (err) return err; 619 620 err = ixheaacd_calc_noise_floor(ptr_header_data_ch_1, ptr_sbr_data_ch_1, 621 ptr_prev_data_ch_1); 622 623 if (err) return err; 624 625 if (!ptr_sbr_data_ch_1->coupling_mode && usac_flag) { 626 ptr_sbr_data_ch_1->num_noise_sfac = 627 ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands * 628 ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env; 629 630 ixheaacd_dequant_esbr_env_data( 631 ptr_sbr_data_ch_1->flt_env_sf_arr, ptr_sbr_data_ch_1->num_env_sfac, 632 ptr_sbr_data_ch_1->num_noise_sfac, ptr_sbr_data_ch_1->amp_res, 633 ptr_sbr_data_ch_1->flt_noise_floor); 634 } 635 636 if (!usac_flag) { 637 if (!error_code && ptr_header_data_ch_0->err_flag) { 638 err = ixheaacd_dec_envelope(ptr_header_data_ch_0, ptr_sbr_data_ch_0, 639 ptr_prev_data_ch_0, ptr_prev_data_ch_1, 640 ptr_common_tables); 641 642 if (err) return err; 643 } 644 } 645 646 if (ptr_sbr_data_ch_0->coupling_mode) { 647 ptr_sbr_data_ch_0->num_noise_sfac = 648 ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands * 649 ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env; 650 ixheaacd_sbr_env_dequant_coup_fix(ptr_header_data_ch_0, ptr_sbr_data_ch_0, 651 ptr_sbr_data_ch_1, ptr_common_tables); 652 653 ixheaacd_sbr_env_dequant_coup(ptr_sbr_data_ch_0, ptr_sbr_data_ch_1); 654 } 655 } 656 657 return 0; 658 } 659 WORD32 ixheaacd_dec_envelope(ia_sbr_header_data_struct *ptr_header_data, 660 ia_sbr_frame_info_data_struct *ptr_sbr_data, 661 ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_0, 662 ia_sbr_prev_frame_data_struct *ptr_prev_data_ch_1, 663 ixheaacd_misc_tables *pstr_common_tables) { 664 FLAG error_code; 665 WORD32 err; 666 WORD16 env_sf_local_arr[MAX_FREQ_COEFFS]; 667 WORD32 usac_flag = ptr_header_data->usac_flag; 668 WORD32 temp_1 = 669 ptr_prev_data_ch_0->end_position - ptr_header_data->num_time_slots; 670 if (temp_1 < 0) return -1; 671 temp_1 = ptr_sbr_data->str_frame_info_details.border_vec[0] - temp_1; 672 673 if ((!ptr_header_data->err_flag_prev) && (!ptr_header_data->err_flag) && 674 (temp_1 != 0)) { 675 if (ptr_sbr_data->del_cod_dir_arr[0] == DTDF_DIR_TIME) { 676 ptr_header_data->err_flag = 1; 677 } else { 678 ptr_header_data->err_flag_prev = 1; 679 } 680 } 681 682 if (ptr_header_data->err_flag && !usac_flag) { 683 ixheaacd_lean_sbrconcealment(ptr_header_data, ptr_sbr_data, 684 ptr_prev_data_ch_0); 685 686 ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, 687 ptr_prev_data_ch_0); 688 } else { 689 WORD32 num = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH]; 690 if (ptr_header_data->err_flag_prev && !usac_flag) { 691 WORD16 *ptr1, *ptr2; 692 WORD32 i; 693 694 err = ixheaacd_wrong_timing_compensate(ptr_header_data, ptr_sbr_data, 695 ptr_prev_data_ch_0, 696 pstr_common_tables); 697 698 if (err) return err; 699 700 if (ptr_sbr_data->coupling_mode != 701 (WORD16)ptr_prev_data_ch_0->coupling_mode) { 702 if (ptr_prev_data_ch_0->coupling_mode == COUPLING_BAL) { 703 memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, 704 ptr_prev_data_ch_1->sfb_nrg_prev, sizeof(WORD16) * num); 705 } else { 706 if (ptr_sbr_data->coupling_mode == COUPLING_LEVEL) { 707 ptr1 = ptr_prev_data_ch_0->sfb_nrg_prev; 708 ptr2 = ptr_prev_data_ch_1->sfb_nrg_prev; 709 710 for (i = 0; i < num; i++) { 711 *ptr1 = (add16_m(*ptr1, *ptr2) >> 1); 712 ptr2++; 713 ptr1++; 714 } 715 } else { 716 if (ptr_sbr_data->coupling_mode == COUPLING_BAL) { 717 memset(ptr_prev_data_ch_0->sfb_nrg_prev, SBR_ENERGY_PAN_OFFSET, 718 sizeof(WORD16) * num); 719 } 720 } 721 } 722 } 723 } 724 725 memcpy(env_sf_local_arr, ptr_prev_data_ch_0->sfb_nrg_prev, 726 sizeof(WORD16) * MAX_FREQ_COEFFS); 727 728 ixheaacd_process_del_cod_env_data(ptr_header_data, ptr_sbr_data, 729 ptr_prev_data_ch_0); 730 731 if (!usac_flag) { 732 error_code = ixheaacd_check_env_data(ptr_header_data, ptr_sbr_data, 733 ptr_prev_data_ch_0); 734 735 if (error_code) { 736 ptr_header_data->err_flag = 1; 737 738 memcpy(ptr_prev_data_ch_0->sfb_nrg_prev, env_sf_local_arr, 739 sizeof(WORD16) * MAX_FREQ_COEFFS); 740 741 err = ixheaacd_dec_envelope(ptr_header_data, ptr_sbr_data, 742 ptr_prev_data_ch_0, ptr_prev_data_ch_1, 743 pstr_common_tables); 744 745 if (err) return err; 746 return 0; 747 } 748 } 749 } 750 if (!usac_flag) 751 ixheaacd_dequant_env_data(ptr_sbr_data, ptr_sbr_data->amp_res); 752 753 return 0; 754 } 755 756 VOID ixheaacd_adj_timeslot(WORD32 *ptr_buf_real, WORD32 *ptr_buf_imag, 757 WORD16 *ptr_filt_buf, WORD16 *ptr_filt_buf_noise, 758 WORD16 *ptr_gain_buf, WORD16 *ptr_noise_floor, 759 WORD16 *ptr_sine_lvl_buf, WORD16 noise_floor_exp, 760 WORD16 *ptr_harm_index, WORD16 sub_band_start, 761 WORD16 num_sub_bands, WORD16 scale_change, 762 WORD16 smooth_ratio, FLAG num_noise_flg, 763 WORD16 *ptr_phase_index, 764 ia_sbr_tables_struct *ptr_sbr_tables) { 765 WORD16 k; 766 WORD16 *ptr_smoothed_gain, *ptr_smoothed_noise; 767 WORD16 direct_ratio; 768 WORD32 index = *ptr_phase_index; 769 WORD32 harm_idx = *ptr_harm_index; 770 WORD32 freq_inv_flag; 771 const WORD32 *ptr_rand_ph_buf; 772 WORD32 factor = 0; 773 774 direct_ratio = ixheaacd_sub16_sat(0x7fff, smooth_ratio); 775 freq_inv_flag = (sub_band_start & 1); 776 777 scale_change = scale_change - 1; 778 779 ptr_rand_ph_buf = &ptr_sbr_tables->sbr_rand_ph[index]; 780 *ptr_phase_index = 781 (WORD16)((index + num_sub_bands) & (SBR_NF_NO_RANDOM_VAL - 1)); 782 783 if (smooth_ratio) { 784 WORD16 *ptr_filt_buf_local = &ptr_filt_buf[0]; 785 WORD16 *ptr_gain_buf_local = &ptr_gain_buf[0]; 786 WORD16 *ptr_filt_noise_local = &ptr_filt_buf_noise[0]; 787 WORD16 *ptr_noise_floor_local = &ptr_noise_floor[0]; 788 789 WORD16 tmp, tmp1; 790 791 for (k = 0; k < num_sub_bands; k++) { 792 tmp = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_buf_local), 793 mult16x16_16(direct_ratio, *ptr_gain_buf_local++)); 794 795 ptr_gain_buf_local++; 796 797 tmp1 = add16_m(mult16x16_16(smooth_ratio, *ptr_filt_noise_local), 798 mult16x16_16(direct_ratio, *ptr_noise_floor_local++)); 799 800 ptr_noise_floor_local++; 801 802 *ptr_filt_buf_local++ = tmp << 1; 803 ptr_filt_buf_local++; 804 *ptr_filt_noise_local++ = tmp1 << 1; 805 } 806 ptr_smoothed_gain = ptr_filt_buf; 807 ptr_smoothed_noise = ptr_filt_buf_noise; 808 factor = 1; 809 } else { 810 ptr_smoothed_gain = ptr_gain_buf; 811 ptr_smoothed_noise = ptr_noise_floor; 812 factor = 2; 813 } 814 815 switch (harm_idx) { 816 case 0: 817 case 2: 818 ixheaacd_harm_idx_zerotwo(num_noise_flg, num_sub_bands, ptr_buf_real, 819 ptr_buf_imag, ptr_smoothed_gain, 820 ptr_smoothed_noise, factor, ptr_gain_buf, 821 scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf, 822 noise_floor_exp, harm_idx); 823 break; 824 case 1: 825 case 3: 826 ixheaacd_harm_idx_onethree( 827 num_noise_flg, num_sub_bands, ptr_buf_real, ptr_buf_imag, 828 ptr_smoothed_gain, ptr_smoothed_noise, factor, ptr_gain_buf, 829 scale_change, ptr_rand_ph_buf, ptr_sine_lvl_buf, noise_floor_exp, 830 freq_inv_flag, harm_idx); 831 break; 832 } 833 *ptr_harm_index = (WORD16)((harm_idx + 1) & 3); 834 } 835