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.h" 29 30#include <ixheaacd_basic_op.h> 31#include "ixheaacd_intrinsics.h" 32#include "ixheaacd_common_rom.h" 33#include "ixheaacd_basic_funcs.h" 34#include "ixheaacd_bitbuffer.h" 35#include "ixheaacd_defines.h" 36 37#include "ixheaacd_pns.h" 38 39#include <ixheaacd_aac_rom.h> 40#include "ixheaacd_pulsedata.h" 41 42#include "ixheaacd_drc_data_struct.h" 43#include "ixheaacd_lt_predict.h" 44#include "ixheaacd_channelinfo.h" 45#include "ixheaacd_drc_dec.h" 46#include "ixheaacd_sbrdecoder.h" 47 48#include "ixheaacd_defines.h" 49#include "ixheaacd_sbrdecoder.h" 50#include "ixheaacd_definitions.h" 51#include "ixheaacd_error_codes.h" 52 53#include "ixheaacd_pulsedata.h" 54 55#include "ixheaacd_sbrdecsettings.h" 56#include "ixheaacd_sbr_scale.h" 57#include "ixheaacd_lpp_tran.h" 58#include "ixheaacd_env_extr_part.h" 59#include <ixheaacd_sbr_rom.h> 60#include "ixheaacd_hybrid.h" 61#include "ixheaacd_ps_dec.h" 62#include "ixheaacd_env_extr.h" 63 64#include "ixheaacd_qmf_dec.h" 65 66#include "ixheaacd_env_calc.h" 67#include "ixheaacd_sbr_const.h" 68 69#include "ixheaacd_pvc_dec.h" 70#include "ixheaacd_sbr_dec.h" 71#include "ixheaacd_env_extr.h" 72#include "ixheaacd_env_calc.h" 73#include "ixheaacd_ps_dec.h" 74#include "ixheaacd_function_selector.h" 75 76#include "ixheaacd_audioobjtypes.h" 77 78VOID ixheaacd_qmf_enrg_calc(ia_sbr_dec_struct *ptr_sbr_dec, 79 WORD32 upsample_ratio_idx, WORD32 low_pow_flag) { 80 WORD32 i, j; 81 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 82 for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 83 for (j = 0; j < 16; j++) { 84 ptr_sbr_dec->qmf_energy_buf[i][j] = 85 ptr_sbr_dec->qmf_buf_real[2 + i][j] * 86 ptr_sbr_dec->qmf_buf_real[2 + i][j]; 87 if (!low_pow_flag) 88 ptr_sbr_dec->qmf_energy_buf[i][j] += 89 (ptr_sbr_dec->qmf_buf_imag[2 + i][j] * 90 ptr_sbr_dec->qmf_buf_imag[2 + i][j]); 91 } 92 } 93 94 for (i = 0; i < 16; i++) { 95 for (j = 0; j < 16; j++) { 96 ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] = 97 (ptr_sbr_dec->qmf_energy_buf[4 * i + 0][j] + 98 ptr_sbr_dec->qmf_energy_buf[4 * i + 1][j] + 99 ptr_sbr_dec->qmf_energy_buf[4 * i + 2][j] + 100 ptr_sbr_dec->qmf_energy_buf[4 * i + 3][j]) * 101 0.25f; 102 } 103 } 104 } else { 105 for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 106 for (j = 0; j < 32; j++) { 107 ptr_sbr_dec->qmf_energy_buf[i][j] = 108 ptr_sbr_dec->qmf_buf_real[2 + i][j] * 109 ptr_sbr_dec->qmf_buf_real[2 + i][j]; 110 if (!low_pow_flag) 111 ptr_sbr_dec->qmf_energy_buf[i][j] += 112 (ptr_sbr_dec->qmf_buf_imag[2 + i][j] * 113 ptr_sbr_dec->qmf_buf_imag[2 + i][j]); 114 } 115 } 116 117 for (i = 0; i < 16; i++) { 118 for (j = 0; j < 32; j++) { 119 ptr_sbr_dec->pvc_qmf_enrg_arr[32 * i + j] = 120 (ptr_sbr_dec->qmf_energy_buf[2 * i + 0][j] + 121 ptr_sbr_dec->qmf_energy_buf[2 * i + 1][j]) * 122 0.5f; 123 } 124 } 125 } 126} 127 128VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES], 129 FLOAT32 qmf_buf_real[][64], 130 FLOAT32 qmf_buf_imag[][64], WORD32 no_bins, 131 WORD32 max_stretch) { 132 WORD32 patch_bands; 133 WORD32 patch, band, col, target, source_bands, i; 134 WORD32 num_patches = 0; 135 136 for (i = 1; i < MAX_NUM_PATCHES; i++) { 137 if (x_over_qmf[i] != 0) { 138 num_patches++; 139 } 140 } 141 142 for (patch = (max_stretch - 1); patch < num_patches; patch++) { 143 patch_bands = x_over_qmf[patch + 1] - x_over_qmf[patch]; 144 target = x_over_qmf[patch]; 145 source_bands = x_over_qmf[max_stretch - 1] - x_over_qmf[max_stretch - 2]; 146 while (patch_bands > 0) { 147 WORD32 ixheaacd_num_bands = source_bands; 148 WORD32 start_band = x_over_qmf[max_stretch - 1] - 1; 149 if (target + ixheaacd_num_bands >= x_over_qmf[patch + 1]) { 150 ixheaacd_num_bands = x_over_qmf[patch + 1] - target; 151 } 152 if ((((target + ixheaacd_num_bands - 1) & 1) + 153 ((x_over_qmf[max_stretch - 1] - 1) & 1)) & 154 1) { 155 if (ixheaacd_num_bands == source_bands) { 156 ixheaacd_num_bands--; 157 } else { 158 start_band--; 159 } 160 } 161 for (col = 0; col < no_bins; col++) { 162 WORD32 i = 0; 163 band = target + ixheaacd_num_bands - 1; 164 if (64 <= band) { 165 band = 63; 166 } 167 if (x_over_qmf[patch + 1] <= band) { 168 band = x_over_qmf[patch + 1] - 1; 169 } 170 for (i = 0; i < ixheaacd_num_bands; i++, band--) { 171 qmf_buf_real[col][band] = qmf_buf_real[col][start_band - i]; 172 qmf_buf_imag[col][band] = qmf_buf_imag[col][start_band - i]; 173 } 174 } 175 target += ixheaacd_num_bands; 176 patch_bands -= ixheaacd_num_bands; 177 } 178 } 179} 180 181VOID ixheaacd_esbr_analysis_filt_block(ia_sbr_dec_struct *ptr_sbr_dec, 182 ia_sbr_tables_struct *sbr_tables_ptr, 183 WORD32 op_delay) { 184 FLOAT32 *core_coder_samples; 185 WORD32 *ptr_filt_states; 186 WORD32 *ptr_filt_states_1; 187 WORD32 *ptr_filt_states_2; 188 WORD32 *ptr_temp; 189 WORD32 *ptr_win_coeffs_1; 190 WORD32 *ptr_win_coeffs_2; 191 WORD32 *ptr_win_coeffs; 192 WORD32 *ploc_qmf_buf_real; 193 WORD32 *ploc_qmf_buf_imag; 194 WORD32 local_qmf_buffer[128] = {0}; 195 WORD32 anal_buf[2 * 32]; 196 WORD32 idx, z; 197 WORD32 core_syn_ch_index; 198 FLOAT32 gain; 199 WORD32 filt_offset; 200 WORD32 num_columns; 201 ia_qmf_dec_tables_struct *qmf_dec_tables_ptr = 202 sbr_tables_ptr->qmf_dec_tables_ptr; 203 ia_sbr_qmf_filter_bank_struct *pstr_qmf_anal_bank = 204 &ptr_sbr_dec->str_codec_qmf_bank; 205 core_coder_samples = ptr_sbr_dec->time_sample_buf; 206 ptr_filt_states = pstr_qmf_anal_bank->state_new_samples_pos_low_32; 207 ptr_win_coeffs_1 = pstr_qmf_anal_bank->filter_pos_32; 208 num_columns = pstr_qmf_anal_bank->no_channels; 209 210 switch (num_columns) { 211 case 16: 212 ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; 213 gain = 128.0f; 214 filt_offset = 64; 215 break; 216 case 24: 217 ptr_win_coeffs_2 = ptr_win_coeffs_1 + 24; 218 gain = 12.0f; 219 filt_offset = 24; 220 break; 221 case 32: 222 ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; 223 gain = 256.0f; 224 filt_offset = 64; 225 break; 226 default: 227 ptr_win_coeffs_2 = ptr_win_coeffs_1 + 64; 228 gain = 256.0f; 229 filt_offset = 64; 230 break; 231 } 232 gain = 1.0f / gain; 233 234 pstr_qmf_anal_bank->usb = num_columns; 235 236 ploc_qmf_buf_real = &local_qmf_buffer[0]; 237 ploc_qmf_buf_imag = &local_qmf_buffer[64]; 238 239 ptr_filt_states_1 = pstr_qmf_anal_bank->anal_filter_states_32; 240 ptr_filt_states_2 = pstr_qmf_anal_bank->anal_filter_states_32 + num_columns; 241 242 for (idx = 0; idx < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; idx++) { 243 for (z = 0; z < num_columns; z++) { 244 ptr_filt_states[num_columns - 1 - z] = 245 (WORD32)(core_coder_samples[z] * (1 << 15)); 246 } 247 ixheaacd_esbr_qmfanal32_winadd(ptr_filt_states_1, ptr_filt_states_2, 248 ptr_win_coeffs_1, ptr_win_coeffs_2, anal_buf, 249 num_columns); 250 251 core_coder_samples += num_columns; 252 253 ptr_filt_states -= num_columns; 254 if (ptr_filt_states < pstr_qmf_anal_bank->anal_filter_states_32) { 255 ptr_filt_states = pstr_qmf_anal_bank->anal_filter_states_32 + 256 10 * num_columns - num_columns; 257 } 258 259 ptr_temp = ptr_filt_states_1; 260 ptr_filt_states_1 = ptr_filt_states_2; 261 ptr_filt_states_2 = ptr_temp; 262 263 ptr_win_coeffs_1 += filt_offset; 264 ptr_win_coeffs_2 += filt_offset; 265 266 ptr_win_coeffs = ptr_win_coeffs_1; 267 ptr_win_coeffs_1 = ptr_win_coeffs_2; 268 ptr_win_coeffs_2 = ptr_win_coeffs; 269 270 if (ptr_win_coeffs_2 > 271 (pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset * 10)) { 272 ptr_win_coeffs_1 = pstr_qmf_anal_bank->analy_win_coeff_32; 273 ptr_win_coeffs_2 = pstr_qmf_anal_bank->analy_win_coeff_32 + filt_offset; 274 } 275 276 ixheaacd_esbr_fwd_modulation(anal_buf, &ploc_qmf_buf_real[0], 277 &ploc_qmf_buf_imag[0], pstr_qmf_anal_bank, 278 qmf_dec_tables_ptr); 279 core_syn_ch_index = num_columns; 280 281 for (z = 0; z < core_syn_ch_index; z++) { 282 ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = 283 ((FLOAT32)ploc_qmf_buf_real[z] * gain); 284 ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = 285 ((FLOAT32)ploc_qmf_buf_imag[z] * gain); 286 } 287 for (z = core_syn_ch_index; z < num_columns; z++) { 288 ptr_sbr_dec->qmf_buf_real[op_delay + idx][z] = (FLOAT32)0.0f; 289 ptr_sbr_dec->qmf_buf_imag[op_delay + idx][z] = (FLOAT32)0.0f; 290 } 291 } 292 293 pstr_qmf_anal_bank->filter_pos_32 = ptr_win_coeffs_1; 294 pstr_qmf_anal_bank->state_new_samples_pos_low_32 = ptr_filt_states; 295} 296 297VOID ixheaacd_esbr_synthesis_regrp( 298 FLOAT32 *qmf_buf_real, FLOAT32 *qmf_buf_imag, 299 ia_sbr_dec_struct *ptr_sbr_dec, 300 ia_sbr_frame_info_data_struct *ptr_frame_data, 301 ia_sbr_header_data_struct *ptr_header_data, WORD32 stereo_config_idx, 302 WORD32 apply_processing) { 303 WORD32 i, k; 304 WORD32 stop_border = 0; 305 WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; 306 WORD32 x_over_band = num_anal_bands; 307 308 if (apply_processing) { 309 if (ptr_header_data->sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 310 stop_border = 4 * ptr_frame_data->str_frame_info_details.border_vec[0]; 311 } else { 312 stop_border = 2 * ptr_frame_data->str_frame_info_details.border_vec[0]; 313 } 314 x_over_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev; 315 } 316 317 if (stereo_config_idx > 0) { 318 for (i = 0; i < stop_border; i++) { 319 for (k = 0; k < 3; k++) { 320 *qmf_buf_real++ = 321 ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k]; 322 *qmf_buf_imag++ = 323 ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k]; 324 } 325 326 for (; k < x_over_band; k++) { 327 *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; 328 *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; 329 } 330 331 for (; k < 64; k++) { 332 *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; 333 *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; 334 } 335 336 qmf_buf_real += 14; 337 qmf_buf_imag += 14; 338 } 339 340 x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start; 341 342 for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 343 for (k = 0; k < 3; k++) { 344 *qmf_buf_real++ = 345 ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k]; 346 *qmf_buf_imag++ = 347 ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k]; 348 } 349 350 for (; k < x_over_band; k++) { 351 *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; 352 *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; 353 } 354 355 for (; k < 64; k++) { 356 *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; 357 *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; 358 } 359 360 qmf_buf_real += 14; 361 qmf_buf_imag += 14; 362 } 363 364 } else { 365 for (i = 0; i < stop_border; i++) { 366 for (k = 0; k < x_over_band; k++) { 367 *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; 368 *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; 369 } 370 371 for (; k < 64; k++) { 372 *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; 373 *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; 374 } 375 376 qmf_buf_real += 14; 377 qmf_buf_imag += 14; 378 } 379 380 x_over_band = ptr_header_data->pstr_freq_band_data->sub_band_start; 381 382 for (; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 383 for (k = 0; k < x_over_band; k++) { 384 *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; 385 *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; 386 } 387 388 for (; k < 64; k++) { 389 *qmf_buf_real++ = ptr_sbr_dec->sbr_qmf_out_real[(2) + i][k]; 390 *qmf_buf_imag++ = ptr_sbr_dec->sbr_qmf_out_imag[(2) + i][k]; 391 } 392 393 qmf_buf_real += 14; 394 qmf_buf_imag += 14; 395 } 396 } 397} 398 399VOID ixheaacd_mps_esbr_synthesis_regrp(FLOAT32 *qmf_buf_real, 400 FLOAT32 *qmf_buf_imag, 401 ia_sbr_dec_struct *ptr_sbr_dec, 402 WORD32 stereo_config_idx) { 403 WORD32 i, k; 404 WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; 405 WORD32 x_over_band = num_anal_bands; 406 407 if (stereo_config_idx > 0) { 408 for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 409 for (k = 0; k < 3; k++) { 410 *qmf_buf_real++ = 411 ptr_sbr_dec->qmf_buf_real[(2) + i + HYBRID_FILTER_DELAY][k]; 412 *qmf_buf_imag++ = 413 ptr_sbr_dec->qmf_buf_imag[(2) + i + HYBRID_FILTER_DELAY][k]; 414 } 415 416 for (; k < x_over_band; k++) { 417 *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; 418 *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; 419 } 420 421 for (; k < 64; k++) { 422 *qmf_buf_real++ = 0; 423 *qmf_buf_imag++ = 0; 424 } 425 426 qmf_buf_real += 14; 427 qmf_buf_imag += 14; 428 } 429 } else { 430 for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 431 for (k = 0; k < x_over_band; k++) { 432 *qmf_buf_real++ = ptr_sbr_dec->qmf_buf_real[(2) + i][k]; 433 *qmf_buf_imag++ = ptr_sbr_dec->qmf_buf_imag[(2) + i][k]; 434 } 435 436 for (; k < 64; k++) { 437 *qmf_buf_real++ = 0.0f; 438 *qmf_buf_imag++ = 0.0f; 439 } 440 441 qmf_buf_real += 14; 442 qmf_buf_imag += 14; 443 } 444 } 445} 446 447VOID ixheaacd_esbr_synthesis_filt_block( 448 ia_sbr_dec_struct *ptr_sbr_dec, ia_sbr_header_data_struct *ptr_header_data, 449 ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing, 450 FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx, 451 ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac) { 452 WORD32 i, k, p1; 453 WORD32 *ptr_filt_states; 454 WORD32 *ptr_filt_states_1; 455 WORD32 *ptr_filt_states_2; 456 WORD32 *filter_l; 457 WORD32 *ploc_qmf_buf_real; 458 WORD32 *ploc_qmf_buf_imag; 459 WORD32 out_scalefactor; 460 WORD32 sixty4; 461 WORD32 no_synthesis_channels; 462 WORD32 ixheaacd_drc_offset; 463 FLOAT32 *syn_buffer; 464 WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local; 465 WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]); 466 467 ia_sbr_qmf_filter_bank_struct *qmf_bank = 468 &ptr_sbr_dec->str_synthesis_qmf_bank; 469 ia_qmf_dec_tables_struct *qmf_dec_tables_ptr = 470 sbr_tables_ptr->qmf_dec_tables_ptr; 471 472 if (!mps_sbr_flag) { 473 ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0], 474 ptr_sbr_dec, ptr_frame_data, ptr_header_data, 475 stereo_config_idx, apply_processing); 476 } else { 477 ixheaacd_mps_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0], 478 ptr_sbr_dec, stereo_config_idx); 479 } 480 481 out_scalefactor = 5; 482 qmf_bank->no_channels = 64; 483 qmf_bank->esbr_cos_twiddle = 484 (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64; 485 qmf_bank->esbr_alt_sin_twiddle = 486 (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64; 487 488 qmf_bank->filter_pos_syn_32 += 489 qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32; 490 qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c; 491 492 sixty4 = NO_SYNTHESIS_CHANNELS; 493 494 ptr_filt_states = qmf_bank->filter_states_32; 495 496 no_synthesis_channels = qmf_bank->no_channels; 497 ptr_filt_states_1 = &ptr_filt_states[0]; 498 ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels; 499 500 filter_l = qmf_bank->filter_pos_syn_32; 501 502 p1 = 0; 503 504 ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset; 505 506 for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { 507 for (k = 0; k < 64; k++) { 508 local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64); 509 local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64); 510 } 511 ploc_qmf_buf_real = local_qmf_buffer; 512 ploc_qmf_buf_imag = local_qmf_buffer + 64; 513 514 ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real, 515 &ptr_sbr_dec->str_synthesis_qmf_bank, 516 sbr_tables_ptr->qmf_dec_tables_ptr); 517 518 ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag, 519 &ptr_filt_states[ixheaacd_drc_offset], 520 no_synthesis_channels, 521 out_scalefactor + 1); 522 523 ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2, 524 filter_l, &time_out[0], ch_fac); 525 526 syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64; 527 for (k = 0; k < 64; k++) { 528 syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16); 529 } 530 531 ptr_filt_states_1 += sixty4; 532 ptr_filt_states_2 -= sixty4; 533 sixty4 = -sixty4; 534 ixheaacd_drc_offset -= 128; 535 536 if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280; 537 538 filter_l += 64; 539 540 if (filter_l == qmf_bank->p_filter_32 + 640) 541 filter_l = (WORD32 *)qmf_bank->p_filter_32; 542 543 p1 += no_synthesis_channels; 544 } 545 546 qmf_bank->filter_pos_syn_32 = filter_l; 547 qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset; 548 549 if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0; 550 551 if (apply_processing && !mps_sbr_flag) { 552 ptr_header_data->pstr_freq_band_data->qmf_sb_prev = 553 ptr_header_data->pstr_freq_band_data->sub_band_start; 554 } 555} 556 557WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, 558 ia_sbr_header_data_struct *ptr_header_data, 559 ia_sbr_frame_info_data_struct *ptr_frame_data, 560 ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, 561 ia_ps_dec_struct *ptr_ps_dec, 562 ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, 563 ia_sbr_scale_fact_struct *ptr_sbr_sf_r, 564 FLAG apply_processing, FLAG low_pow_flag, 565 WORD32 *ptr_work_buf_core, 566 ia_sbr_tables_struct *sbr_tables_ptr, 567 ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, 568 ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, 569 WORD32 drc_sbr_factors[][64], 570 WORD32 audio_object_type) { 571 WORD i; 572 WORD slot, reserve; 573 WORD save_lb_scale; 574 WORD op_delay; 575 576 WORD32 *p_arr_qmf_buf_real[MAX_ENV_COLS + MAX_ENV_COLS]; 577 WORD32 **p_arr_qmf_buf_imag = &p_arr_qmf_buf_real[MAX_ENV_COLS]; 578 WORD32 *ptr; 579 WORD hbe_flag = ptr_header_data->hbe_flag; 580 581 FLOAT32 **pp_qmf_buf_real = NULL; 582 FLOAT32 **pp_qmf_buf_imag = NULL; 583 FLOAT32 pvc_dec_out_buf[16 * 64]; 584 585 WORD upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; 586 WORD no_bins; 587 WORD mps_sbr_flag = ptr_frame_data->mps_sbr_flag; 588 WORD stereo_config_idx = ptr_frame_data->stereo_config_idx; 589 WORD sbr_mode = ptr_frame_data->sbr_mode; 590 WORD usac_flag = ptr_header_data->usac_flag; 591 592 FLOAT32 *pvc_qmf_enrg_arr = (FLOAT32 *)ptr_sbr_dec->pvc_qmf_enrg_arr; 593 594 memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32)); 595 memset(pvc_qmf_enrg_arr, 0, 512 * sizeof(FLOAT32)); 596 if (audio_object_type == AOT_ER_AAC_ELD) { 597 op_delay = 0; 598 } else { 599 op_delay = 6; 600 } 601 if (usac_flag) { 602 pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real; 603 pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag; 604 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 605 op_delay = 2 * 6; 606 } 607 } 608 609 no_bins = (ptr_header_data->num_time_slots * ptr_header_data->time_step); 610 611 if (!usac_flag) { 612 WORD32 num = op_delay; 613 WORD32 *ptr_pers_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf; 614 WORD32 *p_scr_qmf_real = ptr_work_buf_core + (2 << (6 + !low_pow_flag)); 615 if (!low_pow_flag) { 616 num = num << 1; 617 } 618 if (audio_object_type != AOT_ER_AAC_ELD) { 619 memcpy(p_scr_qmf_real, ptr_pers_qmf_real, 620 sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num); 621 } 622 ptr = p_scr_qmf_real; 623 624 for (slot = 0; slot < op_delay + no_bins; slot++) { 625 p_arr_qmf_buf_real[slot] = ptr; 626 ptr += NO_SYNTHESIS_CHANNELS; 627 628 if (!low_pow_flag) { 629 p_arr_qmf_buf_imag[slot] = ptr; 630 ptr += NO_SYNTHESIS_CHANNELS; 631 } 632 } 633 634 ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0; 635 636 if (apply_processing) { 637 ixheaacd_rescale_x_overlap(ptr_sbr_dec, ptr_header_data, ptr_frame_data, 638 ptr_frame_data_prev, p_arr_qmf_buf_real, 639 low_pow_flag); 640 } 641 } 642 643 if (usac_flag) { 644 WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; 645 WORD32 codec_x_delay = 0; 646 WORD32 core_syn_ch_index = 0; 647 WORD32 frame_move = 288; 648 WORD32 core_frame_size = ptr_header_data->core_frame_size; 649 650 if (hbe_flag) { 651 codec_x_delay = 32; 652 } 653 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 654 codec_x_delay = 2 * codec_x_delay; 655 } 656 657 if (hbe_flag || mps_sbr_flag) { 658 core_syn_ch_index = num_anal_bands; 659 } else { 660 core_syn_ch_index = ptr_header_data->pstr_freq_band_data->sub_band_start; 661 } 662 663 frame_move = 9 * num_anal_bands; 664 665 memmove(ptr_sbr_dec->core_sample_buf, 666 ptr_sbr_dec->core_sample_buf + core_frame_size, 667 frame_move * sizeof(FLOAT32)); 668 memcpy(&ptr_sbr_dec->core_sample_buf[frame_move], 669 &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32)); 670 671 memmove( 672 &ptr_sbr_dec->qmf_buf_real[0][0], 673 &ptr_sbr_dec 674 ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], 675 (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); 676 677 memmove( 678 &ptr_sbr_dec->qmf_buf_imag[0][0], 679 &ptr_sbr_dec 680 ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], 681 (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); 682 683 memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0], 684 &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank 685 .num_time_slots][0], 686 (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); 687 688 memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0], 689 &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank 690 .num_time_slots][0], 691 (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); 692 693 if (hbe_flag) { 694 memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0], 695 &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank 696 .num_time_slots][0], 697 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); 698 699 memmove(ptr_sbr_dec->ph_vocod_qmf_imag, 700 ptr_sbr_dec->ph_vocod_qmf_imag + 701 ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, 702 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); 703 } 704 ixheaacd_esbr_analysis_filt_block( 705 ptr_sbr_dec, sbr_tables_ptr, 706 op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET); 707 708 if (hbe_flag) { 709 WORD32 err_code = ixheaacd_qmf_hbe_apply( 710 ptr_sbr_dec->p_hbe_txposer, 711 ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) + 712 ESBR_HBE_DELAY_OFFSET, 713 ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) + 714 ESBR_HBE_DELAY_OFFSET, 715 ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, 716 ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), 717 ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), 718 ptr_frame_data->pitch_in_bins); 719 if (err_code) return err_code; 720 721 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 722 ixheaacd_hbe_repl_spec( 723 &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0], 724 ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), 725 ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), 726 ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, 727 ptr_sbr_dec->p_hbe_txposer->max_stretch); 728 } 729 } 730 ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag); 731 732 if (!mps_sbr_flag && apply_processing) { 733 WORD32 err_code = 0; 734 err_code = ixheaacd_generate_hf( 735 ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), 736 ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), 737 ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET), 738 ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), 739 ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), 740 ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data, 741 ptr_header_data); 742 if (err_code) return err_code; 743 744 ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac; 745 746 if (sbr_mode == PVC_SBR) { 747 ixheaacd_pvc_process( 748 ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start, 749 ptr_frame_data->str_pvc_frame_info.border_vec[0], 750 &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]); 751 ptr_pvc_data->prev_pvc_flg = 1; 752 } else { 753 memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32)); 754 ptr_pvc_data->prev_pvc_flg = 0; 755 } 756 757 ptr_pvc_data->prev_first_bnd_idx = 758 ptr_header_data->pstr_freq_band_data->sub_band_start; 759 ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate; 760 761 ptr_frame_data->pstr_sbr_header = ptr_header_data; 762 if (ptr_header_data->hbe_flag == 0) 763 ixheaacd_sbr_env_calc( 764 ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), 765 ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), 766 ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), 767 ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, 768 ptr_sbr_dec->scratch_buff, pvc_dec_out_buf); 769 else 770 ixheaacd_sbr_env_calc( 771 ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), 772 ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), 773 ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), 774 ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), 775 ptr_sbr_dec->p_hbe_txposer->x_over_qmf, ptr_sbr_dec->scratch_buff, 776 pvc_dec_out_buf); 777 778 } else { 779 for (i = 0; i < 64; i++) { 780 memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32)); 781 memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32)); 782 } 783 } 784 785 ixheaacd_esbr_synthesis_filt_block( 786 ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing, 787 pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, sbr_tables_ptr, 788 mps_sbr_flag, ch_fac); 789 790 ptr_frame_data->prev_sbr_mode = sbr_mode; 791 792 return 0; 793 } 794 795 ixheaacd_cplx_anal_qmffilt( 796 ptr_time_data, &ptr_sbr_dec->str_sbr_scale_fact, 797 &p_arr_qmf_buf_real[op_delay], &p_arr_qmf_buf_imag[op_delay], 798 &ptr_sbr_dec->str_codec_qmf_bank, sbr_tables_ptr->qmf_dec_tables_ptr, 799 ch_fac, low_pow_flag, audio_object_type); 800 801 { 802 WORD shift1, shift2; 803 WORD min_shift; 804 WORD shift_over; 805 WORD reserve_ov1, reserve_ov2; 806 WORD reservea[2]; 807 WORD i = 0; 808 WORD usb = ptr_sbr_dec->str_codec_qmf_bank.usb; 809 WORD iter_val = 1; 810 if (audio_object_type == AOT_ER_AAC_ELD || 811 audio_object_type == AOT_ER_AAC_LD) { 812 iter_val = 0; 813 } 814 do { 815 WORD t1 = op_delay; 816 WORD t2 = no_bins + op_delay; 817 if (i) { 818 t1 = 0; 819 t2 = op_delay; 820 } 821 reservea[i] = (*ixheaacd_ixheaacd_expsubbandsamples)( 822 p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, t1, t2, low_pow_flag); 823 i++; 824 } while (i <= iter_val); 825 ; 826 827 reserve = reservea[0]; 828 if (audio_object_type != AOT_ER_AAC_ELD && 829 audio_object_type != AOT_ER_AAC_LD) 830 reserve_ov1 = reservea[1]; 831 else 832 reserve_ov1 = reserve; 833 ptr_sbr_dec->max_samp_val = ixheaacd_min32(reserve, reserve_ov1); 834 835 reserve_ov2 = (*ixheaacd_ixheaacd_expsubbandsamples)( 836 ptr_sbr_dec->str_hf_generator.lpc_filt_states_real, 837 ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, 0, usb, 0, 838 LPC_ORDER, low_pow_flag); 839 840 reserve_ov1 = ixheaacd_min32(reserve_ov1, reserve_ov2); 841 842 shift1 = ptr_sbr_dec->str_sbr_scale_fact.lb_scale + reserve; 843 844 shift2 = ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale + reserve_ov1; 845 min_shift = ixheaacd_min32(shift1, shift2); 846 shift_over = (shift2 - min_shift); 847 reserve -= (shift1 - min_shift); 848 849 ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale += (reserve_ov1 - shift_over); 850 851 (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, 0, 852 op_delay, reserve_ov1 - shift_over, low_pow_flag); 853 854 (*ixheaacd_adjust_scale)(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, 0, usb, 855 op_delay, (no_bins + op_delay), reserve, 856 low_pow_flag); 857 858 (*ixheaacd_adjust_scale)(ptr_sbr_dec->str_hf_generator.lpc_filt_states_real, 859 ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag, 860 0, usb, 0, LPC_ORDER, reserve_ov1 - shift_over, 861 low_pow_flag); 862 863 ptr_sbr_dec->str_sbr_scale_fact.lb_scale += reserve; 864 865 save_lb_scale = ptr_sbr_dec->str_sbr_scale_fact.lb_scale; 866 } 867 868 { 869 WORD32 num = no_bins; 870 WORD32 *p_loc_qmf_real = 871 &p_arr_qmf_buf_real[op_delay][NO_ANALYSIS_CHANNELS]; 872 873 if (!low_pow_flag) { 874 num = num << 1; 875 } 876 877 ixheaacd_clr_subsamples(p_loc_qmf_real, num - 1, (NO_SYN_ANA_CHANNELS)); 878 } 879 880 if (apply_processing) { 881 WORD16 degree_alias[NO_SYNTHESIS_CHANNELS]; 882 WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec; 883 884 if (low_pow_flag) { 885 memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16)); 886 } 887 888 if (low_pow_flag) { 889 WORD32 com_low_band_scale; 890 ixheaacd_low_pow_hf_generator( 891 &ptr_sbr_dec->str_hf_generator, p_arr_qmf_buf_real, degree_alias, 892 border_vec[0] * ptr_header_data->time_step, 893 ptr_header_data->time_step * 894 ixheaacd_sub16_sat( 895 border_vec[ptr_frame_data->str_frame_info_details.num_env], 896 ptr_header_data->num_time_slots), 897 ptr_header_data->pstr_freq_band_data->num_if_bands, 898 ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode, 899 ptr_frame_data_prev->sbr_invf_mode, ptr_sbr_dec->max_samp_val, 900 ptr_work_buf_core); 901 902 com_low_band_scale = 903 ixheaacd_min32(ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale, 904 ptr_sbr_dec->str_sbr_scale_fact.lb_scale); 905 906 ptr_sbr_dec->str_sbr_scale_fact.hb_scale = 907 (WORD16)(com_low_band_scale - 2); 908 } else { 909 ixheaacd_hf_generator( 910 &ptr_sbr_dec->str_hf_generator, &ptr_sbr_dec->str_sbr_scale_fact, 911 p_arr_qmf_buf_real, p_arr_qmf_buf_imag, ptr_header_data->time_step, 912 border_vec[0], 913 ixheaacd_sub16_sat( 914 border_vec[ptr_frame_data->str_frame_info_details.num_env], 915 ptr_header_data->num_time_slots), 916 ptr_header_data->pstr_freq_band_data->num_if_bands, 917 ptr_frame_data->max_qmf_subband_aac, ptr_frame_data->sbr_invf_mode, 918 ptr_frame_data_prev->sbr_invf_mode, ptr_work_buf_core, 919 audio_object_type); 920 } 921 922 ixheaacd_calc_sbrenvelope( 923 &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env, 924 ptr_header_data, ptr_frame_data, ptr_frame_data_prev, 925 p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag, 926 sbr_tables_ptr, pstr_common_tables, 927 ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)), 928 audio_object_type); 929 930 memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode, 931 ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32)); 932 933 ptr_frame_data_prev->coupling_mode = ptr_frame_data->coupling_mode; 934 ptr_frame_data_prev->max_qmf_subband_aac = 935 ptr_frame_data->max_qmf_subband_aac; 936 ptr_frame_data_prev->end_position = 937 border_vec[ptr_frame_data->str_frame_info_details.num_env]; 938 ptr_frame_data_prev->amp_res = ptr_frame_data->amp_res; 939 } else { 940 ptr_sbr_dec->str_sbr_scale_fact.hb_scale = save_lb_scale; 941 } 942 943 if (!low_pow_flag) { 944 for (i = 0; i < LPC_ORDER; i++) { 945 WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0]; 946 WORD32 *p_loc_qmf_imag = &p_arr_qmf_buf_imag[no_bins - LPC_ORDER + i][0]; 947 WORD32 *plpc_filt_states_real = 948 &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0]; 949 WORD32 *plpc_filt_states_imag = 950 &ptr_sbr_dec->str_hf_generator.lpc_filt_states_imag[i][0]; 951 952 memcpy(plpc_filt_states_real, p_loc_qmf_real, 953 sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb)); 954 memcpy(plpc_filt_states_imag, p_loc_qmf_imag, 955 sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb)); 956 } 957 } else { 958 for (i = 0; i < LPC_ORDER; i++) { 959 WORD32 *p_loc_qmf_real = &p_arr_qmf_buf_real[no_bins - LPC_ORDER + i][0]; 960 WORD32 *plpc_filt_states_real = 961 &ptr_sbr_dec->str_hf_generator.lpc_filt_states_real[i][0]; 962 memcpy(plpc_filt_states_real, p_loc_qmf_real, 963 sizeof(WORD32) * (ptr_sbr_dec->str_codec_qmf_bank.usb)); 964 } 965 } 966 967 if (apply_processing && ptr_header_data->channel_mode == PS_STEREO && 968 ((audio_object_type != AOT_ER_AAC_ELD) && 969 (audio_object_type != AOT_ER_AAC_LD))) { 970 WORD32 ps_scale; 971 972 ixheaacd_init_ps_scale(ptr_ps_dec, &ptr_sbr_dec->str_sbr_scale_fact); 973 974 ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay, 975 &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data, 976 &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec, 977 1, 0, sbr_tables_ptr, pstr_common_tables, ch_fac, 978 drc_on, drc_sbr_factors, audio_object_type); 979 980 ps_scale = ptr_sbr_dec->str_sbr_scale_fact.ps_scale; 981 ptr_sbr_sf_r->ov_lb_scale = ps_scale; 982 ptr_sbr_sf_r->lb_scale = ps_scale; 983 ptr_sbr_sf_r->hb_scale = ps_scale; 984 985 ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay, 986 ptr_sbr_sf_r, ptr_time_data + 1, 987 ptr_qmf_synth_bank_r, ptr_ps_dec, 0, 0, 988 sbr_tables_ptr, pstr_common_tables, ch_fac, 989 drc_on, drc_sbr_factors, audio_object_type); 990 } else { 991 ixheaacd_cplx_synt_qmffilt(p_arr_qmf_buf_real, p_arr_qmf_buf_imag, op_delay, 992 &ptr_sbr_dec->str_sbr_scale_fact, ptr_time_data, 993 &ptr_sbr_dec->str_synthesis_qmf_bank, ptr_ps_dec, 994 0, low_pow_flag, sbr_tables_ptr, 995 pstr_common_tables, ch_fac, drc_on, 996 drc_sbr_factors, audio_object_type); 997 } 998 999 { 1000 WORD32 num = op_delay; 1001 WORD32 *p_loc_qmf_real = ptr_sbr_dec->ptr_sbr_overlap_buf; 1002 WORD32 *p_loc_qmf_real_1 = &p_arr_qmf_buf_real[no_bins][0]; 1003 1004 if (!low_pow_flag) { 1005 num = num << 1; 1006 } 1007 1008 memcpy(p_loc_qmf_real, p_loc_qmf_real_1, 1009 sizeof(WORD32) * NO_SYNTHESIS_CHANNELS * num); 1010 } 1011 1012 ptr_sbr_dec->str_sbr_scale_fact.ov_lb_scale = save_lb_scale; 1013 return 0; 1014} 1015 1016WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, 1017 ia_sbr_header_data_struct *ptr_header_data, 1018 ia_sbr_frame_info_data_struct *ptr_frame_data, 1019 FLAG apply_processing, FLAG low_pow_flag, 1020 ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) { 1021 WORD32 i; 1022 WORD32 op_delay; 1023 1024 WORD32 codec_x_delay = 0; 1025 1026 FLOAT32 **pp_qmf_buf_real = ptr_sbr_dec->pp_qmf_buf_real; 1027 FLOAT32 **pp_qmf_buf_imag = ptr_sbr_dec->pp_qmf_buf_imag; 1028 1029 WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; 1030 WORD32 core_frame_size = ptr_header_data->core_frame_size; 1031 1032 WORD32 no_bins; 1033 WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag; 1034 WORD32 stereo_config_idx = ptr_frame_data->stereo_config_idx; 1035 WORD32 hbe_flag = ptr_header_data->hbe_flag; 1036 WORD32 sbr_mode = ptr_frame_data->sbr_mode; 1037 1038 op_delay = 6; 1039 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 1040 op_delay = 2 * 6; 1041 } 1042 1043 no_bins = ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; 1044 1045 ptr_sbr_dec->str_sbr_scale_fact.lb_scale = 0; 1046 { 1047 WORD32 num_anal_bands = ptr_sbr_dec->str_codec_qmf_bank.no_channels; 1048 WORD32 frame_move = 288; 1049 if (hbe_flag) { 1050 codec_x_delay = 32; 1051 } 1052 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 1053 codec_x_delay = 2 * codec_x_delay; 1054 } 1055 1056 frame_move = 9 * num_anal_bands; 1057 1058 memmove(ptr_sbr_dec->core_sample_buf, 1059 ptr_sbr_dec->core_sample_buf + core_frame_size, 1060 frame_move * sizeof(FLOAT32)); 1061 1062 memcpy(&ptr_sbr_dec->core_sample_buf[frame_move], 1063 &ptr_sbr_dec->time_sample_buf[0], core_frame_size * sizeof(FLOAT32)); 1064 1065 memmove( 1066 &ptr_sbr_dec->qmf_buf_real[0][0], 1067 &ptr_sbr_dec 1068 ->qmf_buf_real[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], 1069 (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); 1070 memmove( 1071 &ptr_sbr_dec->qmf_buf_imag[0][0], 1072 &ptr_sbr_dec 1073 ->qmf_buf_imag[ptr_sbr_dec->str_codec_qmf_bank.num_time_slots][0], 1074 (op_delay + SBR_HF_ADJ_OFFSET + codec_x_delay) * sizeof(FLOAT32) * 64); 1075 1076 memmove(&ptr_sbr_dec->sbr_qmf_out_real[0][0], 1077 &ptr_sbr_dec->sbr_qmf_out_real[ptr_sbr_dec->str_codec_qmf_bank 1078 .num_time_slots][0], 1079 (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); 1080 memmove(&ptr_sbr_dec->sbr_qmf_out_imag[0][0], 1081 &ptr_sbr_dec->sbr_qmf_out_imag[ptr_sbr_dec->str_codec_qmf_bank 1082 .num_time_slots][0], 1083 (op_delay + SBR_HF_ADJ_OFFSET) * sizeof(FLOAT32) * 64); 1084 1085 if (hbe_flag) { 1086 memmove(&ptr_sbr_dec->ph_vocod_qmf_real[0][0], 1087 &ptr_sbr_dec->ph_vocod_qmf_real[ptr_sbr_dec->str_codec_qmf_bank 1088 .num_time_slots][0], 1089 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); 1090 memmove(ptr_sbr_dec->ph_vocod_qmf_imag, 1091 ptr_sbr_dec->ph_vocod_qmf_imag + 1092 ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, 1093 64 * sizeof(FLOAT32) * (op_delay + SBR_HF_ADJ_OFFSET)); 1094 } 1095 } 1096 1097 ixheaacd_esbr_analysis_filt_block( 1098 ptr_sbr_dec, ptr_sbr_tables, 1099 op_delay + codec_x_delay + SBR_HF_ADJ_OFFSET); 1100 1101 if (hbe_flag) { 1102 WORD32 err = ixheaacd_qmf_hbe_apply( 1103 ptr_sbr_dec->p_hbe_txposer, 1104 ptr_sbr_dec->qmf_buf_real + (op_delay + SBR_HF_ADJ_OFFSET) + 1105 ESBR_HBE_DELAY_OFFSET, 1106 ptr_sbr_dec->qmf_buf_imag + (op_delay + SBR_HF_ADJ_OFFSET) + 1107 ESBR_HBE_DELAY_OFFSET, 1108 ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, 1109 ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), 1110 ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), 1111 ptr_frame_data->pitch_in_bins); 1112 if (err) return err; 1113 1114 if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { 1115 ixheaacd_hbe_repl_spec( 1116 &ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0], 1117 ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), 1118 ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), 1119 ptr_sbr_dec->str_codec_qmf_bank.num_time_slots, 1120 ptr_sbr_dec->p_hbe_txposer->max_stretch); 1121 } 1122 } 1123 ixheaacd_qmf_enrg_calc(ptr_sbr_dec, upsample_ratio_idx, low_pow_flag); 1124 1125 for (i = 0; i < 64; i++) { 1126 memset(ptr_sbr_dec->sbr_qmf_out_real[i], 0, 64 * sizeof(FLOAT32)); 1127 memset(ptr_sbr_dec->sbr_qmf_out_imag[i], 0, 64 * sizeof(FLOAT32)); 1128 } 1129 1130 ixheaacd_esbr_synthesis_filt_block( 1131 ptr_sbr_dec, ptr_header_data, ptr_frame_data, apply_processing, 1132 pp_qmf_buf_real, pp_qmf_buf_imag, stereo_config_idx, ptr_sbr_tables, 1133 mps_sbr_flag, ch_fac); 1134 1135 ptr_frame_data->prev_sbr_mode = sbr_mode; 1136 return 0; 1137} 1138 1139WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, 1140 VOID *p_sbr_frame, VOID *p_sbr_header) { 1141 WORD32 i, k; 1142 ia_sbr_frame_info_data_struct *ptr_frame_data = 1143 (ia_sbr_frame_info_data_struct *)p_sbr_frame; 1144 ia_sbr_header_data_struct *ptr_header_data = 1145 (ia_sbr_header_data_struct *)p_sbr_header; 1146 ia_sbr_dec_struct *ptr_sbr_dec = (ia_sbr_dec_struct *)p_sbr_dec; 1147 ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details; 1148 WORD32 no_bins; 1149 WORD32 upsample_ratio_idx = ptr_header_data->sbr_ratio_idx; 1150 WORD32 op_delay = 6 + SBR_HF_ADJ_OFFSET; 1151 WORD32 num_anal_bands = 40; 1152 WORD32 mps_sbr_flag = ptr_frame_data->mps_sbr_flag; 1153 WORD32 err = 0; 1154 1155 if (ptr_header_data->is_usf_4) { 1156 op_delay += 6; 1157 } 1158 1159 num_anal_bands = num_anal_bands - (upsample_ratio_idx << 3); 1160 1161 if (!mps_sbr_flag) { 1162 return 0; 1163 } 1164 1165 no_bins = ptr_header_data->output_framesize / 64; 1166 1167 for (i = 0; i < no_bins; i++) { 1168 FLOAT32 *p_loc_mps_qmf_output = 1169 p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2); 1170 for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) { 1171 ptr_sbr_dec->mps_qmf_buf_real[op_delay + i][k] = *p_loc_mps_qmf_output++; 1172 ptr_sbr_dec->mps_qmf_buf_imag[op_delay + i][k] = *p_loc_mps_qmf_output++; 1173 1174 ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k] = 1175 ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; 1176 ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k] = 1177 ptr_sbr_dec->qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; 1178 } 1179 } 1180 1181 if (ptr_frame_data->reset_flag) { 1182 WORD32 l; 1183 WORD32 start_band = ptr_header_data->pstr_freq_band_data->qmf_sb_prev; 1184 WORD32 end_band = num_anal_bands; 1185 WORD32 start_slot = 1186 SBR_HF_ADJ_OFFSET + ptr_frame_data->rate * p_frame_info->border_vec[0]; 1187 1188 for (l = start_slot; l < op_delay; l++) { 1189 for (k = start_band; k < end_band; k++) { 1190 ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0; 1191 ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0; 1192 } 1193 } 1194 1195 for (l = 0; l < SBR_HF_ADJ_OFFSET; l++) { 1196 for (k = start_band; k < end_band; k++) { 1197 ptr_sbr_dec->mps_qmf_buf_real[l][k] = 0.0; 1198 ptr_sbr_dec->mps_qmf_buf_imag[l][k] = 0.0; 1199 } 1200 } 1201 } 1202 ptr_header_data->pstr_freq_band_data->qmf_sb_prev = 1203 ptr_header_data->pstr_freq_band_data->sub_band_start; 1204 1205 err = ixheaacd_generate_hf( 1206 ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, 1207 ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL, 1208 ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, 1209 ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, ptr_frame_data, 1210 ptr_header_data); 1211 if (err) return err; 1212 1213 ptr_frame_data->pstr_sbr_header = ptr_header_data; 1214 ptr_frame_data->sbr_mode = ORIG_SBR; 1215 ptr_frame_data->prev_sbr_mode = ORIG_SBR; 1216 if (ptr_header_data->hbe_flag == 0) 1217 ixheaacd_sbr_env_calc(ptr_frame_data, 1218 ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, 1219 ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, 1220 ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, 1221 ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, 1222 NULL, ptr_sbr_dec->scratch_buff, NULL); 1223 else 1224 ixheaacd_sbr_env_calc(ptr_frame_data, 1225 ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, 1226 ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, 1227 ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, 1228 ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, 1229 ptr_sbr_dec->p_hbe_txposer->x_over_qmf, 1230 ptr_sbr_dec->scratch_buff, NULL); 1231 1232 for (i = 0; i < no_bins; i++) { 1233 FLOAT32 *p_loc_mps_qmf_output = 1234 p_mps_qmf_output + i * (MAX_NUM_QMF_BANDS_ESBR * 2); 1235 for (k = 0; k < ptr_header_data->pstr_freq_band_data->sub_band_start; k++) { 1236 *p_loc_mps_qmf_output++ = 1237 ptr_sbr_dec->mps_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; 1238 *p_loc_mps_qmf_output++ = 1239 ptr_sbr_dec->mps_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k]; 1240 } 1241 for (k = ptr_header_data->pstr_freq_band_data->sub_band_start; k < 64; 1242 k++) { 1243 *p_loc_mps_qmf_output++ = 1244 ptr_sbr_dec->mps_sbr_qmf_buf_real[SBR_HF_ADJ_OFFSET + i][k]; 1245 *p_loc_mps_qmf_output++ = 1246 ptr_sbr_dec->mps_sbr_qmf_buf_imag[SBR_HF_ADJ_OFFSET + i][k]; 1247 } 1248 } 1249 1250 for (i = 0; i < op_delay; i++) { 1251 memmove(ptr_sbr_dec->mps_qmf_buf_real[i], 1252 ptr_sbr_dec->mps_qmf_buf_real[no_bins + i], 64 * sizeof(FLOAT32)); 1253 1254 memmove(ptr_sbr_dec->mps_qmf_buf_imag[i], 1255 ptr_sbr_dec->mps_qmf_buf_imag[no_bins + i], 64 * sizeof(FLOAT32)); 1256 1257 memmove(ptr_sbr_dec->mps_sbr_qmf_buf_real[i], 1258 ptr_sbr_dec->mps_sbr_qmf_buf_real[no_bins + i], 1259 64 * sizeof(FLOAT32)); 1260 1261 memmove(ptr_sbr_dec->mps_sbr_qmf_buf_imag[i], 1262 ptr_sbr_dec->mps_sbr_qmf_buf_imag[no_bins + i], 1263 64 * sizeof(FLOAT32)); 1264 } 1265 1266 ptr_frame_data->reset_flag = 0; 1267 return err; 1268} 1269