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 <string.h>
21*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_com.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
25*15dc779aSAndroid Build Coastguard Worker
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_interface.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_info.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_acelp_info.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_tns_usac.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_main.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_arith_dec.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_func_def.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
50*15dc779aSAndroid Build Coastguard Worker
51*15dc779aSAndroid Build Coastguard Worker extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[];
52*15dc779aSAndroid Build Coastguard Worker
ixheaacd_get_mode_lpc(WORD32 lpc_set,ia_bit_buf_struct * it_bit_buff,WORD32 * nk_mode)53*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_get_mode_lpc(WORD32 lpc_set, ia_bit_buf_struct *it_bit_buff, WORD32 *nk_mode) {
54*15dc779aSAndroid Build Coastguard Worker WORD32 mode_lpc = 0;
55*15dc779aSAndroid Build Coastguard Worker switch (lpc_set) {
56*15dc779aSAndroid Build Coastguard Worker case 4:
57*15dc779aSAndroid Build Coastguard Worker mode_lpc = 0;
58*15dc779aSAndroid Build Coastguard Worker break;
59*15dc779aSAndroid Build Coastguard Worker case 0:
60*15dc779aSAndroid Build Coastguard Worker case 2:
61*15dc779aSAndroid Build Coastguard Worker mode_lpc = ixheaacd_read_bits_buf(it_bit_buff, 1);
62*15dc779aSAndroid Build Coastguard Worker if (mode_lpc == 1) *nk_mode = 3;
63*15dc779aSAndroid Build Coastguard Worker break;
64*15dc779aSAndroid Build Coastguard Worker case 1:
65*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, 1) == 0)
66*15dc779aSAndroid Build Coastguard Worker mode_lpc = *nk_mode = 2;
67*15dc779aSAndroid Build Coastguard Worker else {
68*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, 1) == 0)
69*15dc779aSAndroid Build Coastguard Worker mode_lpc = *nk_mode = 0;
70*15dc779aSAndroid Build Coastguard Worker else
71*15dc779aSAndroid Build Coastguard Worker mode_lpc = *nk_mode = 1;
72*15dc779aSAndroid Build Coastguard Worker }
73*15dc779aSAndroid Build Coastguard Worker break;
74*15dc779aSAndroid Build Coastguard Worker case 3:
75*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, 1) == 0)
76*15dc779aSAndroid Build Coastguard Worker mode_lpc = *nk_mode = 1;
77*15dc779aSAndroid Build Coastguard Worker else {
78*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, 1) == 0)
79*15dc779aSAndroid Build Coastguard Worker mode_lpc = *nk_mode = 0;
80*15dc779aSAndroid Build Coastguard Worker else {
81*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, 1) == 0)
82*15dc779aSAndroid Build Coastguard Worker mode_lpc = 2;
83*15dc779aSAndroid Build Coastguard Worker else
84*15dc779aSAndroid Build Coastguard Worker mode_lpc = 3;
85*15dc779aSAndroid Build Coastguard Worker *nk_mode = 2;
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker }
88*15dc779aSAndroid Build Coastguard Worker break;
89*15dc779aSAndroid Build Coastguard Worker }
90*15dc779aSAndroid Build Coastguard Worker return mode_lpc;
91*15dc779aSAndroid Build Coastguard Worker }
92*15dc779aSAndroid Build Coastguard Worker
ixheaacd_qn_data(WORD32 nk_mode,WORD32 * qn,ia_bit_buf_struct * it_bit_buff)93*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_qn_data(WORD32 nk_mode, WORD32 *qn, ia_bit_buf_struct *it_bit_buff) {
94*15dc779aSAndroid Build Coastguard Worker WORD32 k;
95*15dc779aSAndroid Build Coastguard Worker switch (nk_mode) {
96*15dc779aSAndroid Build Coastguard Worker case 1:
97*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
98*15dc779aSAndroid Build Coastguard Worker while (ixheaacd_read_bits_buf(it_bit_buff, 1) == 1) {
99*15dc779aSAndroid Build Coastguard Worker qn[k] += 1;
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker if (qn[k] > 0) qn[k] += 1;
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker break;
104*15dc779aSAndroid Build Coastguard Worker case 0:
105*15dc779aSAndroid Build Coastguard Worker case 2:
106*15dc779aSAndroid Build Coastguard Worker case 3:
107*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) qn[k] = 2 + ixheaacd_read_bits_buf(it_bit_buff, 2);
108*15dc779aSAndroid Build Coastguard Worker
109*15dc779aSAndroid Build Coastguard Worker if (nk_mode == 2) {
110*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
111*15dc779aSAndroid Build Coastguard Worker if (qn[k] > 4) {
112*15dc779aSAndroid Build Coastguard Worker qn[k] = 0;
113*15dc779aSAndroid Build Coastguard Worker
114*15dc779aSAndroid Build Coastguard Worker while (ixheaacd_read_bits_buf(it_bit_buff, 1) == 1) qn[k] += 1;
115*15dc779aSAndroid Build Coastguard Worker
116*15dc779aSAndroid Build Coastguard Worker if (qn[k] > 0) qn[k] += 4;
117*15dc779aSAndroid Build Coastguard Worker }
118*15dc779aSAndroid Build Coastguard Worker }
119*15dc779aSAndroid Build Coastguard Worker } else {
120*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
121*15dc779aSAndroid Build Coastguard Worker if (qn[k] > 4) {
122*15dc779aSAndroid Build Coastguard Worker WORD32 qn_ext = 0;
123*15dc779aSAndroid Build Coastguard Worker while (ixheaacd_read_bits_buf(it_bit_buff, 1) == 1) qn_ext += 1;
124*15dc779aSAndroid Build Coastguard Worker
125*15dc779aSAndroid Build Coastguard Worker switch (qn_ext) {
126*15dc779aSAndroid Build Coastguard Worker case 0:
127*15dc779aSAndroid Build Coastguard Worker qn[k] = 5;
128*15dc779aSAndroid Build Coastguard Worker break;
129*15dc779aSAndroid Build Coastguard Worker case 1:
130*15dc779aSAndroid Build Coastguard Worker qn[k] = 6;
131*15dc779aSAndroid Build Coastguard Worker break;
132*15dc779aSAndroid Build Coastguard Worker case 2:
133*15dc779aSAndroid Build Coastguard Worker qn[k] = 0;
134*15dc779aSAndroid Build Coastguard Worker break;
135*15dc779aSAndroid Build Coastguard Worker default:
136*15dc779aSAndroid Build Coastguard Worker qn[k] = qn_ext + 4;
137*15dc779aSAndroid Build Coastguard Worker break;
138*15dc779aSAndroid Build Coastguard Worker }
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker break;
143*15dc779aSAndroid Build Coastguard Worker }
144*15dc779aSAndroid Build Coastguard Worker return;
145*15dc779aSAndroid Build Coastguard Worker }
146*15dc779aSAndroid Build Coastguard Worker
ixheaacd_code_book_indices(ia_td_frame_data_struct * pstr_td_frame_data,WORD32 nk_mode,WORD32 * pos,ia_bit_buf_struct * it_bit_buff)147*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_code_book_indices(ia_td_frame_data_struct *pstr_td_frame_data, WORD32 nk_mode,
148*15dc779aSAndroid Build Coastguard Worker WORD32 *pos, ia_bit_buf_struct *it_bit_buff) {
149*15dc779aSAndroid Build Coastguard Worker WORD32 k, qn[2] = {0, 0}, nk, n, i;
150*15dc779aSAndroid Build Coastguard Worker
151*15dc779aSAndroid Build Coastguard Worker ixheaacd_qn_data(nk_mode, &qn[0], it_bit_buff);
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[(*pos)++] = qn[0];
154*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[(*pos)++] = qn[1];
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
157*15dc779aSAndroid Build Coastguard Worker if (qn[k] > 0) {
158*15dc779aSAndroid Build Coastguard Worker if (qn[k] > 4) {
159*15dc779aSAndroid Build Coastguard Worker nk = (qn[k] - 3) / 2;
160*15dc779aSAndroid Build Coastguard Worker n = qn[k] - nk * 2;
161*15dc779aSAndroid Build Coastguard Worker } else {
162*15dc779aSAndroid Build Coastguard Worker nk = 0;
163*15dc779aSAndroid Build Coastguard Worker n = qn[k];
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[(*pos)++] =
166*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 4 * n);
167*15dc779aSAndroid Build Coastguard Worker
168*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 8; i++)
169*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[(*pos)++] =
170*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, nk);
171*15dc779aSAndroid Build Coastguard Worker }
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker return;
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker
ixheaacd_lpc_data(WORD32 first_lpd_flag,WORD32 mod[],ia_td_frame_data_struct * pstr_td_frame_data,ia_bit_buf_struct * it_bit_buff)176*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_lpc_data(WORD32 first_lpd_flag, WORD32 mod[],
177*15dc779aSAndroid Build Coastguard Worker ia_td_frame_data_struct *pstr_td_frame_data,
178*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
179*15dc779aSAndroid Build Coastguard Worker WORD32 mode_lpc, nk_mode = 0, j = 0;
180*15dc779aSAndroid Build Coastguard Worker
181*15dc779aSAndroid Build Coastguard Worker mode_lpc = ixheaacd_get_mode_lpc(4, it_bit_buff, &nk_mode);
182*15dc779aSAndroid Build Coastguard Worker
183*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
186*15dc779aSAndroid Build Coastguard Worker if (first_lpd_flag) {
187*15dc779aSAndroid Build Coastguard Worker mode_lpc = ixheaacd_get_mode_lpc(0, it_bit_buff, &nk_mode);
188*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
189*15dc779aSAndroid Build Coastguard Worker
190*15dc779aSAndroid Build Coastguard Worker if (mode_lpc == 0)
191*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
194*15dc779aSAndroid Build Coastguard Worker }
195*15dc779aSAndroid Build Coastguard Worker if (mod[0] < 3) {
196*15dc779aSAndroid Build Coastguard Worker mode_lpc = ixheaacd_get_mode_lpc(2, it_bit_buff, &nk_mode);
197*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker if (mode_lpc == 0)
200*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker if (mod[0] < 2) {
205*15dc779aSAndroid Build Coastguard Worker mode_lpc = ixheaacd_get_mode_lpc(1, it_bit_buff, &nk_mode);
206*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
207*15dc779aSAndroid Build Coastguard Worker
208*15dc779aSAndroid Build Coastguard Worker if (mode_lpc == 0)
209*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
210*15dc779aSAndroid Build Coastguard Worker
211*15dc779aSAndroid Build Coastguard Worker if (mode_lpc != 1) ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker if (mod[2] < 2) {
214*15dc779aSAndroid Build Coastguard Worker mode_lpc = ixheaacd_get_mode_lpc(3, it_bit_buff, &nk_mode);
215*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = mode_lpc;
216*15dc779aSAndroid Build Coastguard Worker
217*15dc779aSAndroid Build Coastguard Worker if (mode_lpc == 0)
218*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->lpc_first_approx_idx[j++] = ixheaacd_read_bits_buf(it_bit_buff, 8);
219*15dc779aSAndroid Build Coastguard Worker
220*15dc779aSAndroid Build Coastguard Worker ixheaacd_code_book_indices(pstr_td_frame_data, nk_mode, &j, it_bit_buff);
221*15dc779aSAndroid Build Coastguard Worker }
222*15dc779aSAndroid Build Coastguard Worker return;
223*15dc779aSAndroid Build Coastguard Worker }
224*15dc779aSAndroid Build Coastguard Worker
ixheaacd_fac_decoding(WORD32 fac_length,WORD32 k,WORD32 * fac_prm,ia_bit_buf_struct * it_bit_buff)225*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_fac_decoding(WORD32 fac_length, WORD32 k, WORD32 *fac_prm,
226*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
227*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, n, qn, nk, kv[8];
228*15dc779aSAndroid Build Coastguard Worker long code_book_index;
229*15dc779aSAndroid Build Coastguard Worker
230*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < fac_length; i += 8) {
231*15dc779aSAndroid Build Coastguard Worker qn = 0;
232*15dc779aSAndroid Build Coastguard Worker while (ixheaacd_read_bits_buf(it_bit_buff, 1) == 1) {
233*15dc779aSAndroid Build Coastguard Worker qn += 1;
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker if (qn != 0) qn += 1;
236*15dc779aSAndroid Build Coastguard Worker
237*15dc779aSAndroid Build Coastguard Worker nk = 0;
238*15dc779aSAndroid Build Coastguard Worker n = qn;
239*15dc779aSAndroid Build Coastguard Worker if (qn > 4) {
240*15dc779aSAndroid Build Coastguard Worker nk = (qn - 3) >> 1;
241*15dc779aSAndroid Build Coastguard Worker n = qn - nk * 2;
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker
244*15dc779aSAndroid Build Coastguard Worker code_book_index = ixheaacd_read_bits_buf(it_bit_buff, 4 * n);
245*15dc779aSAndroid Build Coastguard Worker
246*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < 8; j++) {
247*15dc779aSAndroid Build Coastguard Worker kv[j] = ixheaacd_read_bits_buf(it_bit_buff, nk);
248*15dc779aSAndroid Build Coastguard Worker }
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker ixheaacd_rotated_gosset_mtx_dec(qn, code_book_index, kv, &fac_prm[k * FAC_LENGTH + i]);
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker
254*15dc779aSAndroid Build Coastguard Worker const UWORD8 ixheaacd_num_bites_celp_coding[8][4] = {
255*15dc779aSAndroid Build Coastguard Worker {5, 5, 5, 5}, {9, 9, 5, 5}, {9, 9, 9, 9}, {13, 13, 9, 9},
256*15dc779aSAndroid Build Coastguard Worker {13, 13, 13, 13}, {16, 16, 16, 16}, {1, 5, 1, 5}, {1, 5, 5, 5}};
257*15dc779aSAndroid Build Coastguard Worker
ixheaacd_acelp_decoding(WORD32 k,ia_usac_data_struct * usac_data,ia_td_frame_data_struct * pstr_td_frame_data,ia_bit_buf_struct * it_bit_buff,WORD32 chan)258*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_acelp_decoding(WORD32 k, ia_usac_data_struct *usac_data,
259*15dc779aSAndroid Build Coastguard Worker ia_td_frame_data_struct *pstr_td_frame_data,
260*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff, WORD32 chan) {
261*15dc779aSAndroid Build Coastguard Worker WORD32 sfr, kk;
262*15dc779aSAndroid Build Coastguard Worker WORD32 nb_subfr = usac_data->num_subfrm;
263*15dc779aSAndroid Build Coastguard Worker const UWORD8 *ptr_num_bits =
264*15dc779aSAndroid Build Coastguard Worker &ixheaacd_num_bites_celp_coding[pstr_td_frame_data->acelp_core_mode][0];
265*15dc779aSAndroid Build Coastguard Worker
266*15dc779aSAndroid Build Coastguard Worker chan = 0;
267*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mean_energy[k] = ixheaacd_read_bits_buf(it_bit_buff, 2);
268*15dc779aSAndroid Build Coastguard Worker
269*15dc779aSAndroid Build Coastguard Worker for (sfr = 0; sfr < nb_subfr; sfr++) {
270*15dc779aSAndroid Build Coastguard Worker kk = k * 4 + sfr;
271*15dc779aSAndroid Build Coastguard Worker
272*15dc779aSAndroid Build Coastguard Worker if ((sfr == 0) || ((nb_subfr == 4) && (sfr == 2)))
273*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->acb_index[kk] = ixheaacd_read_bits_buf(it_bit_buff, 9);
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker else
276*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->acb_index[kk] = ixheaacd_read_bits_buf(it_bit_buff, 6);
277*15dc779aSAndroid Build Coastguard Worker
278*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->ltp_filtering_flag[kk] = ixheaacd_read_bits_buf(it_bit_buff, 1);
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker if (pstr_td_frame_data->acelp_core_mode == 5) {
281*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][0] =
282*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
283*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][1] =
284*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
285*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][2] =
286*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
287*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][3] =
288*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
289*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][4] =
290*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 14);
291*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][5] =
292*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 14);
293*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][6] =
294*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 14);
295*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][7] =
296*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 14);
297*15dc779aSAndroid Build Coastguard Worker } else {
298*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][0] =
299*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ptr_num_bits[0]);
300*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][1] =
301*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ptr_num_bits[1]);
302*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][2] =
303*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ptr_num_bits[2]);
304*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->icb_index[kk][3] =
305*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ptr_num_bits[3]);
306*15dc779aSAndroid Build Coastguard Worker }
307*15dc779aSAndroid Build Coastguard Worker
308*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->gains[kk] = ixheaacd_read_bits_buf(it_bit_buff, 7);
309*15dc779aSAndroid Build Coastguard Worker }
310*15dc779aSAndroid Build Coastguard Worker }
311*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tcx_coding(ia_usac_data_struct * usac_data,pWORD32 quant,WORD32 k,WORD32 first_tcx_flag,ia_td_frame_data_struct * pstr_td_frame_data,ia_bit_buf_struct * it_bit_buff)312*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, pWORD32 quant, WORD32 k,
313*15dc779aSAndroid Build Coastguard Worker WORD32 first_tcx_flag, ia_td_frame_data_struct *pstr_td_frame_data,
314*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
315*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->noise_factor[k] = ixheaacd_read_bits_buf(it_bit_buff, 3);
316*15dc779aSAndroid Build Coastguard Worker
317*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->global_gain[k] = ixheaacd_read_bits_buf(it_bit_buff, 7);
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker switch (pstr_td_frame_data->mod[k]) {
320*15dc779aSAndroid Build Coastguard Worker case 1:
321*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->tcx_lg[k] = usac_data->len_subfrm;
322*15dc779aSAndroid Build Coastguard Worker break;
323*15dc779aSAndroid Build Coastguard Worker case 2:
324*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->tcx_lg[k] = 2 * (usac_data->len_subfrm);
325*15dc779aSAndroid Build Coastguard Worker break;
326*15dc779aSAndroid Build Coastguard Worker case 3:
327*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->tcx_lg[k] = 4 * (usac_data->len_subfrm);
328*15dc779aSAndroid Build Coastguard Worker break;
329*15dc779aSAndroid Build Coastguard Worker }
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker if (first_tcx_flag) {
332*15dc779aSAndroid Build Coastguard Worker if (usac_data->usac_independency_flg) {
333*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->arith_reset_flag = 1;
334*15dc779aSAndroid Build Coastguard Worker } else {
335*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->arith_reset_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
336*15dc779aSAndroid Build Coastguard Worker }
337*15dc779aSAndroid Build Coastguard Worker }
338*15dc779aSAndroid Build Coastguard Worker
339*15dc779aSAndroid Build Coastguard Worker ixheaacd_arith_data(pstr_td_frame_data, quant, usac_data, it_bit_buff, (first_tcx_flag), k);
340*15dc779aSAndroid Build Coastguard Worker
341*15dc779aSAndroid Build Coastguard Worker return;
342*15dc779aSAndroid Build Coastguard Worker }
343*15dc779aSAndroid Build Coastguard Worker
ixheaacd_lpd_channel_stream(ia_usac_data_struct * usac_data,ia_td_frame_data_struct * pstr_td_frame_data,ia_bit_buf_struct * it_bit_buff,FLOAT32 * synth)344*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_lpd_channel_stream(ia_usac_data_struct *usac_data,
345*15dc779aSAndroid Build Coastguard Worker ia_td_frame_data_struct *pstr_td_frame_data,
346*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff, FLOAT32 *synth) {
347*15dc779aSAndroid Build Coastguard Worker WORD32 lpd_mode, k, cnt, ii;
348*15dc779aSAndroid Build Coastguard Worker WORD32 first_tcx_flag;
349*15dc779aSAndroid Build Coastguard Worker WORD32 *quant;
350*15dc779aSAndroid Build Coastguard Worker WORD32 core_mode_last = 0, fac_data_present;
351*15dc779aSAndroid Build Coastguard Worker WORD32 *fac_data;
352*15dc779aSAndroid Build Coastguard Worker WORD32 first_lpd_flag = 0;
353*15dc779aSAndroid Build Coastguard Worker WORD32 short_fac_flag;
354*15dc779aSAndroid Build Coastguard Worker WORD32 bpf_control_info = 0;
355*15dc779aSAndroid Build Coastguard Worker WORD32 chan = usac_data->present_chan;
356*15dc779aSAndroid Build Coastguard Worker WORD32 last_lpd_mode = usac_data->str_tddec[chan]->mode_prev;
357*15dc779aSAndroid Build Coastguard Worker WORD32 err = 0;
358*15dc779aSAndroid Build Coastguard Worker short_fac_flag = 0;
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker jmp_buf local;
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
363*15dc779aSAndroid Build Coastguard Worker err = setjmp(local);
364*15dc779aSAndroid Build Coastguard Worker }
365*15dc779aSAndroid Build Coastguard Worker
366*15dc779aSAndroid Build Coastguard Worker if (usac_data->sampling_rate_idx <= 5 && usac_data->ec_flag) {
367*15dc779aSAndroid Build Coastguard Worker usac_data->frame_ok = 0;
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker
370*15dc779aSAndroid Build Coastguard Worker if (err == 0 && usac_data->frame_ok == 1) {
371*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
372*15dc779aSAndroid Build Coastguard Worker it_bit_buff->xaac_jmp_buf = &local;
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->acelp_core_mode = ixheaacd_read_bits_buf(it_bit_buff, 3);
375*15dc779aSAndroid Build Coastguard Worker
376*15dc779aSAndroid Build Coastguard Worker lpd_mode = ixheaacd_read_bits_buf(it_bit_buff, 5);
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker if ((lpd_mode > 25 || lpd_mode < 0)) {
379*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
380*15dc779aSAndroid Build Coastguard Worker longjmp(*(it_bit_buff->xaac_jmp_buf),
381*15dc779aSAndroid Build Coastguard Worker IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
382*15dc779aSAndroid Build Coastguard Worker } else {
383*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker }
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker if (lpd_mode == 25) {
388*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = pstr_td_frame_data->mod[2] =
389*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[3] = 3;
390*15dc779aSAndroid Build Coastguard Worker } else if (lpd_mode == 24) {
391*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = pstr_td_frame_data->mod[2] =
392*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[3] = 2;
393*15dc779aSAndroid Build Coastguard Worker } else {
394*15dc779aSAndroid Build Coastguard Worker if (lpd_mode >= 20) {
395*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[0] = lpd_mode & 1;
396*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[1] = (lpd_mode >> 1) & 1;
397*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[2] = pstr_td_frame_data->mod[3] = 2;
398*15dc779aSAndroid Build Coastguard Worker } else if (lpd_mode >= 16) {
399*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[0] = pstr_td_frame_data->mod[1] = 2;
400*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[2] = lpd_mode & 1;
401*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[3] = (lpd_mode >> 1) & 1;
402*15dc779aSAndroid Build Coastguard Worker } else {
403*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[0] = lpd_mode & 1;
404*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[1] = (lpd_mode >> 1) & 1;
405*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[2] = (lpd_mode >> 2) & 1;
406*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->mod[3] = (lpd_mode >> 3) & 1;
407*15dc779aSAndroid Build Coastguard Worker }
408*15dc779aSAndroid Build Coastguard Worker }
409*15dc779aSAndroid Build Coastguard Worker
410*15dc779aSAndroid Build Coastguard Worker bpf_control_info = ixheaacd_read_bits_buf(it_bit_buff, 1);
411*15dc779aSAndroid Build Coastguard Worker
412*15dc779aSAndroid Build Coastguard Worker core_mode_last = ixheaacd_read_bits_buf(it_bit_buff, 1);
413*15dc779aSAndroid Build Coastguard Worker
414*15dc779aSAndroid Build Coastguard Worker fac_data_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
415*15dc779aSAndroid Build Coastguard Worker
416*15dc779aSAndroid Build Coastguard Worker first_lpd_flag = (core_mode_last == 0) ? 1 : 0;
417*15dc779aSAndroid Build Coastguard Worker
418*15dc779aSAndroid Build Coastguard Worker quant = pstr_td_frame_data->x_tcx_invquant;
419*15dc779aSAndroid Build Coastguard Worker first_tcx_flag = 1;
420*15dc779aSAndroid Build Coastguard Worker k = 0;
421*15dc779aSAndroid Build Coastguard Worker while (k < 4) {
422*15dc779aSAndroid Build Coastguard Worker if (k == 0) {
423*15dc779aSAndroid Build Coastguard Worker if ((core_mode_last == 1) && (fac_data_present == 1))
424*15dc779aSAndroid Build Coastguard Worker ixheaacd_fac_decoding((usac_data->len_subfrm) / 2, k, pstr_td_frame_data->fac,
425*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
426*15dc779aSAndroid Build Coastguard Worker } else {
427*15dc779aSAndroid Build Coastguard Worker if (((last_lpd_mode == 0) && (pstr_td_frame_data->mod[k] > 0)) ||
428*15dc779aSAndroid Build Coastguard Worker ((last_lpd_mode > 0) && (pstr_td_frame_data->mod[k] == 0)))
429*15dc779aSAndroid Build Coastguard Worker ixheaacd_fac_decoding((usac_data->len_subfrm) / 2, k, pstr_td_frame_data->fac,
430*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
431*15dc779aSAndroid Build Coastguard Worker }
432*15dc779aSAndroid Build Coastguard Worker
433*15dc779aSAndroid Build Coastguard Worker if (pstr_td_frame_data->mod[k] == 0) {
434*15dc779aSAndroid Build Coastguard Worker ixheaacd_acelp_decoding(k, usac_data, pstr_td_frame_data, it_bit_buff, chan);
435*15dc779aSAndroid Build Coastguard Worker last_lpd_mode = 0;
436*15dc779aSAndroid Build Coastguard Worker pstr_td_frame_data->tcx_lg[k] = 0;
437*15dc779aSAndroid Build Coastguard Worker k += 1;
438*15dc779aSAndroid Build Coastguard Worker } else {
439*15dc779aSAndroid Build Coastguard Worker ixheaacd_tcx_coding(usac_data, quant, k, first_tcx_flag, pstr_td_frame_data, it_bit_buff);
440*15dc779aSAndroid Build Coastguard Worker last_lpd_mode = pstr_td_frame_data->mod[k];
441*15dc779aSAndroid Build Coastguard Worker quant += pstr_td_frame_data->tcx_lg[k];
442*15dc779aSAndroid Build Coastguard Worker
443*15dc779aSAndroid Build Coastguard Worker cnt = 1 << (pstr_td_frame_data->mod[k] - 1);
444*15dc779aSAndroid Build Coastguard Worker
445*15dc779aSAndroid Build Coastguard Worker for (ii = 0; ii < cnt - 1; ii++) pstr_td_frame_data->tcx_lg[k + 1 + ii] = 0;
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker k += cnt;
448*15dc779aSAndroid Build Coastguard Worker first_tcx_flag = 0;
449*15dc779aSAndroid Build Coastguard Worker }
450*15dc779aSAndroid Build Coastguard Worker }
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker ixheaacd_lpc_data(first_lpd_flag, pstr_td_frame_data->mod, pstr_td_frame_data, it_bit_buff);
453*15dc779aSAndroid Build Coastguard Worker
454*15dc779aSAndroid Build Coastguard Worker if ((core_mode_last == 0) && (fac_data_present == 1)) {
455*15dc779aSAndroid Build Coastguard Worker WORD32 fac_length;
456*15dc779aSAndroid Build Coastguard Worker short_fac_flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
457*15dc779aSAndroid Build Coastguard Worker
458*15dc779aSAndroid Build Coastguard Worker fac_length = (short_fac_flag) ? ((usac_data->ccfl) / 16) : ((usac_data->ccfl) / 8);
459*15dc779aSAndroid Build Coastguard Worker
460*15dc779aSAndroid Build Coastguard Worker fac_data = pstr_td_frame_data->fac_data;
461*15dc779aSAndroid Build Coastguard Worker fac_data[0] = ixheaacd_read_bits_buf(it_bit_buff, 7);
462*15dc779aSAndroid Build Coastguard Worker if ((pstr_td_frame_data->fac_data[0] < 0) || (pstr_td_frame_data->fac_data[0] > 128)) {
463*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
464*15dc779aSAndroid Build Coastguard Worker longjmp(*(it_bit_buff->xaac_jmp_buf),
465*15dc779aSAndroid Build Coastguard Worker IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
466*15dc779aSAndroid Build Coastguard Worker } else {
467*15dc779aSAndroid Build Coastguard Worker return IA_FATAL_ERROR;
468*15dc779aSAndroid Build Coastguard Worker }
469*15dc779aSAndroid Build Coastguard Worker }
470*15dc779aSAndroid Build Coastguard Worker ixheaacd_fac_decoding(fac_length, 0, &fac_data[1], it_bit_buff);
471*15dc779aSAndroid Build Coastguard Worker }
472*15dc779aSAndroid Build Coastguard Worker if (fac_data_present == 0) {
473*15dc779aSAndroid Build Coastguard Worker memset(&pstr_td_frame_data->fac_data[0], 0, sizeof(pstr_td_frame_data->fac_data));
474*15dc779aSAndroid Build Coastguard Worker }
475*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag && usac_data->frame_ok) {
476*15dc779aSAndroid Build Coastguard Worker usac_data->bpf_control_info = bpf_control_info;
477*15dc779aSAndroid Build Coastguard Worker usac_data->core_mode_last = core_mode_last;
478*15dc779aSAndroid Build Coastguard Worker usac_data->first_lpd_flag = first_lpd_flag;
479*15dc779aSAndroid Build Coastguard Worker }
480*15dc779aSAndroid Build Coastguard Worker } else {
481*15dc779aSAndroid Build Coastguard Worker usac_data->frame_ok = 0;
482*15dc779aSAndroid Build Coastguard Worker }
483*15dc779aSAndroid Build Coastguard Worker
484*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
485*15dc779aSAndroid Build Coastguard Worker usac_data->str_error_concealment[chan].pstr_ec_scratch =
486*15dc779aSAndroid Build Coastguard Worker (ia_ec_scratch_str *)&usac_data->str_error_concealment[chan].str_ec_scratch;
487*15dc779aSAndroid Build Coastguard Worker
488*15dc779aSAndroid Build Coastguard Worker ixheaacd_usac_apply_ec(usac_data, &ixheaacd_samp_rate_info[0], chan);
489*15dc779aSAndroid Build Coastguard Worker
490*15dc779aSAndroid Build Coastguard Worker if (usac_data->frame_ok == 0) {
491*15dc779aSAndroid Build Coastguard Worker bpf_control_info = usac_data->bpf_control_info;
492*15dc779aSAndroid Build Coastguard Worker core_mode_last = usac_data->core_mode_last;
493*15dc779aSAndroid Build Coastguard Worker first_lpd_flag = usac_data->first_lpd_flag;
494*15dc779aSAndroid Build Coastguard Worker }
495*15dc779aSAndroid Build Coastguard Worker }
496*15dc779aSAndroid Build Coastguard Worker if (usac_data->frame_ok) {
497*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[chan], pstr_td_frame_data, synth,
498*15dc779aSAndroid Build Coastguard Worker first_lpd_flag, short_fac_flag, bpf_control_info);
499*15dc779aSAndroid Build Coastguard Worker } else {
500*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag) {
501*15dc779aSAndroid Build Coastguard Worker usac_data->fac_data_present[chan] = 0;
502*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_lpd_dec(usac_data, usac_data->str_tddec[chan],
503*15dc779aSAndroid Build Coastguard Worker &usac_data->td_frame_data_prev[chan], synth, first_lpd_flag,
504*15dc779aSAndroid Build Coastguard Worker short_fac_flag, bpf_control_info);
505*15dc779aSAndroid Build Coastguard Worker }
506*15dc779aSAndroid Build Coastguard Worker }
507*15dc779aSAndroid Build Coastguard Worker
508*15dc779aSAndroid Build Coastguard Worker return (err);
509*15dc779aSAndroid Build Coastguard Worker }
510*15dc779aSAndroid Build Coastguard Worker
ixheaacd_tw_buff_update(ia_usac_data_struct * usac_data,WORD32 i,ia_usac_lpd_decoder_handle st)511*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_tw_buff_update(ia_usac_data_struct *usac_data, WORD32 i,
512*15dc779aSAndroid Build Coastguard Worker ia_usac_lpd_decoder_handle st) {
513*15dc779aSAndroid Build Coastguard Worker WORD32 *p_ioverlap = usac_data->overlap_data_ptr[i];
514*15dc779aSAndroid Build Coastguard Worker WORD32 td_frame_prev = usac_data->td_frame_prev[i];
515*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence_last = usac_data->window_sequence_last[i];
516*15dc779aSAndroid Build Coastguard Worker WORD32 tw_mdct = usac_data->tw_mdct[0];
517*15dc779aSAndroid Build Coastguard Worker
518*15dc779aSAndroid Build Coastguard Worker if (!td_frame_prev) {
519*15dc779aSAndroid Build Coastguard Worker if (tw_mdct) {
520*15dc779aSAndroid Build Coastguard Worker if (usac_data->ec_flag == 0) {
521*15dc779aSAndroid Build Coastguard Worker return -1;
522*15dc779aSAndroid Build Coastguard Worker } else {
523*15dc779aSAndroid Build Coastguard Worker tw_mdct = 0;
524*15dc779aSAndroid Build Coastguard Worker }
525*15dc779aSAndroid Build Coastguard Worker } else {
526*15dc779aSAndroid Build Coastguard Worker ixheaacd_reset_acelp_data_fix(usac_data, st, p_ioverlap,
527*15dc779aSAndroid Build Coastguard Worker (window_sequence_last == EIGHT_SHORT_SEQUENCE), 0);
528*15dc779aSAndroid Build Coastguard Worker }
529*15dc779aSAndroid Build Coastguard Worker }
530*15dc779aSAndroid Build Coastguard Worker return 0;
531*15dc779aSAndroid Build Coastguard Worker }
532*15dc779aSAndroid Build Coastguard Worker
ixheaacd_td_frm_dec(ia_usac_data_struct * usac_data,WORD32 k,WORD32 mod0)533*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_td_frm_dec(ia_usac_data_struct *usac_data, WORD32 k, WORD32 mod0) {
534*15dc779aSAndroid Build Coastguard Worker WORD32 i;
535*15dc779aSAndroid Build Coastguard Worker WORD32 lfac = 0;
536*15dc779aSAndroid Build Coastguard Worker
537*15dc779aSAndroid Build Coastguard Worker WORD32 *p_out_idata = usac_data->output_data_ptr[k];
538*15dc779aSAndroid Build Coastguard Worker WORD32 *p_ioverlap = usac_data->overlap_data_ptr[k];
539*15dc779aSAndroid Build Coastguard Worker WORD32 nlong = usac_data->ccfl;
540*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence_last = usac_data->window_sequence_last[k];
541*15dc779aSAndroid Build Coastguard Worker WORD32 td_frame_prev = usac_data->td_frame_prev[k];
542*15dc779aSAndroid Build Coastguard Worker WORD32 tw_mdct = usac_data->tw_mdct[0];
543*15dc779aSAndroid Build Coastguard Worker WORD32 nshort = nlong / 8;
544*15dc779aSAndroid Build Coastguard Worker WORD32 *p_in_idata = p_out_idata;
545*15dc779aSAndroid Build Coastguard Worker
546*15dc779aSAndroid Build Coastguard Worker if (!td_frame_prev) {
547*15dc779aSAndroid Build Coastguard Worker if (window_sequence_last == EIGHT_SHORT_SEQUENCE) {
548*15dc779aSAndroid Build Coastguard Worker lfac = nshort / 2;
549*15dc779aSAndroid Build Coastguard Worker } else {
550*15dc779aSAndroid Build Coastguard Worker lfac = nshort;
551*15dc779aSAndroid Build Coastguard Worker }
552*15dc779aSAndroid Build Coastguard Worker }
553*15dc779aSAndroid Build Coastguard Worker
554*15dc779aSAndroid Build Coastguard Worker if (!td_frame_prev && (mod0 == 0)) {
555*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (nlong / 2) - lfac - (LEN_SUBFR); i++) {
556*15dc779aSAndroid Build Coastguard Worker p_in_idata[i] = 0;
557*15dc779aSAndroid Build Coastguard Worker }
558*15dc779aSAndroid Build Coastguard Worker } else if (!td_frame_prev && (mod0 > 0)) {
559*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (nlong / 2) - lfac; i++) {
560*15dc779aSAndroid Build Coastguard Worker p_in_idata[i] = 0;
561*15dc779aSAndroid Build Coastguard Worker }
562*15dc779aSAndroid Build Coastguard Worker }
563*15dc779aSAndroid Build Coastguard Worker
564*15dc779aSAndroid Build Coastguard Worker if (tw_mdct) {
565*15dc779aSAndroid Build Coastguard Worker if (!td_frame_prev && (mod0 == 0)) {
566*15dc779aSAndroid Build Coastguard Worker for (i = (nlong / 2) - lfac - (LEN_SUBFR); i < nlong / 2; i++) {
567*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i + (nlong / 2)] = 0;
568*15dc779aSAndroid Build Coastguard Worker }
569*15dc779aSAndroid Build Coastguard Worker }
570*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nlong / 2; i++) {
571*15dc779aSAndroid Build Coastguard Worker p_out_idata[i] = p_ioverlap[i] << 1;
572*15dc779aSAndroid Build Coastguard Worker p_out_idata[i + nlong / 2] =
573*15dc779aSAndroid Build Coastguard Worker ixheaac_add32_sat(p_ioverlap[i + nlong / 2] << 1, p_in_idata[i]);
574*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i] = ixheaac_add32_sat(p_in_idata[i + (nlong / 2)] >> 1, p_ioverlap[i + nlong]);
575*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i + (nlong / 2)] = 0;
576*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i + nlong] = 0;
577*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i + nlong + (nlong / 2)] = 0;
578*15dc779aSAndroid Build Coastguard Worker }
579*15dc779aSAndroid Build Coastguard Worker } else {
580*15dc779aSAndroid Build Coastguard Worker if (!td_frame_prev && (mod0 == 0)) {
581*15dc779aSAndroid Build Coastguard Worker for (i = (nlong / 2) - lfac - (LEN_SUBFR); i < nlong / 2; i++) {
582*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i] = 0;
583*15dc779aSAndroid Build Coastguard Worker }
584*15dc779aSAndroid Build Coastguard Worker } else if (!td_frame_prev) {
585*15dc779aSAndroid Build Coastguard Worker for (i = (nlong / 2) - lfac; i < nlong; i++) {
586*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i] = 0;
587*15dc779aSAndroid Build Coastguard Worker }
588*15dc779aSAndroid Build Coastguard Worker }
589*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < nlong; i++) {
590*15dc779aSAndroid Build Coastguard Worker p_out_idata[i] = ixheaac_add32_sat(p_ioverlap[i] << 1, p_in_idata[i]);
591*15dc779aSAndroid Build Coastguard Worker p_ioverlap[i] = 0;
592*15dc779aSAndroid Build Coastguard Worker }
593*15dc779aSAndroid Build Coastguard Worker }
594*15dc779aSAndroid Build Coastguard Worker }
595