1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_decor.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_hybfilter.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_mdct_2_qmf.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_get_index.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_basic_op.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
48*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mdct_2_qmf(ia_heaac_mps_state_struct * pstr_mps_state)49*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_mdct_2_qmf(ia_heaac_mps_state_struct *pstr_mps_state) {
50*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
51*15dc779aSAndroid Build Coastguard Worker WORD32 ch, rfpsf, qb;
52*15dc779aSAndroid Build Coastguard Worker WORD32 qmf_global_offset;
53*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = pstr_mps_state->time_slots;
54*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots_x4 = (time_slots << 2);
55*15dc779aSAndroid Build Coastguard Worker WORD32 qmf_bands = pstr_mps_state->qmf_bands;
56*15dc779aSAndroid Build Coastguard Worker WORD32 *p_qmf_residual_real_post, *p_qmf_residual_imag_post;
57*15dc779aSAndroid Build Coastguard Worker VOID *scratch = pstr_mps_state->mps_scratch_mem_v;
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->up_mix_type != 2) {
60*15dc779aSAndroid Build Coastguard Worker WORD32 num_ch = pstr_mps_state->num_ott_boxes + pstr_mps_state->num_ttt_boxes;
61*15dc779aSAndroid Build Coastguard Worker WORD32 rfpsf_max = pstr_mps_state->residual_frames_per_spatial_frame;
62*15dc779aSAndroid Build Coastguard Worker WORD32 upd_qmf = pstr_mps_state->upd_qmf;
63*15dc779aSAndroid Build Coastguard Worker
64*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_real_pre = p_array_struct->qmf_residual_real_pre;
65*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_real_post = p_array_struct->qmf_residual_real_post;
66*15dc779aSAndroid Build Coastguard Worker
67*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_imag_pre = p_array_struct->qmf_residual_imag_pre;
68*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_imag_post = p_array_struct->qmf_residual_imag_post;
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker WORD32 *p_res_mdct = p_array_struct->res_mdct;
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ch; ch++) {
73*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->bs_config.bs_residual_present[ch]) {
74*15dc779aSAndroid Build Coastguard Worker WORD32 *res_mdct = p_res_mdct;
75*15dc779aSAndroid Build Coastguard Worker qmf_global_offset = 0;
76*15dc779aSAndroid Build Coastguard Worker
77*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_real_post = qmf_residual_real_post;
78*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_imag_post = qmf_residual_imag_post;
79*15dc779aSAndroid Build Coastguard Worker for (qb = 0; qb < qmf_bands; qb++) {
80*15dc779aSAndroid Build Coastguard Worker memset(p_qmf_residual_real_post, 0, time_slots_x4);
81*15dc779aSAndroid Build Coastguard Worker memset(p_qmf_residual_imag_post, 0, time_slots_x4);
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_real_post += MAX_TIME_SLOTS;
84*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_imag_post += MAX_TIME_SLOTS;
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker
87*15dc779aSAndroid Build Coastguard Worker for (rfpsf = 0; rfpsf < rfpsf_max; rfpsf++) {
88*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdct2qmf_process(upd_qmf, res_mdct, qmf_residual_real_pre,
89*15dc779aSAndroid Build Coastguard Worker qmf_residual_real_post, qmf_residual_imag_pre,
90*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag_post,
91*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->res_block_type[ch][rfpsf], qmf_global_offset,
92*15dc779aSAndroid Build Coastguard Worker &(pstr_mps_state->ia_mps_dec_mps_table), scratch, time_slots);
93*15dc779aSAndroid Build Coastguard Worker qmf_global_offset += upd_qmf;
94*15dc779aSAndroid Build Coastguard Worker res_mdct += MDCTCOEFX2;
95*15dc779aSAndroid Build Coastguard Worker }
96*15dc779aSAndroid Build Coastguard Worker }
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker qmf_residual_real_pre += QBXTS;
99*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag_pre += QBXTS;
100*15dc779aSAndroid Build Coastguard Worker
101*15dc779aSAndroid Build Coastguard Worker qmf_residual_real_post += QBXTS;
102*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag_post += QBXTS;
103*15dc779aSAndroid Build Coastguard Worker
104*15dc779aSAndroid Build Coastguard Worker p_res_mdct += RFX2XMDCTCOEF;
105*15dc779aSAndroid Build Coastguard Worker }
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->arbitrary_downmix == 2) {
109*15dc779aSAndroid Build Coastguard Worker WORD32 arbdmx_upd_qmf = pstr_mps_state->arbdmx_upd_qmf;
110*15dc779aSAndroid Build Coastguard Worker WORD32 offset = pstr_mps_state->num_ott_boxes + pstr_mps_state->num_ttt_boxes;
111*15dc779aSAndroid Build Coastguard Worker WORD32 in_ch = pstr_mps_state->num_input_channels;
112*15dc779aSAndroid Build Coastguard Worker WORD32 rfpsf_max = pstr_mps_state->arbdmx_frames_per_spatial_frame;
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_real_pre = p_array_struct->qmf_residual_real_pre + offset * QBXTS;
115*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_imag_pre = p_array_struct->qmf_residual_imag_pre + offset * QBXTS;
116*15dc779aSAndroid Build Coastguard Worker
117*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_real_post = p_array_struct->qmf_residual_real_post + offset * QBXTS;
118*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_imag_post = p_array_struct->qmf_residual_imag_post + offset * QBXTS;
119*15dc779aSAndroid Build Coastguard Worker
120*15dc779aSAndroid Build Coastguard Worker WORD32 *p_res_mdct = p_array_struct->res_mdct + offset * RFX2XMDCTCOEF;
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < in_ch; ch++) {
123*15dc779aSAndroid Build Coastguard Worker WORD32 *res_mdct = p_res_mdct;
124*15dc779aSAndroid Build Coastguard Worker qmf_global_offset = 0;
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_real_post = qmf_residual_real_post;
127*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_imag_post = qmf_residual_imag_post;
128*15dc779aSAndroid Build Coastguard Worker for (qb = 0; qb < qmf_bands; qb++) {
129*15dc779aSAndroid Build Coastguard Worker memset(p_qmf_residual_real_post, 0, time_slots_x4);
130*15dc779aSAndroid Build Coastguard Worker memset(p_qmf_residual_imag_post, 0, time_slots_x4);
131*15dc779aSAndroid Build Coastguard Worker
132*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_real_post += MAX_TIME_SLOTS;
133*15dc779aSAndroid Build Coastguard Worker p_qmf_residual_imag_post += MAX_TIME_SLOTS;
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker
136*15dc779aSAndroid Build Coastguard Worker for (rfpsf = 0; rfpsf < rfpsf_max; rfpsf++) {
137*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdct2qmf_process(
138*15dc779aSAndroid Build Coastguard Worker arbdmx_upd_qmf, res_mdct, qmf_residual_real_pre, qmf_residual_real_post,
139*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag_pre, qmf_residual_imag_post,
140*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->res_block_type[offset + ch][rfpsf], qmf_global_offset,
141*15dc779aSAndroid Build Coastguard Worker &(pstr_mps_state->ia_mps_dec_mps_table), scratch, time_slots);
142*15dc779aSAndroid Build Coastguard Worker qmf_global_offset += arbdmx_upd_qmf;
143*15dc779aSAndroid Build Coastguard Worker res_mdct += MDCTCOEFX2;
144*15dc779aSAndroid Build Coastguard Worker }
145*15dc779aSAndroid Build Coastguard Worker
146*15dc779aSAndroid Build Coastguard Worker qmf_residual_real_pre += QBXTS;
147*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag_pre += QBXTS;
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag_post += QBXTS;
150*15dc779aSAndroid Build Coastguard Worker qmf_residual_real_post += QBXTS;
151*15dc779aSAndroid Build Coastguard Worker
152*15dc779aSAndroid Build Coastguard Worker p_res_mdct += RFX2XMDCTCOEF;
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker return;
156*15dc779aSAndroid Build Coastguard Worker }
157*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hybrid_qmf_analysis(ia_heaac_mps_state_struct * pstr_mps_state)158*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hybrid_qmf_analysis(ia_heaac_mps_state_struct *pstr_mps_state) {
159*15dc779aSAndroid Build Coastguard Worker WORD32 ch;
160*15dc779aSAndroid Build Coastguard Worker WORD32 in_ch = pstr_mps_state->num_input_channels;
161*15dc779aSAndroid Build Coastguard Worker WORD32 num_ott_boxes = pstr_mps_state->num_ott_boxes;
162*15dc779aSAndroid Build Coastguard Worker WORD32 num_ttt_boxes = pstr_mps_state->num_ttt_boxes;
163*15dc779aSAndroid Build Coastguard Worker WORD32 num_input_channels = in_ch;
164*15dc779aSAndroid Build Coastguard Worker WORD32 qmf_bands = pstr_mps_state->qmf_bands;
165*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = pstr_mps_state->time_slots;
166*15dc779aSAndroid Build Coastguard Worker WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
167*15dc779aSAndroid Build Coastguard Worker WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
168*15dc779aSAndroid Build Coastguard Worker SIZE_T *kernels = pstr_mps_state->kernels;
169*15dc779aSAndroid Build Coastguard Worker WORD32 *res_bands = pstr_mps_state->res_bands;
170*15dc779aSAndroid Build Coastguard Worker WORD32 *index = pstr_mps_state->index;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_thyb_filter_state_struct *hyb_filter_state =
173*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->mps_persistent_mem.hyb_filter_state;
174*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_hybrid_tables_struct *hybrid_table_ptr =
177*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->ia_mps_dec_mps_table.hybrid_table_ptr;
178*15dc779aSAndroid Build Coastguard Worker
179*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_real = p_array_struct->buf_real;
180*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_imag = p_array_struct->buf_imag;
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_real = p_array_struct->x_real;
183*15dc779aSAndroid Build Coastguard Worker WORD32 *p_x_imag = p_array_struct->x_imag;
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < in_ch; ch++) {
186*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_ana_hyb_filt_bank_create_x(&hyb_filter_state[ch], p_buf_real, p_buf_imag,
187*15dc779aSAndroid Build Coastguard Worker qmf_bands, time_slots, p_x_real, p_x_imag,
188*15dc779aSAndroid Build Coastguard Worker hybrid_table_ptr);
189*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->index[ch] = hybrid_bands;
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
192*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
195*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
196*15dc779aSAndroid Build Coastguard Worker }
197*15dc779aSAndroid Build Coastguard Worker
198*15dc779aSAndroid Build Coastguard Worker if ((pstr_mps_state->residual_coding) && (pstr_mps_state->up_mix_type != 2)) {
199*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_real = p_array_struct->qmf_residual_real_pre;
200*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_imag = p_array_struct->qmf_residual_imag_pre;
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dry_real = p_array_struct->w_dry_real;
203*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dry_imag = p_array_struct->w_dry_imag;
204*15dc779aSAndroid Build Coastguard Worker
205*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_ott_boxes; ch++) {
206*15dc779aSAndroid Build Coastguard Worker if (res_bands[ch] > 0) {
207*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_ana_hyb_filt_bank_merge_res_decor(
208*15dc779aSAndroid Build Coastguard Worker &hyb_filter_state[ch + num_input_channels], qmf_residual_real, qmf_residual_imag,
209*15dc779aSAndroid Build Coastguard Worker qmf_bands, time_slots, p_dry_real, p_dry_imag, hybrid_table_ptr);
210*15dc779aSAndroid Build Coastguard Worker }
211*15dc779aSAndroid Build Coastguard Worker qmf_residual_real += QBXTS;
212*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag += QBXTS;
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker p_dry_real += TSXHB;
215*15dc779aSAndroid Build Coastguard Worker p_dry_imag += TSXHB;
216*15dc779aSAndroid Build Coastguard Worker }
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker for (ch = num_ott_boxes; ch < num_ott_boxes + num_ttt_boxes; ch++, in_ch++) {
219*15dc779aSAndroid Build Coastguard Worker if (res_bands[ch] > 0) {
220*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
221*15dc779aSAndroid Build Coastguard Worker &hyb_filter_state[ch + num_input_channels], qmf_residual_real, qmf_residual_imag,
222*15dc779aSAndroid Build Coastguard Worker qmf_bands, time_slots, p_x_real, p_x_imag, kernels, res_bands[ch], hybrid_bands,
223*15dc779aSAndroid Build Coastguard Worker num_parameter_bands, &index[in_ch], hybrid_table_ptr);
224*15dc779aSAndroid Build Coastguard Worker } else
225*15dc779aSAndroid Build Coastguard Worker index[in_ch] = 0;
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker qmf_residual_real += QBXTS;
228*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag += QBXTS;
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
231*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker in_ch = num_input_channels + num_ttt_boxes;
236*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->arbitrary_downmix == 2) {
237*15dc779aSAndroid Build Coastguard Worker WORD32 offset = num_ott_boxes + num_ttt_boxes;
238*15dc779aSAndroid Build Coastguard Worker
239*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_real = p_array_struct->qmf_residual_real_pre + offset * QBXTS;
240*15dc779aSAndroid Build Coastguard Worker WORD32 *qmf_residual_imag = p_array_struct->qmf_residual_imag_pre + offset * QBXTS;
241*15dc779aSAndroid Build Coastguard Worker
242*15dc779aSAndroid Build Coastguard Worker p_x_real = p_array_struct->x_real + in_ch * TSXHB;
243*15dc779aSAndroid Build Coastguard Worker p_x_imag = p_array_struct->x_imag + in_ch * TSXHB;
244*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < num_input_channels; ch++, in_ch++) {
245*15dc779aSAndroid Build Coastguard Worker ixheaacd_apply_ana_hyb_filt_bank_create_x_res(
246*15dc779aSAndroid Build Coastguard Worker &hyb_filter_state[offset + ch + num_input_channels], qmf_residual_real,
247*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag, qmf_bands, time_slots, p_x_real, p_x_imag, kernels,
248*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->arbdmx_residual_bands, hybrid_bands, num_parameter_bands, &index[in_ch],
249*15dc779aSAndroid Build Coastguard Worker hybrid_table_ptr);
250*15dc779aSAndroid Build Coastguard Worker
251*15dc779aSAndroid Build Coastguard Worker qmf_residual_real += QBXTS;
252*15dc779aSAndroid Build Coastguard Worker qmf_residual_imag += QBXTS;
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker p_x_real += TSXHB;
255*15dc779aSAndroid Build Coastguard Worker p_x_imag += TSXHB;
256*15dc779aSAndroid Build Coastguard Worker }
257*15dc779aSAndroid Build Coastguard Worker }
258*15dc779aSAndroid Build Coastguard Worker }
259*15dc779aSAndroid Build Coastguard Worker
ixheaacd_merge_res_decor(ia_heaac_mps_state_struct * pstr_mps_state)260*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_merge_res_decor(ia_heaac_mps_state_struct *pstr_mps_state) {
261*15dc779aSAndroid Build Coastguard Worker WORD32 ts, qs, row, res;
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker WORD32 temp_1;
264*15dc779aSAndroid Build Coastguard Worker SIZE_T *idx;
265*15dc779aSAndroid Build Coastguard Worker
266*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
267*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
268*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = pstr_mps_state->time_slots;
269*15dc779aSAndroid Build Coastguard Worker WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
270*15dc779aSAndroid Build Coastguard Worker WORD32 num_direct_signals = pstr_mps_state->num_direct_signals;
271*15dc779aSAndroid Build Coastguard Worker WORD32 num_w_channels = pstr_mps_state->num_w_channels;
272*15dc779aSAndroid Build Coastguard Worker WORD32 num_parameter_bands = pstr_mps_state->num_parameter_bands;
273*15dc779aSAndroid Build Coastguard Worker SIZE_T *kernels_ptr = pstr_mps_state->kernels;
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
276*15dc779aSAndroid Build Coastguard Worker WORD32 *buf_real_ch4, *buf_imag_ch4;
277*15dc779aSAndroid Build Coastguard Worker WORD32 *buf_real_ch3, *buf_imag_ch3;
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker p_buf_real = p_array_struct->buffer_real + TSXHBX5;
280*15dc779aSAndroid Build Coastguard Worker p_buf_imag = p_array_struct->buffer_imag + TSXHBX5;
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker for (ts = 0; ts < time_slots; ts++) {
283*15dc779aSAndroid Build Coastguard Worker p_buf_re = p_buf_real;
284*15dc779aSAndroid Build Coastguard Worker p_buf_im = p_buf_imag;
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker buf_real_ch4 = p_buf_real - TSXHB;
287*15dc779aSAndroid Build Coastguard Worker buf_imag_ch4 = p_buf_imag - TSXHB;
288*15dc779aSAndroid Build Coastguard Worker
289*15dc779aSAndroid Build Coastguard Worker buf_real_ch3 = buf_real_ch4 - TSXHB;
290*15dc779aSAndroid Build Coastguard Worker buf_imag_ch3 = buf_imag_ch4 - TSXHB;
291*15dc779aSAndroid Build Coastguard Worker
292*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < hybrid_bands; qs++) {
293*15dc779aSAndroid Build Coastguard Worker if ((kernels_ptr[qs] < ((UWORD32)(p_aux_struct->ttt_config[0][0].stop_band)) &&
294*15dc779aSAndroid Build Coastguard Worker p_aux_struct->ttt_config[0][0].use_ttt_decorr) ||
295*15dc779aSAndroid Build Coastguard Worker (kernels_ptr[qs] >= ((UWORD32)p_aux_struct->ttt_config[1][0].start_band) &&
296*15dc779aSAndroid Build Coastguard Worker p_aux_struct->ttt_config[1][0].use_ttt_decorr)) {
297*15dc779aSAndroid Build Coastguard Worker temp_1 = (WORD32)ONE_BY_SQRT_TWO_Q30;
298*15dc779aSAndroid Build Coastguard Worker
299*15dc779aSAndroid Build Coastguard Worker *p_buf_re = ixheaacd_mps_mult32_shr_30(*p_buf_re, temp_1);
300*15dc779aSAndroid Build Coastguard Worker *p_buf_re += (*buf_real_ch3 + *buf_real_ch4);
301*15dc779aSAndroid Build Coastguard Worker
302*15dc779aSAndroid Build Coastguard Worker *p_buf_im = ixheaacd_mps_mult32_shr_30(*p_buf_im, temp_1);
303*15dc779aSAndroid Build Coastguard Worker *p_buf_im += (*buf_imag_ch3 + *buf_imag_ch4);
304*15dc779aSAndroid Build Coastguard Worker }
305*15dc779aSAndroid Build Coastguard Worker p_buf_re++;
306*15dc779aSAndroid Build Coastguard Worker p_buf_im++;
307*15dc779aSAndroid Build Coastguard Worker
308*15dc779aSAndroid Build Coastguard Worker buf_real_ch4++;
309*15dc779aSAndroid Build Coastguard Worker buf_imag_ch4++;
310*15dc779aSAndroid Build Coastguard Worker
311*15dc779aSAndroid Build Coastguard Worker buf_real_ch3++;
312*15dc779aSAndroid Build Coastguard Worker buf_imag_ch3++;
313*15dc779aSAndroid Build Coastguard Worker }
314*15dc779aSAndroid Build Coastguard Worker p_buf_real += MAX_HYBRID_BANDS;
315*15dc779aSAndroid Build Coastguard Worker p_buf_imag += MAX_HYBRID_BANDS;
316*15dc779aSAndroid Build Coastguard Worker }
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker if (pstr_mps_state->residual_coding) {
319*15dc779aSAndroid Build Coastguard Worker for (row = num_direct_signals; row < num_w_channels; row++) {
320*15dc779aSAndroid Build Coastguard Worker WORD32 resband;
321*15dc779aSAndroid Build Coastguard Worker res = ixheaacd_get_res_idx(pstr_mps_state, row);
322*15dc779aSAndroid Build Coastguard Worker resband = pstr_mps_state->res_bands[res];
323*15dc779aSAndroid Build Coastguard Worker
324*15dc779aSAndroid Build Coastguard Worker if (resband == 1 && (num_parameter_bands == 20 || num_parameter_bands == 28))
325*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->index[res] = 3;
326*15dc779aSAndroid Build Coastguard Worker else {
327*15dc779aSAndroid Build Coastguard Worker idx = &kernels_ptr[0];
328*15dc779aSAndroid Build Coastguard Worker for (qs = 0; qs < hybrid_bands; qs++) {
329*15dc779aSAndroid Build Coastguard Worker if (*idx++ >= (SIZE_T)resband) {
330*15dc779aSAndroid Build Coastguard Worker pstr_mps_state->index[res] = qs;
331*15dc779aSAndroid Build Coastguard Worker qs = hybrid_bands;
332*15dc779aSAndroid Build Coastguard Worker }
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker }
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker }
338*15dc779aSAndroid Build Coastguard Worker
ixheaacd_create_w(ia_heaac_mps_state_struct * pstr_mps_state)339*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_create_w(ia_heaac_mps_state_struct *pstr_mps_state) {
340*15dc779aSAndroid Build Coastguard Worker WORD32 k;
341*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
342*15dc779aSAndroid Build Coastguard Worker WORD32 num_direct_signals = pstr_mps_state->num_direct_signals;
343*15dc779aSAndroid Build Coastguard Worker WORD32 counter = num_direct_signals + pstr_mps_state->num_decor_signals;
344*15dc779aSAndroid Build Coastguard Worker WORD32 time_slots = pstr_mps_state->time_slots;
345*15dc779aSAndroid Build Coastguard Worker WORD32 offset = num_direct_signals * TSXHB;
346*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_real = p_array_struct->buf_real + offset;
347*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buffer_imag = p_array_struct->buf_imag + offset;
348*15dc779aSAndroid Build Coastguard Worker
349*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_real = p_array_struct->buffer_real + offset;
350*15dc779aSAndroid Build Coastguard Worker WORD32 *p_buf_imag = p_array_struct->buffer_imag + offset;
351*15dc779aSAndroid Build Coastguard Worker
352*15dc779aSAndroid Build Coastguard Worker for (k = num_direct_signals; k < counter; k++) {
353*15dc779aSAndroid Build Coastguard Worker ixheaacd_decorr_apply(pstr_mps_state, time_slots, p_buffer_real, p_buffer_imag, p_buf_real,
354*15dc779aSAndroid Build Coastguard Worker p_buf_imag, k);
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker p_buffer_real += TSXHB;
357*15dc779aSAndroid Build Coastguard Worker p_buffer_imag += TSXHB;
358*15dc779aSAndroid Build Coastguard Worker
359*15dc779aSAndroid Build Coastguard Worker p_buf_real += TSXHB;
360*15dc779aSAndroid Build Coastguard Worker p_buf_imag += TSXHB;
361*15dc779aSAndroid Build Coastguard Worker }
362*15dc779aSAndroid Build Coastguard Worker ixheaacd_merge_res_decor(pstr_mps_state);
363*15dc779aSAndroid Build Coastguard Worker }
364*15dc779aSAndroid Build Coastguard Worker
ixheaacd_update_buffers(ia_heaac_mps_state_struct * pstr_mps_state)365*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_update_buffers(ia_heaac_mps_state_struct *pstr_mps_state) {
366*15dc779aSAndroid Build Coastguard Worker ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
367*15dc779aSAndroid Build Coastguard Worker WORD32 *temp_addr = p_array_struct->qmf_residual_real_post;
368*15dc779aSAndroid Build Coastguard Worker p_array_struct->qmf_residual_real_post = p_array_struct->qmf_residual_real_pre;
369*15dc779aSAndroid Build Coastguard Worker p_array_struct->qmf_residual_real_pre = temp_addr;
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker temp_addr = p_array_struct->qmf_residual_imag_post;
372*15dc779aSAndroid Build Coastguard Worker p_array_struct->qmf_residual_imag_post = p_array_struct->qmf_residual_imag_pre;
373*15dc779aSAndroid Build Coastguard Worker p_array_struct->qmf_residual_imag_pre = temp_addr;
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker p_array_struct->buffer_real = p_array_struct->qmf_residual_real_post;
376*15dc779aSAndroid Build Coastguard Worker p_array_struct->buffer_imag = p_array_struct->qmf_residual_imag_post;
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker p_array_struct->m1_param = (ia_mps_dec_m1_param_struct *)p_array_struct->buffer_real;
379*15dc779aSAndroid Build Coastguard Worker }
380