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}