1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 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 <stdio.h>
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker #include <setjmp.h>
24*15dc779aSAndroid Build Coastguard Worker
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
26*15dc779aSAndroid Build Coastguard Worker
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
28*15dc779aSAndroid Build Coastguard Worker
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
30*15dc779aSAndroid Build Coastguard Worker
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
33*15dc779aSAndroid Build Coastguard Worker
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
36*15dc779aSAndroid Build Coastguard Worker
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
42*15dc779aSAndroid Build Coastguard Worker
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
46*15dc779aSAndroid Build Coastguard Worker
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_rom.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_main.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_arith_dec.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
53*15dc779aSAndroid Build Coastguard Worker
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bit_extract.h"
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
59*15dc779aSAndroid Build Coastguard Worker
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_func_def.h"
61*15dc779aSAndroid Build Coastguard Worker
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_windows.h"
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_vec_baisc_ops.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
74*15dc779aSAndroid Build Coastguard Worker
75*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_long_sin[] = {0, 0, -16384, 0, 16384, 0, 0};
76*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_long_kbd[] = {-2998, 0, -19052, 0,
77*15dc779aSAndroid Build Coastguard Worker 19052, 0, 2998};
78*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_long_sin_kbd[] = {-1499, -1876, -17718, 0,
79*15dc779aSAndroid Build Coastguard Worker 17718, 1876, 1499};
80*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_long_kbd_sin[] = {-1499, 1876, -17718, 0,
81*15dc779aSAndroid Build Coastguard Worker 17718, -1876, 1499};
82*15dc779aSAndroid Build Coastguard Worker
83*15dc779aSAndroid Build Coastguard Worker const WORD16 *const ixheaacd_mdst_fcoeff_longshort_curr[2][2] = {
84*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_long_sin, ixheaacd_mdst_fcoeff_long_sin_kbd},
85*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_long_kbd_sin, ixheaacd_mdst_fcoeff_long_kbd}};
86*15dc779aSAndroid Build Coastguard Worker
87*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_start_sin[] = {-3364, -3401, -18584, 0,
88*15dc779aSAndroid Build Coastguard Worker 18584, 3401, 3364};
89*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_start_kbd[] = {-4932, -1572, -19942, 0,
90*15dc779aSAndroid Build Coastguard Worker 19942, 1572, 4932};
91*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_start_sin_kbd[] = {-3433, -3447, -18608, 0,
92*15dc779aSAndroid Build Coastguard Worker 18608, 3447, 3433};
93*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_start_kbd_sin[] = {-4863, -1525, -19918, 0,
94*15dc779aSAndroid Build Coastguard Worker 19918, 1525, 4863};
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker const WORD16 *const ixheaacd_mdst_fcoeff_start_curr[2][2] = {
97*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_start_sin, ixheaacd_mdst_fcoeff_start_sin_kbd},
98*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_start_kbd_sin, ixheaacd_mdst_fcoeff_start_kbd}};
99*15dc779aSAndroid Build Coastguard Worker
100*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stop_sin[] = {-3364, 3401, -18584, 0,
101*15dc779aSAndroid Build Coastguard Worker 18584, -3401, 3364};
102*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stop_kbd[] = {-4932, 1572, -19942, 0,
103*15dc779aSAndroid Build Coastguard Worker 19942, -1572, 4932};
104*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stop_sin_kbd[] = {-4863, 1525, -19918, 0,
105*15dc779aSAndroid Build Coastguard Worker 19918, -1525, 4863};
106*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stop_kbd_sin[] = {-3433, 3447, -18608, 0,
107*15dc779aSAndroid Build Coastguard Worker 18608, -3447, 3433};
108*15dc779aSAndroid Build Coastguard Worker
109*15dc779aSAndroid Build Coastguard Worker const WORD16 *const ixheaacd_mdst_fcoeff_stop_cur[2][2] = {
110*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_stop_sin, ixheaacd_mdst_fcoeff_stop_sin_kbd},
111*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_stop_kbd_sin, ixheaacd_mdst_fcoeff_stop_kbd}};
112*15dc779aSAndroid Build Coastguard Worker
113*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stopstart_sin[] = {-6728, 0, -20785, 0,
114*15dc779aSAndroid Build Coastguard Worker 20785, 0, 6728};
115*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stopstart_kbd[] = {-6866, -0, -20831, 0,
116*15dc779aSAndroid Build Coastguard Worker 20831, 0, 6866};
117*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stopstart_sin_kbd[] = {-6797, -46, -20808, 0,
118*15dc779aSAndroid Build Coastguard Worker 20808, 46, 6797};
119*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stopstart_kbd_sin[] = {-6797, 46, -20808, 0,
120*15dc779aSAndroid Build Coastguard Worker 20808, 46, 6797};
121*15dc779aSAndroid Build Coastguard Worker
122*15dc779aSAndroid Build Coastguard Worker const WORD16 *const ixheaacd_mdst_fcoeff_stopstart_cur[2][2] = {
123*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_stopstart_sin,
124*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stopstart_sin_kbd},
125*15dc779aSAndroid Build Coastguard Worker {ixheaacd_mdst_fcoeff_stopstart_kbd_sin,
126*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stopstart_kbd}};
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_l_s_start_left_sin[] = {
129*15dc779aSAndroid Build Coastguard Worker -0, 3477, 8192, 10430, 8192, 3477, -0};
130*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_l_s_start_left_kbd[] = {
131*15dc779aSAndroid Build Coastguard Worker 1950, 4054, 6114, 6982, 6114, 4054, 1950};
132*15dc779aSAndroid Build Coastguard Worker
133*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stop_stopstart_left_sin[] = {
134*15dc779aSAndroid Build Coastguard Worker 1262, 1285, 1299, 1304, 1299, 1285, 1262};
135*15dc779aSAndroid Build Coastguard Worker const WORD16 ixheaacd_mdst_fcoeff_stop_stopstart_left_kbd[] = {
136*15dc779aSAndroid Build Coastguard Worker 857, 866, 871, 873, 871, 866, 857};
137*15dc779aSAndroid Build Coastguard Worker
138*15dc779aSAndroid Build Coastguard Worker const WORD16 *const ixheaacd_mdst_fcoeff_l_s_start_left_prev[2] = {
139*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_l_s_start_left_sin,
140*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_l_s_start_left_kbd};
141*15dc779aSAndroid Build Coastguard Worker const WORD16 *const ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[2] = {
142*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stop_stopstart_left_sin,
143*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stop_stopstart_left_kbd};
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker #define ONE_BY_TWO_POW_14 0.00006103515625
146*15dc779aSAndroid Build Coastguard Worker #define ONE_BY_TWO_POW_15 0.000030517578125
147*15dc779aSAndroid Build Coastguard Worker
ixheaacd_usac_cplx_save_prev(ia_sfb_info_struct * info,WORD32 * l_spec,WORD32 * r_spec,WORD32 * l_spec_prev,WORD32 * r_spec_prev)148*15dc779aSAndroid Build Coastguard Worker void ixheaacd_usac_cplx_save_prev(ia_sfb_info_struct *info, WORD32 *l_spec,
149*15dc779aSAndroid Build Coastguard Worker WORD32 *r_spec, WORD32 *l_spec_prev,
150*15dc779aSAndroid Build Coastguard Worker WORD32 *r_spec_prev) {
151*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_drc_offset;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset = info->samp_per_bk - info->bins_per_sbk;
154*15dc779aSAndroid Build Coastguard Worker
155*15dc779aSAndroid Build Coastguard Worker memcpy(l_spec_prev + ixheaacd_drc_offset, l_spec + ixheaacd_drc_offset,
156*15dc779aSAndroid Build Coastguard Worker sizeof(WORD32) * info->bins_per_sbk);
157*15dc779aSAndroid Build Coastguard Worker memcpy(r_spec_prev + ixheaacd_drc_offset, r_spec + ixheaacd_drc_offset,
158*15dc779aSAndroid Build Coastguard Worker sizeof(WORD32) * info->bins_per_sbk);
159*15dc779aSAndroid Build Coastguard Worker }
160*15dc779aSAndroid Build Coastguard Worker
ixheaacd_cplx_pred_data(ia_usac_data_struct * usac_data,ia_usac_tmp_core_coder_struct * pstr_core_coder,WORD32 num_window_groups,ia_bit_buf_struct * it_bit_buff)161*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_cplx_pred_data(
162*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *usac_data,
163*15dc779aSAndroid Build Coastguard Worker ia_usac_tmp_core_coder_struct *pstr_core_coder, WORD32 num_window_groups,
164*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
165*15dc779aSAndroid Build Coastguard Worker ia_huff_code_book_struct *ptr_huff_code_book = &ixheaacd_book;
166*15dc779aSAndroid Build Coastguard Worker const ia_huff_code_word_struct *ptr_huff_code_word =
167*15dc779aSAndroid Build Coastguard Worker ptr_huff_code_book->pstr_huff_code_word;
168*15dc779aSAndroid Build Coastguard Worker WORD32 cplx_pred_all;
169*15dc779aSAndroid Build Coastguard Worker WORD32 delta_code_time;
170*15dc779aSAndroid Build Coastguard Worker WORD32 g, sfb;
171*15dc779aSAndroid Build Coastguard Worker WORD32 dpcm_alpha, last_alpha_q_re, last_alpha_q_im;
172*15dc779aSAndroid Build Coastguard Worker UWORD8 max_sfb_ste = pstr_core_coder->max_sfb_ste;
173*15dc779aSAndroid Build Coastguard Worker
174*15dc779aSAndroid Build Coastguard Worker WORD32(*alpha_q_re)[SFB_NUM_MAX] = usac_data->alpha_q_re;
175*15dc779aSAndroid Build Coastguard Worker WORD32(*alpha_q_im)[SFB_NUM_MAX] = usac_data->alpha_q_im;
176*15dc779aSAndroid Build Coastguard Worker WORD32 *alpha_q_re_prev = usac_data->alpha_q_re_prev;
177*15dc779aSAndroid Build Coastguard Worker WORD32 *alpha_q_im_prev = usac_data->alpha_q_im_prev;
178*15dc779aSAndroid Build Coastguard Worker UWORD8(*cplx_pred_used)[SFB_NUM_MAX] = usac_data->cplx_pred_used;
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker cplx_pred_all = ixheaacd_read_bits_buf(it_bit_buff, 1);
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_all == 0) {
183*15dc779aSAndroid Build Coastguard Worker for (g = 0; g < num_window_groups; g++) {
184*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < max_sfb_ste; sfb += SFB_PER_PRED_BAND) {
185*15dc779aSAndroid Build Coastguard Worker cplx_pred_used[g][sfb] = ixheaacd_read_bits_buf(it_bit_buff, 1);
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker if (sfb + 1 < max_sfb_ste)
188*15dc779aSAndroid Build Coastguard Worker cplx_pred_used[g][sfb + 1] = cplx_pred_used[g][sfb];
189*15dc779aSAndroid Build Coastguard Worker }
190*15dc779aSAndroid Build Coastguard Worker for (sfb = max_sfb_ste; sfb < SFB_NUM_MAX; sfb++)
191*15dc779aSAndroid Build Coastguard Worker cplx_pred_used[g][sfb] = 0;
192*15dc779aSAndroid Build Coastguard Worker }
193*15dc779aSAndroid Build Coastguard Worker } else {
194*15dc779aSAndroid Build Coastguard Worker for (g = 0; g < num_window_groups; g++) {
195*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < max_sfb_ste; sfb++) cplx_pred_used[g][sfb] = 1;
196*15dc779aSAndroid Build Coastguard Worker
197*15dc779aSAndroid Build Coastguard Worker for (sfb = max_sfb_ste; sfb < SFB_NUM_MAX; sfb++)
198*15dc779aSAndroid Build Coastguard Worker cplx_pred_used[g][sfb] = 0;
199*15dc779aSAndroid Build Coastguard Worker }
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->pred_dir = ixheaacd_read_bits_buf(it_bit_buff, 1);
203*15dc779aSAndroid Build Coastguard Worker
204*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->complex_coef = ixheaacd_read_bits_buf(it_bit_buff, 1);
205*15dc779aSAndroid Build Coastguard Worker
206*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->complex_coef) {
207*15dc779aSAndroid Build Coastguard Worker if (usac_data->usac_independency_flg)
208*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->use_prev_frame = 0;
209*15dc779aSAndroid Build Coastguard Worker else
210*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->use_prev_frame = ixheaacd_read_bits_buf(it_bit_buff, 1);
211*15dc779aSAndroid Build Coastguard Worker }
212*15dc779aSAndroid Build Coastguard Worker
213*15dc779aSAndroid Build Coastguard Worker if (usac_data->usac_independency_flg)
214*15dc779aSAndroid Build Coastguard Worker delta_code_time = 0;
215*15dc779aSAndroid Build Coastguard Worker else
216*15dc779aSAndroid Build Coastguard Worker delta_code_time = ixheaacd_read_bits_buf(it_bit_buff, 1);
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker for (g = 0; g < num_window_groups; g++) {
219*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < max_sfb_ste; sfb += SFB_PER_PRED_BAND) {
220*15dc779aSAndroid Build Coastguard Worker if (delta_code_time == 1) {
221*15dc779aSAndroid Build Coastguard Worker last_alpha_q_re = alpha_q_re_prev[sfb];
222*15dc779aSAndroid Build Coastguard Worker last_alpha_q_im = alpha_q_im_prev[sfb];
223*15dc779aSAndroid Build Coastguard Worker } else {
224*15dc779aSAndroid Build Coastguard Worker if (sfb > 0) {
225*15dc779aSAndroid Build Coastguard Worker last_alpha_q_re = alpha_q_re[g][sfb - 1];
226*15dc779aSAndroid Build Coastguard Worker last_alpha_q_im = alpha_q_im[g][sfb - 1];
227*15dc779aSAndroid Build Coastguard Worker } else {
228*15dc779aSAndroid Build Coastguard Worker last_alpha_q_re = last_alpha_q_im = 0;
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker
232*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[g][sfb] == 1) {
233*15dc779aSAndroid Build Coastguard Worker dpcm_alpha =
234*15dc779aSAndroid Build Coastguard Worker -ixheaacd_huff_codeword(ptr_huff_code_word, 0, it_bit_buff) + 60;
235*15dc779aSAndroid Build Coastguard Worker alpha_q_re[g][sfb] = dpcm_alpha + last_alpha_q_re;
236*15dc779aSAndroid Build Coastguard Worker
237*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->complex_coef) {
238*15dc779aSAndroid Build Coastguard Worker dpcm_alpha =
239*15dc779aSAndroid Build Coastguard Worker -ixheaacd_huff_codeword(ptr_huff_code_word, 0, it_bit_buff) + 60;
240*15dc779aSAndroid Build Coastguard Worker alpha_q_im[g][sfb] = dpcm_alpha + last_alpha_q_im;
241*15dc779aSAndroid Build Coastguard Worker } else {
242*15dc779aSAndroid Build Coastguard Worker alpha_q_im[g][sfb] = 0;
243*15dc779aSAndroid Build Coastguard Worker }
244*15dc779aSAndroid Build Coastguard Worker } else {
245*15dc779aSAndroid Build Coastguard Worker alpha_q_re[g][sfb] = 0;
246*15dc779aSAndroid Build Coastguard Worker alpha_q_im[g][sfb] = 0;
247*15dc779aSAndroid Build Coastguard Worker }
248*15dc779aSAndroid Build Coastguard Worker
249*15dc779aSAndroid Build Coastguard Worker if ((sfb + 1) < max_sfb_ste) {
250*15dc779aSAndroid Build Coastguard Worker alpha_q_re[g][sfb + 1] = alpha_q_re[g][sfb];
251*15dc779aSAndroid Build Coastguard Worker alpha_q_im[g][sfb + 1] = alpha_q_im[g][sfb];
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker alpha_q_re_prev[sfb] = alpha_q_re[g][sfb];
255*15dc779aSAndroid Build Coastguard Worker alpha_q_im_prev[sfb] = alpha_q_im[g][sfb];
256*15dc779aSAndroid Build Coastguard Worker }
257*15dc779aSAndroid Build Coastguard Worker for (sfb = max_sfb_ste; sfb < SFB_NUM_MAX; sfb++) {
258*15dc779aSAndroid Build Coastguard Worker alpha_q_re[g][sfb] = 0;
259*15dc779aSAndroid Build Coastguard Worker alpha_q_im[g][sfb] = 0;
260*15dc779aSAndroid Build Coastguard Worker alpha_q_re_prev[sfb] = 0;
261*15dc779aSAndroid Build Coastguard Worker alpha_q_im_prev[sfb] = 0;
262*15dc779aSAndroid Build Coastguard Worker }
263*15dc779aSAndroid Build Coastguard Worker }
264*15dc779aSAndroid Build Coastguard Worker
265*15dc779aSAndroid Build Coastguard Worker return;
266*15dc779aSAndroid Build Coastguard Worker }
267*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_ms_mask(ia_usac_data_struct * usac_data,ia_usac_tmp_core_coder_struct * pstr_core_coder,ia_bit_buf_struct * it_bit_buff,WORD32 chn)268*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_read_ms_mask(
269*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *usac_data,
270*15dc779aSAndroid Build Coastguard Worker ia_usac_tmp_core_coder_struct *pstr_core_coder,
271*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff, WORD32 chn) {
272*15dc779aSAndroid Build Coastguard Worker WORD32 g, sfb;
273*15dc779aSAndroid Build Coastguard Worker WORD32 ms_mask_present;
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker UWORD8 *sfb_group = usac_data->group_dis[chn];
276*15dc779aSAndroid Build Coastguard Worker UWORD8 max_sfb = pstr_core_coder->max_sfb_ste;
277*15dc779aSAndroid Build Coastguard Worker UWORD8 *ms_used = usac_data->ms_used[chn];
278*15dc779aSAndroid Build Coastguard Worker ia_sfb_info_struct *info = usac_data->pstr_sfb_info[chn];
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker ms_mask_present = ixheaacd_read_bits_buf(it_bit_buff, 2);
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker switch (ms_mask_present) {
283*15dc779aSAndroid Build Coastguard Worker case 0:
284*15dc779aSAndroid Build Coastguard Worker
285*15dc779aSAndroid Build Coastguard Worker break;
286*15dc779aSAndroid Build Coastguard Worker
287*15dc779aSAndroid Build Coastguard Worker case 1:
288*15dc779aSAndroid Build Coastguard Worker for (g = 0; g < info->max_win_len; g = *sfb_group++) {
289*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < max_sfb; sfb++) {
290*15dc779aSAndroid Build Coastguard Worker *ms_used = ixheaacd_read_bits_buf(it_bit_buff, 1);
291*15dc779aSAndroid Build Coastguard Worker ms_used++;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker for (; sfb < info->sfb_per_sbk; sfb++) {
294*15dc779aSAndroid Build Coastguard Worker *ms_used = 0;
295*15dc779aSAndroid Build Coastguard Worker ms_used++;
296*15dc779aSAndroid Build Coastguard Worker }
297*15dc779aSAndroid Build Coastguard Worker }
298*15dc779aSAndroid Build Coastguard Worker
299*15dc779aSAndroid Build Coastguard Worker break;
300*15dc779aSAndroid Build Coastguard Worker case 2:
301*15dc779aSAndroid Build Coastguard Worker for (g = 0; g < info->max_win_len; g = *sfb_group++)
302*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < info->sfb_per_sbk; sfb++) *ms_used++ = 1;
303*15dc779aSAndroid Build Coastguard Worker break;
304*15dc779aSAndroid Build Coastguard Worker
305*15dc779aSAndroid Build Coastguard Worker case 3:
306*15dc779aSAndroid Build Coastguard Worker
307*15dc779aSAndroid Build Coastguard Worker ixheaacd_cplx_pred_data(usac_data, pstr_core_coder, info->num_groups,
308*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
309*15dc779aSAndroid Build Coastguard Worker return 3;
310*15dc779aSAndroid Build Coastguard Worker }
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < SFB_NUM_MAX; sfb++) {
313*15dc779aSAndroid Build Coastguard Worker usac_data->alpha_q_re_prev[sfb] = 0;
314*15dc779aSAndroid Build Coastguard Worker usac_data->alpha_q_im_prev[sfb] = 0;
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker return ms_mask_present;
317*15dc779aSAndroid Build Coastguard Worker }
318*15dc779aSAndroid Build Coastguard Worker
ixheaacd_ms_stereo(ia_usac_data_struct * usac_data,WORD32 * r_spec,WORD32 * l_spec,WORD32 chn,WORD32 nband)319*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_ms_stereo(ia_usac_data_struct *usac_data, WORD32 *r_spec,
320*15dc779aSAndroid Build Coastguard Worker WORD32 *l_spec, WORD32 chn, WORD32 nband) {
321*15dc779aSAndroid Build Coastguard Worker WORD32 temp_r, temp_l;
322*15dc779aSAndroid Build Coastguard Worker WORD32 sfb, k, grp, grp_len;
323*15dc779aSAndroid Build Coastguard Worker ia_sfb_info_struct *ptr_sfb_info = usac_data->pstr_sfb_info[chn];
324*15dc779aSAndroid Build Coastguard Worker UWORD8 *ms_used = usac_data->ms_used[chn];
325*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_drc_offset = 0;
326*15dc779aSAndroid Build Coastguard Worker
327*15dc779aSAndroid Build Coastguard Worker for (grp = 0; grp < ptr_sfb_info->num_groups; grp++) {
328*15dc779aSAndroid Build Coastguard Worker for (grp_len = 0; grp_len < ptr_sfb_info->group_len[grp]; grp_len++) {
329*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset = 0;
330*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < nband; sfb++) {
331*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset += ptr_sfb_info->sfb_width[sfb];
332*15dc779aSAndroid Build Coastguard Worker if (ms_used[sfb]) {
333*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < ptr_sfb_info->sfb_width[sfb]; k++) {
334*15dc779aSAndroid Build Coastguard Worker temp_r = *r_spec;
335*15dc779aSAndroid Build Coastguard Worker temp_l = *l_spec;
336*15dc779aSAndroid Build Coastguard Worker *l_spec = ixheaac_add32_sat(temp_r, temp_l);
337*15dc779aSAndroid Build Coastguard Worker *r_spec = ixheaac_sub32_sat(temp_l, temp_r);
338*15dc779aSAndroid Build Coastguard Worker r_spec++;
339*15dc779aSAndroid Build Coastguard Worker l_spec++;
340*15dc779aSAndroid Build Coastguard Worker }
341*15dc779aSAndroid Build Coastguard Worker } else {
342*15dc779aSAndroid Build Coastguard Worker r_spec += ptr_sfb_info->sfb_width[sfb];
343*15dc779aSAndroid Build Coastguard Worker l_spec += ptr_sfb_info->sfb_width[sfb];
344*15dc779aSAndroid Build Coastguard Worker }
345*15dc779aSAndroid Build Coastguard Worker }
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker l_spec = l_spec + ptr_sfb_info->bins_per_sbk - ixheaacd_drc_offset;
348*15dc779aSAndroid Build Coastguard Worker r_spec = r_spec + ptr_sfb_info->bins_per_sbk - ixheaacd_drc_offset;
349*15dc779aSAndroid Build Coastguard Worker }
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker ms_used += ptr_sfb_info->sfb_per_sbk;
352*15dc779aSAndroid Build Coastguard Worker }
353*15dc779aSAndroid Build Coastguard Worker }
354*15dc779aSAndroid Build Coastguard Worker
ixheaacd_filter_and_add(const WORD32 * in,const WORD32 length,const WORD16 * filter,WORD32 * out,const WORD32 factor_even,const WORD32 factor_odd)355*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_filter_and_add(const WORD32 *in, const WORD32 length,
356*15dc779aSAndroid Build Coastguard Worker const WORD16 *filter, WORD32 *out,
357*15dc779aSAndroid Build Coastguard Worker const WORD32 factor_even,
358*15dc779aSAndroid Build Coastguard Worker const WORD32 factor_odd) {
359*15dc779aSAndroid Build Coastguard Worker WORD32 i;
360*15dc779aSAndroid Build Coastguard Worker WORD64 sum;
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mult32x32in64(in[2], filter[0]);
363*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[1], filter[1]);
364*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[0], filter[2]);
365*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_n(sum, &in[0], &filter[3], 4);
366*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
367*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_even) >> 15)));
368*15dc779aSAndroid Build Coastguard Worker out++;
369*15dc779aSAndroid Build Coastguard Worker
370*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mult32x32in64(in[1], filter[0]);
371*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[0], filter[1]);
372*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_n(sum, &in[0], &filter[2], 5);
373*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
374*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15)));
375*15dc779aSAndroid Build Coastguard Worker out++;
376*15dc779aSAndroid Build Coastguard Worker
377*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mult32x32in64(in[0], filter[0]);
378*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_n(sum, &in[0], &filter[1], 6);
379*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
380*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_even) >> 15)));
381*15dc779aSAndroid Build Coastguard Worker out++;
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker for (i = 3; i < length - 4; i += 2) {
384*15dc779aSAndroid Build Coastguard Worker sum = 0;
385*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_7(&in[i - 3], filter);
386*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
387*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15)));
388*15dc779aSAndroid Build Coastguard Worker out++;
389*15dc779aSAndroid Build Coastguard Worker
390*15dc779aSAndroid Build Coastguard Worker sum = 0;
391*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_7(&in[i - 2], filter);
392*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
393*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_even) >> 15)));
394*15dc779aSAndroid Build Coastguard Worker out++;
395*15dc779aSAndroid Build Coastguard Worker }
396*15dc779aSAndroid Build Coastguard Worker i = length - 3;
397*15dc779aSAndroid Build Coastguard Worker sum = 0;
398*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_n(sum, &in[i - 3], filter, 6);
399*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[i + 2], filter[6]);
400*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
401*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15)));
402*15dc779aSAndroid Build Coastguard Worker
403*15dc779aSAndroid Build Coastguard Worker out++;
404*15dc779aSAndroid Build Coastguard Worker i = length - 2;
405*15dc779aSAndroid Build Coastguard Worker sum = 0;
406*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_n(sum, &in[i - 3], filter, 5);
407*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[i + 1], filter[5]);
408*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[i], filter[6]);
409*15dc779aSAndroid Build Coastguard Worker
410*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
411*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_even) >> 15)));
412*15dc779aSAndroid Build Coastguard Worker out++;
413*15dc779aSAndroid Build Coastguard Worker
414*15dc779aSAndroid Build Coastguard Worker i = length - 1;
415*15dc779aSAndroid Build Coastguard Worker sum = 0;
416*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64_n(sum, &in[i - 3], filter, 4);
417*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[i], filter[4]);
418*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[i - 1], filter[5]);
419*15dc779aSAndroid Build Coastguard Worker sum = ixheaac_mac32x32in64(sum, in[i - 2], filter[6]);
420*15dc779aSAndroid Build Coastguard Worker
421*15dc779aSAndroid Build Coastguard Worker *out = ixheaac_add32_sat(
422*15dc779aSAndroid Build Coastguard Worker *out, ixheaac_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15)));
423*15dc779aSAndroid Build Coastguard Worker }
424*15dc779aSAndroid Build Coastguard Worker
ixheaacd_estimate_dmx_im(const WORD32 * dmx_re,const WORD32 * dmx_re_prev,WORD32 * dmx_im,ia_sfb_info_struct * pstr_sfb_info,WORD32 window,const WORD32 w_shape,const WORD32 prev_w_shape)425*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_estimate_dmx_im(const WORD32 *dmx_re,
426*15dc779aSAndroid Build Coastguard Worker const WORD32 *dmx_re_prev, WORD32 *dmx_im,
427*15dc779aSAndroid Build Coastguard Worker ia_sfb_info_struct *pstr_sfb_info,
428*15dc779aSAndroid Build Coastguard Worker WORD32 window, const WORD32 w_shape,
429*15dc779aSAndroid Build Coastguard Worker const WORD32 prev_w_shape) {
430*15dc779aSAndroid Build Coastguard Worker WORD32 i;
431*15dc779aSAndroid Build Coastguard Worker const WORD16 *mdst_fcoeff_curr, *mdst_fcoeff_prev;
432*15dc779aSAndroid Build Coastguard Worker
433*15dc779aSAndroid Build Coastguard Worker switch (window) {
434*15dc779aSAndroid Build Coastguard Worker case ONLY_LONG_SEQUENCE:
435*15dc779aSAndroid Build Coastguard Worker case EIGHT_SHORT_SEQUENCE:
436*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_curr =
437*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_longshort_curr[prev_w_shape][w_shape];
438*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_prev = ixheaacd_mdst_fcoeff_l_s_start_left_prev[prev_w_shape];
439*15dc779aSAndroid Build Coastguard Worker break;
440*15dc779aSAndroid Build Coastguard Worker case LONG_START_SEQUENCE:
441*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_curr = ixheaacd_mdst_fcoeff_start_curr[prev_w_shape][w_shape];
442*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_prev = ixheaacd_mdst_fcoeff_l_s_start_left_prev[prev_w_shape];
443*15dc779aSAndroid Build Coastguard Worker break;
444*15dc779aSAndroid Build Coastguard Worker case LONG_STOP_SEQUENCE:
445*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_curr = ixheaacd_mdst_fcoeff_stop_cur[prev_w_shape][w_shape];
446*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_prev =
447*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[prev_w_shape];
448*15dc779aSAndroid Build Coastguard Worker break;
449*15dc779aSAndroid Build Coastguard Worker case STOP_START_SEQUENCE:
450*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_curr =
451*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stopstart_cur[prev_w_shape][w_shape];
452*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_prev =
453*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[prev_w_shape];
454*15dc779aSAndroid Build Coastguard Worker break;
455*15dc779aSAndroid Build Coastguard Worker default:
456*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_curr =
457*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stopstart_cur[prev_w_shape][w_shape];
458*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_prev =
459*15dc779aSAndroid Build Coastguard Worker ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[prev_w_shape];
460*15dc779aSAndroid Build Coastguard Worker break;
461*15dc779aSAndroid Build Coastguard Worker }
462*15dc779aSAndroid Build Coastguard Worker
463*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_sfb_info->max_win_len; i++) {
464*15dc779aSAndroid Build Coastguard Worker ixheaacd_filter_and_add(dmx_re, pstr_sfb_info->bins_per_sbk,
465*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_curr, dmx_im, 1, 1);
466*15dc779aSAndroid Build Coastguard Worker
467*15dc779aSAndroid Build Coastguard Worker if (dmx_re_prev)
468*15dc779aSAndroid Build Coastguard Worker ixheaacd_filter_and_add(dmx_re_prev, pstr_sfb_info->bins_per_sbk,
469*15dc779aSAndroid Build Coastguard Worker mdst_fcoeff_prev, dmx_im, -1, 1);
470*15dc779aSAndroid Build Coastguard Worker
471*15dc779aSAndroid Build Coastguard Worker dmx_re_prev = dmx_re;
472*15dc779aSAndroid Build Coastguard Worker dmx_re += pstr_sfb_info->bins_per_sbk;
473*15dc779aSAndroid Build Coastguard Worker dmx_im += pstr_sfb_info->bins_per_sbk;
474*15dc779aSAndroid Build Coastguard Worker }
475*15dc779aSAndroid Build Coastguard Worker return;
476*15dc779aSAndroid Build Coastguard Worker }
477*15dc779aSAndroid Build Coastguard Worker
ixheaacd_cplx_pred_upmixing(ia_usac_data_struct * usac_data,WORD32 * l_spec,WORD32 * r_spec,ia_usac_tmp_core_coder_struct * pstr_core_coder,WORD32 chn)478*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_cplx_pred_upmixing(
479*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *usac_data, WORD32 *l_spec, WORD32 *r_spec,
480*15dc779aSAndroid Build Coastguard Worker ia_usac_tmp_core_coder_struct *pstr_core_coder, WORD32 chn) {
481*15dc779aSAndroid Build Coastguard Worker ia_sfb_info_struct *pstr_sfb_info = usac_data->pstr_sfb_info[chn];
482*15dc779aSAndroid Build Coastguard Worker WORD32 *dmx_re = &usac_data->scratch_buffer[0];
483*15dc779aSAndroid Build Coastguard Worker WORD32 *dmx_im = &usac_data->x_ac_dec[0];
484*15dc779aSAndroid Build Coastguard Worker
485*15dc779aSAndroid Build Coastguard Worker WORD32 grp, sfb, grp_len, i = 0, k;
486*15dc779aSAndroid Build Coastguard Worker WORD32 *dmx_re_prev = usac_data->dmx_re_prev;
487*15dc779aSAndroid Build Coastguard Worker WORD32(*alpha_q_re)[SFB_NUM_MAX] = usac_data->alpha_q_re;
488*15dc779aSAndroid Build Coastguard Worker WORD32(*alpha_q_im)[SFB_NUM_MAX] = usac_data->alpha_q_im;
489*15dc779aSAndroid Build Coastguard Worker
490*15dc779aSAndroid Build Coastguard Worker UWORD8(*cplx_pred_used)[SFB_NUM_MAX] = usac_data->cplx_pred_used;
491*15dc779aSAndroid Build Coastguard Worker
492*15dc779aSAndroid Build Coastguard Worker WORD32 alpha_q_re_temp;
493*15dc779aSAndroid Build Coastguard Worker WORD32 alpha_q_im_temp;
494*15dc779aSAndroid Build Coastguard Worker WORD32 factor = 1;
495*15dc779aSAndroid Build Coastguard Worker
496*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->pred_dir) factor = -1;
497*15dc779aSAndroid Build Coastguard Worker
498*15dc779aSAndroid Build Coastguard Worker for (grp = 0; grp < pstr_sfb_info->num_groups; grp++) {
499*15dc779aSAndroid Build Coastguard Worker for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
500*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
501*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[grp][sfb] == 1) {
502*15dc779aSAndroid Build Coastguard Worker memcpy(&dmx_re[i], &l_spec[i],
503*15dc779aSAndroid Build Coastguard Worker pstr_sfb_info->sfb_width[sfb] * sizeof(WORD32));
504*15dc779aSAndroid Build Coastguard Worker i += pstr_sfb_info->sfb_width[sfb];
505*15dc779aSAndroid Build Coastguard Worker }
506*15dc779aSAndroid Build Coastguard Worker
507*15dc779aSAndroid Build Coastguard Worker else {
508*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
509*15dc779aSAndroid Build Coastguard Worker dmx_re[i] = (WORD32)(
510*15dc779aSAndroid Build Coastguard Worker ((WORD64)l_spec[i] + ((WORD64)factor * (WORD64)r_spec[i])) >>
511*15dc779aSAndroid Build Coastguard Worker 1);
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker }
514*15dc779aSAndroid Build Coastguard Worker }
515*15dc779aSAndroid Build Coastguard Worker }
516*15dc779aSAndroid Build Coastguard Worker }
517*15dc779aSAndroid Build Coastguard Worker
518*15dc779aSAndroid Build Coastguard Worker memset(dmx_im, 0, sizeof(WORD32) * BLOCK_LEN_LONG);
519*15dc779aSAndroid Build Coastguard Worker
520*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->complex_coef) {
521*15dc779aSAndroid Build Coastguard Worker WORD32 *p_dmx_re_prev =
522*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->use_prev_frame ? dmx_re_prev : NULL;
523*15dc779aSAndroid Build Coastguard Worker ixheaacd_estimate_dmx_im(dmx_re, p_dmx_re_prev, dmx_im, pstr_sfb_info,
524*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence[chn],
525*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[chn],
526*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[chn]);
527*15dc779aSAndroid Build Coastguard Worker
528*15dc779aSAndroid Build Coastguard Worker for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) {
529*15dc779aSAndroid Build Coastguard Worker for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
530*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
531*15dc779aSAndroid Build Coastguard Worker alpha_q_re_temp = ixheaac_sat64_32(ixheaac_mult32x32in64(alpha_q_re[grp][sfb], 1677722));
532*15dc779aSAndroid Build Coastguard Worker alpha_q_im_temp = ixheaac_sat64_32(ixheaac_mult32x32in64(alpha_q_im[grp][sfb], 1677722));
533*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[grp][sfb]) {
534*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
535*15dc779aSAndroid Build Coastguard Worker WORD32 mid_side = ixheaac_sub32_sat(
536*15dc779aSAndroid Build Coastguard Worker ixheaac_sub32_sat(r_spec[i],
537*15dc779aSAndroid Build Coastguard Worker (WORD32)((WORD64)ixheaac_mult32x32in64(
538*15dc779aSAndroid Build Coastguard Worker alpha_q_re_temp, l_spec[i]) >>
539*15dc779aSAndroid Build Coastguard Worker 24)),
540*15dc779aSAndroid Build Coastguard Worker (WORD32)((WORD64)ixheaac_mult32x32in64(alpha_q_im_temp,
541*15dc779aSAndroid Build Coastguard Worker dmx_im[i]) >>
542*15dc779aSAndroid Build Coastguard Worker 24));
543*15dc779aSAndroid Build Coastguard Worker r_spec[i] = ixheaac_sat64_32((WORD64)factor) *
544*15dc779aSAndroid Build Coastguard Worker (WORD64)(ixheaac_sub32_sat(l_spec[i], mid_side));
545*15dc779aSAndroid Build Coastguard Worker l_spec[i] = ixheaac_add32_sat(l_spec[i], mid_side);
546*15dc779aSAndroid Build Coastguard Worker }
547*15dc779aSAndroid Build Coastguard Worker } else {
548*15dc779aSAndroid Build Coastguard Worker i += pstr_sfb_info->sfb_width[sfb];
549*15dc779aSAndroid Build Coastguard Worker }
550*15dc779aSAndroid Build Coastguard Worker }
551*15dc779aSAndroid Build Coastguard Worker }
552*15dc779aSAndroid Build Coastguard Worker }
553*15dc779aSAndroid Build Coastguard Worker } else {
554*15dc779aSAndroid Build Coastguard Worker for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) {
555*15dc779aSAndroid Build Coastguard Worker for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
556*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
557*15dc779aSAndroid Build Coastguard Worker alpha_q_re_temp = ixheaac_sat64_32(ixheaac_mult32x32in64(alpha_q_re[grp][sfb], 1677722));
558*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[grp][sfb]) {
559*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
560*15dc779aSAndroid Build Coastguard Worker WORD32 mid_side = ixheaac_sub32_sat(
561*15dc779aSAndroid Build Coastguard Worker r_spec[i], (WORD32)((WORD64)ixheaac_mult32x32in64(
562*15dc779aSAndroid Build Coastguard Worker alpha_q_re_temp, l_spec[i]) >>
563*15dc779aSAndroid Build Coastguard Worker 24));
564*15dc779aSAndroid Build Coastguard Worker
565*15dc779aSAndroid Build Coastguard Worker r_spec[i] = ixheaac_sat64_32((WORD64)factor) *
566*15dc779aSAndroid Build Coastguard Worker (WORD64)(ixheaac_sub32_sat(l_spec[i], mid_side));
567*15dc779aSAndroid Build Coastguard Worker l_spec[i] = ixheaac_add32_sat(l_spec[i], mid_side);
568*15dc779aSAndroid Build Coastguard Worker }
569*15dc779aSAndroid Build Coastguard Worker } else {
570*15dc779aSAndroid Build Coastguard Worker i += pstr_sfb_info->sfb_width[sfb];
571*15dc779aSAndroid Build Coastguard Worker }
572*15dc779aSAndroid Build Coastguard Worker }
573*15dc779aSAndroid Build Coastguard Worker }
574*15dc779aSAndroid Build Coastguard Worker }
575*15dc779aSAndroid Build Coastguard Worker }
576*15dc779aSAndroid Build Coastguard Worker
577*15dc779aSAndroid Build Coastguard Worker return;
578*15dc779aSAndroid Build Coastguard Worker }
579*15dc779aSAndroid Build Coastguard Worker
ixheaacd_cplx_prev_mdct_dmx(ia_sfb_info_struct * pstr_sfb_info,WORD32 * l_spec,WORD32 * r_spec,WORD32 * dmx_re_prev,WORD32 pred_dir)580*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_cplx_prev_mdct_dmx(ia_sfb_info_struct *pstr_sfb_info,
581*15dc779aSAndroid Build Coastguard Worker WORD32 *l_spec, WORD32 *r_spec,
582*15dc779aSAndroid Build Coastguard Worker WORD32 *dmx_re_prev, WORD32 pred_dir) {
583*15dc779aSAndroid Build Coastguard Worker WORD32 offs, i;
584*15dc779aSAndroid Build Coastguard Worker WORD32 factor = 1;
585*15dc779aSAndroid Build Coastguard Worker if (pred_dir) factor = -1;
586*15dc779aSAndroid Build Coastguard Worker
587*15dc779aSAndroid Build Coastguard Worker offs = pstr_sfb_info->samp_per_bk - pstr_sfb_info->bins_per_sbk;
588*15dc779aSAndroid Build Coastguard Worker
589*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_sfb_info->bins_per_sbk; i++)
590*15dc779aSAndroid Build Coastguard Worker dmx_re_prev[i] = (WORD32)(((WORD64)l_spec[i + offs] +
591*15dc779aSAndroid Build Coastguard Worker ((WORD64)factor * (WORD64)r_spec[i + offs])) >>
592*15dc779aSAndroid Build Coastguard Worker 1);
593*15dc779aSAndroid Build Coastguard Worker }
594*15dc779aSAndroid Build Coastguard Worker
ixheaacd_ics_info(ia_usac_data_struct * usac_data,WORD32 chn,UWORD8 * max_sfb,ia_bit_buf_struct * it_bit_buff,WORD32 window_sequence_last)595*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_ics_info(ia_usac_data_struct *usac_data, WORD32 chn,
596*15dc779aSAndroid Build Coastguard Worker UWORD8 *max_sfb, ia_bit_buf_struct *it_bit_buff,
597*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence_last
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 WORD32 win;
603*15dc779aSAndroid Build Coastguard Worker WORD32 mask = 0x40;
604*15dc779aSAndroid Build Coastguard Worker
605*15dc779aSAndroid Build Coastguard Worker UWORD8 *scf_group_ptr = usac_data->group_dis[chn];
606*15dc779aSAndroid Build Coastguard Worker
607*15dc779aSAndroid Build Coastguard Worker win = ixheaacd_read_bits_buf(it_bit_buff, 2);
608*15dc779aSAndroid Build Coastguard Worker
609*15dc779aSAndroid Build Coastguard Worker win = usac_data->window_sequence[chn] =
610*15dc779aSAndroid Build Coastguard Worker ixheaacd_win_seq_select(win, window_sequence_last);
611*15dc779aSAndroid Build Coastguard Worker if (win == -1) return -1;
612*15dc779aSAndroid Build Coastguard Worker
613*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_sfb_info[chn] =
614*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_usac_winmap[usac_data->window_sequence[chn]];
615*15dc779aSAndroid Build Coastguard Worker
616*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[chn] = ixheaacd_read_bits_buf(it_bit_buff, 1);
617*15dc779aSAndroid Build Coastguard Worker
618*15dc779aSAndroid Build Coastguard Worker if (usac_data->pstr_usac_winmap[win]->islong) {
619*15dc779aSAndroid Build Coastguard Worker *max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 6);
620*15dc779aSAndroid Build Coastguard Worker *scf_group_ptr = 1;
621*15dc779aSAndroid Build Coastguard Worker } else {
622*15dc779aSAndroid Build Coastguard Worker WORD32 i, scale_factor_grouping;
623*15dc779aSAndroid Build Coastguard Worker
624*15dc779aSAndroid Build Coastguard Worker *max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 4);
625*15dc779aSAndroid Build Coastguard Worker
626*15dc779aSAndroid Build Coastguard Worker scale_factor_grouping = ixheaacd_read_bits_buf(it_bit_buff, 7);
627*15dc779aSAndroid Build Coastguard Worker
628*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < 8; i++) {
629*15dc779aSAndroid Build Coastguard Worker if (!(scale_factor_grouping & mask)) *scf_group_ptr++ = i;
630*15dc779aSAndroid Build Coastguard Worker
631*15dc779aSAndroid Build Coastguard Worker mask = mask >> 1;
632*15dc779aSAndroid Build Coastguard Worker }
633*15dc779aSAndroid Build Coastguard Worker *scf_group_ptr++ = i;
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker ixheaacd_calc_grp_offset(usac_data->pstr_usac_winmap[win],
636*15dc779aSAndroid Build Coastguard Worker &usac_data->group_dis[chn][0]);
637*15dc779aSAndroid Build Coastguard Worker }
638*15dc779aSAndroid Build Coastguard Worker
639*15dc779aSAndroid Build Coastguard Worker if (*max_sfb > usac_data->pstr_sfb_info[chn]->sfb_per_sbk) {
640*15dc779aSAndroid Build Coastguard Worker *max_sfb = usac_data->pstr_sfb_info[chn]->sfb_per_sbk;
641*15dc779aSAndroid Build Coastguard Worker return -1;
642*15dc779aSAndroid Build Coastguard Worker }
643*15dc779aSAndroid Build Coastguard Worker
644*15dc779aSAndroid Build Coastguard Worker return 0;
645*15dc779aSAndroid Build Coastguard Worker }
646*15dc779aSAndroid Build Coastguard Worker
ixheaacd_core_coder_data(WORD32 id,ia_usac_data_struct * usac_data,WORD32 elem_idx,WORD32 chan_offset,ia_bit_buf_struct * it_bit_buff,WORD32 nr_core_coder_channels)647*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_core_coder_data(WORD32 id, ia_usac_data_struct *usac_data,
648*15dc779aSAndroid Build Coastguard Worker WORD32 elem_idx, WORD32 chan_offset,
649*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
650*15dc779aSAndroid Build Coastguard Worker WORD32 nr_core_coder_channels) {
651*15dc779aSAndroid Build Coastguard Worker WORD32 err_code = 0;
652*15dc779aSAndroid Build Coastguard Worker WORD32 k = 0, ch = 0, chn = 0, left = 0, right = 0;
653*15dc779aSAndroid Build Coastguard Worker
654*15dc779aSAndroid Build Coastguard Worker ia_usac_tmp_core_coder_struct str_tmp_core_coder = {0};
655*15dc779aSAndroid Build Coastguard Worker ia_usac_tmp_core_coder_struct *pstr_core_coder = &str_tmp_core_coder;
656*15dc779aSAndroid Build Coastguard Worker ia_td_frame_data_struct td_frame;
657*15dc779aSAndroid Build Coastguard Worker jmp_buf local;
658*15dc779aSAndroid Build Coastguard Worker
659*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
660*15dc779aSAndroid Build Coastguard Worker err_code = setjmp(local);
661*15dc779aSAndroid Build Coastguard Worker it_bit_buff->xaac_jmp_buf = &local;
662*15dc779aSAndroid Build Coastguard Worker }
663*15dc779aSAndroid Build Coastguard Worker if (err_code == 0 &&
664*15dc779aSAndroid Build Coastguard Worker ((usac_data->ec_flag == 0) || (usac_data->frame_ok == 1 && usac_data->ec_flag == 1))) {
665*15dc779aSAndroid Build Coastguard Worker memset(&td_frame, 0, sizeof(td_frame));
666*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_on_lr = 0;
667*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->pred_dir = 0;
668*15dc779aSAndroid Build Coastguard Worker if (id != ID_USAC_LFE) {
669*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < nr_core_coder_channels; ch++)
670*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->core_mode[ch] = ixheaacd_read_bits_buf(it_bit_buff, 1);
671*15dc779aSAndroid Build Coastguard Worker } else {
672*15dc779aSAndroid Build Coastguard Worker for (ch = 0; ch < nr_core_coder_channels; ch++) pstr_core_coder->core_mode[ch] = 0;
673*15dc779aSAndroid Build Coastguard Worker }
674*15dc779aSAndroid Build Coastguard Worker
675*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
676*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->core_mode[1] == 0) {
677*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_active = ixheaacd_read_bits_buf(it_bit_buff, 1);
678*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_window = ixheaacd_read_bits_buf(it_bit_buff, 1);
679*15dc779aSAndroid Build Coastguard Worker
680*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->common_window) {
681*15dc779aSAndroid Build Coastguard Worker left = chan_offset;
682*15dc779aSAndroid Build Coastguard Worker right = chan_offset + 1;
683*15dc779aSAndroid Build Coastguard Worker
684*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_ics_info(usac_data, left, &pstr_core_coder->max_sfb[left],
685*15dc779aSAndroid Build Coastguard Worker it_bit_buff, usac_data->window_sequence_last[left]);
686*15dc779aSAndroid Build Coastguard Worker
687*15dc779aSAndroid Build Coastguard Worker if (err_code == -1) {
688*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
689*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->max_sfb, pstr_core_coder->max_sfb,
690*15dc779aSAndroid Build Coastguard Worker sizeof(pstr_core_coder->max_sfb));
691*15dc779aSAndroid Build Coastguard Worker longjmp(*(it_bit_buff->xaac_jmp_buf),
692*15dc779aSAndroid Build Coastguard Worker IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
693*15dc779aSAndroid Build Coastguard Worker } else {
694*15dc779aSAndroid Build Coastguard Worker return err_code;
695*15dc779aSAndroid Build Coastguard Worker }
696*15dc779aSAndroid Build Coastguard Worker }
697*15dc779aSAndroid Build Coastguard Worker
698*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 1);
699*15dc779aSAndroid Build Coastguard Worker
700*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->common_max_sfb == 0) {
701*15dc779aSAndroid Build Coastguard Worker if (usac_data->window_sequence[left] == EIGHT_SHORT_SEQUENCE)
702*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb[right] = ixheaacd_read_bits_buf(it_bit_buff, 4);
703*15dc779aSAndroid Build Coastguard Worker else
704*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb[right] = ixheaacd_read_bits_buf(it_bit_buff, 6);
705*15dc779aSAndroid Build Coastguard Worker } else {
706*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb[right] = pstr_core_coder->max_sfb[left];
707*15dc779aSAndroid Build Coastguard Worker }
708*15dc779aSAndroid Build Coastguard Worker
709*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb_ste =
710*15dc779aSAndroid Build Coastguard Worker max(pstr_core_coder->max_sfb[left], pstr_core_coder->max_sfb[right]);
711*15dc779aSAndroid Build Coastguard Worker
712*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence[right] = usac_data->window_sequence[left];
713*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[right] = usac_data->window_shape[left];
714*15dc779aSAndroid Build Coastguard Worker memcpy(&usac_data->group_dis[right][0], &usac_data->group_dis[left][0], 8);
715*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_sfb_info[right] = usac_data->pstr_sfb_info[left];
716*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->max_sfb[right] > usac_data->pstr_sfb_info[right]->sfb_per_sbk)
717*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb[right] = usac_data->pstr_sfb_info[right]->sfb_per_sbk;
718*15dc779aSAndroid Build Coastguard Worker
719*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->ms_mask_present[0] =
720*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_ms_mask(usac_data, pstr_core_coder, it_bit_buff, left);
721*15dc779aSAndroid Build Coastguard Worker } else {
722*15dc779aSAndroid Build Coastguard Worker left = chan_offset;
723*15dc779aSAndroid Build Coastguard Worker right = chan_offset + 1;
724*15dc779aSAndroid Build Coastguard Worker
725*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->ms_mask_present[0] = 0;
726*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->ms_mask_present[1] = 0;
727*15dc779aSAndroid Build Coastguard Worker
728*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < SFB_NUM_MAX; k++) {
729*15dc779aSAndroid Build Coastguard Worker usac_data->alpha_q_re_prev[k] = 0;
730*15dc779aSAndroid Build Coastguard Worker usac_data->alpha_q_im_prev[k] = 0;
731*15dc779aSAndroid Build Coastguard Worker }
732*15dc779aSAndroid Build Coastguard Worker }
733*15dc779aSAndroid Build Coastguard Worker
734*15dc779aSAndroid Build Coastguard Worker if (usac_data->tw_mdct[elem_idx] == 1) {
735*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_tw = ixheaacd_read_bits_buf(it_bit_buff, 1);
736*15dc779aSAndroid Build Coastguard Worker
737*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->common_tw == 1) {
738*15dc779aSAndroid Build Coastguard Worker usac_data->tw_data_present[left] = ixheaacd_read_bits_buf(it_bit_buff, 1);
739*15dc779aSAndroid Build Coastguard Worker usac_data->tw_data_present[right] = usac_data->tw_data_present[left];
740*15dc779aSAndroid Build Coastguard Worker if (usac_data->tw_data_present[left]) {
741*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < NUM_TW_NODES; k++) {
742*15dc779aSAndroid Build Coastguard Worker usac_data->tw_ratio[left][k] = ixheaacd_read_bits_buf(it_bit_buff, 3);
743*15dc779aSAndroid Build Coastguard Worker usac_data->tw_ratio[right][k] = usac_data->tw_ratio[left][k];
744*15dc779aSAndroid Build Coastguard Worker }
745*15dc779aSAndroid Build Coastguard Worker }
746*15dc779aSAndroid Build Coastguard Worker }
747*15dc779aSAndroid Build Coastguard Worker }
748*15dc779aSAndroid Build Coastguard Worker
749*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->tns_active) {
750*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->common_window) {
751*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_tns = ixheaacd_read_bits_buf(it_bit_buff, 1);
752*15dc779aSAndroid Build Coastguard Worker
753*15dc779aSAndroid Build Coastguard Worker } else {
754*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_tns = 0;
755*15dc779aSAndroid Build Coastguard Worker }
756*15dc779aSAndroid Build Coastguard Worker
757*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_on_lr = ixheaacd_read_bits_buf(it_bit_buff, 1);
758*15dc779aSAndroid Build Coastguard Worker
759*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->common_tns) {
760*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_tns_u(usac_data->pstr_sfb_info[0], &usac_data->pstr_tns[left][0],
761*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
762*15dc779aSAndroid Build Coastguard Worker memcpy(&usac_data->pstr_tns[right][0], &usac_data->pstr_tns[left][0],
763*15dc779aSAndroid Build Coastguard Worker sizeof(ia_tns_frame_info_struct));
764*15dc779aSAndroid Build Coastguard Worker
765*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[0] = 2;
766*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[1] = 2;
767*15dc779aSAndroid Build Coastguard Worker } else {
768*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_present_both = ixheaacd_read_bits_buf(it_bit_buff, 1);
769*15dc779aSAndroid Build Coastguard Worker
770*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->tns_present_both) {
771*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[0] = 1;
772*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[1] = 1;
773*15dc779aSAndroid Build Coastguard Worker } else {
774*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[1] = ixheaacd_read_bits_buf(it_bit_buff, 1);
775*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[0] = 1 - pstr_core_coder->tns_data_present[1];
776*15dc779aSAndroid Build Coastguard Worker }
777*15dc779aSAndroid Build Coastguard Worker }
778*15dc779aSAndroid Build Coastguard Worker } else {
779*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_tns = 0;
780*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[0] = 0;
781*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[1] = 0;
782*15dc779aSAndroid Build Coastguard Worker }
783*15dc779aSAndroid Build Coastguard Worker
784*15dc779aSAndroid Build Coastguard Worker } else {
785*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_window = 0;
786*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->common_tw = 0;
787*15dc779aSAndroid Build Coastguard Worker left = chan_offset;
788*15dc779aSAndroid Build Coastguard Worker right = chan_offset;
789*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2) right = chan_offset + 1;
790*15dc779aSAndroid Build Coastguard Worker }
791*15dc779aSAndroid Build Coastguard Worker
792*15dc779aSAndroid Build Coastguard Worker for (ch = 0, chn = chan_offset; ch < nr_core_coder_channels; ch++, chn++) {
793*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->core_mode[chn] == CORE_MODE_LPD &&
794*15dc779aSAndroid Build Coastguard Worker usac_data->td_frame_prev[chn] == CORE_MODE_FD && usac_data->ec_flag) {
795*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->coef_fix[chn], usac_data->str_error_concealment[chn].spectral_coeff,
796*15dc779aSAndroid Build Coastguard Worker sizeof(usac_data->str_error_concealment[chn].spectral_coeff));
797*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->spec_scale[chn], usac_data->str_error_concealment[chn].q_spec_coeff,
798*15dc779aSAndroid Build Coastguard Worker sizeof(usac_data->spec_scale[chn]));
799*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_fd_frm_dec(usac_data, chn);
800*15dc779aSAndroid Build Coastguard Worker if (err_code == -1) return err_code;
801*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
802*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[chn][k] = (FLOAT32)(
803*15dc779aSAndroid Build Coastguard Worker (FLOAT32)usac_data->output_data_ptr[chn][k] * (FLOAT32)(ONE_BY_TWO_POW_15));
804*15dc779aSAndroid Build Coastguard Worker }
805*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->time_sample_vector_prev[chn], usac_data->time_sample_vector[chn],
806*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(usac_data->time_sample_vector_prev[chn][0]));
807*15dc779aSAndroid Build Coastguard Worker
808*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence[ch] = usac_data->str_error_concealment[ch].win_seq;
809*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[ch] = usac_data->str_error_concealment[ch].win_shape;
810*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
811*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
812*15dc779aSAndroid Build Coastguard Worker }
813*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->core_mode[ch] == 1) {
814*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_tw_buff_update(usac_data, chn, usac_data->str_tddec[chn]);
815*15dc779aSAndroid Build Coastguard Worker if (err_code == -1) return err_code;
816*15dc779aSAndroid Build Coastguard Worker
817*15dc779aSAndroid Build Coastguard Worker if (!usac_data->td_frame_prev[chn]) {
818*15dc779aSAndroid Build Coastguard Worker ixheaacd_fix2flt_data(usac_data, usac_data->str_tddec[chn], chn);
819*15dc779aSAndroid Build Coastguard Worker }
820*15dc779aSAndroid Build Coastguard Worker
821*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
822*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[chn][k] = (FLOAT32)(
823*15dc779aSAndroid Build Coastguard Worker (FLOAT32)usac_data->output_data_ptr[chn][k] * (FLOAT32)(ONE_BY_TWO_POW_15));
824*15dc779aSAndroid Build Coastguard Worker }
825*15dc779aSAndroid Build Coastguard Worker usac_data->present_chan = chn;
826*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_lpd_channel_stream(usac_data, &td_frame, it_bit_buff,
827*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[chn]);
828*15dc779aSAndroid Build Coastguard Worker if (err_code == -1) return err_code;
829*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
830*15dc779aSAndroid Build Coastguard Worker it_bit_buff->xaac_jmp_buf = &local;
831*15dc779aSAndroid Build Coastguard Worker }
832*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag && usac_data->frame_ok) {
833*15dc779aSAndroid Build Coastguard Worker memcpy(&usac_data->td_frame_data_prev[chn], &td_frame, sizeof(td_frame));
834*15dc779aSAndroid Build Coastguard Worker usac_data->core_mode = CORE_MODE_LPD;
835*15dc779aSAndroid Build Coastguard Worker }
836*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
837*15dc779aSAndroid Build Coastguard Worker usac_data->output_data_ptr[chn][k] =
838*15dc779aSAndroid Build Coastguard Worker (WORD32)(usac_data->time_sample_vector[chn][k] * (FLOAT32)((WORD64)1 << 15));
839*15dc779aSAndroid Build Coastguard Worker }
840*15dc779aSAndroid Build Coastguard Worker
841*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[chn] = WIN_SEL_0;
842*15dc779aSAndroid Build Coastguard Worker
843*15dc779aSAndroid Build Coastguard Worker ixheaacd_td_frm_dec(usac_data, chn, td_frame.mod[0]);
844*15dc779aSAndroid Build Coastguard Worker
845*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[chn] = usac_data->window_shape[chn];
846*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence_last[chn] = EIGHT_SHORT_SEQUENCE;
847*15dc779aSAndroid Build Coastguard Worker
848*15dc779aSAndroid Build Coastguard Worker } else {
849*15dc779aSAndroid Build Coastguard Worker memset(usac_data->coef_fix[chn], 0, LN2 * sizeof(*usac_data->coef_fix[0]));
850*15dc779aSAndroid Build Coastguard Worker
851*15dc779aSAndroid Build Coastguard Worker if (usac_data->str_tddec[chn] && usac_data->td_frame_prev[chn]) {
852*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
853*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->time_sample_vector[chn], usac_data->time_sample_vector_prev[chn],
854*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(usac_data->time_sample_vector[chn][0]));
855*15dc779aSAndroid Build Coastguard Worker }
856*15dc779aSAndroid Build Coastguard Worker ixheaacd_lpd_dec_update(usac_data->str_tddec[chn], usac_data, chn);
857*15dc779aSAndroid Build Coastguard Worker }
858*15dc779aSAndroid Build Coastguard Worker
859*15dc779aSAndroid Build Coastguard Worker if (id != ID_USAC_LFE) {
860*15dc779aSAndroid Build Coastguard Worker if ((nr_core_coder_channels == 1) ||
861*15dc779aSAndroid Build Coastguard Worker (pstr_core_coder->core_mode[0] != pstr_core_coder->core_mode[1]))
862*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->tns_data_present[ch] = ixheaacd_read_bits_buf(it_bit_buff, 1);
863*15dc779aSAndroid Build Coastguard Worker }
864*15dc779aSAndroid Build Coastguard Worker
865*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_fd_channel_stream(
866*15dc779aSAndroid Build Coastguard Worker usac_data, pstr_core_coder, &pstr_core_coder->max_sfb[ch],
867*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence_last[chn], chn, usac_data->noise_filling_config[elem_idx],
868*15dc779aSAndroid Build Coastguard Worker ch, it_bit_buff);
869*15dc779aSAndroid Build Coastguard Worker if (err_code == -1) return err_code;
870*15dc779aSAndroid Build Coastguard Worker }
871*15dc779aSAndroid Build Coastguard Worker }
872*15dc779aSAndroid Build Coastguard Worker
873*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->core_mode[0] == CORE_MODE_FD &&
874*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->core_mode[1] == CORE_MODE_FD && nr_core_coder_channels == 2) {
875*15dc779aSAndroid Build Coastguard Worker ixheaacd_cplx_prev_mdct_dmx(usac_data->pstr_sfb_info[left], usac_data->coef_save[left],
876*15dc779aSAndroid Build Coastguard Worker usac_data->coef_save[right], usac_data->dmx_re_prev,
877*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->pred_dir);
878*15dc779aSAndroid Build Coastguard Worker }
879*15dc779aSAndroid Build Coastguard Worker
880*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->tns_on_lr == 0 && (id != ID_USAC_LFE)) {
881*15dc779aSAndroid Build Coastguard Worker for (ch = 0, chn = left; chn <= right; ch++, chn++) {
882*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
883*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_tns_apply(usac_data, usac_data->coef_fix[chn],
884*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb[ch],
885*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
886*15dc779aSAndroid Build Coastguard Worker if (err_code) return err_code;
887*15dc779aSAndroid Build Coastguard Worker }
888*15dc779aSAndroid Build Coastguard Worker }
889*15dc779aSAndroid Build Coastguard Worker }
890*15dc779aSAndroid Build Coastguard Worker
891*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
892*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->core_mode[1] == 0) {
893*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->ms_mask_present[0] == 3) {
894*15dc779aSAndroid Build Coastguard Worker ixheaacd_cplx_pred_upmixing(usac_data, usac_data->coef_fix[left],
895*15dc779aSAndroid Build Coastguard Worker usac_data->coef_fix[right], pstr_core_coder, left);
896*15dc779aSAndroid Build Coastguard Worker
897*15dc779aSAndroid Build Coastguard Worker } else if (pstr_core_coder->ms_mask_present[0] > 0) {
898*15dc779aSAndroid Build Coastguard Worker ixheaacd_ms_stereo(usac_data, usac_data->coef_fix[right], usac_data->coef_fix[left], left,
899*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->max_sfb[right] > pstr_core_coder->max_sfb[left]
900*15dc779aSAndroid Build Coastguard Worker ? pstr_core_coder->max_sfb[right]
901*15dc779aSAndroid Build Coastguard Worker : pstr_core_coder->max_sfb[left]);
902*15dc779aSAndroid Build Coastguard Worker }
903*15dc779aSAndroid Build Coastguard Worker
904*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->tns_on_lr) {
905*15dc779aSAndroid Build Coastguard Worker for (ch = 0, chn = left; chn <= right; ch++, chn++) {
906*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
907*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_tns_apply(
908*15dc779aSAndroid Build Coastguard Worker usac_data, usac_data->coef_fix[chn], pstr_core_coder->max_sfb[ch],
909*15dc779aSAndroid Build Coastguard Worker usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
910*15dc779aSAndroid Build Coastguard Worker if (err_code) return err_code;
911*15dc779aSAndroid Build Coastguard Worker }
912*15dc779aSAndroid Build Coastguard Worker }
913*15dc779aSAndroid Build Coastguard Worker }
914*15dc779aSAndroid Build Coastguard Worker
915*15dc779aSAndroid Build Coastguard Worker ixheaacd_usac_cplx_save_prev(usac_data->pstr_sfb_info[left], usac_data->coef_fix[left],
916*15dc779aSAndroid Build Coastguard Worker usac_data->coef_fix[right], usac_data->coef_save[left],
917*15dc779aSAndroid Build Coastguard Worker usac_data->coef_save[right]);
918*15dc779aSAndroid Build Coastguard Worker }
919*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
920*15dc779aSAndroid Build Coastguard Worker for (chn = left; chn <= right; chn++) {
921*15dc779aSAndroid Build Coastguard Worker if (pstr_core_coder->core_mode[chn] == CORE_MODE_FD &&
922*15dc779aSAndroid Build Coastguard Worker usac_data->td_frame_prev[chn] == CORE_MODE_LPD) {
923*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->str_error_concealment[chn].spectral_coeff, usac_data->coef_fix[chn],
924*15dc779aSAndroid Build Coastguard Worker sizeof(usac_data->str_error_concealment[chn].spectral_coeff));
925*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->str_error_concealment[chn].q_spec_coeff, usac_data->spec_scale[chn],
926*15dc779aSAndroid Build Coastguard Worker sizeof(usac_data->spec_scale[chn]));
927*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[chn].win_seq = usac_data->window_sequence[chn];
928*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[chn].win_shape = usac_data->window_shape[chn];
929*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[chn].win_shape_prev =
930*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[chn];
931*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[chn].td_frame_prev = usac_data->td_frame_prev[chn];
932*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[chn].fac_data_present =
933*15dc779aSAndroid Build Coastguard Worker usac_data->fac_data_present[chn];
934*15dc779aSAndroid Build Coastguard Worker }
935*15dc779aSAndroid Build Coastguard Worker }
936*15dc779aSAndroid Build Coastguard Worker if (usac_data->frame_ok && usac_data->ec_flag) {
937*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->max_sfb, pstr_core_coder->max_sfb, sizeof(pstr_core_coder->max_sfb));
938*15dc779aSAndroid Build Coastguard Worker }
939*15dc779aSAndroid Build Coastguard Worker }
940*15dc779aSAndroid Build Coastguard Worker } else {
941*15dc779aSAndroid Build Coastguard Worker left = chan_offset;
942*15dc779aSAndroid Build Coastguard Worker right = chan_offset;
943*15dc779aSAndroid Build Coastguard Worker if (nr_core_coder_channels == 2) right = chan_offset + 1;
944*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag == 1) {
945*15dc779aSAndroid Build Coastguard Worker WORD32 err = 0;
946*15dc779aSAndroid Build Coastguard Worker usac_data->frame_ok = 0;
947*15dc779aSAndroid Build Coastguard Worker for (ch = left; ch <= right; ch++) {
948*15dc779aSAndroid Build Coastguard Worker if (usac_data->td_frame_prev[ch] == CORE_MODE_LPD) {
949*15dc779aSAndroid Build Coastguard Worker usac_data->fac_data_present[ch] = 0;
950*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[ch].pstr_ec_scratch =
951*15dc779aSAndroid Build Coastguard Worker (ia_ec_scratch_str *)&usac_data->str_error_concealment[ch].str_ec_scratch;
952*15dc779aSAndroid Build Coastguard Worker usac_data->core_mode = usac_data->td_frame_prev[ch];
953*15dc779aSAndroid Build Coastguard Worker usac_data->present_chan = ch;
954*15dc779aSAndroid Build Coastguard Worker ixheaacd_usac_apply_ec(usac_data, NULL, ch);
955*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[ch],
956*15dc779aSAndroid Build Coastguard Worker &usac_data->td_frame_data_prev[ch],
957*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[ch], usac_data->first_lpd_flag, 0,
958*15dc779aSAndroid Build Coastguard Worker usac_data->bpf_control_info);
959*15dc779aSAndroid Build Coastguard Worker
960*15dc779aSAndroid Build Coastguard Worker if (err) return err;
961*15dc779aSAndroid Build Coastguard Worker
962*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
963*15dc779aSAndroid Build Coastguard Worker usac_data->output_data_ptr[ch][k] =
964*15dc779aSAndroid Build Coastguard Worker (WORD32)(usac_data->time_sample_vector[ch][k] * (FLOAT32)((WORD64)1 << 15));
965*15dc779aSAndroid Build Coastguard Worker }
966*15dc779aSAndroid Build Coastguard Worker
967*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[ch] = WIN_SEL_0;
968*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
969*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence_last[ch] = EIGHT_SHORT_SEQUENCE;
970*15dc779aSAndroid Build Coastguard Worker } else {
971*15dc779aSAndroid Build Coastguard Worker pstr_core_coder->core_mode[ch] = CORE_MODE_FD;
972*15dc779aSAndroid Build Coastguard Worker }
973*15dc779aSAndroid Build Coastguard Worker }
974*15dc779aSAndroid Build Coastguard Worker }
975*15dc779aSAndroid Build Coastguard Worker }
976*15dc779aSAndroid Build Coastguard Worker
977*15dc779aSAndroid Build Coastguard Worker for (ch = left; ch <= right; ch++) {
978*15dc779aSAndroid Build Coastguard Worker FLOAT32 *ptr_scratch =
979*15dc779aSAndroid Build Coastguard Worker (FLOAT32 *)usac_data->str_error_concealment[ch].str_ec_scratch.spec_coeff;
980*15dc779aSAndroid Build Coastguard Worker if ((pstr_core_coder->core_mode[ch] != CORE_MODE_LPD &&
981*15dc779aSAndroid Build Coastguard Worker usac_data->td_frame_prev[ch] != CORE_MODE_LPD && usac_data->ec_flag) ||
982*15dc779aSAndroid Build Coastguard Worker (pstr_core_coder->core_mode[ch] == CORE_MODE_FD && usac_data->ec_flag == 0)) {
983*15dc779aSAndroid Build Coastguard Worker if (usac_data->tw_mdct[elem_idx]) {
984*15dc779aSAndroid Build Coastguard Worker err_code = -1;
985*15dc779aSAndroid Build Coastguard Worker return err_code;
986*15dc779aSAndroid Build Coastguard Worker
987*15dc779aSAndroid Build Coastguard Worker } else {
988*15dc779aSAndroid Build Coastguard Worker if (usac_data->frame_ok == 0) {
989*15dc779aSAndroid Build Coastguard Worker usac_data->fac_data_present[ch] = 0;
990*15dc779aSAndroid Build Coastguard Worker }
991*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_fd_frm_dec(usac_data, ch);
992*15dc779aSAndroid Build Coastguard Worker if (err_code == -1) return err_code;
993*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
994*15dc779aSAndroid Build Coastguard Worker if (usac_data->str_error_concealment[ch].fade_idx < MAX_FADE_FRAMES) {
995*15dc779aSAndroid Build Coastguard Worker FLOAT32 fade_fac = (FLOAT32)(ONE_BY_TWO_POW_15)*ia_ec_fade_factors
996*15dc779aSAndroid Build Coastguard Worker [usac_data->str_error_concealment[ch].fade_idx];
997*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
998*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[ch][k] =
999*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] * fade_fac);
1000*15dc779aSAndroid Build Coastguard Worker }
1001*15dc779aSAndroid Build Coastguard Worker } else {
1002*15dc779aSAndroid Build Coastguard Worker memset(&usac_data->time_sample_vector[ch][0], 0,
1003*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(usac_data->time_sample_vector[ch][0]));
1004*15dc779aSAndroid Build Coastguard Worker }
1005*15dc779aSAndroid Build Coastguard Worker } else {
1006*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
1007*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[ch][k] =
1008*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] *
1009*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(ONE_BY_TWO_POW_15));
1010*15dc779aSAndroid Build Coastguard Worker }
1011*15dc779aSAndroid Build Coastguard Worker }
1012*15dc779aSAndroid Build Coastguard Worker }
1013*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
1014*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
1015*15dc779aSAndroid Build Coastguard Worker } else {
1016*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
1017*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[ch].prev_frame_ok[0] =
1018*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[ch].prev_frame_ok[1];
1019*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[ch].prev_frame_ok[1] = usac_data->frame_ok;
1020*15dc779aSAndroid Build Coastguard Worker
1021*15dc779aSAndroid Build Coastguard Worker if (usac_data->str_error_concealment[ch].fade_idx < MAX_FADE_FRAMES) {
1022*15dc779aSAndroid Build Coastguard Worker FLOAT32 fade_fac =
1023*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(ONE_BY_TWO_POW_15)*ia_ec_fade_factors[usac_data->str_error_concealment[ch]
1024*15dc779aSAndroid Build Coastguard Worker .fade_idx];
1025*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
1026*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[ch][k] =
1027*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] * fade_fac);
1028*15dc779aSAndroid Build Coastguard Worker }
1029*15dc779aSAndroid Build Coastguard Worker } else {
1030*15dc779aSAndroid Build Coastguard Worker memset(&usac_data->time_sample_vector[ch][0], 0,
1031*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(usac_data->time_sample_vector[ch][0]));
1032*15dc779aSAndroid Build Coastguard Worker }
1033*15dc779aSAndroid Build Coastguard Worker
1034*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_scratch, usac_data->time_sample_vector[ch],
1035*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(ptr_scratch[0]));
1036*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->time_sample_vector[ch], usac_data->time_sample_vector_prev[ch],
1037*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(usac_data->time_sample_vector[ch][0]));
1038*15dc779aSAndroid Build Coastguard Worker memcpy(usac_data->time_sample_vector_prev[ch], ptr_scratch,
1039*15dc779aSAndroid Build Coastguard Worker usac_data->ccfl * sizeof(ptr_scratch[0]));
1040*15dc779aSAndroid Build Coastguard Worker } else {
1041*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < usac_data->ccfl; k++) {
1042*15dc779aSAndroid Build Coastguard Worker usac_data->time_sample_vector[ch][k] =
1043*15dc779aSAndroid Build Coastguard Worker (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] *
1044*15dc779aSAndroid Build Coastguard Worker (FLOAT32)(ONE_BY_TWO_POW_15));
1045*15dc779aSAndroid Build Coastguard Worker }
1046*15dc779aSAndroid Build Coastguard Worker }
1047*15dc779aSAndroid Build Coastguard Worker }
1048*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
1049*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence[ch] = usac_data->str_error_concealment[ch].win_seq;
1050*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape[ch] = usac_data->str_error_concealment[ch].win_shape;
1051*15dc779aSAndroid Build Coastguard Worker if (usac_data->first_frame == 0) {
1052*15dc779aSAndroid Build Coastguard Worker usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
1053*15dc779aSAndroid Build Coastguard Worker usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
1054*15dc779aSAndroid Build Coastguard Worker }
1055*15dc779aSAndroid Build Coastguard Worker }
1056*15dc779aSAndroid Build Coastguard Worker }
1057*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
1058*15dc779aSAndroid Build Coastguard Worker usac_data->first_frame = 0;
1059*15dc779aSAndroid Build Coastguard Worker if (usac_data->frame_ok == 1) {
1060*15dc779aSAndroid Build Coastguard Worker for (ch = 0, chn = left; chn <= right; chn++, ch++)
1061*15dc779aSAndroid Build Coastguard Worker usac_data->td_frame_prev[chn] = pstr_core_coder->core_mode[ch];
1062*15dc779aSAndroid Build Coastguard Worker }
1063*15dc779aSAndroid Build Coastguard Worker } else {
1064*15dc779aSAndroid Build Coastguard Worker for (ch = 0, chn = left; chn <= right; chn++, ch++)
1065*15dc779aSAndroid Build Coastguard Worker usac_data->td_frame_prev[chn] = pstr_core_coder->core_mode[ch];
1066*15dc779aSAndroid Build Coastguard Worker }
1067*15dc779aSAndroid Build Coastguard Worker
1068*15dc779aSAndroid Build Coastguard Worker return 0;
1069*15dc779aSAndroid Build Coastguard Worker }
1070