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
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
25*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
26*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_fix.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_defines.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_param_extract.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_buf.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_lib.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_bitstream.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_struct_def.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_polyphase.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_nlc_enc.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_sac_hybfilter.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_spatial_bitstream.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_tree.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_rom.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_vector_functions.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
52*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_get_icc_correlation_coherence_border(const WORD32 aot,const WORD32 use_coherence_only)53*15dc779aSAndroid Build Coastguard Worker static UWORD8 ixheaace_mps_212_get_icc_correlation_coherence_border(
54*15dc779aSAndroid Build Coastguard Worker const WORD32 aot, const WORD32 use_coherence_only) {
55*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_box_subband_setup pstr_box_subband_setup;
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_ELD) {
58*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.p_subband_2_parameter_index_ld = (UWORD8 *)subband_2_parameter_ld;
59*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.icc_correlation_coherence_border = 5;
60*15dc779aSAndroid Build Coastguard Worker } else {
61*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.p_subband_2_parameter_index_ld = (UWORD8 *)subband_2_parameter_usac;
62*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.icc_correlation_coherence_border = 8;
63*15dc779aSAndroid Build Coastguard Worker }
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker return ((use_coherence_only) ? 0 : pstr_box_subband_setup.icc_correlation_coherence_border);
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_calc_correlation_vec(FLOAT32 * const data,const FLOAT32 * const data_real,const FLOAT32 * const power_data_1,const FLOAT32 * const power_data_2,const WORD32 icc_correlation_coherence_border)68*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_calc_correlation_vec(FLOAT32 *const data,
69*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const data_real,
70*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const power_data_1,
71*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const power_data_2,
72*15dc779aSAndroid Build Coastguard Worker const WORD32 icc_correlation_coherence_border) {
73*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
74*15dc779aSAndroid Build Coastguard Worker FLOAT32 p_12;
75*15dc779aSAndroid Build Coastguard Worker
76*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < icc_correlation_coherence_border; idx++) {
77*15dc779aSAndroid Build Coastguard Worker p_12 = power_data_1[idx] * power_data_2[idx];
78*15dc779aSAndroid Build Coastguard Worker if (p_12 > 0.0f) {
79*15dc779aSAndroid Build Coastguard Worker p_12 = 1.0f / ((FLOAT32)sqrt(p_12));
80*15dc779aSAndroid Build Coastguard Worker data[idx] = data_real[idx] * p_12;
81*15dc779aSAndroid Build Coastguard Worker } else {
82*15dc779aSAndroid Build Coastguard Worker data[idx] = 0.9995f;
83*15dc779aSAndroid Build Coastguard Worker }
84*15dc779aSAndroid Build Coastguard Worker }
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_calc_coherence_vec(FLOAT32 * const data,const FLOAT32 * const data_real,const FLOAT32 * const data_imag,const FLOAT32 * const power_data_1,const FLOAT32 * const power_data_2,const WORD32 icc_correlation_coherence_border)87*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_calc_coherence_vec(FLOAT32 *const data,
88*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const data_real,
89*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const data_imag,
90*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const power_data_1,
91*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const power_data_2,
92*15dc779aSAndroid Build Coastguard Worker const WORD32 icc_correlation_coherence_border) {
93*15dc779aSAndroid Build Coastguard Worker WORD32 idx;
94*15dc779aSAndroid Build Coastguard Worker FLOAT32 coh, p_12, p_12_ri;
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker for (idx = 0; idx < icc_correlation_coherence_border; idx++) {
97*15dc779aSAndroid Build Coastguard Worker p_12_ri = (FLOAT32)(sqrt(data_real[idx] * data_real[idx] + data_imag[idx] * data_imag[idx]));
98*15dc779aSAndroid Build Coastguard Worker p_12 = power_data_1[idx] * power_data_2[idx];
99*15dc779aSAndroid Build Coastguard Worker
100*15dc779aSAndroid Build Coastguard Worker if (p_12 > 0.0f) {
101*15dc779aSAndroid Build Coastguard Worker p_12 = 1.0f / ((FLOAT32)sqrt(p_12));
102*15dc779aSAndroid Build Coastguard Worker coh = p_12_ri * p_12;
103*15dc779aSAndroid Build Coastguard Worker data[idx] = coh;
104*15dc779aSAndroid Build Coastguard Worker } else {
105*15dc779aSAndroid Build Coastguard Worker data[idx] = 0.9995f;
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_quantize_coef(const FLOAT32 * const input,const WORD32 num_bands,const FLOAT32 * const quant_table,const WORD32 idx_offset,const WORD32 num_quant_steps,WORD8 * const quant_out)110*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_mps_212_quantize_coef(const FLOAT32 *const input, const WORD32 num_bands,
111*15dc779aSAndroid Build Coastguard Worker const FLOAT32 *const quant_table,
112*15dc779aSAndroid Build Coastguard Worker const WORD32 idx_offset, const WORD32 num_quant_steps,
113*15dc779aSAndroid Build Coastguard Worker WORD8 *const quant_out) {
114*15dc779aSAndroid Build Coastguard Worker WORD32 band;
115*15dc779aSAndroid Build Coastguard Worker WORD32 forward = (quant_table[1] >= quant_table[0]);
116*15dc779aSAndroid Build Coastguard Worker
117*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_bands; band++) {
118*15dc779aSAndroid Build Coastguard Worker FLOAT32 q_val;
119*15dc779aSAndroid Build Coastguard Worker FLOAT32 cur_val = input[band];
120*15dc779aSAndroid Build Coastguard Worker WORD32 upper = num_quant_steps - 1;
121*15dc779aSAndroid Build Coastguard Worker WORD32 lower = 0;
122*15dc779aSAndroid Build Coastguard Worker if (forward) {
123*15dc779aSAndroid Build Coastguard Worker while (upper - lower > 1) {
124*15dc779aSAndroid Build Coastguard Worker WORD32 idx = (lower + upper) >> 1;
125*15dc779aSAndroid Build Coastguard Worker q_val = quant_table[idx];
126*15dc779aSAndroid Build Coastguard Worker if (cur_val <= q_val) {
127*15dc779aSAndroid Build Coastguard Worker upper = idx;
128*15dc779aSAndroid Build Coastguard Worker } else {
129*15dc779aSAndroid Build Coastguard Worker lower = idx;
130*15dc779aSAndroid Build Coastguard Worker }
131*15dc779aSAndroid Build Coastguard Worker }
132*15dc779aSAndroid Build Coastguard Worker
133*15dc779aSAndroid Build Coastguard Worker if ((cur_val - quant_table[lower]) > (quant_table[upper] - cur_val)) {
134*15dc779aSAndroid Build Coastguard Worker quant_out[band] = (WORD8)(upper - idx_offset);
135*15dc779aSAndroid Build Coastguard Worker } else {
136*15dc779aSAndroid Build Coastguard Worker quant_out[band] = (WORD8)(lower - idx_offset);
137*15dc779aSAndroid Build Coastguard Worker }
138*15dc779aSAndroid Build Coastguard Worker } else {
139*15dc779aSAndroid Build Coastguard Worker while (upper - lower > 1) {
140*15dc779aSAndroid Build Coastguard Worker WORD32 idx = (lower + upper) >> 1;
141*15dc779aSAndroid Build Coastguard Worker q_val = quant_table[idx];
142*15dc779aSAndroid Build Coastguard Worker if (cur_val >= q_val) {
143*15dc779aSAndroid Build Coastguard Worker upper = idx;
144*15dc779aSAndroid Build Coastguard Worker } else {
145*15dc779aSAndroid Build Coastguard Worker lower = idx;
146*15dc779aSAndroid Build Coastguard Worker }
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker if ((cur_val - quant_table[lower]) < (quant_table[upper] - cur_val)) {
150*15dc779aSAndroid Build Coastguard Worker quant_out[band] = (WORD8)(upper - idx_offset);
151*15dc779aSAndroid Build Coastguard Worker } else {
152*15dc779aSAndroid Build Coastguard Worker quant_out[band] = (WORD8)(lower - idx_offset);
153*15dc779aSAndroid Build Coastguard Worker }
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker if (quant_out[band] != 0) {
156*15dc779aSAndroid Build Coastguard Worker quant_out[band] = quant_out[band];
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker }
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_calc_parameter_band_to_hybrid_band_offset(const WORD32 num_hybrid_bands,UWORD8 * ptr_parameter_band_2_hybrid_band_offset,WORD32 aot)161*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_mps_212_calc_parameter_band_to_hybrid_band_offset(
162*15dc779aSAndroid Build Coastguard Worker const WORD32 num_hybrid_bands, UWORD8 *ptr_parameter_band_2_hybrid_band_offset, WORD32 aot) {
163*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_box_subband_setup pstr_box_subband_setup;
164*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_ELD) {
165*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.p_subband_2_parameter_index_ld = (UWORD8 *)subband_2_parameter_ld;
166*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.icc_correlation_coherence_border = 5;
167*15dc779aSAndroid Build Coastguard Worker } else {
168*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.p_subband_2_parameter_index_ld = (UWORD8 *)subband_2_parameter_usac;
169*15dc779aSAndroid Build Coastguard Worker pstr_box_subband_setup.icc_correlation_coherence_border = 8;
170*15dc779aSAndroid Build Coastguard Worker }
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker const UWORD8 *p_subband_2_parameter_index;
173*15dc779aSAndroid Build Coastguard Worker
174*15dc779aSAndroid Build Coastguard Worker UWORD8 idx;
175*15dc779aSAndroid Build Coastguard Worker WORD32 band;
176*15dc779aSAndroid Build Coastguard Worker
177*15dc779aSAndroid Build Coastguard Worker p_subband_2_parameter_index = pstr_box_subband_setup.p_subband_2_parameter_index_ld;
178*15dc779aSAndroid Build Coastguard Worker
179*15dc779aSAndroid Build Coastguard Worker for (band = 0, idx = NUM_QMF_BANDS - 1; idx > NUM_QMF_BANDS - num_hybrid_bands; idx--) {
180*15dc779aSAndroid Build Coastguard Worker if (p_subband_2_parameter_index[idx - 1] - p_subband_2_parameter_index[idx]) {
181*15dc779aSAndroid Build Coastguard Worker ptr_parameter_band_2_hybrid_band_offset[band++] = (NUM_QMF_BANDS - idx);
182*15dc779aSAndroid Build Coastguard Worker }
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker ptr_parameter_band_2_hybrid_band_offset[band++] = (NUM_QMF_BANDS - idx);
185*15dc779aSAndroid Build Coastguard Worker }
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_mps_212_init_tto_box(ixheaace_mps_pstr_tto_box pstr_tto_box,const ixheaace_mps_tto_box_config * const pstr_tto_box_config,UWORD8 * ptr_parameter_band_2_hybrid_band_offset,WORD32 aot)188*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_init_tto_box(ixheaace_mps_pstr_tto_box pstr_tto_box,
189*15dc779aSAndroid Build Coastguard Worker const ixheaace_mps_tto_box_config *const pstr_tto_box_config,
190*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_parameter_band_2_hybrid_band_offset, WORD32 aot) {
191*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker {
194*15dc779aSAndroid Build Coastguard Worker memset(pstr_tto_box, 0, sizeof(ixheaace_mps_tto_box));
195*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->use_coarse_quant_cld_flag = pstr_tto_box_config->use_coarse_quant_cld_flag;
196*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->use_coarse_quant_icc_flag = pstr_tto_box_config->use_coarse_quant_icc_flag;
197*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->box_quant_mode = pstr_tto_box_config->box_quant_mode;
198*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->icc_correlation_coherence_border =
199*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_get_icc_correlation_coherence_border(
200*15dc779aSAndroid Build Coastguard Worker aot, pstr_tto_box_config->b_use_coherence_icc_only);
201*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->num_hybrid_bands_max = pstr_tto_box_config->num_hybrid_bands_max;
202*15dc779aSAndroid Build Coastguard Worker if (aot == 39) {
203*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->num_parameter_bands = IXHEAACE_MPS_SAC_BANDS_ld;
204*15dc779aSAndroid Build Coastguard Worker } else {
205*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->num_parameter_bands = IXHEAACE_MPS_SAC_BANDS_usac;
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->ptr_parameter_band_2_hybrid_band_offset =
208*15dc779aSAndroid Build Coastguard Worker ptr_parameter_band_2_hybrid_band_offset;
209*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->frame_keep_flag = pstr_tto_box_config->frame_keep_flag;
210*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->n_cld_quant_steps = pstr_tto_box->use_coarse_quant_cld_flag
211*15dc779aSAndroid Build Coastguard Worker ? IXHEAACE_MPS_MAX_CLD_QUANT_COARSE
212*15dc779aSAndroid Build Coastguard Worker : IXHEAACE_MPS_MAX_CLD_QUANT_FINE;
213*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->n_cld_quant_offset = pstr_tto_box->use_coarse_quant_cld_flag
214*15dc779aSAndroid Build Coastguard Worker ? IXHEAACE_MPS_OFFSET_CLD_QUANT_COARSE
215*15dc779aSAndroid Build Coastguard Worker : IXHEAACE_MPS_OFFSET_CLD_QUANT_FINE;
216*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->n_icc_quant_steps = pstr_tto_box->use_coarse_quant_icc_flag
217*15dc779aSAndroid Build Coastguard Worker ? IXHEAACE_MPS_MAX_ICC_QUANT_COARSE
218*15dc779aSAndroid Build Coastguard Worker : IXHEAACE_MPS_MAX_ICC_QUANT_FINE;
219*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->n_icc_quant_offset = pstr_tto_box->use_coarse_quant_icc_flag
220*15dc779aSAndroid Build Coastguard Worker ? IXHEAACE_MPS_OFFSET_ICC_QUANT_COARSE
221*15dc779aSAndroid Build Coastguard Worker : IXHEAACE_MPS_OFFSET_ICC_QUANT_FINE;
222*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->p_icc_quant_table =
223*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->use_coarse_quant_icc_flag ? icc_quant_table_coarse : icc_quant_table_fine;
224*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->p_cld_quant_table_enc = pstr_tto_box->use_coarse_quant_cld_flag
225*15dc779aSAndroid Build Coastguard Worker ? cld_quant_table_coarse_enc
226*15dc779aSAndroid Build Coastguard Worker : cld_quant_table_fine_enc;
227*15dc779aSAndroid Build Coastguard Worker
228*15dc779aSAndroid Build Coastguard Worker if ((pstr_tto_box->box_quant_mode != IXHEAACE_MPS_QUANTMODE_FINE) &&
229*15dc779aSAndroid Build Coastguard Worker (pstr_tto_box->box_quant_mode != IXHEAACE_MPS_QUANTMODE_EBQ1) &&
230*15dc779aSAndroid Build Coastguard Worker (pstr_tto_box->box_quant_mode != IXHEAACE_MPS_QUANTMODE_EBQ2)) {
231*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_MPS_INIT_FAILED;
232*15dc779aSAndroid Build Coastguard Worker }
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker return error;
235*15dc779aSAndroid Build Coastguard Worker }
236*15dc779aSAndroid Build Coastguard Worker
ixheaace_mps_212_apply_tto_box(ixheaace_mps_pstr_tto_box pstr_tto_box,const WORD32 num_time_slots,const WORD32 start_time_slot,const WORD32 num_hybrid_bands,ixheaace_cmplx_str pp_hybrid_data_1[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],ixheaace_cmplx_str pp_hybrid_data_2[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],WORD8 * const ptr_icc,UWORD8 * const pb_icc_quant_coarse,WORD8 * const ptr_cld,UWORD8 * const pb_cld_quant_coarse,const WORD32 b_use_bb_cues)237*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_mps_212_apply_tto_box(
238*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_pstr_tto_box pstr_tto_box, const WORD32 num_time_slots,
239*15dc779aSAndroid Build Coastguard Worker const WORD32 start_time_slot, const WORD32 num_hybrid_bands,
240*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str pp_hybrid_data_1[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS],
241*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str pp_hybrid_data_2[MAX_ANA_TIME_SLOT][MAX_QMF_BANDS], WORD8 *const ptr_icc,
242*15dc779aSAndroid Build Coastguard Worker UWORD8 *const pb_icc_quant_coarse, WORD8 *const ptr_cld, UWORD8 *const pb_cld_quant_coarse,
243*15dc779aSAndroid Build Coastguard Worker const WORD32 b_use_bb_cues) {
244*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error = IA_NO_ERROR;
245*15dc779aSAndroid Build Coastguard Worker
246*15dc779aSAndroid Build Coastguard Worker WORD32 j, band;
247*15dc779aSAndroid Build Coastguard Worker FLOAT32 power_hybrid_data_1[MAX_NUM_PARAM_BANDS] = {0};
248*15dc779aSAndroid Build Coastguard Worker FLOAT32 power_hybrid_data_2[MAX_NUM_PARAM_BANDS] = {0};
249*15dc779aSAndroid Build Coastguard Worker FLOAT32 prod_hybrid_data_real[MAX_NUM_PARAM_BANDS] = {0};
250*15dc779aSAndroid Build Coastguard Worker FLOAT32 prod_hybrid_data_imag[MAX_NUM_PARAM_BANDS] = {0};
251*15dc779aSAndroid Build Coastguard Worker const WORD32 num_param_bands = pstr_tto_box->num_parameter_bands;
252*15dc779aSAndroid Build Coastguard Worker const WORD32 use_box_quant_mode =
253*15dc779aSAndroid Build Coastguard Worker (pstr_tto_box->box_quant_mode == IXHEAACE_MPS_QUANTMODE_EBQ1) ||
254*15dc779aSAndroid Build Coastguard Worker (pstr_tto_box->box_quant_mode == IXHEAACE_MPS_QUANTMODE_EBQ2);
255*15dc779aSAndroid Build Coastguard Worker
256*15dc779aSAndroid Build Coastguard Worker if ((num_hybrid_bands < 0) || (num_hybrid_bands > pstr_tto_box->num_hybrid_bands_max)) {
257*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_CONFIG_NONFATAL_MPS_INVALID_CONFIG;
258*15dc779aSAndroid Build Coastguard Worker }
259*15dc779aSAndroid Build Coastguard Worker
260*15dc779aSAndroid Build Coastguard Worker for (j = 0, band = 0; band < num_param_bands; band++) {
261*15dc779aSAndroid Build Coastguard Worker FLOAT32 data_1, data_2;
262*15dc779aSAndroid Build Coastguard Worker data_1 = 0;
263*15dc779aSAndroid Build Coastguard Worker data_2 = 0;
264*15dc779aSAndroid Build Coastguard Worker for (; j < pstr_tto_box->ptr_parameter_band_2_hybrid_band_offset[band]; j++) {
265*15dc779aSAndroid Build Coastguard Worker data_1 += ixheaace_mps_212_sum_up_cplx_pow_2_dim_2(pp_hybrid_data_1, start_time_slot,
266*15dc779aSAndroid Build Coastguard Worker num_time_slots, j, j + 1);
267*15dc779aSAndroid Build Coastguard Worker data_2 += ixheaace_mps_212_sum_up_cplx_pow_2_dim_2(pp_hybrid_data_2, start_time_slot,
268*15dc779aSAndroid Build Coastguard Worker num_time_slots, j, j + 1);
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker
271*15dc779aSAndroid Build Coastguard Worker power_hybrid_data_1[band] = data_1;
272*15dc779aSAndroid Build Coastguard Worker power_hybrid_data_2[band] = data_2;
273*15dc779aSAndroid Build Coastguard Worker }
274*15dc779aSAndroid Build Coastguard Worker for (j = 0, band = 0; band < num_param_bands; band++) {
275*15dc779aSAndroid Build Coastguard Worker FLOAT32 data_real, data_imag;
276*15dc779aSAndroid Build Coastguard Worker data_real = data_imag = 0;
277*15dc779aSAndroid Build Coastguard Worker for (; j < pstr_tto_box->ptr_parameter_band_2_hybrid_band_offset[band]; j++) {
278*15dc779aSAndroid Build Coastguard Worker ixheaace_cmplx_str scalar_prod;
279*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_cplx_scalar_product(&scalar_prod, pp_hybrid_data_1, pp_hybrid_data_2,
280*15dc779aSAndroid Build Coastguard Worker start_time_slot, num_time_slots, j, j + 1);
281*15dc779aSAndroid Build Coastguard Worker data_real += scalar_prod.re;
282*15dc779aSAndroid Build Coastguard Worker data_imag += scalar_prod.im;
283*15dc779aSAndroid Build Coastguard Worker }
284*15dc779aSAndroid Build Coastguard Worker prod_hybrid_data_real[band] = data_real;
285*15dc779aSAndroid Build Coastguard Worker prod_hybrid_data_imag[band] = data_imag;
286*15dc779aSAndroid Build Coastguard Worker }
287*15dc779aSAndroid Build Coastguard Worker
288*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_calc_correlation_vec(pstr_tto_box->icc, prod_hybrid_data_real,
289*15dc779aSAndroid Build Coastguard Worker power_hybrid_data_1, power_hybrid_data_2,
290*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->icc_correlation_coherence_border);
291*15dc779aSAndroid Build Coastguard Worker
292*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_calc_coherence_vec(
293*15dc779aSAndroid Build Coastguard Worker &pstr_tto_box->icc[pstr_tto_box->icc_correlation_coherence_border],
294*15dc779aSAndroid Build Coastguard Worker &prod_hybrid_data_real[pstr_tto_box->icc_correlation_coherence_border],
295*15dc779aSAndroid Build Coastguard Worker &prod_hybrid_data_imag[pstr_tto_box->icc_correlation_coherence_border],
296*15dc779aSAndroid Build Coastguard Worker &power_hybrid_data_1[pstr_tto_box->icc_correlation_coherence_border],
297*15dc779aSAndroid Build Coastguard Worker &power_hybrid_data_2[pstr_tto_box->icc_correlation_coherence_border],
298*15dc779aSAndroid Build Coastguard Worker num_param_bands - pstr_tto_box->icc_correlation_coherence_border);
299*15dc779aSAndroid Build Coastguard Worker if (error) {
300*15dc779aSAndroid Build Coastguard Worker return error;
301*15dc779aSAndroid Build Coastguard Worker }
302*15dc779aSAndroid Build Coastguard Worker if (!use_box_quant_mode) {
303*15dc779aSAndroid Build Coastguard Worker FLOAT32 power_1, power_2, cld;
304*15dc779aSAndroid Build Coastguard Worker FLOAT32 max_pow = 30.0f;
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_param_bands; band++) {
307*15dc779aSAndroid Build Coastguard Worker power_1 = (FLOAT32)log(power_hybrid_data_1[band] / 2.0f);
308*15dc779aSAndroid Build Coastguard Worker power_2 = (FLOAT32)log(power_hybrid_data_2[band] / 2.0f);
309*15dc779aSAndroid Build Coastguard Worker power_1 = MAX(MIN(power_1, max_pow), -max_pow);
310*15dc779aSAndroid Build Coastguard Worker power_2 = MAX(MIN(power_2, max_pow), -max_pow);
311*15dc779aSAndroid Build Coastguard Worker cld = (INV_LN_10_10 * (power_1 - power_2));
312*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->cld[band] = cld;
313*15dc779aSAndroid Build Coastguard Worker }
314*15dc779aSAndroid Build Coastguard Worker }
315*15dc779aSAndroid Build Coastguard Worker
316*15dc779aSAndroid Build Coastguard Worker if (b_use_bb_cues) {
317*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp;
318*15dc779aSAndroid Build Coastguard Worker temp = 0;
319*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_param_bands; band++) {
320*15dc779aSAndroid Build Coastguard Worker temp += pstr_tto_box->cld[band];
321*15dc779aSAndroid Build Coastguard Worker }
322*15dc779aSAndroid Build Coastguard Worker temp /= num_param_bands;
323*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < num_param_bands; band++) {
324*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->cld[band] = temp;
325*15dc779aSAndroid Build Coastguard Worker }
326*15dc779aSAndroid Build Coastguard Worker }
327*15dc779aSAndroid Build Coastguard Worker
328*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_quantize_coef(
329*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->icc, num_param_bands, pstr_tto_box->p_icc_quant_table,
330*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->n_icc_quant_offset, pstr_tto_box->n_icc_quant_steps, ptr_icc);
331*15dc779aSAndroid Build Coastguard Worker
332*15dc779aSAndroid Build Coastguard Worker *pb_icc_quant_coarse = pstr_tto_box->use_coarse_quant_icc_flag;
333*15dc779aSAndroid Build Coastguard Worker
334*15dc779aSAndroid Build Coastguard Worker if (!use_box_quant_mode) {
335*15dc779aSAndroid Build Coastguard Worker ixheaace_mps_212_quantize_coef(
336*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->cld, num_param_bands, pstr_tto_box->p_cld_quant_table_enc,
337*15dc779aSAndroid Build Coastguard Worker pstr_tto_box->n_cld_quant_offset, pstr_tto_box->n_cld_quant_steps, ptr_cld);
338*15dc779aSAndroid Build Coastguard Worker } else {
339*15dc779aSAndroid Build Coastguard Worker memset(ptr_cld, 0, num_param_bands * sizeof(WORD8));
340*15dc779aSAndroid Build Coastguard Worker }
341*15dc779aSAndroid Build Coastguard Worker *pb_cld_quant_coarse = pstr_tto_box->use_coarse_quant_cld_flag;
342*15dc779aSAndroid Build Coastguard Worker
343*15dc779aSAndroid Build Coastguard Worker return error;
344*15dc779aSAndroid Build Coastguard Worker }
345