| /****************************************************************************** |
| * * |
| * Copyright (C) 2018 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| ***************************************************************************** |
| * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
| */ |
| #include <string.h> |
| |
| #include "ixheaacd_sbr_common.h" |
| #include <ixheaacd_type_def.h> |
| |
| #include "ixheaacd_constants.h" |
| #include "ixheaacd_basic_ops32.h" |
| #include "ixheaacd_basic_ops16.h" |
| #include "ixheaacd_basic_ops40.h" |
| #include "ixheaacd_basic_ops.h" |
| |
| #include "ixheaacd_intrinsics.h" |
| #include "ixheaacd_common_rom.h" |
| #include "ixheaacd_bitbuffer.h" |
| #include "ixheaacd_sbrdecsettings.h" |
| #include "ixheaacd_sbr_scale.h" |
| #include "ixheaacd_lpp_tran.h" |
| #include "ixheaacd_env_extr_part.h" |
| #include "ixheaacd_sbr_rom.h" |
| #include "ixheaacd_hybrid.h" |
| #include "ixheaacd_ps_dec.h" |
| #include "ixheaacd_env_extr.h" |
| #include "ixheaacd_qmf_dec.h" |
| |
| #include <ixheaacd_basic_op.h> |
| #include "ixheaacd_env_calc.h" |
| |
| #include "ixheaacd_interface.h" |
| |
| #include "ixheaacd_function_selector.h" |
| #include "ixheaacd_audioobjtypes.h" |
| |
| #define DCT3_LEN (32) |
| #define DCT2_LEN (64) |
| |
| #define LP_SHIFT_VAL 7 |
| #define HQ_SHIFT_64 4 |
| #define RADIXSHIFT 1 |
| #define ROUNDING_SPECTRA 1 |
| #define HQ_SHIFT_VAL 4 |
| |
| static PLATFORM_INLINE WORD32 ixheaacd_mult32x32in32_shift25(WORD32 a, |
| WORD32 b) { |
| WORD32 result; |
| WORD64 temp_result; |
| |
| temp_result = (WORD64)a * (WORD64)b; |
| |
| result = (WORD32)(temp_result >> 25); |
| |
| return (result); |
| } |
| |
| VOID ixheaacd_pretwdct2(WORD32 *inp, WORD32 *out_fwd) { |
| WORD32 n; |
| WORD32 *out_rev = out_fwd + DCT2_LEN - 1; |
| |
| for (n = 0; n < DCT2_LEN / 2; n++) { |
| *out_fwd = *inp; |
| inp++; |
| *out_rev = *inp; |
| out_fwd++; |
| |
| out_rev--; |
| inp++; |
| } |
| |
| return; |
| } |
| |
| static PLATFORM_INLINE VOID ixheaacd_pretwdct2_32(WORD32 *inp, WORD32 *out_fwd, |
| int dct2_len) { |
| WORD32 n; |
| |
| WORD32 *out_rev = out_fwd + dct2_len - 1; |
| for (n = dct2_len / 2 - 1; n >= 0; n--) { |
| *out_fwd = *inp; |
| inp++; |
| *out_rev = *inp; |
| out_fwd++; |
| |
| out_rev--; |
| inp++; |
| } |
| |
| return; |
| } |
| |
| VOID ixheaacd_fftposttw(WORD32 *out, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| int k; |
| WORD32 *p_out_fwd, *ptr_out_rev; |
| const WORD16 *twidle_fwd, *twidle_rev; |
| WORD32 in1, in2, val1, val2; |
| |
| twidle_fwd = qmf_dec_tables_ptr->post_fft_tbl + 1; |
| twidle_rev = qmf_dec_tables_ptr->post_fft_tbl + 15; |
| |
| p_out_fwd = out; |
| ptr_out_rev = out + DCT2_LEN - 1; |
| |
| in1 = ((*p_out_fwd++) << 1); |
| val1 = ((*p_out_fwd--) << 1); |
| |
| *p_out_fwd++ = in1; |
| *p_out_fwd++ = val1; |
| |
| for (k = 1; k <= DCT2_LEN / 4; k++) { |
| WORD32 temp[4]; |
| WORD16 twid_re, twid_im; |
| |
| temp[0] = *p_out_fwd++; |
| temp[1] = *p_out_fwd--; |
| temp[3] = *ptr_out_rev--; |
| temp[2] = *ptr_out_rev++; |
| |
| in2 = ixheaacd_sub32_sat(temp[3], temp[1]); |
| in1 = ixheaacd_add32_sat(temp[3], temp[1]); |
| |
| temp[1] = ixheaacd_sub32_sat(temp[0], temp[2]); |
| temp[3] = ixheaacd_add32_sat(temp[0], temp[2]); |
| |
| twid_re = *twidle_fwd++; |
| twid_im = *twidle_rev--; |
| val1 = ixheaacd_mult32x16in32(in1, twid_re) - |
| ixheaacd_mult32x16in32(temp[1], twid_im); |
| val2 = ixheaacd_mult32x16in32(temp[1], twid_re) + |
| ixheaacd_mult32x16in32(in1, twid_im); |
| val1 = val1 << 1; |
| val2 = val2 << 1; |
| |
| *p_out_fwd++ = ixheaacd_add32_sat(temp[3], val1); |
| *p_out_fwd++ = ixheaacd_add32_sat(in2, val2); |
| |
| *ptr_out_rev-- = ixheaacd_sub32_sat(val2, in2); |
| *ptr_out_rev-- = ixheaacd_sub32_sat(temp[3], val1); |
| } |
| |
| return; |
| } |
| |
| VOID ixheaacd_posttwdct2(WORD32 *inp, WORD16 *out_fwd, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| WORD32 k; |
| WORD32 inp_re, inp_im, out_re, out_im, last_val, out_re1; |
| WORD16 *out_fwd2, *out_rev2, *out_rev; |
| WORD16 twid_re, twid_im; |
| const WORD16 *twidle_fwd; |
| WORD16 re1, im1, im2; |
| |
| out_rev = out_fwd + DCT2_LEN - 1; |
| out_rev2 = out_fwd - 1; |
| out_fwd2 = out_fwd + 65; |
| out_re = *inp++; |
| out_im = *inp++; |
| out_re1 = |
| ixheaacd_sat64_32(ixheaacd_add64((WORD64)out_re, (WORD64)out_im) >> 1); |
| re1 = ixheaacd_round16(ixheaacd_shl32(out_re1, (5 - 1))); |
| |
| *out_fwd++ = re1; |
| |
| last_val = ixheaacd_sub32_sat(out_re, out_im); |
| |
| twidle_fwd = qmf_dec_tables_ptr->dct23_tw + 2; |
| for (k = DCT2_LEN / 2 - 2; k >= 0; k--) { |
| inp_re = *inp++; |
| inp_im = *inp++; |
| |
| twid_re = *twidle_fwd++; |
| twid_im = *twidle_fwd++; |
| out_re = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(inp_re, twid_re), |
| ixheaacd_mult32x16in32(inp_im, twid_im)); |
| out_im = ixheaacd_add32_sat(ixheaacd_mult32x16in32(inp_im, twid_re), |
| ixheaacd_mult32x16in32(inp_re, twid_im)); |
| re1 = ixheaacd_round16(ixheaacd_shl32(out_re, (5 - 1))); |
| im1 = ixheaacd_round16(ixheaacd_shl32(out_im, (5 - 1))); |
| im2 = ixheaacd_negate16(im1); |
| |
| *out_fwd++ = re1; |
| *out_rev2-- = re1; |
| *out_rev-- = im1; |
| *out_fwd2++ = im2; |
| } |
| twid_re = *twidle_fwd++; |
| |
| out_re = ixheaacd_mult32x16in32(last_val, twid_re); |
| re1 = ixheaacd_round16(ixheaacd_shl32(out_re, (5 - 1))); |
| |
| *out_fwd++ = re1; |
| *out_rev2-- = re1; |
| |
| return; |
| } |
| |
| static PLATFORM_INLINE VOID ixheaacd_fftposttw_32( |
| WORD32 *out, int dct2_len, ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| int k; |
| WORD32 *ptr_out_fwd, *ptr_out_rev; |
| const WORD16 *twidle_fwd, *twidle_rev; |
| WORD32 in1, in2, val1, val2; |
| |
| twidle_fwd = qmf_dec_tables_ptr->post_fft_tbl + 2; |
| twidle_rev = qmf_dec_tables_ptr->post_fft_tbl + 14; |
| |
| ptr_out_fwd = out; |
| ptr_out_rev = out + dct2_len - 1; |
| |
| in1 = ((*ptr_out_fwd++) << 1); |
| val1 = ((*ptr_out_fwd--) << 1); |
| |
| *ptr_out_fwd++ = in1; |
| *ptr_out_fwd++ = val1; |
| |
| for (k = dct2_len / 4 - 1; k >= 0; k--) { |
| WORD32 temp0, temp1, temp2, temp3; |
| WORD16 twid_re, twid_im; |
| |
| temp0 = *ptr_out_fwd++; |
| temp1 = *ptr_out_fwd--; |
| temp3 = *ptr_out_rev--; |
| temp2 = *ptr_out_rev++; |
| |
| in1 = ixheaacd_add32_sat(temp1, temp3); |
| in2 = ixheaacd_sub32_sat(temp3, temp1); |
| |
| temp1 = ixheaacd_sub32_sat(temp0, temp2); |
| temp3 = ixheaacd_add32_sat(temp0, temp2); |
| |
| twid_re = *twidle_fwd; |
| twidle_fwd += 2; |
| |
| twid_im = *twidle_rev; |
| twidle_rev -= 2; |
| |
| val1 = ixheaacd_mult32x16in32(in1, twid_re) - |
| ixheaacd_mult32x16in32(temp1, twid_im); |
| val2 = ixheaacd_mult32x16in32(temp1, twid_re) + |
| ixheaacd_mult32x16in32(in1, twid_im); |
| |
| val1 = val1 << 1; |
| val2 = val2 << 1; |
| |
| *ptr_out_fwd++ = ixheaacd_add32_sat(temp3, val1); |
| *ptr_out_fwd++ = ixheaacd_add32_sat(in2, val2); |
| |
| *ptr_out_rev-- = ixheaacd_sub32_sat(val2, in2); |
| *ptr_out_rev-- = ixheaacd_sub32_sat(temp3, val1); |
| } |
| |
| return; |
| } |
| |
| static PLATFORM_INLINE VOID |
| ixheaacd_posttwdct2_32(WORD32 *inp, WORD16 *out_fwd, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| int k; |
| WORD32 inp_re, out_re, out_im, last_val, out_re1; |
| WORD16 *out_rev, *out_rev2, *out_fwd2; |
| WORD16 twid_re, twid_im; |
| const WORD16 *twidle_fwd; |
| WORD16 re1, im1, im2; |
| WORD32 rounding_fac = 0x8000; |
| |
| out_rev = out_fwd + 32 - 1; |
| out_rev2 = out_fwd - 1; |
| out_fwd2 = out_fwd + 32 + 1; |
| out_fwd[32] = 0; |
| |
| out_re = *inp++; |
| out_im = *inp++; |
| |
| out_re1 = |
| ixheaacd_sat64_32(ixheaacd_add64((WORD64)out_re, (WORD64)out_im) >> 1); |
| re1 = ixheaacd_round16(ixheaacd_shl32_sat(out_re1, (5 - 1))); |
| *out_fwd++ = re1; |
| last_val = ixheaacd_sub32_sat(out_re, out_im); |
| |
| twidle_fwd = qmf_dec_tables_ptr->dct23_tw + 4; |
| for (k = 14; k >= 0; k--) { |
| WORD32 temp1, temp2; |
| inp_re = *inp++; |
| twid_re = *twidle_fwd++; |
| twid_im = *twidle_fwd; |
| twidle_fwd += 3; |
| |
| temp1 = ixheaacd_mult32x16in32(inp_re, twid_re); |
| temp2 = ixheaacd_mult32x16in32(inp_re, twid_im); |
| |
| inp_re = *inp++; |
| |
| out_re = ixheaacd_sub32_sat(temp1, ixheaacd_mult32x16in32(inp_re, twid_im)); |
| out_im = ixheaacd_add32_sat(ixheaacd_mult32x16in32(inp_re, twid_re), temp2); |
| |
| out_re = ixheaacd_add32_sat(out_re, out_re); |
| out_im = ixheaacd_add32_sat(out_im, out_im); |
| out_re = ixheaacd_add32_sat(out_re, out_re); |
| out_im = ixheaacd_add32_sat(out_im, out_im); |
| out_re = ixheaacd_add32_sat(out_re, out_re); |
| out_im = ixheaacd_add32_sat(out_im, out_im); |
| out_re = ixheaacd_add32_sat(out_re, out_re); |
| out_im = ixheaacd_add32_sat(out_im, out_im); |
| out_re = ixheaacd_add32_sat(out_re, rounding_fac); |
| out_im = ixheaacd_add32_sat(out_im, rounding_fac); |
| re1 = (out_re >> 16); |
| im1 = (out_im >> 16); |
| im2 = ixheaacd_negate16(im1); |
| |
| *out_fwd++ = re1; |
| *out_rev2-- = re1; |
| *out_rev-- = im1; |
| *out_fwd2++ = im2; |
| } |
| twid_re = *twidle_fwd++; |
| |
| out_re = ixheaacd_mult32x16in32(last_val, twid_re); |
| re1 = ixheaacd_round16(ixheaacd_shl32_sat(out_re, (5 - 1))); |
| *out_fwd++ = re1; |
| *out_rev2-- = re1; |
| |
| return; |
| } |
| |
| VOID ixheaacd_dct2_32(WORD32 *inp, WORD32 *out, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr, |
| WORD16 *filter_states) { |
| WORD32 *output; |
| |
| output = out + 16; |
| filter_states = filter_states + 16; |
| ixheaacd_pretwdct2_32(inp, output, 32); |
| |
| ixheaacd_radix4bfly(qmf_dec_tables_ptr->w_16, output, 1, 4); |
| ixheaacd_postradixcompute4(inp, output, qmf_dec_tables_ptr->dig_rev_table4_16, |
| 16); |
| ixheaacd_fftposttw_32(inp, 32, qmf_dec_tables_ptr); |
| |
| ixheaacd_posttwdct2_32(inp, filter_states, qmf_dec_tables_ptr); |
| |
| return; |
| } |
| |
| VOID ixheaacd_sbr_qmfanal32_winadd_eld(WORD16 *inp1, WORD16 *inp2, |
| WORD16 *p_qmf1, WORD16 *p_qmf2, |
| WORD32 *p_out) { |
| WORD32 n; |
| |
| for (n = 0; n < 32; n += 2) { |
| WORD32 accu; |
| accu = ixheaacd_mult16x16in32(inp1[n + 0], p_qmf1[(n + 0)]); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp1[n + 64], p_qmf1[(n + 64)])); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp1[n + 128], p_qmf1[(n + 128)])); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp1[n + 192], p_qmf1[(n + 192)])); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp1[n + 256], p_qmf1[(n + 256)])); |
| p_out[n] = accu; |
| |
| accu = ixheaacd_mult16x16in32(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)]); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 1 + 64], p_qmf1[(n + 1 + 64)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 1 + 128], p_qmf1[(n + 1 + 128)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 1 + 192], p_qmf1[(n + 1 + 192)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp1[n + 1 + 256], p_qmf1[(n + 1 + 256)])); |
| p_out[n + 1] = accu; |
| |
| accu = ixheaacd_mult16x16in32(inp2[n + 0], p_qmf2[(n + 0)]); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp2[n + 64], p_qmf2[(n + 64)])); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp2[n + 128], p_qmf2[(n + 128)])); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp2[n + 192], p_qmf2[(n + 192)])); |
| accu = ixheaacd_add32( |
| accu, ixheaacd_mult16x16in32(inp2[n + 256], p_qmf2[(n + 256)])); |
| p_out[n + 32] = accu; |
| |
| accu = ixheaacd_mult16x16in32(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)]); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 1 + 64], p_qmf2[(n + 1 + 64)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 1 + 128], p_qmf2[(n + 1 + 128)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 1 + 192], p_qmf2[(n + 1 + 192)])); |
| accu = ixheaacd_add32_sat( |
| accu, ixheaacd_mult16x16in32(inp2[n + 1 + 256], p_qmf2[(n + 1 + 256)])); |
| p_out[n + 1 + 32] = accu; |
| } |
| } |
| |
| VOID ixheaacd_esbr_qmfanal32_winadd(WORD32 *inp1, WORD32 *inp2, WORD32 *p_qmf1, |
| WORD32 *p_qmf2, WORD32 *p_out, |
| WORD32 num_band_anal_qmf) { |
| WORD32 n; |
| WORD64 accu; |
| |
| if (num_band_anal_qmf == 32) { |
| for (n = 0; n < num_band_anal_qmf; n += 2) { |
| accu = ixheaacd_mult64(inp1[n + 0], p_qmf1[2 * (n + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 2 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 4 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 6 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 8 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 8 * num_band_anal_qmf)])); |
| p_out[n] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp1[n + 1 + 0], p_qmf1[2 * (n + 1 + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 2 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 1 + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 4 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 1 + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 6 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 1 + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 8 * num_band_anal_qmf], |
| p_qmf1[2 * (n + 1 + 8 * num_band_anal_qmf)])); |
| p_out[n + 1] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp2[n + 0], p_qmf2[2 * (n + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 2 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 4 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 6 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 8 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 8 * num_band_anal_qmf)])); |
| p_out[n + num_band_anal_qmf] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp2[n + 1 + 0], p_qmf2[2 * (n + 1 + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 2 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 1 + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 4 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 1 + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 6 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 1 + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 8 * num_band_anal_qmf], |
| p_qmf2[2 * (n + 1 + 8 * num_band_anal_qmf)])); |
| p_out[n + 1 + num_band_anal_qmf] = (WORD32)(accu >> 31); |
| } |
| } else if (num_band_anal_qmf == 24) { |
| for (n = 0; n < num_band_anal_qmf; n += 2) { |
| accu = ixheaacd_mult64(inp1[n + 0], p_qmf1[(n + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 2 * num_band_anal_qmf], |
| p_qmf1[(n + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 4 * num_band_anal_qmf], |
| p_qmf1[(n + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 6 * num_band_anal_qmf], |
| p_qmf1[(n + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 8 * num_band_anal_qmf], |
| p_qmf1[(n + 8 * num_band_anal_qmf)])); |
| p_out[n] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp1[n + 1 + 0], p_qmf1[(n + 1 + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 2 * num_band_anal_qmf], |
| p_qmf1[(n + 1 + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 4 * num_band_anal_qmf], |
| p_qmf1[(n + 1 + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 6 * num_band_anal_qmf], |
| p_qmf1[(n + 1 + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 8 * num_band_anal_qmf], |
| p_qmf1[(n + 1 + 8 * num_band_anal_qmf)])); |
| p_out[n + 1] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp2[n + 0], p_qmf2[(n + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 2 * num_band_anal_qmf], |
| p_qmf2[(n + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 4 * num_band_anal_qmf], |
| p_qmf2[(n + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 6 * num_band_anal_qmf], |
| p_qmf2[(n + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 8 * num_band_anal_qmf], |
| p_qmf2[(n + 8 * num_band_anal_qmf)])); |
| p_out[n + num_band_anal_qmf] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp2[n + 1 + 0], p_qmf2[(n + 1 + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 2 * num_band_anal_qmf], |
| p_qmf2[(n + 1 + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 4 * num_band_anal_qmf], |
| p_qmf2[(n + 1 + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 6 * num_band_anal_qmf], |
| p_qmf2[(n + 1 + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 8 * num_band_anal_qmf], |
| p_qmf2[(n + 1 + 8 * num_band_anal_qmf)])); |
| p_out[n + 1 + num_band_anal_qmf] = (WORD32)(accu >> 31); |
| } |
| |
| } else { |
| for (n = 0; n < num_band_anal_qmf; n += 2) { |
| accu = ixheaacd_mult64(inp1[n + 0], p_qmf1[4 * (n + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 2 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 4 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 6 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 8 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 8 * num_band_anal_qmf)])); |
| p_out[n] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp1[n + 1 + 0], p_qmf1[4 * (n + 1 + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 2 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 1 + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 4 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 1 + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 6 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 1 + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp1[n + 1 + 8 * num_band_anal_qmf], |
| p_qmf1[4 * (n + 1 + 8 * num_band_anal_qmf)])); |
| p_out[n + 1] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp2[n + 0], p_qmf2[4 * (n + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 2 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 4 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 6 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 8 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 8 * num_band_anal_qmf)])); |
| p_out[n + num_band_anal_qmf] = (WORD32)(accu >> 31); |
| |
| accu = ixheaacd_mult64(inp2[n + 1 + 0], p_qmf2[4 * (n + 1 + 0)]); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 2 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 1 + 2 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 4 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 1 + 4 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 6 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 1 + 6 * num_band_anal_qmf)])); |
| accu = ixheaacd_add64( |
| accu, ixheaacd_mult64(inp2[n + 1 + 8 * num_band_anal_qmf], |
| p_qmf2[4 * (n + 1 + 8 * num_band_anal_qmf)])); |
| p_out[n + 1 + num_band_anal_qmf] = (WORD32)(accu >> 31); |
| } |
| } |
| } |
| |
| VOID ixheaacd_esbr_inv_modulation( |
| WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf, |
| ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { |
| ixheaacd_esbr_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->esbr_w_32, |
| qmf_dec_tables_ptr->dig_rev_table2_32); |
| } |
| |
| VOID ixheaacd_sbr_qmfsyn32_winadd(WORD16 *tmp1, WORD16 *tmp2, WORD16 *inp1, |
| WORD16 *sample_buffer, FLAG shift, |
| WORD32 ch_fac) { |
| WORD32 k; |
| WORD32 rounding_fac = 0x8000; |
| rounding_fac = rounding_fac >> shift; |
| |
| for (k = 0; k < 32; k++) { |
| WORD32 syn_out = rounding_fac; |
| |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp1[0 + k], inp1[2 * (k + 0)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp1[128 + k], inp1[2 * (k + 64)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp1[256 + k], inp1[2 * (k + 128)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp1[384 + k], inp1[2 * (k + 192)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp1[512 + k], inp1[2 * (k + 256)])); |
| |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp2[64 + k], inp1[2 * (k + 32)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp2[192 + k], inp1[2 * (k + 96)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp2[320 + k], inp1[2 * (k + 160)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp2[448 + k], inp1[2 * (k + 224)])); |
| syn_out = ixheaacd_add32( |
| syn_out, ixheaacd_mult16x16in32(tmp2[576 + k], inp1[2 * (k + 288)])); |
| syn_out = ixheaacd_add32_sat(syn_out, syn_out); |
| if (shift == 2) { |
| syn_out = ixheaacd_add32_sat(syn_out, syn_out); |
| } |
| sample_buffer[ch_fac * k] = (syn_out >> 16); |
| } |
| } |
| |
| void ixheaacd_sbr_pre_twiddle(WORD32 *p_xre, WORD32 *p_xim, |
| WORD16 *p_twiddles) { |
| int k; |
| |
| for (k = 62; k >= 0; k--) { |
| WORD32 x_re = *p_xre; |
| WORD32 x_im = *p_xim; |
| |
| WORD16 ixheaacd_cosine = *p_twiddles++; |
| WORD16 ixheaacd_sine = *p_twiddles++; |
| |
| WORD32 re, im; |
| |
| re = ixheaacd_mac32x16in32_shl( |
| ixheaacd_mult32x16in32_shl(x_re, ixheaacd_cosine), x_im, ixheaacd_sine); |
| im = ixheaacd_sub32(ixheaacd_mult32x16in32_shl(x_im, ixheaacd_cosine), |
| ixheaacd_mult32x16in32_shl(x_re, ixheaacd_sine)); |
| |
| *p_xre++ = re; |
| *p_xim++ = im; |
| } |
| } |
| |
| VOID ixheaacd_cplx_synt_qmffilt( |
| WORD32 **qmf_real, WORD32 **qmf_imag, WORD32 split, |
| ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 *time_out, |
| ia_sbr_qmf_filter_bank_struct *qmf_bank, ia_ps_dec_struct *ptr_ps_dec, |
| FLAG active, FLAG low_pow_flag, ia_sbr_tables_struct *sbr_tables_ptr, |
| ixheaacd_misc_tables *pstr_common_tables, WORD32 ch_fac, FLAG drc_on, |
| WORD32 drc_sbr_factors[][64], WORD32 audio_object_type) { |
| WORD32 i; |
| |
| WORD32 code_scale_factor; |
| WORD32 scale_factor; |
| WORD32 out_scale_factor; |
| WORD32 low_band_scale_factor; |
| WORD32 high_band_scale_factor; |
| WORD16 *filter_states = qmf_bank->filter_states; |
| WORD32 **ptr_qmf_imag_temp; |
| WORD32 qmf_real2[2 * NO_SYNTHESIS_CHANNELS]; |
| |
| WORD32 no_synthesis_channels = qmf_bank->no_channels; |
| WORD32 p1; |
| |
| WORD16 *fp1; |
| WORD16 *fp2; |
| |
| WORD32 sixty4 = NO_SYNTHESIS_CHANNELS; |
| WORD32 thirty2 = qmf_bank->no_channels; |
| |
| WORD16 *filter_coeff; |
| WORD32 num_time_slots = qmf_bank->num_time_slots; |
| WORD32 ixheaacd_drc_offset; |
| WORD32 ov_lb_scale = sbr_scale_factor->ov_lb_scale; |
| WORD32 lb_scale = sbr_scale_factor->lb_scale; |
| WORD32 st_syn_scale = sbr_scale_factor->st_syn_scale; |
| WORD32 ov_lb_shift, lb_shift, hb_shift; |
| |
| WORD32 *qmf_real_tmp = qmf_real2; |
| WORD32 *qmf_imag_tmp = &qmf_real2[NO_SYNTHESIS_CHANNELS]; |
| WORD32 env = 0; |
| |
| WORD32 common_shift; |
| |
| if (no_synthesis_channels == 32) { |
| qmf_bank->cos_twiddle = |
| (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l32; |
| qmf_bank->alt_sin_twiddle = |
| (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l32; |
| qmf_bank->t_cos = |
| (WORD16 *) |
| sbr_tables_ptr->qmf_dec_tables_ptr->sbr_cos_sin_twiddle_ds_l32; |
| } else { |
| qmf_bank->cos_twiddle = |
| (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_sin_cos_twiddle_l64; |
| qmf_bank->alt_sin_twiddle = |
| (WORD16 *)sbr_tables_ptr->qmf_dec_tables_ptr->sbr_alt_sin_twiddle_l64; |
| } |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| qmf_bank->filter_pos_syn += |
| (sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c - qmf_bank->p_filter); |
| qmf_bank->p_filter = sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c; |
| } else { |
| qmf_bank->filter_pos_syn += |
| (sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c_eld - qmf_bank->p_filter); |
| qmf_bank->p_filter = sbr_tables_ptr->qmf_dec_tables_ptr->qmf_c_eld; |
| } |
| |
| fp1 = &filter_states[0]; |
| fp2 = fp1 + no_synthesis_channels; |
| |
| if (audio_object_type == AOT_ER_AAC_ELD || |
| audio_object_type == AOT_ER_AAC_LD) { |
| fp1 = qmf_bank->fp1_syn; |
| fp2 = qmf_bank->fp2_syn; |
| sixty4 = qmf_bank->sixty4; |
| } |
| |
| filter_coeff = qmf_bank->filter_pos_syn; |
| |
| if (active) { |
| code_scale_factor = scale_factor = sbr_scale_factor->ps_scale; |
| } else { |
| code_scale_factor = ixheaacd_min32(lb_scale, ov_lb_scale); |
| scale_factor = sbr_scale_factor->hb_scale; |
| } |
| |
| low_band_scale_factor = (st_syn_scale - code_scale_factor); |
| high_band_scale_factor = (st_syn_scale - scale_factor); |
| |
| p1 = 0; |
| |
| if (low_pow_flag) |
| |
| { |
| ov_lb_shift = (st_syn_scale - ov_lb_scale) - 4; |
| lb_shift = (st_syn_scale - lb_scale) - 4; |
| hb_shift = high_band_scale_factor - 4; |
| out_scale_factor = -((sbr_scale_factor->st_syn_scale - 1)); |
| ptr_qmf_imag_temp = 0; |
| |
| } |
| |
| else { |
| out_scale_factor = -((sbr_scale_factor->st_syn_scale - 3)); |
| if (active) { |
| ov_lb_shift = (sbr_scale_factor->ps_scale - ov_lb_scale); |
| lb_shift = (sbr_scale_factor->ps_scale - lb_scale); |
| hb_shift = (sbr_scale_factor->ps_scale - sbr_scale_factor->hb_scale); |
| common_shift = low_band_scale_factor - 8; |
| |
| } else { |
| if (audio_object_type != AOT_ER_AAC_ELD && |
| audio_object_type != AOT_ER_AAC_LD) { |
| ov_lb_shift = (st_syn_scale - ov_lb_scale) - 8; |
| lb_shift = (st_syn_scale - lb_scale) - 8; |
| hb_shift = high_band_scale_factor - 8; |
| } else { |
| ov_lb_shift = (st_syn_scale - ov_lb_scale) - 7; |
| lb_shift = (st_syn_scale - lb_scale) - 7; |
| hb_shift = high_band_scale_factor - 7; |
| } |
| common_shift = 0; |
| } |
| ptr_qmf_imag_temp = qmf_imag; |
| } |
| |
| { |
| if (ov_lb_shift == lb_shift) { |
| (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, 0, qmf_bank->lsb, 0, |
| num_time_slots, ov_lb_shift, low_pow_flag); |
| |
| } else { |
| (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, 0, qmf_bank->lsb, 0, |
| split, ov_lb_shift, low_pow_flag); |
| |
| (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, 0, qmf_bank->lsb, |
| split, num_time_slots, lb_shift, low_pow_flag); |
| } |
| |
| (*ixheaacd_adjust_scale)(qmf_real, ptr_qmf_imag_temp, qmf_bank->lsb, |
| qmf_bank->usb, 0, num_time_slots, hb_shift, |
| low_pow_flag); |
| } |
| |
| ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset; |
| |
| if (1 == drc_on) { |
| for (i = 0; i < num_time_slots; i++) { |
| WORD32 loop_val; |
| for (loop_val = 0; loop_val < 64; loop_val++) { |
| qmf_real[i][loop_val] = ixheaacd_mult32x32in32_shift25( |
| qmf_real[i][loop_val], drc_sbr_factors[6 + i][loop_val]); |
| } |
| } |
| } |
| |
| if (low_pow_flag) |
| |
| { |
| WORD16 *fptemp; |
| |
| VOID(*sbr_qmf_syn_winadd) |
| (WORD16 *, WORD16 *, WORD16 *, WORD16 *, FLAG, WORD32); |
| ia_qmf_dec_tables_struct *qmf_tab_ptr = sbr_tables_ptr->qmf_dec_tables_ptr; |
| |
| if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) |
| sbr_qmf_syn_winadd = ixheaacd_sbr_qmfsyn32_winadd; |
| else |
| sbr_qmf_syn_winadd = ixheaacd_sbr_qmfsyn64_winadd; |
| |
| for (i = 0; i < num_time_slots; i++) { |
| ixheaacd_inv_modulation_lp(qmf_real[i], |
| &filter_states[ixheaacd_drc_offset], qmf_bank, |
| qmf_tab_ptr); |
| |
| sbr_qmf_syn_winadd(fp1, fp2, filter_coeff, &time_out[ch_fac * p1], 2, |
| ch_fac); |
| |
| ixheaacd_drc_offset -= no_synthesis_channels << 1; |
| |
| if (ixheaacd_drc_offset < 0) |
| ixheaacd_drc_offset += ((no_synthesis_channels << 1) * 10); |
| |
| fptemp = fp1; |
| fp1 = fp2; |
| fp2 = fptemp; |
| |
| filter_coeff += 64; |
| |
| if (filter_coeff == qmf_bank->p_filter + 640) |
| filter_coeff = (WORD16 *)qmf_bank->p_filter; |
| |
| p1 += no_synthesis_channels; |
| } |
| |
| } else { |
| for (i = 0; i < num_time_slots; i++) { |
| WORD32 *t_qmf_imag; |
| t_qmf_imag = qmf_imag[i]; |
| |
| if (active) { |
| if (i == ptr_ps_dec->border_position[env]) { |
| ixheaacd_init_rot_env(ptr_ps_dec, (WORD16)env, qmf_bank->usb, |
| sbr_tables_ptr, pstr_common_tables->trig_data); |
| env++; |
| } |
| |
| ixheaacd_apply_ps(ptr_ps_dec, &qmf_real[i], &qmf_imag[i], qmf_real_tmp, |
| qmf_imag_tmp, sbr_scale_factor, (WORD16)i, |
| sbr_tables_ptr); |
| } |
| if (1 == drc_on) { |
| WORD32 loop_val; |
| for (loop_val = 0; loop_val < 64; loop_val++) { |
| qmf_real[i][loop_val] = ixheaacd_mult32x32in32_shift25( |
| qmf_real[i][loop_val], drc_sbr_factors[6 + i][loop_val]); |
| } |
| } |
| |
| if (active) { |
| if (common_shift) |
| ixheaacd_shiftrountine(qmf_real[i], t_qmf_imag, no_synthesis_channels, |
| common_shift); |
| } |
| |
| if (audio_object_type == AOT_ER_AAC_ELD || |
| audio_object_type == AOT_ER_AAC_LD) |
| ixheaacd_sbr_pre_twiddle( |
| qmf_real[i], t_qmf_imag, |
| sbr_tables_ptr->qmf_dec_tables_ptr->ixheaacd_sbr_synth_cos_sin_l32); |
| |
| ixheaacd_inv_emodulation(qmf_real[i], qmf_bank, |
| sbr_tables_ptr->qmf_dec_tables_ptr); |
| |
| { |
| WORD32 temp_out_scale_fac = out_scale_factor + 1; |
| if (audio_object_type == AOT_ER_AAC_LD || |
| audio_object_type == AOT_ER_AAC_ELD) { |
| temp_out_scale_fac = temp_out_scale_fac - 1; |
| |
| ixheaacd_shiftrountine_with_rnd_eld( |
| qmf_real[i], t_qmf_imag, &filter_states[ixheaacd_drc_offset], |
| no_synthesis_channels, temp_out_scale_fac); |
| |
| } |
| |
| else { |
| ixheaacd_shiftrountine_with_rnd( |
| qmf_real[i], t_qmf_imag, &filter_states[ixheaacd_drc_offset], |
| no_synthesis_channels, temp_out_scale_fac); |
| } |
| } |
| |
| if (no_synthesis_channels == NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED) { |
| WORD32 temp = 1; |
| if (audio_object_type == AOT_ER_AAC_LD || |
| audio_object_type == AOT_ER_AAC_ELD) { |
| temp = 2; |
| } |
| ixheaacd_sbr_qmfsyn32_winadd(fp1, fp2, filter_coeff, |
| &time_out[ch_fac * p1], temp, ch_fac); |
| |
| fp1 += thirty2; |
| fp2 -= thirty2; |
| thirty2 = -thirty2; |
| |
| ixheaacd_drc_offset -= 64; |
| |
| if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 640; |
| |
| } else { |
| WORD32 temp = 1; |
| if (audio_object_type == AOT_ER_AAC_LD || |
| audio_object_type == AOT_ER_AAC_ELD) { |
| temp = 2; |
| } |
| ixheaacd_sbr_qmfsyn64_winadd(fp1, fp2, filter_coeff, |
| &time_out[ch_fac * p1], temp, ch_fac); |
| |
| fp1 += sixty4; |
| fp2 -= sixty4; |
| sixty4 = -sixty4; |
| ixheaacd_drc_offset -= 128; |
| |
| if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280; |
| } |
| |
| filter_coeff += 64; |
| |
| if (filter_coeff == qmf_bank->p_filter + 640) |
| filter_coeff = (WORD16 *)qmf_bank->p_filter; |
| |
| p1 += no_synthesis_channels; |
| |
| if (active) |
| memcpy(qmf_real[i], qmf_real_tmp, |
| 2 * no_synthesis_channels * sizeof(WORD32)); |
| } |
| } |
| |
| if (audio_object_type == AOT_ER_AAC_LD || |
| audio_object_type == AOT_ER_AAC_ELD) { |
| qmf_bank->fp1_syn = fp1; |
| qmf_bank->fp2_syn = fp2; |
| qmf_bank->sixty4 = sixty4; |
| } |
| |
| qmf_bank->filter_pos_syn = filter_coeff; |
| qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset; |
| } |