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
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_enc.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
35*15dc779aSAndroid Build Coastguard Worker
ixheaace_memcpy(void * dest,const void * src,WORD32 count)36*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_memcpy(void *dest, const void *src, WORD32 count) {
37*15dc779aSAndroid Build Coastguard Worker memcpy(dest, src, count);
38*15dc779aSAndroid Build Coastguard Worker }
39*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_downmix_to_mono(ixheaace_pstr_ps_enc pms,FLOAT32 ** qmf_left_real,FLOAT32 ** qmf_left_imag,FLOAT32 ** qmf_right_real,FLOAT32 ** qmf_right_imag,ixheaace_str_ps_tab * ps_tables)40*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_downmix_to_mono(ixheaace_pstr_ps_enc pms, FLOAT32 **qmf_left_real,
41*15dc779aSAndroid Build Coastguard Worker FLOAT32 **qmf_left_imag, FLOAT32 **qmf_right_real,
42*15dc779aSAndroid Build Coastguard Worker FLOAT32 **qmf_right_imag,
43*15dc779aSAndroid Build Coastguard Worker ixheaace_str_ps_tab *ps_tables) {
44*15dc779aSAndroid Build Coastguard Worker WORD32 i;
45*15dc779aSAndroid Build Coastguard Worker WORD32 group;
46*15dc779aSAndroid Build Coastguard Worker WORD32 subband;
47*15dc779aSAndroid Build Coastguard Worker WORD32 max_subband;
48*15dc779aSAndroid Build Coastguard Worker WORD32 subband_grp;
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_left_real;
51*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_left_imag;
52*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_right_real;
53*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_right_imag;
54*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp, temp2;
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < IXHEAACE_HYBRID_FILTER_DELAY; i++) {
57*15dc779aSAndroid Build Coastguard Worker ixheaace_memcpy(pms->temp_qmf_left_real[i],
58*15dc779aSAndroid Build Coastguard Worker qmf_left_real[NUMBER_OF_SUBSAMPLES - IXHEAACE_HYBRID_FILTER_DELAY + i],
59*15dc779aSAndroid Build Coastguard Worker NUMBER_OF_QMF_BANDS * sizeof(**qmf_left_real));
60*15dc779aSAndroid Build Coastguard Worker ixheaace_memcpy(pms->temp_qmf_left_imag[i],
61*15dc779aSAndroid Build Coastguard Worker qmf_left_imag[NUMBER_OF_SUBSAMPLES - IXHEAACE_HYBRID_FILTER_DELAY + i],
62*15dc779aSAndroid Build Coastguard Worker NUMBER_OF_QMF_BANDS * sizeof(**qmf_left_imag));
63*15dc779aSAndroid Build Coastguard Worker }
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker {
66*15dc779aSAndroid Build Coastguard Worker FLOAT32 *hybrid_left_real_init, *hybrid_right_real_init;
67*15dc779aSAndroid Build Coastguard Worker hybrid_left_real_init = pms->m_hybrid_real_left[0];
68*15dc779aSAndroid Build Coastguard Worker hybrid_right_real_init = pms->m_hybrid_real_right[0];
69*15dc779aSAndroid Build Coastguard Worker
70*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < SUBQMF_GROUPS_MIX; group++) {
71*15dc779aSAndroid Build Coastguard Worker FLOAT32 *hybrid_left_real, *hybrid_right_real;
72*15dc779aSAndroid Build Coastguard Worker
73*15dc779aSAndroid Build Coastguard Worker subband = ps_tables->grp_borders_mix[group];
74*15dc779aSAndroid Build Coastguard Worker hybrid_left_real = hybrid_left_real_init + subband;
75*15dc779aSAndroid Build Coastguard Worker hybrid_right_real = hybrid_right_real_init + subband;
76*15dc779aSAndroid Build Coastguard Worker
77*15dc779aSAndroid Build Coastguard Worker for (i = NUMBER_OF_SUBSAMPLES; i != 0; i--) {
78*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_left_real_1, temp_left_imag_1;
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker temp_left_real = hybrid_left_real[0];
81*15dc779aSAndroid Build Coastguard Worker hybrid_left_real += 32;
82*15dc779aSAndroid Build Coastguard Worker temp_left_imag = hybrid_left_real[-16];
83*15dc779aSAndroid Build Coastguard Worker temp_right_real = hybrid_right_real[0];
84*15dc779aSAndroid Build Coastguard Worker hybrid_right_real += 32;
85*15dc779aSAndroid Build Coastguard Worker temp_right_imag = hybrid_right_real[-16];
86*15dc779aSAndroid Build Coastguard Worker
87*15dc779aSAndroid Build Coastguard Worker temp_left_real_1 = temp_right_real + temp_left_real;
88*15dc779aSAndroid Build Coastguard Worker temp_left_imag_1 = temp_right_imag + temp_left_imag;
89*15dc779aSAndroid Build Coastguard Worker
90*15dc779aSAndroid Build Coastguard Worker temp2 = temp_left_real_1 * temp_left_real_1;
91*15dc779aSAndroid Build Coastguard Worker temp2 += temp_left_imag_1 * temp_left_imag_1;
92*15dc779aSAndroid Build Coastguard Worker temp2 /= 2.0f;
93*15dc779aSAndroid Build Coastguard Worker
94*15dc779aSAndroid Build Coastguard Worker temp = temp_left_real * temp_right_real;
95*15dc779aSAndroid Build Coastguard Worker temp += temp_left_imag * temp_right_imag;
96*15dc779aSAndroid Build Coastguard Worker
97*15dc779aSAndroid Build Coastguard Worker temp = temp2 - temp;
98*15dc779aSAndroid Build Coastguard Worker
99*15dc779aSAndroid Build Coastguard Worker if ((temp / 8.0f) >= temp2) {
100*15dc779aSAndroid Build Coastguard Worker temp_left_real = temp_left_real_1 * 2.0f;
101*15dc779aSAndroid Build Coastguard Worker temp_left_imag = temp_left_imag_1 * 2.0f;
102*15dc779aSAndroid Build Coastguard Worker } else {
103*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)sqrt(temp / (temp2 * 2.0f));
104*15dc779aSAndroid Build Coastguard Worker temp_left_real = temp_left_real_1 * temp;
105*15dc779aSAndroid Build Coastguard Worker temp_left_imag = temp_left_imag_1 * temp;
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker hybrid_left_real[-32] = temp_left_real;
109*15dc779aSAndroid Build Coastguard Worker hybrid_left_real[-16] = temp_left_imag;
110*15dc779aSAndroid Build Coastguard Worker }
111*15dc779aSAndroid Build Coastguard Worker }
112*15dc779aSAndroid Build Coastguard Worker }
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker for (; group < NUMBER_OF_IPD_GROUPS; group++) {
115*15dc779aSAndroid Build Coastguard Worker FLOAT32 *hybrid_left_real;
116*15dc779aSAndroid Build Coastguard Worker FLOAT32 *qmf_lre = qmf_left_real[NUMBER_OF_SUBSAMPLES - 1];
117*15dc779aSAndroid Build Coastguard Worker
118*15dc779aSAndroid Build Coastguard Worker subband_grp = ps_tables->grp_borders_mix[group];
119*15dc779aSAndroid Build Coastguard Worker max_subband = ps_tables->grp_borders_mix[group + 1];
120*15dc779aSAndroid Build Coastguard Worker
121*15dc779aSAndroid Build Coastguard Worker hybrid_left_real =
122*15dc779aSAndroid Build Coastguard Worker (qmf_left_real - IXHEAACE_HYBRID_FILTER_DELAY)[NUMBER_OF_SUBSAMPLES - 1] + 0X1000;
123*15dc779aSAndroid Build Coastguard Worker hybrid_left_real += subband_grp;
124*15dc779aSAndroid Build Coastguard Worker qmf_lre += subband_grp;
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker for (i = NUMBER_OF_SUBSAMPLES - 1; i >= IXHEAACE_HYBRID_FILTER_DELAY; i--) {
127*15dc779aSAndroid Build Coastguard Worker for (subband = max_subband - subband_grp; subband != 0; subband--) {
128*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_left_real_1, temp_left_imag_1;
129*15dc779aSAndroid Build Coastguard Worker
130*15dc779aSAndroid Build Coastguard Worker temp_left_real = hybrid_left_real[-0X1000];
131*15dc779aSAndroid Build Coastguard Worker temp_left_imag = hybrid_left_real[0];
132*15dc779aSAndroid Build Coastguard Worker temp_right_real = hybrid_left_real[-0X800];
133*15dc779aSAndroid Build Coastguard Worker temp_right_imag = hybrid_left_real[0X800];
134*15dc779aSAndroid Build Coastguard Worker
135*15dc779aSAndroid Build Coastguard Worker hybrid_left_real += 1;
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker temp_left_real_1 = temp_right_real + temp_left_real;
138*15dc779aSAndroid Build Coastguard Worker temp_left_imag_1 = temp_right_imag + temp_left_imag;
139*15dc779aSAndroid Build Coastguard Worker
140*15dc779aSAndroid Build Coastguard Worker temp2 = temp_left_real_1 * temp_left_real_1;
141*15dc779aSAndroid Build Coastguard Worker temp2 += temp_left_imag_1 * temp_left_imag_1;
142*15dc779aSAndroid Build Coastguard Worker temp2 /= 2.0f;
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker temp = temp_left_real * temp_right_real;
145*15dc779aSAndroid Build Coastguard Worker temp += temp_left_imag * temp_right_imag;
146*15dc779aSAndroid Build Coastguard Worker
147*15dc779aSAndroid Build Coastguard Worker temp = temp2 - temp;
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker if ((temp / 8.0f) >= temp2) {
150*15dc779aSAndroid Build Coastguard Worker temp_left_real = temp_left_real_1 * 2.0f;
151*15dc779aSAndroid Build Coastguard Worker temp_left_imag = temp_left_imag_1 * 2.0f;
152*15dc779aSAndroid Build Coastguard Worker } else {
153*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)sqrt(temp / (2.0f * temp2));
154*15dc779aSAndroid Build Coastguard Worker temp_left_real = temp_left_real_1 * temp;
155*15dc779aSAndroid Build Coastguard Worker temp_left_imag = temp_left_imag_1 * temp;
156*15dc779aSAndroid Build Coastguard Worker }
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker qmf_lre[0] = temp_left_real;
159*15dc779aSAndroid Build Coastguard Worker qmf_lre[0 + 0x1000] = temp_left_imag;
160*15dc779aSAndroid Build Coastguard Worker qmf_lre += 1;
161*15dc779aSAndroid Build Coastguard Worker }
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker hybrid_left_real -= max_subband - subband_grp;
164*15dc779aSAndroid Build Coastguard Worker qmf_lre -= max_subband - subband_grp;
165*15dc779aSAndroid Build Coastguard Worker qmf_lre -= 64;
166*15dc779aSAndroid Build Coastguard Worker hybrid_left_real -= 64;
167*15dc779aSAndroid Build Coastguard Worker }
168*15dc779aSAndroid Build Coastguard Worker
169*15dc779aSAndroid Build Coastguard Worker hybrid_left_real = pms->hist_qmf_left_real[IXHEAACE_HYBRID_FILTER_DELAY - 1];
170*15dc779aSAndroid Build Coastguard Worker hybrid_left_real += subband_grp;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker for (i = IXHEAACE_HYBRID_FILTER_DELAY - 1; i >= 0; i--) {
173*15dc779aSAndroid Build Coastguard Worker for (subband = max_subband - subband_grp; subband != 0; subband--) {
174*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_left_real_1, temp_left_imag_1;
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker temp_left_real = hybrid_left_real[0];
177*15dc779aSAndroid Build Coastguard Worker temp_left_imag = hybrid_left_real[0 + 0x40];
178*15dc779aSAndroid Build Coastguard Worker temp_right_real = hybrid_left_real[0 + 0x80];
179*15dc779aSAndroid Build Coastguard Worker temp_right_imag = hybrid_left_real[0 + 0xc0];
180*15dc779aSAndroid Build Coastguard Worker
181*15dc779aSAndroid Build Coastguard Worker temp_left_real_1 = temp_right_real + temp_left_real;
182*15dc779aSAndroid Build Coastguard Worker temp_left_imag_1 = temp_right_imag + temp_left_imag;
183*15dc779aSAndroid Build Coastguard Worker
184*15dc779aSAndroid Build Coastguard Worker temp2 = temp_left_real_1 * temp_left_real_1;
185*15dc779aSAndroid Build Coastguard Worker temp2 += temp_left_imag_1 * temp_left_imag_1;
186*15dc779aSAndroid Build Coastguard Worker temp2 /= 2.0f;
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker temp = temp_left_real * temp_right_real;
189*15dc779aSAndroid Build Coastguard Worker temp += temp_left_imag * temp_right_imag;
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker temp = temp2 - temp;
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker if ((temp / 8.0f) >= temp2) {
194*15dc779aSAndroid Build Coastguard Worker temp_left_real = temp_left_real_1 * 2.0f;
195*15dc779aSAndroid Build Coastguard Worker temp_left_imag = temp_left_imag_1 * 2.0f;
196*15dc779aSAndroid Build Coastguard Worker } else {
197*15dc779aSAndroid Build Coastguard Worker temp = (FLOAT32)sqrt(temp / (2.0f * temp2));
198*15dc779aSAndroid Build Coastguard Worker temp_left_real = temp_left_real_1 * temp;
199*15dc779aSAndroid Build Coastguard Worker temp_left_imag = temp_left_imag_1 * temp;
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker qmf_lre[0] = temp_left_real;
203*15dc779aSAndroid Build Coastguard Worker qmf_lre[0x1000] = temp_left_imag;
204*15dc779aSAndroid Build Coastguard Worker qmf_lre += 1;
205*15dc779aSAndroid Build Coastguard Worker hybrid_left_real += 1;
206*15dc779aSAndroid Build Coastguard Worker }
207*15dc779aSAndroid Build Coastguard Worker qmf_lre -= max_subband - subband_grp;
208*15dc779aSAndroid Build Coastguard Worker hybrid_left_real -= max_subband - subband_grp;
209*15dc779aSAndroid Build Coastguard Worker qmf_lre -= 64;
210*15dc779aSAndroid Build Coastguard Worker hybrid_left_real -= 0x100;
211*15dc779aSAndroid Build Coastguard Worker }
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < IXHEAACE_HYBRID_FILTER_DELAY; i++) {
215*15dc779aSAndroid Build Coastguard Worker ixheaace_memcpy(pms->hist_qmf_left_real[i], pms->temp_qmf_left_real[i],
216*15dc779aSAndroid Build Coastguard Worker NUMBER_OF_QMF_BANDS * sizeof(**qmf_left_real));
217*15dc779aSAndroid Build Coastguard Worker ixheaace_memcpy(pms->hist_qmf_left_imag[i], pms->temp_qmf_left_imag[i],
218*15dc779aSAndroid Build Coastguard Worker NUMBER_OF_QMF_BANDS * sizeof(**qmf_left_imag));
219*15dc779aSAndroid Build Coastguard Worker ixheaace_memcpy(pms->hist_qmf_right_real[i],
220*15dc779aSAndroid Build Coastguard Worker qmf_right_real[NUMBER_OF_SUBSAMPLES - IXHEAACE_HYBRID_FILTER_DELAY + i],
221*15dc779aSAndroid Build Coastguard Worker NUMBER_OF_QMF_BANDS * sizeof(**qmf_right_real));
222*15dc779aSAndroid Build Coastguard Worker ixheaace_memcpy(pms->hist_qmf_right_imag[i],
223*15dc779aSAndroid Build Coastguard Worker qmf_right_imag[NUMBER_OF_SUBSAMPLES - IXHEAACE_HYBRID_FILTER_DELAY + i],
224*15dc779aSAndroid Build Coastguard Worker NUMBER_OF_QMF_BANDS * sizeof(**qmf_right_imag));
225*15dc779aSAndroid Build Coastguard Worker }
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker ixheaace_hybrid_synthesis((const FLOAT32 **)pms->m_hybrid_real_left,
228*15dc779aSAndroid Build Coastguard Worker (const FLOAT32 **)pms->m_hybrid_imag_left, qmf_left_real,
229*15dc779aSAndroid Build Coastguard Worker qmf_left_imag, ps_tables->a_hyb_res);
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker
ixheaace_encode_ps_frame(ixheaace_pstr_ps_enc pms,FLOAT32 ** i_buffer_left,FLOAT32 ** r_buffer_left,FLOAT32 ** i_buffer_right,FLOAT32 ** r_buffer_right,ixheaace_str_ps_tab * ps_tables,ixheaace_comm_tables * common_tab)232*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaace_encode_ps_frame(ixheaace_pstr_ps_enc pms, FLOAT32 **i_buffer_left,
233*15dc779aSAndroid Build Coastguard Worker FLOAT32 **r_buffer_left, FLOAT32 **i_buffer_right,
234*15dc779aSAndroid Build Coastguard Worker FLOAT32 **r_buffer_right, ixheaace_str_ps_tab *ps_tables,
235*15dc779aSAndroid Build Coastguard Worker ixheaace_comm_tables *common_tab) {
236*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
237*15dc779aSAndroid Build Coastguard Worker WORD32 i;
238*15dc779aSAndroid Build Coastguard Worker WORD32 bin;
239*15dc779aSAndroid Build Coastguard Worker WORD32 subband, max_subband;
240*15dc779aSAndroid Build Coastguard Worker
241*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_hist_power_left;
242*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_hist_power_right;
243*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_hist_power_corr_real;
244*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_hist_power_corr_imag;
245*15dc779aSAndroid Build Coastguard Worker
246*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_power_left_env1;
247*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_power_right_env1;
248*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_power_corr_real_env1;
249*15dc779aSAndroid Build Coastguard Worker FLOAT32 band_power_corr_imag_env1;
250*15dc779aSAndroid Build Coastguard Worker FLOAT32 scratch_power_left_right_env2[2 * NUMBER_OF_BINS];
251*15dc779aSAndroid Build Coastguard Worker FLOAT32 scratch_power_corr_real_imag_env2[2 * NUMBER_OF_BINS];
252*15dc779aSAndroid Build Coastguard Worker
253*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybrid_left_imag_env1;
254*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybrid_left_real_env1;
255*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybrid_right_imag_env1;
256*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybrid_right_real_env1;
257*15dc779aSAndroid Build Coastguard Worker
258*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybrid_left_imag_env2;
259*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybrid_left_real_env2;
260*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybr_right_imag_env2;
261*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hybr_right_real_env2;
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hist_left_imag;
264*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hist_left_real;
265*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hist_right_imag;
266*15dc779aSAndroid Build Coastguard Worker FLOAT32 **hist_right_real;
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp1;
269*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp2;
270*15dc779aSAndroid Build Coastguard Worker
271*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_hist_pow_left;
272*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_hist_pow_right;
273*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_hist_pow_corr_real;
274*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_hist_pow_corr_imag;
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_left_env1;
277*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_right_env1;
278*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_corr_real_env1;
279*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_corr_imag_env1;
280*15dc779aSAndroid Build Coastguard Worker
281*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_left_env2;
282*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_right_env2;
283*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_corr_real_env2;
284*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_power_corr_imag_env2;
285*15dc779aSAndroid Build Coastguard Worker
286*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_hybrid_analysis((const FLOAT32 **)(r_buffer_left),
287*15dc779aSAndroid Build Coastguard Worker (const FLOAT32 **)(i_buffer_left), pms->m_hybrid_real_left,
288*15dc779aSAndroid Build Coastguard Worker pms->m_hybrid_imag_left, pms->ptr_hybrid_left, ps_tables,
289*15dc779aSAndroid Build Coastguard Worker common_tab->pstr_common_tab);
290*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
291*15dc779aSAndroid Build Coastguard Worker return err_code;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker err_code = ixheaace_hybrid_analysis(
295*15dc779aSAndroid Build Coastguard Worker (const FLOAT32 **)(r_buffer_right), (const FLOAT32 **)(i_buffer_right),
296*15dc779aSAndroid Build Coastguard Worker pms->m_hybrid_real_right, pms->m_hybrid_imag_right, pms->ptr_hybrid_right, ps_tables,
297*15dc779aSAndroid Build Coastguard Worker common_tab->pstr_common_tab);
298*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
299*15dc779aSAndroid Build Coastguard Worker return err_code;
300*15dc779aSAndroid Build Coastguard Worker }
301*15dc779aSAndroid Build Coastguard Worker
302*15dc779aSAndroid Build Coastguard Worker {
303*15dc779aSAndroid Build Coastguard Worker hybrid_left_real_env1 = pms->m_hybrid_real_left;
304*15dc779aSAndroid Build Coastguard Worker hybrid_left_imag_env1 = pms->m_hybrid_imag_left;
305*15dc779aSAndroid Build Coastguard Worker hybrid_right_real_env1 = pms->m_hybrid_real_right;
306*15dc779aSAndroid Build Coastguard Worker hybrid_right_imag_env1 = pms->m_hybrid_imag_right;
307*15dc779aSAndroid Build Coastguard Worker
308*15dc779aSAndroid Build Coastguard Worker hybrid_left_real_env2 = &(pms->m_hybrid_real_left[NUMBER_OF_SUBSAMPLES / 2]);
309*15dc779aSAndroid Build Coastguard Worker hybrid_left_imag_env2 = &(pms->m_hybrid_imag_left[NUMBER_OF_SUBSAMPLES / 2]);
310*15dc779aSAndroid Build Coastguard Worker hybr_right_real_env2 = &(pms->m_hybrid_real_right[NUMBER_OF_SUBSAMPLES / 2]);
311*15dc779aSAndroid Build Coastguard Worker hybr_right_imag_env2 = &(pms->m_hybrid_imag_right[NUMBER_OF_SUBSAMPLES / 2]);
312*15dc779aSAndroid Build Coastguard Worker
313*15dc779aSAndroid Build Coastguard Worker for (bin = 0; bin < SUBQMF_BINS_ENERGY; bin++) {
314*15dc779aSAndroid Build Coastguard Worker band_power_left_env1 = 0;
315*15dc779aSAndroid Build Coastguard Worker band_power_right_env1 = 0;
316*15dc779aSAndroid Build Coastguard Worker band_power_corr_real_env1 = 0;
317*15dc779aSAndroid Build Coastguard Worker band_power_corr_imag_env1 = 0;
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker temp_power_left_env2 = 0;
320*15dc779aSAndroid Build Coastguard Worker temp_power_right_env2 = 0;
321*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env2 = 0;
322*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env2 = 0;
323*15dc779aSAndroid Build Coastguard Worker
324*15dc779aSAndroid Build Coastguard Worker max_subband = ps_tables->hi_res_band_borders[bin] + 1;
325*15dc779aSAndroid Build Coastguard Worker for (subband = ps_tables->hi_res_band_borders[bin]; subband < max_subband; subband++) {
326*15dc779aSAndroid Build Coastguard Worker FLOAT32 t_left_real, t_left_imag, t_right_real, t_right_imag;
327*15dc779aSAndroid Build Coastguard Worker
328*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < NUMBER_OF_SUBSAMPLES / 2; i++) {
329*15dc779aSAndroid Build Coastguard Worker // Envelope 1
330*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env1[i][subband];
331*15dc779aSAndroid Build Coastguard Worker t_right_real = hybrid_right_real_env1[i][subband];
332*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env1[i][subband];
333*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybrid_right_imag_env1[i][subband];
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
336*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
337*15dc779aSAndroid Build Coastguard Worker band_power_left_env1 += (temp1 + temp2);
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
340*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
341*15dc779aSAndroid Build Coastguard Worker band_power_right_env1 += (temp1 + temp2);
342*15dc779aSAndroid Build Coastguard Worker
343*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
344*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
345*15dc779aSAndroid Build Coastguard Worker band_power_corr_real_env1 += (temp1 + temp2);
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
348*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
349*15dc779aSAndroid Build Coastguard Worker band_power_corr_imag_env1 += (temp1 - temp2);
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker // Envelope 2
352*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env2[i][subband];
353*15dc779aSAndroid Build Coastguard Worker t_right_real = hybr_right_real_env2[i][subband];
354*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env2[i][subband];
355*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybr_right_imag_env2[i][subband];
356*15dc779aSAndroid Build Coastguard Worker
357*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
358*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
359*15dc779aSAndroid Build Coastguard Worker temp_power_left_env2 += (temp1 + temp2);
360*15dc779aSAndroid Build Coastguard Worker
361*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
362*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
363*15dc779aSAndroid Build Coastguard Worker temp_power_right_env2 += (temp1 + temp2);
364*15dc779aSAndroid Build Coastguard Worker
365*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
366*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
367*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env2 += (temp1 + temp2);
368*15dc779aSAndroid Build Coastguard Worker
369*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
370*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
371*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env2 += (temp1 - temp2);
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin] = temp_power_left_env2;
376*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin + 1] = temp_power_right_env2;
377*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin] = temp_power_corr_real_env2;
378*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin + 1] = temp_power_corr_imag_env2;
379*15dc779aSAndroid Build Coastguard Worker
380*15dc779aSAndroid Build Coastguard Worker pms->pow_left_right[2 * bin] = pms->pow_left_right[2 * bin] + band_power_left_env1;
381*15dc779aSAndroid Build Coastguard Worker pms->pow_left_right[2 * bin + 1] = pms->pow_left_right[2 * bin + 1] + band_power_right_env1;
382*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * bin] =
383*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * bin] + band_power_corr_real_env1;
384*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * bin + 1] =
385*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * bin + 1] + band_power_corr_imag_env1;
386*15dc779aSAndroid Build Coastguard Worker }
387*15dc779aSAndroid Build Coastguard Worker
388*15dc779aSAndroid Build Coastguard Worker hist_left_real = pms->hist_qmf_left_real;
389*15dc779aSAndroid Build Coastguard Worker hist_left_imag = pms->hist_qmf_left_imag;
390*15dc779aSAndroid Build Coastguard Worker hist_right_real = pms->hist_qmf_right_real;
391*15dc779aSAndroid Build Coastguard Worker hist_right_imag = pms->hist_qmf_right_imag;
392*15dc779aSAndroid Build Coastguard Worker
393*15dc779aSAndroid Build Coastguard Worker hybrid_left_real_env1 = r_buffer_left;
394*15dc779aSAndroid Build Coastguard Worker hybrid_left_imag_env1 = i_buffer_left;
395*15dc779aSAndroid Build Coastguard Worker hybrid_right_real_env1 = r_buffer_right;
396*15dc779aSAndroid Build Coastguard Worker hybrid_right_imag_env1 = i_buffer_right;
397*15dc779aSAndroid Build Coastguard Worker
398*15dc779aSAndroid Build Coastguard Worker hybrid_left_real_env2 =
399*15dc779aSAndroid Build Coastguard Worker &r_buffer_left[NUMBER_OF_SUBSAMPLES / 2 - IXHEAACE_HYBRID_FILTER_DELAY];
400*15dc779aSAndroid Build Coastguard Worker hybrid_left_imag_env2 =
401*15dc779aSAndroid Build Coastguard Worker &i_buffer_left[NUMBER_OF_SUBSAMPLES / 2 - IXHEAACE_HYBRID_FILTER_DELAY];
402*15dc779aSAndroid Build Coastguard Worker hybr_right_real_env2 =
403*15dc779aSAndroid Build Coastguard Worker &r_buffer_right[NUMBER_OF_SUBSAMPLES / 2 - IXHEAACE_HYBRID_FILTER_DELAY];
404*15dc779aSAndroid Build Coastguard Worker hybr_right_imag_env2 =
405*15dc779aSAndroid Build Coastguard Worker &i_buffer_right[NUMBER_OF_SUBSAMPLES / 2 - IXHEAACE_HYBRID_FILTER_DELAY];
406*15dc779aSAndroid Build Coastguard Worker
407*15dc779aSAndroid Build Coastguard Worker for (bin = SUBQMF_BINS_ENERGY; bin < NUMBER_OF_BINS; bin++) {
408*15dc779aSAndroid Build Coastguard Worker band_power_left_env1 = 0;
409*15dc779aSAndroid Build Coastguard Worker band_power_right_env1 = 0;
410*15dc779aSAndroid Build Coastguard Worker band_power_corr_real_env1 = 0;
411*15dc779aSAndroid Build Coastguard Worker band_power_corr_imag_env1 = 0;
412*15dc779aSAndroid Build Coastguard Worker
413*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin] = 0;
414*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin + 1] = 0;
415*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin] = 0;
416*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin + 1] = 0;
417*15dc779aSAndroid Build Coastguard Worker
418*15dc779aSAndroid Build Coastguard Worker band_hist_power_left = 0;
419*15dc779aSAndroid Build Coastguard Worker band_hist_power_right = 0;
420*15dc779aSAndroid Build Coastguard Worker band_hist_power_corr_real = 0;
421*15dc779aSAndroid Build Coastguard Worker band_hist_power_corr_imag = 0;
422*15dc779aSAndroid Build Coastguard Worker
423*15dc779aSAndroid Build Coastguard Worker for (subband = ps_tables->hi_res_band_borders[bin];
424*15dc779aSAndroid Build Coastguard Worker subband < ps_tables->hi_res_band_borders[bin + 1]; subband++) {
425*15dc779aSAndroid Build Coastguard Worker FLOAT32 t_left_real, t_left_imag, t_right_real, t_right_imag;
426*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_left = 0;
427*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_right = 0;
428*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_corr_real = 0;
429*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_corr_imag = 0;
430*15dc779aSAndroid Build Coastguard Worker
431*15dc779aSAndroid Build Coastguard Worker temp_power_left_env1 = 0;
432*15dc779aSAndroid Build Coastguard Worker temp_power_right_env1 = 0;
433*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env1 = 0;
434*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env1 = 0;
435*15dc779aSAndroid Build Coastguard Worker
436*15dc779aSAndroid Build Coastguard Worker temp_power_left_env2 = 0;
437*15dc779aSAndroid Build Coastguard Worker temp_power_right_env2 = 0;
438*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env2 = 0;
439*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env2 = 0;
440*15dc779aSAndroid Build Coastguard Worker
441*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 6; i++) {
442*15dc779aSAndroid Build Coastguard Worker t_left_real = hist_left_real[i][subband];
443*15dc779aSAndroid Build Coastguard Worker t_left_imag = hist_left_imag[i][subband];
444*15dc779aSAndroid Build Coastguard Worker t_right_real = hist_right_real[i][subband];
445*15dc779aSAndroid Build Coastguard Worker t_right_imag = hist_right_imag[i][subband];
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
448*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
449*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_left += (temp1 + temp2);
450*15dc779aSAndroid Build Coastguard Worker
451*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
452*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
453*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_right += (temp1 + temp2);
454*15dc779aSAndroid Build Coastguard Worker
455*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
456*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
457*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_corr_real += (temp1 + temp2);
458*15dc779aSAndroid Build Coastguard Worker
459*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
460*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
461*15dc779aSAndroid Build Coastguard Worker temp_hist_pow_corr_imag += (temp1 - temp2);
462*15dc779aSAndroid Build Coastguard Worker
463*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env1[i][subband];
464*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env1[i][subband];
465*15dc779aSAndroid Build Coastguard Worker t_right_real = hybrid_right_real_env1[i][subband];
466*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybrid_right_imag_env1[i][subband];
467*15dc779aSAndroid Build Coastguard Worker
468*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
469*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
470*15dc779aSAndroid Build Coastguard Worker temp_power_left_env1 += (temp1 + temp2);
471*15dc779aSAndroid Build Coastguard Worker
472*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
473*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
474*15dc779aSAndroid Build Coastguard Worker temp_power_right_env1 += (temp1 + temp2);
475*15dc779aSAndroid Build Coastguard Worker
476*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
477*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
478*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env1 += (temp1 + temp2);
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
481*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
482*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env1 += (temp1 - temp2);
483*15dc779aSAndroid Build Coastguard Worker
484*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env2[i][subband];
485*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env2[i][subband];
486*15dc779aSAndroid Build Coastguard Worker t_right_real = hybr_right_real_env2[i][subband];
487*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybr_right_imag_env2[i][subband];
488*15dc779aSAndroid Build Coastguard Worker
489*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
490*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
491*15dc779aSAndroid Build Coastguard Worker temp_power_left_env2 += (temp1 + temp2);
492*15dc779aSAndroid Build Coastguard Worker
493*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
494*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
495*15dc779aSAndroid Build Coastguard Worker temp_power_right_env2 += (temp1 + temp2);
496*15dc779aSAndroid Build Coastguard Worker
497*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
498*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
499*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env2 += (temp1 + temp2);
500*15dc779aSAndroid Build Coastguard Worker
501*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
502*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
503*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env2 += (temp1 - temp2);
504*15dc779aSAndroid Build Coastguard Worker }
505*15dc779aSAndroid Build Coastguard Worker
506*15dc779aSAndroid Build Coastguard Worker for (i = 6; i < 10; i++) {
507*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env1[i][subband];
508*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env1[i][subband];
509*15dc779aSAndroid Build Coastguard Worker t_right_real = hybrid_right_real_env1[i][subband];
510*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybrid_right_imag_env1[i][subband];
511*15dc779aSAndroid Build Coastguard Worker
512*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
513*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
514*15dc779aSAndroid Build Coastguard Worker temp_power_left_env1 += (temp1 + temp2);
515*15dc779aSAndroid Build Coastguard Worker
516*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
517*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
518*15dc779aSAndroid Build Coastguard Worker temp_power_right_env1 += (temp1 + temp2);
519*15dc779aSAndroid Build Coastguard Worker
520*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
521*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
522*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env1 += (temp1 + temp2);
523*15dc779aSAndroid Build Coastguard Worker
524*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
525*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
526*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env1 += (temp1 - temp2);
527*15dc779aSAndroid Build Coastguard Worker
528*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env2[i][subband];
529*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env2[i][subband];
530*15dc779aSAndroid Build Coastguard Worker t_right_real = hybr_right_real_env2[i][subband];
531*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybr_right_imag_env2[i][subband];
532*15dc779aSAndroid Build Coastguard Worker
533*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
534*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
535*15dc779aSAndroid Build Coastguard Worker temp_power_left_env2 += (temp1 + temp2);
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
538*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
539*15dc779aSAndroid Build Coastguard Worker temp_power_right_env2 += (temp1 + temp2);
540*15dc779aSAndroid Build Coastguard Worker
541*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
542*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
543*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env2 += (temp1 + temp2);
544*15dc779aSAndroid Build Coastguard Worker
545*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
546*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
547*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env2 += (temp1 - temp2);
548*15dc779aSAndroid Build Coastguard Worker }
549*15dc779aSAndroid Build Coastguard Worker
550*15dc779aSAndroid Build Coastguard Worker for (i = 10; i < 16; i++) {
551*15dc779aSAndroid Build Coastguard Worker t_left_real = hybrid_left_real_env2[i][subband];
552*15dc779aSAndroid Build Coastguard Worker t_left_imag = hybrid_left_imag_env2[i][subband];
553*15dc779aSAndroid Build Coastguard Worker t_right_real = hybr_right_real_env2[i][subband];
554*15dc779aSAndroid Build Coastguard Worker t_right_imag = hybr_right_imag_env2[i][subband];
555*15dc779aSAndroid Build Coastguard Worker
556*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_left_real;
557*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_left_imag;
558*15dc779aSAndroid Build Coastguard Worker temp_power_left_env2 += (temp1 + temp2);
559*15dc779aSAndroid Build Coastguard Worker
560*15dc779aSAndroid Build Coastguard Worker temp1 = t_right_real * t_right_real;
561*15dc779aSAndroid Build Coastguard Worker temp2 = t_right_imag * t_right_imag;
562*15dc779aSAndroid Build Coastguard Worker temp_power_right_env2 += (temp1 + temp2);
563*15dc779aSAndroid Build Coastguard Worker
564*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_real * t_right_real;
565*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_imag * t_right_imag;
566*15dc779aSAndroid Build Coastguard Worker temp_power_corr_real_env2 += (temp1 + temp2);
567*15dc779aSAndroid Build Coastguard Worker
568*15dc779aSAndroid Build Coastguard Worker temp1 = t_left_imag * t_right_real;
569*15dc779aSAndroid Build Coastguard Worker temp2 = t_left_real * t_right_imag;
570*15dc779aSAndroid Build Coastguard Worker temp_power_corr_imag_env2 += (temp1 - temp2);
571*15dc779aSAndroid Build Coastguard Worker }
572*15dc779aSAndroid Build Coastguard Worker
573*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin] =
574*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin] + temp_power_left_env2;
575*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin + 1] =
576*15dc779aSAndroid Build Coastguard Worker scratch_power_left_right_env2[2 * bin + 1] + temp_power_right_env2;
577*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin] =
578*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin] + temp_power_corr_real_env2;
579*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin + 1] =
580*15dc779aSAndroid Build Coastguard Worker scratch_power_corr_real_imag_env2[2 * bin + 1] + temp_power_corr_imag_env2;
581*15dc779aSAndroid Build Coastguard Worker
582*15dc779aSAndroid Build Coastguard Worker band_power_left_env1 = band_power_left_env1 + temp_power_left_env1;
583*15dc779aSAndroid Build Coastguard Worker band_power_right_env1 = band_power_right_env1 + temp_power_right_env1;
584*15dc779aSAndroid Build Coastguard Worker band_power_corr_real_env1 = band_power_corr_real_env1 + temp_power_corr_real_env1;
585*15dc779aSAndroid Build Coastguard Worker band_power_corr_imag_env1 = band_power_corr_imag_env1 + temp_power_corr_imag_env1;
586*15dc779aSAndroid Build Coastguard Worker
587*15dc779aSAndroid Build Coastguard Worker band_hist_power_left = band_hist_power_left + temp_hist_pow_left;
588*15dc779aSAndroid Build Coastguard Worker band_hist_power_right = band_hist_power_right + temp_hist_pow_right;
589*15dc779aSAndroid Build Coastguard Worker band_hist_power_corr_real = band_hist_power_corr_real + temp_hist_pow_corr_real;
590*15dc779aSAndroid Build Coastguard Worker band_hist_power_corr_imag = band_hist_power_corr_imag + temp_hist_pow_corr_imag;
591*15dc779aSAndroid Build Coastguard Worker }
592*15dc779aSAndroid Build Coastguard Worker
593*15dc779aSAndroid Build Coastguard Worker pms->pow_left_right[2 * bin] += (band_power_left_env1 + band_hist_power_left);
594*15dc779aSAndroid Build Coastguard Worker pms->pow_left_right[2 * bin + 1] += (band_power_right_env1 + band_hist_power_right);
595*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * bin] += (band_power_corr_real_env1 + band_hist_power_corr_real);
596*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * bin + 1] +=
597*15dc779aSAndroid Build Coastguard Worker (band_power_corr_imag_env1 + band_hist_power_corr_imag);
598*15dc779aSAndroid Build Coastguard Worker }
599*15dc779aSAndroid Build Coastguard Worker }
600*15dc779aSAndroid Build Coastguard Worker
601*15dc779aSAndroid Build Coastguard Worker {
602*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_left;
603*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_right;
604*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_corr_re;
605*15dc779aSAndroid Build Coastguard Worker FLOAT32 temp_corr_im;
606*15dc779aSAndroid Build Coastguard Worker
607*15dc779aSAndroid Build Coastguard Worker for (bin = 0; bin < pms->iid_icc_bins; bin++) {
608*15dc779aSAndroid Build Coastguard Worker if (pms->b_hi_freq_res_iid_icc) {
609*15dc779aSAndroid Build Coastguard Worker temp_left = pms->pow_left_right[2 * bin];
610*15dc779aSAndroid Build Coastguard Worker temp_right = pms->pow_left_right[2 * bin + 1];
611*15dc779aSAndroid Build Coastguard Worker temp_corr_re = pms->pow_corr_real_imag[2 * bin];
612*15dc779aSAndroid Build Coastguard Worker temp_corr_im = pms->pow_corr_real_imag[2 * bin + 1];
613*15dc779aSAndroid Build Coastguard Worker } else {
614*15dc779aSAndroid Build Coastguard Worker temp_left = pms->pow_left_right[2 * 2 * bin] + pms->pow_left_right[2 * 2 * bin + 2];
615*15dc779aSAndroid Build Coastguard Worker temp_right =
616*15dc779aSAndroid Build Coastguard Worker pms->pow_left_right[2 * 2 * bin + 1] + pms->pow_left_right[2 * (2 * bin + 1) + 1];
617*15dc779aSAndroid Build Coastguard Worker temp_corr_re =
618*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * 2 * bin] + pms->pow_corr_real_imag[2 * 2 * bin + 2];
619*15dc779aSAndroid Build Coastguard Worker temp_corr_im = pms->pow_corr_real_imag[2 * 2 * bin + 1] +
620*15dc779aSAndroid Build Coastguard Worker pms->pow_corr_real_imag[2 * (2 * bin + 1) + 1];
621*15dc779aSAndroid Build Coastguard Worker }
622*15dc779aSAndroid Build Coastguard Worker
623*15dc779aSAndroid Build Coastguard Worker if (temp_left == 0) {
624*15dc779aSAndroid Build Coastguard Worker temp_left = 0.0625f;
625*15dc779aSAndroid Build Coastguard Worker }
626*15dc779aSAndroid Build Coastguard Worker if (temp_right == 0) {
627*15dc779aSAndroid Build Coastguard Worker temp_right = 0.0625f;
628*15dc779aSAndroid Build Coastguard Worker }
629*15dc779aSAndroid Build Coastguard Worker if (temp_corr_re == 0) {
630*15dc779aSAndroid Build Coastguard Worker temp_corr_re = 0.0625f;
631*15dc779aSAndroid Build Coastguard Worker }
632*15dc779aSAndroid Build Coastguard Worker if (temp_corr_im == 0) {
633*15dc779aSAndroid Build Coastguard Worker temp_corr_im = 0.0625f;
634*15dc779aSAndroid Build Coastguard Worker }
635*15dc779aSAndroid Build Coastguard Worker
636*15dc779aSAndroid Build Coastguard Worker pms->aaa_ICC_data_buf[bin][1] = pms->aaa_ICC_data_buf[bin][0];
637*15dc779aSAndroid Build Coastguard Worker if (bin > NUMBER_OF_IPD_BINS) {
638*15dc779aSAndroid Build Coastguard Worker temp1 = temp_corr_re * temp_corr_re;
639*15dc779aSAndroid Build Coastguard Worker temp2 = temp_corr_im * temp_corr_im;
640*15dc779aSAndroid Build Coastguard Worker temp_corr_re = temp1 + temp2;
641*15dc779aSAndroid Build Coastguard Worker
642*15dc779aSAndroid Build Coastguard Worker temp1 = temp_left * temp_right;
643*15dc779aSAndroid Build Coastguard Worker pms->aaa_ICC_data_buf[bin][0] = (FLOAT32)sqrt(temp_corr_re / temp1);
644*15dc779aSAndroid Build Coastguard Worker } else {
645*15dc779aSAndroid Build Coastguard Worker temp1 = temp_left * temp_right;
646*15dc779aSAndroid Build Coastguard Worker pms->aaa_ICC_data_buf[bin][0] = temp_corr_re / (FLOAT32)sqrt(temp1);
647*15dc779aSAndroid Build Coastguard Worker }
648*15dc779aSAndroid Build Coastguard Worker if (pms->aaa_ICC_data_buf[bin][0] > 1.0f) {
649*15dc779aSAndroid Build Coastguard Worker pms->aaa_ICC_data_buf[bin][0] = 0;
650*15dc779aSAndroid Build Coastguard Worker } else {
651*15dc779aSAndroid Build Coastguard Worker pms->aaa_ICC_data_buf[bin][0] =
652*15dc779aSAndroid Build Coastguard Worker (FLOAT32)sqrt(0.5f - (pms->aaa_ICC_data_buf[bin][0] / 2.0f));
653*15dc779aSAndroid Build Coastguard Worker }
654*15dc779aSAndroid Build Coastguard Worker temp1 = temp_left / temp_right;
655*15dc779aSAndroid Build Coastguard Worker temp1 = (FLOAT32)sqrt(temp1);
656*15dc779aSAndroid Build Coastguard Worker pms->aaa_IID_data_buf[bin][1] = pms->aaa_IID_data_buf[bin][0];
657*15dc779aSAndroid Build Coastguard Worker pms->aaa_IID_data_buf[bin][0] = SBR_INV_LOG_2 * (FLOAT32)log(temp1);
658*15dc779aSAndroid Build Coastguard Worker }
659*15dc779aSAndroid Build Coastguard Worker }
660*15dc779aSAndroid Build Coastguard Worker {
661*15dc779aSAndroid Build Coastguard Worker FLOAT32 *pow_left = &pms->pow_left_right[0];
662*15dc779aSAndroid Build Coastguard Worker FLOAT32 *corr_real = &pms->pow_corr_real_imag[0];
663*15dc779aSAndroid Build Coastguard Worker
664*15dc779aSAndroid Build Coastguard Worker memcpy(pow_left, scratch_power_left_right_env2, 2 * NUMBER_OF_BINS * sizeof(FLOAT32));
665*15dc779aSAndroid Build Coastguard Worker memcpy(corr_real, scratch_power_corr_real_imag_env2, 2 * NUMBER_OF_BINS * sizeof(FLOAT32));
666*15dc779aSAndroid Build Coastguard Worker }
667*15dc779aSAndroid Build Coastguard Worker
668*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_downmix_to_mono(pms, r_buffer_left, i_buffer_left, r_buffer_right,
669*15dc779aSAndroid Build Coastguard Worker i_buffer_right, ps_tables);
670*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
671*15dc779aSAndroid Build Coastguard Worker }
672