151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick/****************************************************************************** 251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * * 351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Copyright (C) 2018 The Android Open Source Project 451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * 551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Licensed under the Apache License, Version 2.0 (the "License"); 651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * you may not use this file except in compliance with the License. 751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * You may obtain a copy of the License at: 851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * 951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * http://www.apache.org/licenses/LICENSE-2.0 1051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * 1151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Unless required by applicable law or agreed to in writing, software 1251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * distributed under the License is distributed on an "AS IS" BASIS, 1351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * See the License for the specific language governing permissions and 1551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * limitations under the License. 1651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * 1751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ***************************************************************************** 1851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 1951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick*/ 2051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <math.h> 2151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <stdio.h> 2251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <stdlib.h> 2351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <string.h> 2451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 2551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_type_def.h> 2651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_interface.h> 2751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 2851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_bitbuffer.h" 2951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_interface.h" 3051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 3151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_tns_usac.h" 3251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_cnst.h" 3351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_acelp_info.h" 3451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 3551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_td_mdct.h" 3651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 3751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecsettings.h" 3851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_info.h" 3951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbr_common.h" 4051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_drc_data_struct.h" 4151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_drc_dec.h" 4251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbrdecoder.h" 4351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_mps_polyphase.h" 4451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_sbr_const.h" 4551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_main.h" 4651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_arith_dec.h" 4751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_windows.h" 4851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 4951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_vec_baisc_ops.h" 5051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_constants.h" 5151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_function_selector.h" 5251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_type_def.h> 5351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_basic_ops32.h> 5451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include <ixheaacd_basic_ops40.h> 5551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 5651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_func_def.h" 5751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 5851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#include "ixheaacd_windows.h" 5951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 6051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_cos_512[512]; 6151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_sin_512[512]; 6251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_cos_384[384]; 6351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_sin_384[384]; 6451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_cos_64[64]; 6551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_sin_64[64]; 6651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_cos_48[48]; 6751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const WORD32 ixheaacd_pre_post_twid_sin_48[48]; 6851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickextern const FLOAT64 ixheaacd_power_10_table[28]; 6951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 7051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#define ABS(A) ((A) < 0 ? (-A) : (A)) 7151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 7251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic WORD32 ixheaacd_calc_max_spectralline(WORD32 *p_in_ibuffer, WORD32 n) { 7351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 k, shiftp, itemp = 0; 7451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < n; k++) { 75b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri if (ixheaacd_abs32_sat(p_in_ibuffer[k]) > itemp) 76b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri itemp = ixheaacd_abs32_sat(p_in_ibuffer[k]); 7751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 7851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 7951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp = ixheaacd_norm32(itemp); 8051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 8151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick return (shiftp); 8251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 8351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 8451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic void ixheaacd_normalize(WORD32 *buff, WORD32 shift, WORD len) { 8551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 i; 8651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 8751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (i = 0; i < len; i++) { 8851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick buff[i] = buff[i] << shift; 8951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 9051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 9151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 9251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic FLOAT32 ixheaacd_pow10(WORD32 input) { 9351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 output = 1; 9451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick while (input > 0) { 9551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output *= 10; 9651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick input--; 9751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 9851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick return (output); 9951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 10051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 10151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickvoid ixheaacd_calc_pre_twid_dec(WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, 10251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 nlength, const WORD32 *cos_ptr, 10351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick const WORD32 *sin_ptr) { 10451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 i; 10551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *ptr_y; 10651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 10751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ptr_y = &ptr_x[2 * nlength - 1]; 10851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 10951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (i = 0; i < nlength; i++) { 1104908247643e9e97852e847c00bfe7c4259279538Ray Essick *r_ptr++ = ((ixheaacd_mult32(ixheaacd_negate32_sat(*ptr_x), (*cos_ptr)) - 11151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_mult32((*ptr_y), (*sin_ptr)))); 11251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *i_ptr++ = ((ixheaacd_mult32((*ptr_y), (*cos_ptr++)) - 11351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_mult32((*ptr_x), (*sin_ptr++)))); 11451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ptr_x += 2; 11551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ptr_y -= 2; 11651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 11751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 11851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 11951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickvoid ixheaacd_calc_post_twid_dec(WORD32 *xptr, WORD32 *r_ptr, WORD32 *i_ptr, 12051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 nlength, const WORD32 *cos_ptr, 12151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick const WORD32 *sin_ptr 12251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 12351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ) { 12451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 i; 12551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *yptr; 12651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 12751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick yptr = &xptr[2 * nlength - 1]; 12851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 12951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (i = 0; i < nlength; i++) { 13051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *xptr = (-(ixheaacd_mult32((r_ptr[i]), (*cos_ptr)) - 13151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_mult32((i_ptr[i]), (*sin_ptr)))); 13251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *yptr = (-(ixheaacd_mult32((i_ptr[i]), (*cos_ptr++)) + 13351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_mult32((r_ptr[i]), (*sin_ptr++)))); 13451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick xptr += 2; 13551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick yptr -= 2; 13651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 13751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 13851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 13951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic void ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints, 14051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *preshift, WORD32 *tmp_data) { 14151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *data_r; 14251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *data_i; 14351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 nlength = npoints >> 1; 14451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick const WORD32 *cos_ptr; 14551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick const WORD32 *sin_ptr; 14651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 14751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick data_r = tmp_data; 14851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick data_i = tmp_data + 512; 14951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 15051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (nlength == 512) { 15151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick cos_ptr = ixheaacd_pre_post_twid_cos_512; 15251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick sin_ptr = ixheaacd_pre_post_twid_sin_512; 15351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else if (nlength == 384) { 15451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick cos_ptr = ixheaacd_pre_post_twid_cos_384; 15551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick sin_ptr = ixheaacd_pre_post_twid_sin_384; 15651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else if (nlength == 64) { 15751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick cos_ptr = ixheaacd_pre_post_twid_cos_64; 15851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick sin_ptr = ixheaacd_pre_post_twid_sin_64; 15951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else if (nlength == 48) { 16051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick cos_ptr = ixheaacd_pre_post_twid_cos_48; 16151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick sin_ptr = ixheaacd_pre_post_twid_sin_48; 16251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else { 16351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick cos_ptr = ixheaacd_pre_post_twid_cos_48; 16451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick sin_ptr = ixheaacd_pre_post_twid_sin_48; 16551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 16651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 16751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick (*ixheaacd_calc_pre_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr); 16851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift); 16951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick (*ixheaacd_calc_post_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr); 17051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 17151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 17251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick#define N_LONG_LEN_MAX 1024 17351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 17451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickvoid ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, 17551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *tmp_data) { 17651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 preshift = 0; 17751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 i; 17851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 k = (npoints / 2); 17951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 18051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick while (((k & 1) == 0) & (k != 1)) { 18151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick k = k >> 1; 18251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick preshift++; 18351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 18451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 18551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if ((k != 1)) { 18651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (i = 0; i < (npoints / 2); i++) { 18751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick imdct_in[i] = (imdct_in[i] / 3) << 1; 18851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 18951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick preshift++; 19051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 19151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 19251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data); 19351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick preshift += 2; 19451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick *qshift -= preshift; 19551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 19651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 19751aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickWORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch, 19851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 n_long, WORD32 lfac, WORD32 *fac_idata) { 19951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 gain_fac, scale, k, *i_aq, itemp = 0, *izir; 20051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 int_aq[ORDER + 1], intzir[2 * LEN_FRAME], x_in[FAC_LENGTH]; 20151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 gain, ztemp, ftemp, pow10, rem10; 20251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 qfac1; 20351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD8 qshift1, qshift2 = 0, qshift3 = 0; 20451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 quo, rem, preshift = 0; 20551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 20651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 *last_lpc = usac_data->lpc_prev[i_ch]; 20751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 *acelp_in = usac_data->acelp_in[i_ch]; 20851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *fac_data = usac_data->fac_data[i_ch]; 20951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *ptr_scratch = &usac_data->scratch_buffer[0]; 21051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 21151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick quo = fac_data[0] / 28; 21251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick rem = fac_data[0] % 28; 21351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick pow10 = ixheaacd_pow10(quo); 21451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick rem10 = (FLOAT32)ixheaacd_power_10_table[rem]; 21551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 21651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick gain = pow10 * rem10; 21751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick scale = (WORD32)(ixheaacd_norm32((WORD32)((ABS(gain) + 1)))); 21851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick gain_fac = (WORD32)(gain * (FLOAT32)((WORD64)1 << scale)); 21951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick scale += 4; 22051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick qfac1 = 1.0f / (gain); 22151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 22251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (acelp_in != NULL) { 22351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick izir = intzir; 22451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ftemp = 0.0; 22551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < n_long / 4; k++) { 22651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ztemp = acelp_in[k] * (qfac1); 22751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (ABS(ztemp) > ftemp) ftemp = ABS(ztemp); 22851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 22951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 23051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick itemp = (WORD32)(ftemp); 23151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick qshift3 = ixheaacd_norm32(itemp); 23251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 23351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < n_long / 4; k++) { 23451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick izir[k] = 23551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick (WORD32)((acelp_in[k] * (qfac1)) * (FLOAT32)((WORD64)1 << qshift3)); 23651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 23751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else 23851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick izir = NULL; 23951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 24051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (last_lpc != NULL) { 24151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ftemp = 0.0; 24251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick i_aq = int_aq; 24351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < ORDER + 1; k++) { 24451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (ABS(last_lpc[k]) > ftemp) ftemp = ABS(last_lpc[k]); 24551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 24651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 24751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick itemp = (WORD32)(ftemp); 24851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick qshift2 = ixheaacd_norm32(itemp); 24951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 25051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < ORDER + 1; k++) { 25151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick i_aq[k] = (WORD32)(last_lpc[k] * (FLOAT32)((WORD64)1 << qshift2)); 25251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 25351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else 25451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick i_aq = NULL; 25551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 25651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < lfac; k++) { 25751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (ABS(fac_data[k + 1]) > itemp) itemp = ABS(fac_data[k + 1]); 25851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 25951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 26051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick qshift1 = ixheaacd_norm32(itemp); 26151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 26251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < lfac; k++) { 26351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fac_data[k + 1] = 26451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick (WORD32)(fac_data[k + 1] * (FLOAT32)((WORD64)1 << qshift1)); 26551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 26651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 26751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < lfac / 2; k++) { 26851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick x_in[k] = fac_data[2 * k + 1]; 26951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick x_in[lfac / 2 + k] = fac_data[lfac - 2 * k]; 27051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 27151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 27251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_fr_alias_cnx_fix(x_in, n_long / 4, lfac, i_aq, izir, fac_idata + 16, 27351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick &qshift1, qshift2, qshift3, &preshift, ptr_scratch); 27451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick preshift += 4; 27551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 27651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (acelp_in != NULL) { 27751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < 2 * lfac; k++) { 27851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fac_idata[k] = 27951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_mul32_sh(fac_idata[k + 16], gain_fac, (WORD8)(scale)); 28051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 28151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 28251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick return (qshift1 - preshift); 28351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 28451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 28551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data, 28651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 i_ch, WORD32 *fac_data_out, 28751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick offset_lengths *ixheaacd_drc_offset, 28851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD8 fac_q) { 28951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 qfac; 29051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 overlap_data_buf[2 * N_LONG_LEN_MAX] = {0}; 29151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *window_short, k, *window_short_prev_ptr; 29251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *overlap_data, *fp; 29351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 29451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *p_overlap_ibuffer = usac_data->overlap_data_ptr[i_ch]; 29551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *p_in_ibuffer = usac_data->coef_fix[i_ch]; 29651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 *p_out_buffer = usac_data->time_sample_vector[i_ch]; 29751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *p_out_ibuffer = usac_data->output_data_ptr[i_ch]; 29851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *scratch_mem = usac_data->scratch_buffer; 29951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 td_frame_prev = usac_data->td_frame_prev[i_ch]; 30051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 fac_apply = usac_data->fac_data_present[i_ch]; 30151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD8 shiftp, input_q, output_q, shift_olap = 14; 30251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 max_shift; 30351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 30451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 window_select = usac_data->window_shape[i_ch]; 30551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 window_select_prev = usac_data->window_shape_prev[i_ch]; 30651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ia_usac_lpd_decoder_handle st = usac_data->str_tddec[i_ch]; 30751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 err_code = 0; 30851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 30951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick max_shift = 31051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long); 31151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_normalize(p_in_ibuffer, max_shift, ixheaacd_drc_offset->n_long); 31251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp = max_shift + 6; 31351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick input_q = shiftp; 31451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 31551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick memcpy(overlap_data_buf, p_overlap_ibuffer, 31651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick sizeof(WORD32) * ixheaacd_drc_offset->n_long); 31751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick overlap_data = overlap_data_buf; 31851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 31951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fp = overlap_data + ixheaacd_drc_offset->n_flat_ls; 32051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 32151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < 8; k++) { 32251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp = input_q; 32351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_acelp_imdct(p_in_ibuffer + (k * ixheaacd_drc_offset->n_short), 32451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 2 * ixheaacd_drc_offset->n_short, &shiftp, 32551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick scratch_mem); 32651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 32751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 32851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick max_shift = 32951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long); 33051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_normalize(p_in_ibuffer, max_shift - 1, ixheaacd_drc_offset->n_long); 33151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp += max_shift - 1; 33251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 33351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick err_code = ixheaacd_calc_window(&window_short, ixheaacd_drc_offset->n_short, 33451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_select); 33551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (err_code == -1) return err_code; 33651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick err_code = 33751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_calc_window(&window_short_prev_ptr, 33851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_trans_ls, window_select_prev); 33951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (err_code == -1) return err_code; 34051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 34151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (fac_apply) 34251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_windowing_short1(p_in_ibuffer + ixheaacd_drc_offset->n_short / 2, 34351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr, fp, ixheaacd_drc_offset, 34451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp, shift_olap); 34551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 34651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick else 34751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_windowing_short2(p_in_ibuffer + ixheaacd_drc_offset->n_short / 2, 34851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr, fp, ixheaacd_drc_offset, 34951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp, shift_olap); 35051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 35151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q = ixheaacd_windowing_short3( 35251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer, window_short + ixheaacd_drc_offset->n_short - 1, 35351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fp + ixheaacd_drc_offset->n_short, ixheaacd_drc_offset->n_short, shiftp, 35451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shift_olap); 35551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer += ixheaacd_drc_offset->n_short; 35651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fp += ixheaacd_drc_offset->n_short; 35751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr = window_short; 35851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 35951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 1; k < 7; k++) { 36051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q = ixheaacd_windowing_short4( 36151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer, window_short_prev_ptr, fp, 36251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr + ixheaacd_drc_offset->n_short - 1, 36351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_short, 1, shiftp, shift_olap, output_q); 36451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer += ixheaacd_drc_offset->n_short; 36551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fp += ixheaacd_drc_offset->n_short; 36651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr = window_short; 36751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 36851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 36951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q = ixheaacd_windowing_short4( 37051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer, window_short_prev_ptr, fp, 37151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr + ixheaacd_drc_offset->n_short - 1, 37251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_short, 0, shiftp, shift_olap, output_q); 37351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer += ixheaacd_drc_offset->n_short; 37451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fp += ixheaacd_drc_offset->n_short; 37551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 37651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (fac_apply) { 37751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_combine_fac(overlap_data + ixheaacd_drc_offset->n_flat_ls + 37851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->lfac, 37951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fac_data_out, 38051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick overlap_data + ixheaacd_drc_offset->n_flat_ls + 38151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->lfac, 38251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 2 * ixheaacd_drc_offset->lfac, output_q, fac_q); 38351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 38451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick memset(overlap_data + 2 * ixheaacd_drc_offset->n_long - 38551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_flat_ls, 38651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 0, sizeof(WORD32) * ixheaacd_drc_offset->n_flat_ls); 38751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_scale_down(overlap_data, overlap_data, 38851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_flat_ls, shift_olap, output_q); 38951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 39051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_scale_down(p_overlap_ibuffer, 39151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick overlap_data + ixheaacd_drc_offset->n_long, 39251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_long, output_q, shift_olap); 39351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_scale_down(p_out_ibuffer, overlap_data, ixheaacd_drc_offset->n_long, 39451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q, 15); 39551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 39651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (td_frame_prev) { 39751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick qfac = 1.0f / (FLOAT32)(1 << 15); 39851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 39951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < ixheaacd_drc_offset->n_long; k++) { 40051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_out_buffer[k] = ((FLOAT32)p_out_ibuffer[k]) * qfac; 40151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 4024908247643e9e97852e847c00bfe7c4259279538Ray Essick err_code = ixheaacd_lpd_bpf_fix(usac_data, 1, p_out_buffer, st); 403b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri if (err_code != 0) return err_code; 40451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 40551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < ixheaacd_drc_offset->n_long; k++) { 40651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_out_ibuffer[k] = (WORD32)(p_out_buffer[k] * (1 << 15)); 40751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 40851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 40951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 41051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick return 0; 41151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 41251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 41351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essickstatic WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data, 41451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 i_ch, WORD32 *fac_idata, 41551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick offset_lengths *ixheaacd_drc_offset, 41651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD8 fac_q) { 41751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 qfac; 41851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *window_long_prev, k, i, *window_short_prev_ptr; 41951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 42051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *p_in_ibuffer = usac_data->coef_fix[i_ch]; 42151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *p_overlap_ibuffer = usac_data->overlap_data_ptr[i_ch]; 42251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *p_out_ibuffer = usac_data->output_data_ptr[i_ch]; 42351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick FLOAT32 *p_out_buffer = usac_data->time_sample_vector[i_ch]; 42451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 *scratch_mem = usac_data->scratch_buffer; 42551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 n_long = usac_data->ccfl; 42651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 td_frame_prev = usac_data->td_frame_prev[i_ch]; 42751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 fac_apply = usac_data->fac_data_present[i_ch]; 42851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD8 shiftp, output_q = 0, shift_olap = 14; 42951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 max_shift; 43051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 43151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 window_sequence = usac_data->window_sequence[i_ch]; 43251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 window_select_prev = usac_data->window_shape_prev[i_ch]; 43351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ia_usac_lpd_decoder_handle st = usac_data->str_tddec[i_ch]; 43451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 43551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 err_code = 0; 43651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 43751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick max_shift = 43851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long); 43951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_normalize(p_in_ibuffer, max_shift, ixheaacd_drc_offset->n_long); 44051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp = max_shift + 6; 44151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 44251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_acelp_imdct(p_in_ibuffer, 2 * ixheaacd_drc_offset->n_long, &shiftp, 44351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick scratch_mem); 44451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 44551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick max_shift = 44651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long); 44751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_normalize(p_in_ibuffer, max_shift - 1, ixheaacd_drc_offset->n_long); 44851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shiftp += max_shift - 1; 44951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 45051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick switch (window_sequence) { 45151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick case ONLY_LONG_SEQUENCE: 45251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick case LONG_START_SEQUENCE: 45351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick err_code = ixheaacd_calc_window( 45451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick &window_long_prev, ixheaacd_drc_offset->n_long, window_select_prev); 45551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (err_code == -1) return err_code; 45651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q = ixheaacd_windowing_long1( 45751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer + n_long / 2, p_overlap_ibuffer, window_long_prev, 45851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_long_prev + ixheaacd_drc_offset->n_long - 1, p_out_ibuffer, 45951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_long, shiftp, shift_olap); 46051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick break; 46151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 46251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick case STOP_START_SEQUENCE: 46351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick case LONG_STOP_SEQUENCE: 46451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick err_code = ixheaacd_calc_window(&window_short_prev_ptr, 46551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset->n_trans_ls, 46651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_select_prev); 46751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (err_code == -1) return err_code; 46851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (fac_apply) { 46951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q = ixheaacd_windowing_long2( 47051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer + n_long / 2, window_short_prev_ptr, fac_idata, 47151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_overlap_ibuffer, p_out_ibuffer, ixheaacd_drc_offset, shiftp, 47251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick shift_olap, fac_q); 47351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else { 47451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q = ixheaacd_windowing_long3( 47551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_in_ibuffer + n_long / 2, window_short_prev_ptr, p_overlap_ibuffer, 47651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_out_ibuffer, 47751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick window_short_prev_ptr + ixheaacd_drc_offset->n_trans_ls - 1, 47851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset, shiftp, shift_olap); 47951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 48051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick break; 48151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 48251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 48351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (i = 0; i < ixheaacd_drc_offset->n_long / 2; i++) { 48451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_overlap_ibuffer[ixheaacd_drc_offset->n_long / 2 + i] = 48551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick -p_in_ibuffer[i] >> (shiftp - shift_olap); 48651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_overlap_ibuffer[ixheaacd_drc_offset->n_long / 2 - i - 1] = 48751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick -p_in_ibuffer[i] >> (shiftp - shift_olap); 48851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 48951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 49051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_scale_down(p_out_ibuffer, p_out_ibuffer, ixheaacd_drc_offset->n_long, 49151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick output_q, 15); 49251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 49351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (td_frame_prev) { 49451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick qfac = 1.0f / (FLOAT32)(1 << 15); 49551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 49651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < ixheaacd_drc_offset->n_long; k++) { 49751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_out_buffer[k] = ((FLOAT32)p_out_ibuffer[k]) * qfac; 49851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 4994908247643e9e97852e847c00bfe7c4259279538Ray Essick err_code = ixheaacd_lpd_bpf_fix(usac_data, 0, p_out_buffer, st); 500b3226ce6f80c78946aa3190cec158fb9852272eaRamesh Katuri if (err_code != 0) return err_code; 50151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 50251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick for (k = 0; k < ixheaacd_drc_offset->n_long; k++) { 50351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick p_out_ibuffer[k] = (WORD32)(p_out_buffer[k] * (1 << 15)); 50451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 50551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 50651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 50751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick return 0; 50851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick} 50951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 51051aa06e124ba688ca810b25ee0b5bb66678aac14Ray EssickWORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch) { 51151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 fac_idata[2 * FAC_LENGTH + 16]; 51251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick offset_lengths ixheaacd_drc_offset; 51351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD8 fac_q = 0; 51451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 td_frame_prev = usac_data->td_frame_prev[i_ch]; 51551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 fac_apply = usac_data->fac_data_present[i_ch]; 51651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick WORD32 window_sequence = usac_data->window_sequence[i_ch]; 51751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.n_long = usac_data->ccfl; 51851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.n_short = ixheaacd_drc_offset.n_long >> 3; 51951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 52051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick memset(fac_idata, 0, sizeof(fac_idata)); 52151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 52251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (td_frame_prev) { 52351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (window_sequence == EIGHT_SHORT_SEQUENCE) { 52451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.lfac = ixheaacd_drc_offset.n_long >> 4; 52551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else { 52651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.lfac = ixheaacd_drc_offset.n_long >> 3; 52751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 52851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.n_flat_ls = 52951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick (ixheaacd_drc_offset.n_long - (ixheaacd_drc_offset.lfac) * 2) >> 1; 53051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 53151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.n_trans_ls = (ixheaacd_drc_offset.lfac) << 1; 53251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } else { 53351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.lfac = FAC_LENGTH; 53451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.n_flat_ls = 53551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick (ixheaacd_drc_offset.n_long - ixheaacd_drc_offset.n_short) >> 1; 53651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.n_trans_ls = ixheaacd_drc_offset.n_short; 53751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick } 53851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 53951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (fac_apply) 54051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fac_q = ixheaacd_cal_fac_data(usac_data, i_ch, ixheaacd_drc_offset.n_long, 54151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_drc_offset.lfac, fac_idata); 54251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 54351aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick if (window_sequence != EIGHT_SHORT_SEQUENCE) 54451aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_fd_imdct_long(usac_data, i_ch, fac_idata, &ixheaacd_drc_offset, 54551aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fac_q); 54651aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 54751aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick else 54851aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick ixheaacd_fd_imdct_short(usac_data, i_ch, fac_idata, &ixheaacd_drc_offset, 54951aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick fac_q); 55051aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick 55151aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick return 0; 55251aa06e124ba688ca810b25ee0b5bb66678aac14Ray Essick}