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
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
36*15dc779aSAndroid Build Coastguard Worker
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
45*15dc779aSAndroid Build Coastguard Worker
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
47*15dc779aSAndroid Build Coastguard Worker
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
52*15dc779aSAndroid Build Coastguard Worker
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
61*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
63*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
65*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_interface.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker #define RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID 0x80000000
83*15dc779aSAndroid Build Coastguard Worker #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD 0x08000000
84*15dc779aSAndroid Build Coastguard Worker #define RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD 0x04000000
85*15dc779aSAndroid Build Coastguard Worker
86*15dc779aSAndroid Build Coastguard Worker #define FWD 0
87*15dc779aSAndroid Build Coastguard Worker #define BWD 1
88*15dc779aSAndroid Build Coastguard Worker
89*15dc779aSAndroid Build Coastguard Worker #define MAX_LEN_RVLC_CODE_WORD 9
90*15dc779aSAndroid Build Coastguard Worker #define MAX_LEN_RVLC_ESCAPE_WORD 20
91*15dc779aSAndroid Build Coastguard Worker
92*15dc779aSAndroid Build Coastguard Worker #define CONCEAL_MAX_INIT 1311
93*15dc779aSAndroid Build Coastguard Worker #define CONCEAL_MIN_INIT -1311
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker #define RVLC_MAX_SFB ((8) * (16))
96*15dc779aSAndroid Build Coastguard Worker
97*15dc779aSAndroid Build Coastguard Worker #define MASK_LEFT 0xFFF000
98*15dc779aSAndroid Build Coastguard Worker #define MASK_RIGHT 0xFFF
99*15dc779aSAndroid Build Coastguard Worker #define CLR_BIT_10 0x3FF
100*15dc779aSAndroid Build Coastguard Worker #define LEFT_OFFSET 12
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker #define ixheaacd_bitbuf_checkpoint(it_bit_buf, saved_bit_buf) \
103*15dc779aSAndroid Build Coastguard Worker (saved_bit_buf) = (it_bit_buf)
104*15dc779aSAndroid Build Coastguard Worker #define ixheaacd_bitbuf_restore(it_bit_buf, saved_bit_buf) \
105*15dc779aSAndroid Build Coastguard Worker (it_bit_buf) = (saved_bit_buf)
106*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_decode(WORD16 cw,WORD32 len,WORD32 * found)107*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_rvlc_decode(WORD16 cw, WORD32 len, WORD32 *found) {
108*15dc779aSAndroid Build Coastguard Worker WORD16 indx = 0;
109*15dc779aSAndroid Build Coastguard Worker *found = 0;
110*15dc779aSAndroid Build Coastguard Worker switch (len) {
111*15dc779aSAndroid Build Coastguard Worker case 1:
112*15dc779aSAndroid Build Coastguard Worker if (cw == 0)
113*15dc779aSAndroid Build Coastguard Worker indx = 0;
114*15dc779aSAndroid Build Coastguard Worker else
115*15dc779aSAndroid Build Coastguard Worker return 3;
116*15dc779aSAndroid Build Coastguard Worker break;
117*15dc779aSAndroid Build Coastguard Worker case 3:
118*15dc779aSAndroid Build Coastguard Worker switch (cw) {
119*15dc779aSAndroid Build Coastguard Worker case 5:
120*15dc779aSAndroid Build Coastguard Worker indx = -1;
121*15dc779aSAndroid Build Coastguard Worker break;
122*15dc779aSAndroid Build Coastguard Worker case 7:
123*15dc779aSAndroid Build Coastguard Worker indx = 1;
124*15dc779aSAndroid Build Coastguard Worker break;
125*15dc779aSAndroid Build Coastguard Worker default:
126*15dc779aSAndroid Build Coastguard Worker return 4;
127*15dc779aSAndroid Build Coastguard Worker }
128*15dc779aSAndroid Build Coastguard Worker break;
129*15dc779aSAndroid Build Coastguard Worker case 4:
130*15dc779aSAndroid Build Coastguard Worker if (cw == 9)
131*15dc779aSAndroid Build Coastguard Worker indx = -2;
132*15dc779aSAndroid Build Coastguard Worker else
133*15dc779aSAndroid Build Coastguard Worker return 5;
134*15dc779aSAndroid Build Coastguard Worker break;
135*15dc779aSAndroid Build Coastguard Worker case 5:
136*15dc779aSAndroid Build Coastguard Worker switch (cw) {
137*15dc779aSAndroid Build Coastguard Worker case 17:
138*15dc779aSAndroid Build Coastguard Worker indx = -3;
139*15dc779aSAndroid Build Coastguard Worker break;
140*15dc779aSAndroid Build Coastguard Worker case 27:
141*15dc779aSAndroid Build Coastguard Worker indx = 2;
142*15dc779aSAndroid Build Coastguard Worker break;
143*15dc779aSAndroid Build Coastguard Worker default:
144*15dc779aSAndroid Build Coastguard Worker return 6;
145*15dc779aSAndroid Build Coastguard Worker }
146*15dc779aSAndroid Build Coastguard Worker break;
147*15dc779aSAndroid Build Coastguard Worker case 6:
148*15dc779aSAndroid Build Coastguard Worker switch (cw) {
149*15dc779aSAndroid Build Coastguard Worker case 33:
150*15dc779aSAndroid Build Coastguard Worker indx = -4;
151*15dc779aSAndroid Build Coastguard Worker break;
152*15dc779aSAndroid Build Coastguard Worker case 51:
153*15dc779aSAndroid Build Coastguard Worker indx = 3;
154*15dc779aSAndroid Build Coastguard Worker break;
155*15dc779aSAndroid Build Coastguard Worker default:
156*15dc779aSAndroid Build Coastguard Worker return 7;
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker break;
159*15dc779aSAndroid Build Coastguard Worker case 7:
160*15dc779aSAndroid Build Coastguard Worker switch (cw) {
161*15dc779aSAndroid Build Coastguard Worker case 65:
162*15dc779aSAndroid Build Coastguard Worker indx = -7;
163*15dc779aSAndroid Build Coastguard Worker break;
164*15dc779aSAndroid Build Coastguard Worker case 107:
165*15dc779aSAndroid Build Coastguard Worker indx = 4;
166*15dc779aSAndroid Build Coastguard Worker break;
167*15dc779aSAndroid Build Coastguard Worker case 99:
168*15dc779aSAndroid Build Coastguard Worker indx = 7;
169*15dc779aSAndroid Build Coastguard Worker break;
170*15dc779aSAndroid Build Coastguard Worker default:
171*15dc779aSAndroid Build Coastguard Worker return 8;
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker break;
174*15dc779aSAndroid Build Coastguard Worker case 8:
175*15dc779aSAndroid Build Coastguard Worker switch (cw) {
176*15dc779aSAndroid Build Coastguard Worker case 129:
177*15dc779aSAndroid Build Coastguard Worker indx = -5;
178*15dc779aSAndroid Build Coastguard Worker break;
179*15dc779aSAndroid Build Coastguard Worker case 195:
180*15dc779aSAndroid Build Coastguard Worker indx = 5;
181*15dc779aSAndroid Build Coastguard Worker break;
182*15dc779aSAndroid Build Coastguard Worker default:
183*15dc779aSAndroid Build Coastguard Worker return 9;
184*15dc779aSAndroid Build Coastguard Worker }
185*15dc779aSAndroid Build Coastguard Worker break;
186*15dc779aSAndroid Build Coastguard Worker case 9:
187*15dc779aSAndroid Build Coastguard Worker switch (cw) {
188*15dc779aSAndroid Build Coastguard Worker case 257:
189*15dc779aSAndroid Build Coastguard Worker indx = -6;
190*15dc779aSAndroid Build Coastguard Worker break;
191*15dc779aSAndroid Build Coastguard Worker case 427:
192*15dc779aSAndroid Build Coastguard Worker indx = 6;
193*15dc779aSAndroid Build Coastguard Worker break;
194*15dc779aSAndroid Build Coastguard Worker default:
195*15dc779aSAndroid Build Coastguard Worker return -1;
196*15dc779aSAndroid Build Coastguard Worker }
197*15dc779aSAndroid Build Coastguard Worker break;
198*15dc779aSAndroid Build Coastguard Worker default:
199*15dc779aSAndroid Build Coastguard Worker return -1;
200*15dc779aSAndroid Build Coastguard Worker }
201*15dc779aSAndroid Build Coastguard Worker *found = 1;
202*15dc779aSAndroid Build Coastguard Worker return indx;
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_decode_esc(WORD32 cw,WORD32 len,WORD32 * found)205*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_rvlc_decode_esc(WORD32 cw, WORD32 len, WORD32 *found) {
206*15dc779aSAndroid Build Coastguard Worker WORD16 indx = 0;
207*15dc779aSAndroid Build Coastguard Worker *found = 0;
208*15dc779aSAndroid Build Coastguard Worker switch (len) {
209*15dc779aSAndroid Build Coastguard Worker case 2:
210*15dc779aSAndroid Build Coastguard Worker switch (cw) {
211*15dc779aSAndroid Build Coastguard Worker case 2:
212*15dc779aSAndroid Build Coastguard Worker indx = 0;
213*15dc779aSAndroid Build Coastguard Worker break;
214*15dc779aSAndroid Build Coastguard Worker case 0:
215*15dc779aSAndroid Build Coastguard Worker indx = 1;
216*15dc779aSAndroid Build Coastguard Worker break;
217*15dc779aSAndroid Build Coastguard Worker default:
218*15dc779aSAndroid Build Coastguard Worker return 3;
219*15dc779aSAndroid Build Coastguard Worker }
220*15dc779aSAndroid Build Coastguard Worker break;
221*15dc779aSAndroid Build Coastguard Worker case 3:
222*15dc779aSAndroid Build Coastguard Worker switch (cw) {
223*15dc779aSAndroid Build Coastguard Worker case 6:
224*15dc779aSAndroid Build Coastguard Worker indx = 2;
225*15dc779aSAndroid Build Coastguard Worker break;
226*15dc779aSAndroid Build Coastguard Worker case 2:
227*15dc779aSAndroid Build Coastguard Worker indx = 3;
228*15dc779aSAndroid Build Coastguard Worker break;
229*15dc779aSAndroid Build Coastguard Worker default:
230*15dc779aSAndroid Build Coastguard Worker return 4;
231*15dc779aSAndroid Build Coastguard Worker }
232*15dc779aSAndroid Build Coastguard Worker break;
233*15dc779aSAndroid Build Coastguard Worker case 4:
234*15dc779aSAndroid Build Coastguard Worker if (cw == 14)
235*15dc779aSAndroid Build Coastguard Worker indx = 4;
236*15dc779aSAndroid Build Coastguard Worker else
237*15dc779aSAndroid Build Coastguard Worker return 5;
238*15dc779aSAndroid Build Coastguard Worker break;
239*15dc779aSAndroid Build Coastguard Worker case 5:
240*15dc779aSAndroid Build Coastguard Worker switch (cw) {
241*15dc779aSAndroid Build Coastguard Worker case 31:
242*15dc779aSAndroid Build Coastguard Worker indx = 5;
243*15dc779aSAndroid Build Coastguard Worker break;
244*15dc779aSAndroid Build Coastguard Worker case 15:
245*15dc779aSAndroid Build Coastguard Worker indx = 6;
246*15dc779aSAndroid Build Coastguard Worker break;
247*15dc779aSAndroid Build Coastguard Worker case 13:
248*15dc779aSAndroid Build Coastguard Worker indx = 7;
249*15dc779aSAndroid Build Coastguard Worker break;
250*15dc779aSAndroid Build Coastguard Worker default:
251*15dc779aSAndroid Build Coastguard Worker return 6;
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker break;
254*15dc779aSAndroid Build Coastguard Worker case 6:
255*15dc779aSAndroid Build Coastguard Worker switch (cw) {
256*15dc779aSAndroid Build Coastguard Worker case 61:
257*15dc779aSAndroid Build Coastguard Worker indx = 8;
258*15dc779aSAndroid Build Coastguard Worker break;
259*15dc779aSAndroid Build Coastguard Worker case 29:
260*15dc779aSAndroid Build Coastguard Worker indx = 9;
261*15dc779aSAndroid Build Coastguard Worker break;
262*15dc779aSAndroid Build Coastguard Worker case 25:
263*15dc779aSAndroid Build Coastguard Worker indx = 10;
264*15dc779aSAndroid Build Coastguard Worker break;
265*15dc779aSAndroid Build Coastguard Worker case 24:
266*15dc779aSAndroid Build Coastguard Worker indx = 11;
267*15dc779aSAndroid Build Coastguard Worker break;
268*15dc779aSAndroid Build Coastguard Worker default:
269*15dc779aSAndroid Build Coastguard Worker return 7;
270*15dc779aSAndroid Build Coastguard Worker }
271*15dc779aSAndroid Build Coastguard Worker break;
272*15dc779aSAndroid Build Coastguard Worker case 7:
273*15dc779aSAndroid Build Coastguard Worker switch (cw) {
274*15dc779aSAndroid Build Coastguard Worker case 120:
275*15dc779aSAndroid Build Coastguard Worker indx = 12;
276*15dc779aSAndroid Build Coastguard Worker break;
277*15dc779aSAndroid Build Coastguard Worker case 56:
278*15dc779aSAndroid Build Coastguard Worker indx = 13;
279*15dc779aSAndroid Build Coastguard Worker break;
280*15dc779aSAndroid Build Coastguard Worker default:
281*15dc779aSAndroid Build Coastguard Worker return 8;
282*15dc779aSAndroid Build Coastguard Worker }
283*15dc779aSAndroid Build Coastguard Worker break;
284*15dc779aSAndroid Build Coastguard Worker case 8:
285*15dc779aSAndroid Build Coastguard Worker switch (cw) {
286*15dc779aSAndroid Build Coastguard Worker case 242:
287*15dc779aSAndroid Build Coastguard Worker indx = 14;
288*15dc779aSAndroid Build Coastguard Worker break;
289*15dc779aSAndroid Build Coastguard Worker case 114:
290*15dc779aSAndroid Build Coastguard Worker indx = 15;
291*15dc779aSAndroid Build Coastguard Worker break;
292*15dc779aSAndroid Build Coastguard Worker default:
293*15dc779aSAndroid Build Coastguard Worker return 9;
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker break;
296*15dc779aSAndroid Build Coastguard Worker case 9:
297*15dc779aSAndroid Build Coastguard Worker switch (cw) {
298*15dc779aSAndroid Build Coastguard Worker case 486:
299*15dc779aSAndroid Build Coastguard Worker indx = 16;
300*15dc779aSAndroid Build Coastguard Worker break;
301*15dc779aSAndroid Build Coastguard Worker case 230:
302*15dc779aSAndroid Build Coastguard Worker indx = 17;
303*15dc779aSAndroid Build Coastguard Worker break;
304*15dc779aSAndroid Build Coastguard Worker default:
305*15dc779aSAndroid Build Coastguard Worker return 10;
306*15dc779aSAndroid Build Coastguard Worker }
307*15dc779aSAndroid Build Coastguard Worker break;
308*15dc779aSAndroid Build Coastguard Worker case 10:
309*15dc779aSAndroid Build Coastguard Worker switch (cw) {
310*15dc779aSAndroid Build Coastguard Worker case 974:
311*15dc779aSAndroid Build Coastguard Worker indx = 18;
312*15dc779aSAndroid Build Coastguard Worker break;
313*15dc779aSAndroid Build Coastguard Worker case 463:
314*15dc779aSAndroid Build Coastguard Worker indx = 19;
315*15dc779aSAndroid Build Coastguard Worker break;
316*15dc779aSAndroid Build Coastguard Worker default:
317*15dc779aSAndroid Build Coastguard Worker return 11;
318*15dc779aSAndroid Build Coastguard Worker }
319*15dc779aSAndroid Build Coastguard Worker break;
320*15dc779aSAndroid Build Coastguard Worker case 11:
321*15dc779aSAndroid Build Coastguard Worker switch (cw) {
322*15dc779aSAndroid Build Coastguard Worker case 1950:
323*15dc779aSAndroid Build Coastguard Worker indx = 20;
324*15dc779aSAndroid Build Coastguard Worker break;
325*15dc779aSAndroid Build Coastguard Worker case 1951:
326*15dc779aSAndroid Build Coastguard Worker indx = 21;
327*15dc779aSAndroid Build Coastguard Worker break;
328*15dc779aSAndroid Build Coastguard Worker case 925:
329*15dc779aSAndroid Build Coastguard Worker indx = 22;
330*15dc779aSAndroid Build Coastguard Worker break;
331*15dc779aSAndroid Build Coastguard Worker default:
332*15dc779aSAndroid Build Coastguard Worker return 12;
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker break;
335*15dc779aSAndroid Build Coastguard Worker case 12:
336*15dc779aSAndroid Build Coastguard Worker if (cw == 1848)
337*15dc779aSAndroid Build Coastguard Worker indx = 23;
338*15dc779aSAndroid Build Coastguard Worker else
339*15dc779aSAndroid Build Coastguard Worker return 13;
340*15dc779aSAndroid Build Coastguard Worker break;
341*15dc779aSAndroid Build Coastguard Worker case 13:
342*15dc779aSAndroid Build Coastguard Worker if (cw == 3698)
343*15dc779aSAndroid Build Coastguard Worker indx = 25;
344*15dc779aSAndroid Build Coastguard Worker else
345*15dc779aSAndroid Build Coastguard Worker return 14;
346*15dc779aSAndroid Build Coastguard Worker break;
347*15dc779aSAndroid Build Coastguard Worker case 14:
348*15dc779aSAndroid Build Coastguard Worker if (cw == 7399)
349*15dc779aSAndroid Build Coastguard Worker indx = 24;
350*15dc779aSAndroid Build Coastguard Worker else
351*15dc779aSAndroid Build Coastguard Worker return 15;
352*15dc779aSAndroid Build Coastguard Worker break;
353*15dc779aSAndroid Build Coastguard Worker case 15:
354*15dc779aSAndroid Build Coastguard Worker if (cw == 14797)
355*15dc779aSAndroid Build Coastguard Worker indx = 26;
356*15dc779aSAndroid Build Coastguard Worker else
357*15dc779aSAndroid Build Coastguard Worker return 19;
358*15dc779aSAndroid Build Coastguard Worker break;
359*15dc779aSAndroid Build Coastguard Worker case 19:
360*15dc779aSAndroid Build Coastguard Worker if ((cw >= 236736) && (cw <= 236740))
361*15dc779aSAndroid Build Coastguard Worker indx = 53 - (236740 - cw);
362*15dc779aSAndroid Build Coastguard Worker else
363*15dc779aSAndroid Build Coastguard Worker return 20;
364*15dc779aSAndroid Build Coastguard Worker break;
365*15dc779aSAndroid Build Coastguard Worker case 20:
366*15dc779aSAndroid Build Coastguard Worker if ((cw >= 473482) && (cw <= 473503))
367*15dc779aSAndroid Build Coastguard Worker indx = 48 - (473503 - cw);
368*15dc779aSAndroid Build Coastguard Worker else
369*15dc779aSAndroid Build Coastguard Worker return -1;
370*15dc779aSAndroid Build Coastguard Worker break;
371*15dc779aSAndroid Build Coastguard Worker default:
372*15dc779aSAndroid Build Coastguard Worker return -1;
373*15dc779aSAndroid Build Coastguard Worker }
374*15dc779aSAndroid Build Coastguard Worker *found = 1;
375*15dc779aSAndroid Build Coastguard Worker return indx;
376*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_rvlc_check_intensity_cb(ia_rvlc_info_struct * ptr_rvlc,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info)377*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_rvlc_check_intensity_cb(
378*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc,
379*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
380*15dc779aSAndroid Build Coastguard Worker WORD32 group, band, bnds;
381*15dc779aSAndroid Build Coastguard Worker
382*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->intensity_used = 0;
383*15dc779aSAndroid Build Coastguard Worker
384*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
385*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
386*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
387*15dc779aSAndroid Build Coastguard Worker if ((ptr_aac_dec_channel_info->ptr_code_book[bnds] == INTENSITY_HCB) ||
388*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_channel_info->ptr_code_book[bnds] == INTENSITY_HCB2)) {
389*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->intensity_used = 1;
390*15dc779aSAndroid Build Coastguard Worker break;
391*15dc779aSAndroid Build Coastguard Worker }
392*15dc779aSAndroid Build Coastguard Worker }
393*15dc779aSAndroid Build Coastguard Worker }
394*15dc779aSAndroid Build Coastguard Worker }
395*15dc779aSAndroid Build Coastguard Worker
ixheaacd_carry_bit_branch_val(UWORD8 carry_bit,UWORD32 tree_node,UWORD32 * branch_val,UWORD32 * branch_node)396*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_carry_bit_branch_val(UWORD8 carry_bit, UWORD32 tree_node,
397*15dc779aSAndroid Build Coastguard Worker UWORD32 *branch_val, UWORD32 *branch_node) {
398*15dc779aSAndroid Build Coastguard Worker if (carry_bit == 0) {
399*15dc779aSAndroid Build Coastguard Worker *branch_node = (tree_node & MASK_LEFT) >> LEFT_OFFSET;
400*15dc779aSAndroid Build Coastguard Worker } else {
401*15dc779aSAndroid Build Coastguard Worker *branch_node = tree_node & MASK_RIGHT;
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker
404*15dc779aSAndroid Build Coastguard Worker *branch_val = *branch_node & CLR_BIT_10;
405*15dc779aSAndroid Build Coastguard Worker }
406*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_read_bits(ia_bit_buf_struct * it_bit_buff,UWORD16 * ptr_position,UWORD8 read_direction)407*15dc779aSAndroid Build Coastguard Worker UWORD8 ixheaacd_rvlc_read_bits(ia_bit_buf_struct *it_bit_buff,
408*15dc779aSAndroid Build Coastguard Worker UWORD16 *ptr_position, UWORD8 read_direction) {
409*15dc779aSAndroid Build Coastguard Worker UWORD32 bit;
410*15dc779aSAndroid Build Coastguard Worker WORD32 read_bit_offset =
411*15dc779aSAndroid Build Coastguard Worker *ptr_position - (it_bit_buff->size - it_bit_buff->cnt_bits);
412*15dc779aSAndroid Build Coastguard Worker
413*15dc779aSAndroid Build Coastguard Worker if (read_bit_offset) it_bit_buff->cnt_bits -= read_bit_offset;
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_read_next =
416*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_bit_buf_base +
417*15dc779aSAndroid Build Coastguard Worker ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
418*15dc779aSAndroid Build Coastguard Worker it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
419*15dc779aSAndroid Build Coastguard Worker
420*15dc779aSAndroid Build Coastguard Worker if (read_direction == 0) {
421*15dc779aSAndroid Build Coastguard Worker bit = ixheaacd_aac_read_bit_rev(it_bit_buff);
422*15dc779aSAndroid Build Coastguard Worker
423*15dc779aSAndroid Build Coastguard Worker *ptr_position += 1;
424*15dc779aSAndroid Build Coastguard Worker } else {
425*15dc779aSAndroid Build Coastguard Worker bit = ixheaacd_aac_read_bit(it_bit_buff);
426*15dc779aSAndroid Build Coastguard Worker
427*15dc779aSAndroid Build Coastguard Worker *ptr_position -= 1;
428*15dc779aSAndroid Build Coastguard Worker }
429*15dc779aSAndroid Build Coastguard Worker
430*15dc779aSAndroid Build Coastguard Worker return (bit);
431*15dc779aSAndroid Build Coastguard Worker }
432*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_decode_escape_word(ia_rvlc_info_struct * ptr_rvlc,ia_bit_buf_struct * it_bit_buff)433*15dc779aSAndroid Build Coastguard Worker static WORD8 ixheaacd_rvlc_decode_escape_word(ia_rvlc_info_struct *ptr_rvlc,
434*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
435*15dc779aSAndroid Build Coastguard Worker WORD32 i;
436*15dc779aSAndroid Build Coastguard Worker
437*15dc779aSAndroid Build Coastguard Worker UWORD8 carry_bit;
438*15dc779aSAndroid Build Coastguard Worker
439*15dc779aSAndroid Build Coastguard Worker UWORD16 *ptr_bitstream_index_esc;
440*15dc779aSAndroid Build Coastguard Worker
441*15dc779aSAndroid Build Coastguard Worker int len = 0;
442*15dc779aSAndroid Build Coastguard Worker int codeword = 0;
443*15dc779aSAndroid Build Coastguard Worker int found = 0;
444*15dc779aSAndroid Build Coastguard Worker int indx;
445*15dc779aSAndroid Build Coastguard Worker
446*15dc779aSAndroid Build Coastguard Worker ptr_bitstream_index_esc = &(ptr_rvlc->esc_bit_str_idx);
447*15dc779aSAndroid Build Coastguard Worker
448*15dc779aSAndroid Build Coastguard Worker for (i = MAX_LEN_RVLC_ESCAPE_WORD - 1; i >= 0; i--) {
449*15dc779aSAndroid Build Coastguard Worker carry_bit =
450*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_read_bits(it_bit_buff, ptr_bitstream_index_esc, FWD);
451*15dc779aSAndroid Build Coastguard Worker
452*15dc779aSAndroid Build Coastguard Worker len++;
453*15dc779aSAndroid Build Coastguard Worker codeword = codeword << 1 | carry_bit;
454*15dc779aSAndroid Build Coastguard Worker indx = ixheaacd_rvlc_decode_esc(codeword, len, &found);
455*15dc779aSAndroid Build Coastguard Worker
456*15dc779aSAndroid Build Coastguard Worker if (found) {
457*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_esc_len -= (MAX_LEN_RVLC_ESCAPE_WORD - i);
458*15dc779aSAndroid Build Coastguard Worker return indx;
459*15dc779aSAndroid Build Coastguard Worker }
460*15dc779aSAndroid Build Coastguard Worker }
461*15dc779aSAndroid Build Coastguard Worker
462*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_err_log |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
463*15dc779aSAndroid Build Coastguard Worker
464*15dc779aSAndroid Build Coastguard Worker return -1;
465*15dc779aSAndroid Build Coastguard Worker }
466*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_decode_escape(ia_rvlc_info_struct * ptr_rvlc,WORD16 * ptr_escape,ia_bit_buf_struct * it_bit_buff)467*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_rvlc_decode_escape(ia_rvlc_info_struct *ptr_rvlc,
468*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_escape,
469*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
470*15dc779aSAndroid Build Coastguard Worker WORD8 esc_word;
471*15dc779aSAndroid Build Coastguard Worker WORD8 esc_cnt = 0;
472*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_esc_bit_cnt_sum;
473*15dc779aSAndroid Build Coastguard Worker
474*15dc779aSAndroid Build Coastguard Worker ptr_esc_bit_cnt_sum = &(ptr_rvlc->rvlc_esc_len);
475*15dc779aSAndroid Build Coastguard Worker
476*15dc779aSAndroid Build Coastguard Worker while (*ptr_esc_bit_cnt_sum > 0) {
477*15dc779aSAndroid Build Coastguard Worker esc_word = ixheaacd_rvlc_decode_escape_word(ptr_rvlc, it_bit_buff);
478*15dc779aSAndroid Build Coastguard Worker
479*15dc779aSAndroid Build Coastguard Worker if (esc_word >= 0) {
480*15dc779aSAndroid Build Coastguard Worker ptr_escape[esc_cnt] = esc_word;
481*15dc779aSAndroid Build Coastguard Worker esc_cnt++;
482*15dc779aSAndroid Build Coastguard Worker } else {
483*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_err_log |= RVLC_ERROR_ALL_ESCAPE_WORDS_INVALID;
484*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded = esc_cnt;
485*15dc779aSAndroid Build Coastguard Worker
486*15dc779aSAndroid Build Coastguard Worker return;
487*15dc779aSAndroid Build Coastguard Worker }
488*15dc779aSAndroid Build Coastguard Worker }
489*15dc779aSAndroid Build Coastguard Worker
490*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded = esc_cnt;
491*15dc779aSAndroid Build Coastguard Worker }
492*15dc779aSAndroid Build Coastguard Worker
ixheaacd_decode_rvlc_code_word(ia_bit_buf_struct * it_bit_buff,ia_rvlc_info_struct * ptr_rvlc)493*15dc779aSAndroid Build Coastguard Worker WORD8 ixheaacd_decode_rvlc_code_word(ia_bit_buf_struct *it_bit_buff,
494*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc) {
495*15dc779aSAndroid Build Coastguard Worker WORD32 i;
496*15dc779aSAndroid Build Coastguard Worker
497*15dc779aSAndroid Build Coastguard Worker UWORD8 carry_bit;
498*15dc779aSAndroid Build Coastguard Worker
499*15dc779aSAndroid Build Coastguard Worker UWORD8 direction = ptr_rvlc->direction;
500*15dc779aSAndroid Build Coastguard Worker UWORD16 *ptr_bit_str_idx_rvl = ptr_rvlc->ptr_rvl_bit_str_idx;
501*15dc779aSAndroid Build Coastguard Worker
502*15dc779aSAndroid Build Coastguard Worker int len = 0;
503*15dc779aSAndroid Build Coastguard Worker short codeword = 0;
504*15dc779aSAndroid Build Coastguard Worker int found = 0;
505*15dc779aSAndroid Build Coastguard Worker int indx;
506*15dc779aSAndroid Build Coastguard Worker
507*15dc779aSAndroid Build Coastguard Worker for (i = MAX_LEN_RVLC_CODE_WORD - 1; i >= 0; i--) {
508*15dc779aSAndroid Build Coastguard Worker carry_bit =
509*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_read_bits(it_bit_buff, ptr_bit_str_idx_rvl, direction);
510*15dc779aSAndroid Build Coastguard Worker
511*15dc779aSAndroid Build Coastguard Worker len++;
512*15dc779aSAndroid Build Coastguard Worker codeword = codeword << 1 | carry_bit;
513*15dc779aSAndroid Build Coastguard Worker indx = ixheaacd_rvlc_decode(codeword, len, &found);
514*15dc779aSAndroid Build Coastguard Worker if (found) {
515*15dc779aSAndroid Build Coastguard Worker indx = indx + 7;
516*15dc779aSAndroid Build Coastguard Worker *ptr_rvlc->ptr_rvl_bit_cnt -= (MAX_LEN_RVLC_CODE_WORD - i);
517*15dc779aSAndroid Build Coastguard Worker return indx;
518*15dc779aSAndroid Build Coastguard Worker }
519*15dc779aSAndroid Build Coastguard Worker }
520*15dc779aSAndroid Build Coastguard Worker
521*15dc779aSAndroid Build Coastguard Worker return -1;
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_decode_forward(ia_rvlc_info_struct * ptr_rvlc,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_bit_buf_struct * it_bit_buff)524*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_rvlc_decode_forward(
525*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc,
526*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
527*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
528*15dc779aSAndroid Build Coastguard Worker WORD32 band = 0;
529*15dc779aSAndroid Build Coastguard Worker WORD32 group = 0;
530*15dc779aSAndroid Build Coastguard Worker WORD32 bnds = 0;
531*15dc779aSAndroid Build Coastguard Worker
532*15dc779aSAndroid Build Coastguard Worker WORD16 dpcm;
533*15dc779aSAndroid Build Coastguard Worker
534*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct temp_buf = {0};
535*15dc779aSAndroid Build Coastguard Worker
536*15dc779aSAndroid Build Coastguard Worker WORD16 factor = ptr_aac_dec_channel_info->global_gain;
537*15dc779aSAndroid Build Coastguard Worker WORD16 position = 0;
538*15dc779aSAndroid Build Coastguard Worker WORD16 noise_energy = ptr_aac_dec_channel_info->global_gain - 90 - 256;
539*15dc779aSAndroid Build Coastguard Worker
540*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr;
541*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_esc = ptr_aac_dec_channel_info->rvlc_scf_esc_arr;
542*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_esc_fwd_cnt = &(ptr_rvlc->num_fwd_esc_words_decoded);
543*15dc779aSAndroid Build Coastguard Worker
544*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->ptr_rvl_bit_cnt = &(ptr_rvlc->rvlc_sf_fwd_len);
545*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->ptr_rvl_bit_str_idx = &(ptr_rvlc->rvl_fwd_bit_str_idx);
546*15dc779aSAndroid Build Coastguard Worker
547*15dc779aSAndroid Build Coastguard Worker *ptr_esc_fwd_cnt = 0;
548*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->direction = 0;
549*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->noise_used = 0;
550*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_used = 0;
551*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->last_scale_fac = 0;
552*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->last_nrg = 0;
553*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->is_last = 0;
554*15dc779aSAndroid Build Coastguard Worker
555*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_check_intensity_cb(ptr_rvlc, ptr_aac_dec_channel_info);
556*15dc779aSAndroid Build Coastguard Worker
557*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
558*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
559*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
560*15dc779aSAndroid Build Coastguard Worker
561*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
562*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
563*15dc779aSAndroid Build Coastguard Worker ptr_scf_fwd[bnds] = 0;
564*15dc779aSAndroid Build Coastguard Worker break;
565*15dc779aSAndroid Build Coastguard Worker
566*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
567*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
568*15dc779aSAndroid Build Coastguard Worker
569*15dc779aSAndroid Build Coastguard Worker {
570*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
571*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
572*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
573*15dc779aSAndroid Build Coastguard Worker return;
574*15dc779aSAndroid Build Coastguard Worker }
575*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
576*15dc779aSAndroid Build Coastguard Worker }
577*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
578*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
579*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
580*15dc779aSAndroid Build Coastguard Worker return;
581*15dc779aSAndroid Build Coastguard Worker } else {
582*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
583*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc++;
584*15dc779aSAndroid Build Coastguard Worker } else {
585*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc++;
586*15dc779aSAndroid Build Coastguard Worker }
587*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_fwd_cnt)++;
588*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_max_esc == 1311) {
589*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max_esc = bnds;
590*15dc779aSAndroid Build Coastguard Worker }
591*15dc779aSAndroid Build Coastguard Worker }
592*15dc779aSAndroid Build Coastguard Worker }
593*15dc779aSAndroid Build Coastguard Worker position += dpcm;
594*15dc779aSAndroid Build Coastguard Worker ptr_scf_fwd[bnds] = position;
595*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->is_last = position;
596*15dc779aSAndroid Build Coastguard Worker break;
597*15dc779aSAndroid Build Coastguard Worker
598*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
599*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->noise_used == 0) {
600*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->noise_used = 1;
601*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->first_noise_band = bnds;
602*15dc779aSAndroid Build Coastguard Worker noise_energy += ptr_rvlc->dpcm_noise_nrg;
603*15dc779aSAndroid Build Coastguard Worker ptr_scf_fwd[bnds] = noise_energy;
604*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->last_nrg = noise_energy;
605*15dc779aSAndroid Build Coastguard Worker } else {
606*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
607*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
608*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
609*15dc779aSAndroid Build Coastguard Worker return;
610*15dc779aSAndroid Build Coastguard Worker }
611*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
612*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
613*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
614*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
615*15dc779aSAndroid Build Coastguard Worker return;
616*15dc779aSAndroid Build Coastguard Worker } else {
617*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
618*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc++;
619*15dc779aSAndroid Build Coastguard Worker } else {
620*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc++;
621*15dc779aSAndroid Build Coastguard Worker }
622*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_fwd_cnt)++;
623*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_max_esc == 1311) {
624*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max_esc = bnds;
625*15dc779aSAndroid Build Coastguard Worker }
626*15dc779aSAndroid Build Coastguard Worker }
627*15dc779aSAndroid Build Coastguard Worker }
628*15dc779aSAndroid Build Coastguard Worker noise_energy += dpcm;
629*15dc779aSAndroid Build Coastguard Worker ptr_scf_fwd[bnds] = noise_energy;
630*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->last_nrg = noise_energy;
631*15dc779aSAndroid Build Coastguard Worker }
632*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->str_pns_info.pns_used[bnds] = 1;
633*15dc779aSAndroid Build Coastguard Worker break;
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker default:
636*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_used = 1;
637*15dc779aSAndroid Build Coastguard Worker {
638*15dc779aSAndroid Build Coastguard Worker memcpy(&temp_buf, it_bit_buff, sizeof(ia_bit_buf_struct));
639*15dc779aSAndroid Build Coastguard Worker
640*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
641*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
642*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
643*15dc779aSAndroid Build Coastguard Worker return;
644*15dc779aSAndroid Build Coastguard Worker }
645*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
646*15dc779aSAndroid Build Coastguard Worker }
647*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
648*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
649*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
650*15dc779aSAndroid Build Coastguard Worker return;
651*15dc779aSAndroid Build Coastguard Worker } else {
652*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
653*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc++;
654*15dc779aSAndroid Build Coastguard Worker } else {
655*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc++;
656*15dc779aSAndroid Build Coastguard Worker }
657*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_fwd_cnt)++;
658*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_max_esc == 1311) {
659*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max_esc = bnds;
660*15dc779aSAndroid Build Coastguard Worker }
661*15dc779aSAndroid Build Coastguard Worker }
662*15dc779aSAndroid Build Coastguard Worker }
663*15dc779aSAndroid Build Coastguard Worker factor += dpcm;
664*15dc779aSAndroid Build Coastguard Worker ptr_scf_fwd[bnds] = factor;
665*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->last_scale_fac = factor;
666*15dc779aSAndroid Build Coastguard Worker break;
667*15dc779aSAndroid Build Coastguard Worker }
668*15dc779aSAndroid Build Coastguard Worker }
669*15dc779aSAndroid Build Coastguard Worker }
670*15dc779aSAndroid Build Coastguard Worker
671*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->intensity_used) {
672*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
673*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
674*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
675*15dc779aSAndroid Build Coastguard Worker return;
676*15dc779aSAndroid Build Coastguard Worker }
677*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
678*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
679*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
680*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = bnds;
681*15dc779aSAndroid Build Coastguard Worker return;
682*15dc779aSAndroid Build Coastguard Worker } else {
683*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
684*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc++;
685*15dc779aSAndroid Build Coastguard Worker } else {
686*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc++;
687*15dc779aSAndroid Build Coastguard Worker }
688*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_fwd_cnt)++;
689*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_max_esc == 1311) {
690*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max_esc = bnds;
691*15dc779aSAndroid Build Coastguard Worker }
692*15dc779aSAndroid Build Coastguard Worker }
693*15dc779aSAndroid Build Coastguard Worker }
694*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_is_last_pos = dpcm;
695*15dc779aSAndroid Build Coastguard Worker }
696*15dc779aSAndroid Build Coastguard Worker }
697*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_decode_backward(ia_rvlc_info_struct * ptr_rvlc,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_bit_buf_struct * it_bit_buff)698*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_rvlc_decode_backward(
699*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc,
700*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
701*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
702*15dc779aSAndroid Build Coastguard Worker WORD16 band, group, dpcm;
703*15dc779aSAndroid Build Coastguard Worker WORD16 bnds = ptr_rvlc->max_sfb_transmitted - 1;
704*15dc779aSAndroid Build Coastguard Worker
705*15dc779aSAndroid Build Coastguard Worker WORD16 factor = ptr_rvlc->rev_global_gain;
706*15dc779aSAndroid Build Coastguard Worker WORD16 position = ptr_rvlc->dpcm_is_last_pos;
707*15dc779aSAndroid Build Coastguard Worker WORD16 noise_energy =
708*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rev_global_gain + ptr_rvlc->dpcm_noise_last_pos - 90 - 256;
709*15dc779aSAndroid Build Coastguard Worker
710*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr;
711*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_esc = ptr_aac_dec_channel_info->rvlc_scf_esc_arr;
712*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_esc_cnt = &(ptr_rvlc->num_esc_words_decoded);
713*15dc779aSAndroid Build Coastguard Worker UWORD8 *ptr_esc_bwd_cnt = &(ptr_rvlc->num_bwd_esc_words_decoded);
714*15dc779aSAndroid Build Coastguard Worker
715*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->ptr_rvl_bit_cnt = &(ptr_rvlc->rvlc_sf_bwd_len);
716*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->ptr_rvl_bit_str_idx = &(ptr_rvlc->rvl_bwd_bit_str_idx);
717*15dc779aSAndroid Build Coastguard Worker
718*15dc779aSAndroid Build Coastguard Worker *ptr_esc_bwd_cnt = 0;
719*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->direction = 1;
720*15dc779aSAndroid Build Coastguard Worker ptr_scf_esc += *ptr_esc_cnt - 1;
721*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->firt_scale_fac = 0;
722*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->first_nrg = 0;
723*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->is_first = 0;
724*15dc779aSAndroid Build Coastguard Worker
725*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->intensity_used) {
726*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
727*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
728*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_is_last_pos = 0;
729*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min = bnds;
730*15dc779aSAndroid Build Coastguard Worker return;
731*15dc779aSAndroid Build Coastguard Worker }
732*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
733*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
734*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
735*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min = bnds;
736*15dc779aSAndroid Build Coastguard Worker return;
737*15dc779aSAndroid Build Coastguard Worker } else {
738*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
739*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc--;
740*15dc779aSAndroid Build Coastguard Worker } else {
741*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc--;
742*15dc779aSAndroid Build Coastguard Worker }
743*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_bwd_cnt)++;
744*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min_esc == -1311) {
745*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min_esc = bnds;
746*15dc779aSAndroid Build Coastguard Worker }
747*15dc779aSAndroid Build Coastguard Worker }
748*15dc779aSAndroid Build Coastguard Worker }
749*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_is_last_pos = dpcm;
750*15dc779aSAndroid Build Coastguard Worker }
751*15dc779aSAndroid Build Coastguard Worker
752*15dc779aSAndroid Build Coastguard Worker for (group = ptr_rvlc->num_wind_grps - 1; group >= 0; group--) {
753*15dc779aSAndroid Build Coastguard Worker for (band = ptr_rvlc->max_sfb_transmitted - 1; band >= 0; band--) {
754*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
755*15dc779aSAndroid Build Coastguard Worker
756*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
757*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
758*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = 0;
759*15dc779aSAndroid Build Coastguard Worker break;
760*15dc779aSAndroid Build Coastguard Worker
761*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
762*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
763*15dc779aSAndroid Build Coastguard Worker
764*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
765*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
766*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = position;
767*15dc779aSAndroid Build Coastguard Worker
768*15dc779aSAndroid Build Coastguard Worker return;
769*15dc779aSAndroid Build Coastguard Worker }
770*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
771*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
772*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
773*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = position;
774*15dc779aSAndroid Build Coastguard Worker
775*15dc779aSAndroid Build Coastguard Worker return;
776*15dc779aSAndroid Build Coastguard Worker } else {
777*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
778*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc--;
779*15dc779aSAndroid Build Coastguard Worker } else {
780*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc--;
781*15dc779aSAndroid Build Coastguard Worker }
782*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_bwd_cnt)++;
783*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min_esc == -1311) {
784*15dc779aSAndroid Build Coastguard Worker }
785*15dc779aSAndroid Build Coastguard Worker }
786*15dc779aSAndroid Build Coastguard Worker }
787*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = position;
788*15dc779aSAndroid Build Coastguard Worker position -= dpcm;
789*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->is_first = position;
790*15dc779aSAndroid Build Coastguard Worker break;
791*15dc779aSAndroid Build Coastguard Worker
792*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
793*15dc779aSAndroid Build Coastguard Worker if (bnds == ptr_rvlc->first_noise_band) {
794*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = ptr_rvlc->dpcm_noise_nrg +
795*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->global_gain - 90 -
796*15dc779aSAndroid Build Coastguard Worker 256;
797*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->first_nrg = ptr_scf_bwd[bnds];
798*15dc779aSAndroid Build Coastguard Worker } else {
799*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
800*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
801*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = noise_energy;
802*15dc779aSAndroid Build Coastguard Worker return;
803*15dc779aSAndroid Build Coastguard Worker }
804*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
805*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
806*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
807*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = noise_energy;
808*15dc779aSAndroid Build Coastguard Worker return;
809*15dc779aSAndroid Build Coastguard Worker } else {
810*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
811*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc--;
812*15dc779aSAndroid Build Coastguard Worker } else {
813*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc--;
814*15dc779aSAndroid Build Coastguard Worker }
815*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_bwd_cnt)++;
816*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min_esc == -1311) {
817*15dc779aSAndroid Build Coastguard Worker }
818*15dc779aSAndroid Build Coastguard Worker }
819*15dc779aSAndroid Build Coastguard Worker }
820*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = noise_energy;
821*15dc779aSAndroid Build Coastguard Worker noise_energy -= dpcm;
822*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->first_nrg = noise_energy;
823*15dc779aSAndroid Build Coastguard Worker }
824*15dc779aSAndroid Build Coastguard Worker break;
825*15dc779aSAndroid Build Coastguard Worker
826*15dc779aSAndroid Build Coastguard Worker default:
827*15dc779aSAndroid Build Coastguard Worker dpcm = ixheaacd_decode_rvlc_code_word(it_bit_buff, ptr_rvlc);
828*15dc779aSAndroid Build Coastguard Worker if (dpcm < 0) {
829*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = factor;
830*15dc779aSAndroid Build Coastguard Worker
831*15dc779aSAndroid Build Coastguard Worker return;
832*15dc779aSAndroid Build Coastguard Worker }
833*15dc779aSAndroid Build Coastguard Worker dpcm -= 7;
834*15dc779aSAndroid Build Coastguard Worker if ((dpcm == -7) || (dpcm == 7)) {
835*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) {
836*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = factor;
837*15dc779aSAndroid Build Coastguard Worker
838*15dc779aSAndroid Build Coastguard Worker return;
839*15dc779aSAndroid Build Coastguard Worker } else {
840*15dc779aSAndroid Build Coastguard Worker if (dpcm == -7) {
841*15dc779aSAndroid Build Coastguard Worker dpcm -= *ptr_scf_esc--;
842*15dc779aSAndroid Build Coastguard Worker } else {
843*15dc779aSAndroid Build Coastguard Worker dpcm += *ptr_scf_esc--;
844*15dc779aSAndroid Build Coastguard Worker }
845*15dc779aSAndroid Build Coastguard Worker (*ptr_esc_bwd_cnt)++;
846*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min_esc == -1311) {
847*15dc779aSAndroid Build Coastguard Worker }
848*15dc779aSAndroid Build Coastguard Worker }
849*15dc779aSAndroid Build Coastguard Worker }
850*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = factor;
851*15dc779aSAndroid Build Coastguard Worker factor -= dpcm;
852*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->firt_scale_fac = factor;
853*15dc779aSAndroid Build Coastguard Worker break;
854*15dc779aSAndroid Build Coastguard Worker }
855*15dc779aSAndroid Build Coastguard Worker }
856*15dc779aSAndroid Build Coastguard Worker }
857*15dc779aSAndroid Build Coastguard Worker }
858*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_read(ia_bit_buf_struct * it_bit_buff,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info)859*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_rvlc_read(
860*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
861*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
862*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
863*15dc779aSAndroid Build Coastguard Worker
864*15dc779aSAndroid Build Coastguard Worker WORD32 group, band;
865*15dc779aSAndroid Build Coastguard Worker
866*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_wind_grps =
867*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->str_ics_info.num_window_groups;
868*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->max_sfb_transmitted =
869*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->str_ics_info.max_sfb;
870*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->noise_used = 0;
871*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_noise_nrg = 0;
872*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_noise_last_pos = 0;
873*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_esc_len = -1;
874*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_is_last_pos = 0;
875*15dc779aSAndroid Build Coastguard Worker
876*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_concealment = ixheaacd_read_bits_buf(it_bit_buff, 1);
877*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rev_global_gain = ixheaacd_read_bits_buf(it_bit_buff, 8);
878*15dc779aSAndroid Build Coastguard Worker
879*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
880*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE) {
881*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_sf_len = ixheaacd_read_bits_buf(it_bit_buff, 11);
882*15dc779aSAndroid Build Coastguard Worker } else {
883*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_sf_len = ixheaacd_read_bits_buf(it_bit_buff, 9);
884*15dc779aSAndroid Build Coastguard Worker }
885*15dc779aSAndroid Build Coastguard Worker
886*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
887*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
888*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->ptr_code_book[16 * group + band] ==
889*15dc779aSAndroid Build Coastguard Worker NOISE_HCB) {
890*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->noise_used = 1;
891*15dc779aSAndroid Build Coastguard Worker break;
892*15dc779aSAndroid Build Coastguard Worker }
893*15dc779aSAndroid Build Coastguard Worker }
894*15dc779aSAndroid Build Coastguard Worker }
895*15dc779aSAndroid Build Coastguard Worker
896*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->noise_used)
897*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_noise_nrg = ixheaacd_read_bits_buf(it_bit_buff, 9);
898*15dc779aSAndroid Build Coastguard Worker
899*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_esc_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
900*15dc779aSAndroid Build Coastguard Worker
901*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->sf_esc_present) {
902*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_esc_len = ixheaacd_read_bits_buf(it_bit_buff, 8);
903*15dc779aSAndroid Build Coastguard Worker }
904*15dc779aSAndroid Build Coastguard Worker
905*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->noise_used) {
906*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_noise_last_pos = ixheaacd_read_bits_buf(it_bit_buff, 9);
907*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_sf_len -= 9;
908*15dc779aSAndroid Build Coastguard Worker }
909*15dc779aSAndroid Build Coastguard Worker
910*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_sf_fwd_len = ptr_rvlc->rvlc_sf_len;
911*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_sf_bwd_len = ptr_rvlc->rvlc_sf_len;
912*15dc779aSAndroid Build Coastguard Worker }
913*15dc779aSAndroid Build Coastguard Worker
ixheaacd_hcr_read(ia_bit_buf_struct * it_bit_buff,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,WORD32 ele_type)914*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_hcr_read(ia_bit_buf_struct *it_bit_buff,
915*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
916*15dc779aSAndroid Build Coastguard Worker WORD32 ele_type) {
917*15dc779aSAndroid Build Coastguard Worker WORD16 len_reordered_spec_data;
918*15dc779aSAndroid Build Coastguard Worker WORD8 len_longest_code_word;
919*15dc779aSAndroid Build Coastguard Worker
920*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->reorder_spect_data_len = 0;
921*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->longest_cw_len = 0;
922*15dc779aSAndroid Build Coastguard Worker
923*15dc779aSAndroid Build Coastguard Worker len_reordered_spec_data = ixheaacd_read_bits_buf(it_bit_buff, 14);
924*15dc779aSAndroid Build Coastguard Worker if (ele_type == ID_CPE) {
925*15dc779aSAndroid Build Coastguard Worker if ((len_reordered_spec_data >= 0) && (len_reordered_spec_data <= 12288)) {
926*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->reorder_spect_data_len =
927*15dc779aSAndroid Build Coastguard Worker len_reordered_spec_data;
928*15dc779aSAndroid Build Coastguard Worker } else {
929*15dc779aSAndroid Build Coastguard Worker if (len_reordered_spec_data > 12288) {
930*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->reorder_spect_data_len = 12288;
931*15dc779aSAndroid Build Coastguard Worker }
932*15dc779aSAndroid Build Coastguard Worker }
933*15dc779aSAndroid Build Coastguard Worker } else if (ele_type == ID_SCE || ele_type == ID_LFE || ele_type == ID_CCE) {
934*15dc779aSAndroid Build Coastguard Worker if ((len_reordered_spec_data >= 0) && (len_reordered_spec_data <= 6144)) {
935*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->reorder_spect_data_len =
936*15dc779aSAndroid Build Coastguard Worker len_reordered_spec_data;
937*15dc779aSAndroid Build Coastguard Worker } else {
938*15dc779aSAndroid Build Coastguard Worker if (len_reordered_spec_data > 6144) {
939*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->reorder_spect_data_len = 6144;
940*15dc779aSAndroid Build Coastguard Worker }
941*15dc779aSAndroid Build Coastguard Worker }
942*15dc779aSAndroid Build Coastguard Worker }
943*15dc779aSAndroid Build Coastguard Worker
944*15dc779aSAndroid Build Coastguard Worker len_longest_code_word = ixheaacd_read_bits_buf(it_bit_buff, 6);
945*15dc779aSAndroid Build Coastguard Worker if ((len_longest_code_word >= 0) && (len_longest_code_word <= 49)) {
946*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->longest_cw_len = len_longest_code_word;
947*15dc779aSAndroid Build Coastguard Worker } else {
948*15dc779aSAndroid Build Coastguard Worker if (len_longest_code_word > 49) {
949*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->longest_cw_len = 49;
950*15dc779aSAndroid Build Coastguard Worker }
951*15dc779aSAndroid Build Coastguard Worker }
952*15dc779aSAndroid Build Coastguard Worker }
953*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_init(ia_rvlc_info_struct * ptr_rvlc,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_bit_buf_struct * it_bit_buff)954*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaacd_rvlc_init(
955*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc,
956*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
957*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
958*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_esc = ptr_aac_dec_channel_info->rvlc_scf_esc_arr;
959*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr;
960*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr;
961*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scale_factor = ptr_aac_dec_channel_info->ptr_scale_factor;
962*15dc779aSAndroid Build Coastguard Worker WORD32 bnds;
963*15dc779aSAndroid Build Coastguard Worker
964*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_intensity_used = 0;
965*15dc779aSAndroid Build Coastguard Worker
966*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded = 0;
967*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_fwd_esc_words_decoded = 0;
968*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_bwd_esc_words_decoded = 0;
969*15dc779aSAndroid Build Coastguard Worker
970*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->intensity_used = 0;
971*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvlc_err_log = 0;
972*15dc779aSAndroid Build Coastguard Worker
973*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = CONCEAL_MAX_INIT;
974*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min = CONCEAL_MIN_INIT;
975*15dc779aSAndroid Build Coastguard Worker
976*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max_esc = CONCEAL_MAX_INIT;
977*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min_esc = CONCEAL_MIN_INIT;
978*15dc779aSAndroid Build Coastguard Worker
979*15dc779aSAndroid Build Coastguard Worker for (bnds = 0; bnds < RVLC_MAX_SFB; bnds++) {
980*15dc779aSAndroid Build Coastguard Worker ptr_scf_fwd[bnds] = 0;
981*15dc779aSAndroid Build Coastguard Worker ptr_scf_bwd[bnds] = 0;
982*15dc779aSAndroid Build Coastguard Worker ptr_scf_esc[bnds] = 0;
983*15dc779aSAndroid Build Coastguard Worker ptr_scale_factor[bnds] = 0;
984*15dc779aSAndroid Build Coastguard Worker }
985*15dc779aSAndroid Build Coastguard Worker
986*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvl_fwd_bit_str_idx = it_bit_buff->size - it_bit_buff->cnt_bits;
987*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->rvl_bwd_bit_str_idx =
988*15dc779aSAndroid Build Coastguard Worker it_bit_buff->size - it_bit_buff->cnt_bits + ptr_rvlc->rvlc_sf_len - 1;
989*15dc779aSAndroid Build Coastguard Worker
990*15dc779aSAndroid Build Coastguard Worker it_bit_buff->cnt_bits -= ptr_rvlc->rvlc_sf_len;
991*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_read_next =
992*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_bit_buf_base +
993*15dc779aSAndroid Build Coastguard Worker ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
994*15dc779aSAndroid Build Coastguard Worker it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
995*15dc779aSAndroid Build Coastguard Worker
996*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->sf_esc_present != 0) {
997*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->esc_bit_str_idx = it_bit_buff->size - it_bit_buff->cnt_bits;
998*15dc779aSAndroid Build Coastguard Worker
999*15dc779aSAndroid Build Coastguard Worker it_bit_buff->cnt_bits -= ptr_rvlc->rvlc_esc_len;
1000*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_read_next =
1001*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_bit_buf_base +
1002*15dc779aSAndroid Build Coastguard Worker ((it_bit_buff->size - it_bit_buff->cnt_bits) >> 3);
1003*15dc779aSAndroid Build Coastguard Worker it_bit_buff->bit_pos = ((it_bit_buff->size - it_bit_buff->cnt_bits) & 7);
1004*15dc779aSAndroid Build Coastguard Worker }
1005*15dc779aSAndroid Build Coastguard Worker if (it_bit_buff->cnt_bits < 0) {
1006*15dc779aSAndroid Build Coastguard Worker return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
1007*15dc779aSAndroid Build Coastguard Worker } else
1008*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
1009*15dc779aSAndroid Build Coastguard Worker }
1010*15dc779aSAndroid Build Coastguard Worker
ixheaacd_bi_dir_est_scf_prev_frame_reference(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_aac_dec_overlap_info * ptr_aac_dec_static_channel_info)1011*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_bi_dir_est_scf_prev_frame_reference(
1012*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
1013*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
1014*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
1015*15dc779aSAndroid Build Coastguard Worker WORD32 band, bnds, start_band, end_band, group;
1016*15dc779aSAndroid Build Coastguard Worker WORD32 conceal_min, conceal_max;
1017*15dc779aSAndroid Build Coastguard Worker WORD32 conceal_group_min, conceal_group_max;
1018*15dc779aSAndroid Build Coastguard Worker WORD32 max_scf_bands;
1019*15dc779aSAndroid Build Coastguard Worker WORD32 common_min;
1020*15dc779aSAndroid Build Coastguard Worker
1021*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
1022*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE) {
1023*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 16;
1024*15dc779aSAndroid Build Coastguard Worker } else {
1025*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 64;
1026*15dc779aSAndroid Build Coastguard Worker }
1027*15dc779aSAndroid Build Coastguard Worker
1028*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) ptr_rvlc->conceal_min = 0;
1029*15dc779aSAndroid Build Coastguard Worker
1030*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_max == CONCEAL_MAX_INIT)
1031*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max =
1032*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->num_wind_grps - 1) * 16 + ptr_rvlc->max_sfb_transmitted - 1;
1033*15dc779aSAndroid Build Coastguard Worker
1034*15dc779aSAndroid Build Coastguard Worker conceal_min = ptr_rvlc->conceal_min % max_scf_bands;
1035*15dc779aSAndroid Build Coastguard Worker conceal_group_min = ptr_rvlc->conceal_min / max_scf_bands;
1036*15dc779aSAndroid Build Coastguard Worker conceal_max = ptr_rvlc->conceal_max % max_scf_bands;
1037*15dc779aSAndroid Build Coastguard Worker conceal_group_max = ptr_rvlc->conceal_max / max_scf_bands;
1038*15dc779aSAndroid Build Coastguard Worker
1039*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_max] =
1040*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_max];
1041*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_min] =
1042*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_min];
1043*15dc779aSAndroid Build Coastguard Worker
1044*15dc779aSAndroid Build Coastguard Worker start_band = conceal_min;
1045*15dc779aSAndroid Build Coastguard Worker if (conceal_group_min == conceal_group_max)
1046*15dc779aSAndroid Build Coastguard Worker end_band = conceal_max;
1047*15dc779aSAndroid Build Coastguard Worker else
1048*15dc779aSAndroid Build Coastguard Worker end_band = ptr_rvlc->max_sfb_transmitted - 1;
1049*15dc779aSAndroid Build Coastguard Worker
1050*15dc779aSAndroid Build Coastguard Worker for (group = conceal_group_min; group <= conceal_group_max; group++) {
1051*15dc779aSAndroid Build Coastguard Worker for (band = start_band; band <= end_band; band++) {
1052*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1053*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1054*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1055*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = 0;
1056*15dc779aSAndroid Build Coastguard Worker break;
1057*15dc779aSAndroid Build Coastguard Worker
1058*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1059*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1060*15dc779aSAndroid Build Coastguard Worker if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
1061*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB) ||
1062*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
1063*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB2)) {
1064*15dc779aSAndroid Build Coastguard Worker common_min = ixheaac_min32(
1065*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1066*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1067*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1068*15dc779aSAndroid Build Coastguard Worker common_min,
1069*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
1070*15dc779aSAndroid Build Coastguard Worker } else {
1071*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1072*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1073*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1074*15dc779aSAndroid Build Coastguard Worker }
1075*15dc779aSAndroid Build Coastguard Worker break;
1076*15dc779aSAndroid Build Coastguard Worker
1077*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1078*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
1079*15dc779aSAndroid Build Coastguard Worker NOISE_HCB) {
1080*15dc779aSAndroid Build Coastguard Worker common_min = ixheaac_min32(
1081*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1082*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1083*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1084*15dc779aSAndroid Build Coastguard Worker common_min,
1085*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
1086*15dc779aSAndroid Build Coastguard Worker } else {
1087*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1088*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1089*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1090*15dc779aSAndroid Build Coastguard Worker }
1091*15dc779aSAndroid Build Coastguard Worker break;
1092*15dc779aSAndroid Build Coastguard Worker
1093*15dc779aSAndroid Build Coastguard Worker default:
1094*15dc779aSAndroid Build Coastguard Worker if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1095*15dc779aSAndroid Build Coastguard Worker ZERO_HCB) &&
1096*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1097*15dc779aSAndroid Build Coastguard Worker NOISE_HCB) &&
1098*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1099*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB) &&
1100*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1101*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB2)) {
1102*15dc779aSAndroid Build Coastguard Worker common_min = ixheaac_min32(
1103*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1104*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1105*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1106*15dc779aSAndroid Build Coastguard Worker common_min,
1107*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
1108*15dc779aSAndroid Build Coastguard Worker } else {
1109*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1110*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1111*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1112*15dc779aSAndroid Build Coastguard Worker }
1113*15dc779aSAndroid Build Coastguard Worker break;
1114*15dc779aSAndroid Build Coastguard Worker }
1115*15dc779aSAndroid Build Coastguard Worker }
1116*15dc779aSAndroid Build Coastguard Worker start_band = 0;
1117*15dc779aSAndroid Build Coastguard Worker if ((group + 1) == conceal_group_max) end_band = conceal_max;
1118*15dc779aSAndroid Build Coastguard Worker }
1119*15dc779aSAndroid Build Coastguard Worker
1120*15dc779aSAndroid Build Coastguard Worker if (conceal_group_min == 0)
1121*15dc779aSAndroid Build Coastguard Worker end_band = conceal_min;
1122*15dc779aSAndroid Build Coastguard Worker else
1123*15dc779aSAndroid Build Coastguard Worker end_band = ptr_rvlc->max_sfb_transmitted;
1124*15dc779aSAndroid Build Coastguard Worker for (group = 0; group <= conceal_group_min; group++) {
1125*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < end_band; band++) {
1126*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1127*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1128*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1129*15dc779aSAndroid Build Coastguard Worker }
1130*15dc779aSAndroid Build Coastguard Worker if ((group + 1) == conceal_group_min) end_band = conceal_min;
1131*15dc779aSAndroid Build Coastguard Worker }
1132*15dc779aSAndroid Build Coastguard Worker
1133*15dc779aSAndroid Build Coastguard Worker start_band = conceal_max + 1;
1134*15dc779aSAndroid Build Coastguard Worker for (group = conceal_group_max; group < ptr_rvlc->num_wind_grps; group++) {
1135*15dc779aSAndroid Build Coastguard Worker for (band = start_band; band < ptr_rvlc->max_sfb_transmitted; band++) {
1136*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1137*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1138*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1139*15dc779aSAndroid Build Coastguard Worker }
1140*15dc779aSAndroid Build Coastguard Worker start_band = 0;
1141*15dc779aSAndroid Build Coastguard Worker }
1142*15dc779aSAndroid Build Coastguard Worker }
1143*15dc779aSAndroid Build Coastguard Worker
ixheaacd_calc_ref_val_fwd(ia_rvlc_info_struct * ptr_rvlc,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,WORD32 * ref_fwd,WORD32 * ref_nrg_fwd,WORD32 * ref_scf_fwd)1144*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_calc_ref_val_fwd(
1145*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc,
1146*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD32 *ref_fwd,
1147*15dc779aSAndroid Build Coastguard Worker WORD32 *ref_nrg_fwd, WORD32 *ref_scf_fwd) {
1148*15dc779aSAndroid Build Coastguard Worker WORD32 band, bnds, group, start_band;
1149*15dc779aSAndroid Build Coastguard Worker WORD32 id_is, id_nrg, id_scf;
1150*15dc779aSAndroid Build Coastguard Worker WORD32 conceal_min, conceal_group_min;
1151*15dc779aSAndroid Build Coastguard Worker WORD32 max_scf_bands;
1152*15dc779aSAndroid Build Coastguard Worker
1153*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
1154*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE)
1155*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 16;
1156*15dc779aSAndroid Build Coastguard Worker else
1157*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 64;
1158*15dc779aSAndroid Build Coastguard Worker
1159*15dc779aSAndroid Build Coastguard Worker conceal_min = ptr_rvlc->conceal_min % max_scf_bands;
1160*15dc779aSAndroid Build Coastguard Worker conceal_group_min = ptr_rvlc->conceal_min / max_scf_bands;
1161*15dc779aSAndroid Build Coastguard Worker
1162*15dc779aSAndroid Build Coastguard Worker id_is = id_nrg = id_scf = 1;
1163*15dc779aSAndroid Build Coastguard Worker
1164*15dc779aSAndroid Build Coastguard Worker *ref_nrg_fwd = ptr_aac_dec_channel_info->global_gain - 90 - 256;
1165*15dc779aSAndroid Build Coastguard Worker *ref_scf_fwd = ptr_aac_dec_channel_info->global_gain;
1166*15dc779aSAndroid Build Coastguard Worker
1167*15dc779aSAndroid Build Coastguard Worker start_band = conceal_min - 1;
1168*15dc779aSAndroid Build Coastguard Worker for (group = conceal_group_min; group >= 0; group--) {
1169*15dc779aSAndroid Build Coastguard Worker for (band = start_band; band >= 0; band--) {
1170*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1171*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1172*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1173*15dc779aSAndroid Build Coastguard Worker break;
1174*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1175*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1176*15dc779aSAndroid Build Coastguard Worker if (id_is) {
1177*15dc779aSAndroid Build Coastguard Worker *ref_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1178*15dc779aSAndroid Build Coastguard Worker id_is = 0;
1179*15dc779aSAndroid Build Coastguard Worker }
1180*15dc779aSAndroid Build Coastguard Worker break;
1181*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1182*15dc779aSAndroid Build Coastguard Worker if (id_nrg) {
1183*15dc779aSAndroid Build Coastguard Worker *ref_nrg_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1184*15dc779aSAndroid Build Coastguard Worker id_nrg = 0;
1185*15dc779aSAndroid Build Coastguard Worker }
1186*15dc779aSAndroid Build Coastguard Worker break;
1187*15dc779aSAndroid Build Coastguard Worker default:
1188*15dc779aSAndroid Build Coastguard Worker if (id_scf) {
1189*15dc779aSAndroid Build Coastguard Worker *ref_scf_fwd = ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1190*15dc779aSAndroid Build Coastguard Worker id_scf = 0;
1191*15dc779aSAndroid Build Coastguard Worker }
1192*15dc779aSAndroid Build Coastguard Worker break;
1193*15dc779aSAndroid Build Coastguard Worker }
1194*15dc779aSAndroid Build Coastguard Worker }
1195*15dc779aSAndroid Build Coastguard Worker start_band = ptr_rvlc->max_sfb_transmitted - 1;
1196*15dc779aSAndroid Build Coastguard Worker }
1197*15dc779aSAndroid Build Coastguard Worker }
1198*15dc779aSAndroid Build Coastguard Worker
ixheaacd_calc_ref_val_bwd(ia_rvlc_info_struct * ptr_rvlc,ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,WORD32 * ref_bwd,WORD32 * ref_nrg_bwd,WORD32 * ref_scf_bwd)1199*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_calc_ref_val_bwd(
1200*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc,
1201*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD32 *ref_bwd,
1202*15dc779aSAndroid Build Coastguard Worker WORD32 *ref_nrg_bwd, WORD32 *ref_scf_bwd) {
1203*15dc779aSAndroid Build Coastguard Worker WORD32 band, bnds, group, start_band;
1204*15dc779aSAndroid Build Coastguard Worker WORD32 id_is, id_nrg, id_scf;
1205*15dc779aSAndroid Build Coastguard Worker WORD32 conceal_max, conceal_group_max;
1206*15dc779aSAndroid Build Coastguard Worker WORD32 max_scf_bands;
1207*15dc779aSAndroid Build Coastguard Worker
1208*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
1209*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE)
1210*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 16;
1211*15dc779aSAndroid Build Coastguard Worker else
1212*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 64;
1213*15dc779aSAndroid Build Coastguard Worker
1214*15dc779aSAndroid Build Coastguard Worker conceal_max = ptr_rvlc->conceal_max % max_scf_bands;
1215*15dc779aSAndroid Build Coastguard Worker conceal_group_max = ptr_rvlc->conceal_max / max_scf_bands;
1216*15dc779aSAndroid Build Coastguard Worker
1217*15dc779aSAndroid Build Coastguard Worker id_is = id_nrg = id_scf = 1;
1218*15dc779aSAndroid Build Coastguard Worker
1219*15dc779aSAndroid Build Coastguard Worker *ref_bwd = ptr_rvlc->dpcm_is_last_pos;
1220*15dc779aSAndroid Build Coastguard Worker *ref_nrg_bwd = ptr_rvlc->rev_global_gain + ptr_rvlc->dpcm_noise_last_pos -
1221*15dc779aSAndroid Build Coastguard Worker 90 - 256 + ptr_rvlc->dpcm_noise_nrg;
1222*15dc779aSAndroid Build Coastguard Worker *ref_scf_bwd = ptr_rvlc->rev_global_gain;
1223*15dc779aSAndroid Build Coastguard Worker
1224*15dc779aSAndroid Build Coastguard Worker start_band = conceal_max + 1;
1225*15dc779aSAndroid Build Coastguard Worker
1226*15dc779aSAndroid Build Coastguard Worker for (group = conceal_group_max; group < ptr_rvlc->num_wind_grps; group++) {
1227*15dc779aSAndroid Build Coastguard Worker for (band = start_band; band < ptr_rvlc->max_sfb_transmitted; band++) {
1228*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1229*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1230*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1231*15dc779aSAndroid Build Coastguard Worker break;
1232*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1233*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1234*15dc779aSAndroid Build Coastguard Worker if (id_is) {
1235*15dc779aSAndroid Build Coastguard Worker *ref_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1236*15dc779aSAndroid Build Coastguard Worker id_is = 0;
1237*15dc779aSAndroid Build Coastguard Worker }
1238*15dc779aSAndroid Build Coastguard Worker break;
1239*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1240*15dc779aSAndroid Build Coastguard Worker if (id_nrg) {
1241*15dc779aSAndroid Build Coastguard Worker *ref_nrg_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1242*15dc779aSAndroid Build Coastguard Worker id_nrg = 0;
1243*15dc779aSAndroid Build Coastguard Worker }
1244*15dc779aSAndroid Build Coastguard Worker break;
1245*15dc779aSAndroid Build Coastguard Worker default:
1246*15dc779aSAndroid Build Coastguard Worker if (id_scf) {
1247*15dc779aSAndroid Build Coastguard Worker *ref_scf_bwd = ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1248*15dc779aSAndroid Build Coastguard Worker id_scf = 0;
1249*15dc779aSAndroid Build Coastguard Worker }
1250*15dc779aSAndroid Build Coastguard Worker break;
1251*15dc779aSAndroid Build Coastguard Worker }
1252*15dc779aSAndroid Build Coastguard Worker }
1253*15dc779aSAndroid Build Coastguard Worker start_band = 0;
1254*15dc779aSAndroid Build Coastguard Worker }
1255*15dc779aSAndroid Build Coastguard Worker }
1256*15dc779aSAndroid Build Coastguard Worker
ixheaacd_bi_dir_est_lower_scf_cur_frame(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info)1257*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_bi_dir_est_lower_scf_cur_frame(
1258*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
1259*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
1260*15dc779aSAndroid Build Coastguard Worker WORD32 band, bnds, start_band, end_band, group;
1261*15dc779aSAndroid Build Coastguard Worker WORD32 conceal_min, conceal_max;
1262*15dc779aSAndroid Build Coastguard Worker WORD32 conceal_group_min, conceal_group_max;
1263*15dc779aSAndroid Build Coastguard Worker WORD32 max_scf_bands;
1264*15dc779aSAndroid Build Coastguard Worker
1265*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
1266*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE) {
1267*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 16;
1268*15dc779aSAndroid Build Coastguard Worker } else {
1269*15dc779aSAndroid Build Coastguard Worker max_scf_bands = 64;
1270*15dc779aSAndroid Build Coastguard Worker }
1271*15dc779aSAndroid Build Coastguard Worker
1272*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) ptr_rvlc->conceal_min = 0;
1273*15dc779aSAndroid Build Coastguard Worker
1274*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_max == CONCEAL_MAX_INIT)
1275*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max =
1276*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->num_wind_grps - 1) * 16 + ptr_rvlc->max_sfb_transmitted - 1;
1277*15dc779aSAndroid Build Coastguard Worker
1278*15dc779aSAndroid Build Coastguard Worker conceal_min = ptr_rvlc->conceal_min % max_scf_bands;
1279*15dc779aSAndroid Build Coastguard Worker conceal_group_min = ptr_rvlc->conceal_min / max_scf_bands;
1280*15dc779aSAndroid Build Coastguard Worker conceal_max = ptr_rvlc->conceal_max % max_scf_bands;
1281*15dc779aSAndroid Build Coastguard Worker conceal_group_max = ptr_rvlc->conceal_max / max_scf_bands;
1282*15dc779aSAndroid Build Coastguard Worker
1283*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->conceal_min == ptr_rvlc->conceal_max) {
1284*15dc779aSAndroid Build Coastguard Worker WORD32 ref_fwd = 0, ref_nrg_fwd = 0, ref_scf_fwd = 0;
1285*15dc779aSAndroid Build Coastguard Worker WORD32 ref_bwd = 0, ref_nrg_bwd = 0, ref_scf_bwd = 0;
1286*15dc779aSAndroid Build Coastguard Worker
1287*15dc779aSAndroid Build Coastguard Worker bnds = ptr_rvlc->conceal_min;
1288*15dc779aSAndroid Build Coastguard Worker ixheaacd_calc_ref_val_fwd(ptr_rvlc, ptr_aac_dec_channel_info, &ref_fwd,
1289*15dc779aSAndroid Build Coastguard Worker &ref_nrg_fwd, &ref_scf_fwd);
1290*15dc779aSAndroid Build Coastguard Worker ixheaacd_calc_ref_val_bwd(ptr_rvlc, ptr_aac_dec_channel_info, &ref_bwd,
1291*15dc779aSAndroid Build Coastguard Worker &ref_nrg_bwd, &ref_scf_bwd);
1292*15dc779aSAndroid Build Coastguard Worker
1293*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1294*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1295*15dc779aSAndroid Build Coastguard Worker break;
1296*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1297*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1298*15dc779aSAndroid Build Coastguard Worker if (ref_fwd < ref_bwd)
1299*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_fwd;
1300*15dc779aSAndroid Build Coastguard Worker else
1301*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_bwd;
1302*15dc779aSAndroid Build Coastguard Worker break;
1303*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1304*15dc779aSAndroid Build Coastguard Worker if (ref_nrg_fwd < ref_nrg_bwd)
1305*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_nrg_fwd;
1306*15dc779aSAndroid Build Coastguard Worker else
1307*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_nrg_bwd;
1308*15dc779aSAndroid Build Coastguard Worker break;
1309*15dc779aSAndroid Build Coastguard Worker default:
1310*15dc779aSAndroid Build Coastguard Worker if (ref_scf_fwd < ref_scf_bwd)
1311*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_scf_fwd;
1312*15dc779aSAndroid Build Coastguard Worker else
1313*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ref_scf_bwd;
1314*15dc779aSAndroid Build Coastguard Worker break;
1315*15dc779aSAndroid Build Coastguard Worker }
1316*15dc779aSAndroid Build Coastguard Worker } else {
1317*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_max] =
1318*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_max];
1319*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[ptr_rvlc->conceal_min] =
1320*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[ptr_rvlc->conceal_min];
1321*15dc779aSAndroid Build Coastguard Worker
1322*15dc779aSAndroid Build Coastguard Worker start_band = conceal_min;
1323*15dc779aSAndroid Build Coastguard Worker if (conceal_group_min == conceal_group_max)
1324*15dc779aSAndroid Build Coastguard Worker end_band = conceal_max;
1325*15dc779aSAndroid Build Coastguard Worker else
1326*15dc779aSAndroid Build Coastguard Worker end_band = ptr_rvlc->max_sfb_transmitted - 1;
1327*15dc779aSAndroid Build Coastguard Worker
1328*15dc779aSAndroid Build Coastguard Worker for (group = conceal_group_min; group <= conceal_group_max; group++) {
1329*15dc779aSAndroid Build Coastguard Worker for (band = start_band; band <= end_band; band++) {
1330*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1331*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds] <
1332*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds])
1333*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1334*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1335*15dc779aSAndroid Build Coastguard Worker else
1336*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1337*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1338*15dc779aSAndroid Build Coastguard Worker }
1339*15dc779aSAndroid Build Coastguard Worker start_band = 0;
1340*15dc779aSAndroid Build Coastguard Worker if ((group + 1) == conceal_group_max) end_band = conceal_max;
1341*15dc779aSAndroid Build Coastguard Worker }
1342*15dc779aSAndroid Build Coastguard Worker }
1343*15dc779aSAndroid Build Coastguard Worker
1344*15dc779aSAndroid Build Coastguard Worker if (conceal_group_min == 0)
1345*15dc779aSAndroid Build Coastguard Worker end_band = conceal_min;
1346*15dc779aSAndroid Build Coastguard Worker else
1347*15dc779aSAndroid Build Coastguard Worker end_band = ptr_rvlc->max_sfb_transmitted;
1348*15dc779aSAndroid Build Coastguard Worker for (group = 0; group <= conceal_group_min; group++) {
1349*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < end_band; band++) {
1350*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1351*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1352*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1353*15dc779aSAndroid Build Coastguard Worker }
1354*15dc779aSAndroid Build Coastguard Worker if ((group + 1) == conceal_group_min) end_band = conceal_min;
1355*15dc779aSAndroid Build Coastguard Worker }
1356*15dc779aSAndroid Build Coastguard Worker
1357*15dc779aSAndroid Build Coastguard Worker start_band = conceal_max + 1;
1358*15dc779aSAndroid Build Coastguard Worker for (group = conceal_group_max; group < ptr_rvlc->num_wind_grps; group++) {
1359*15dc779aSAndroid Build Coastguard Worker for (band = start_band; band < ptr_rvlc->max_sfb_transmitted; band++) {
1360*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1361*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1362*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1363*15dc779aSAndroid Build Coastguard Worker }
1364*15dc779aSAndroid Build Coastguard Worker start_band = 0;
1365*15dc779aSAndroid Build Coastguard Worker }
1366*15dc779aSAndroid Build Coastguard Worker }
1367*15dc779aSAndroid Build Coastguard Worker
ixheaacd_statistical_estimation(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info)1368*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_statistical_estimation(
1369*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info) {
1370*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
1371*15dc779aSAndroid Build Coastguard Worker WORD32 band, bnds, group;
1372*15dc779aSAndroid Build Coastguard Worker WORD32 sum_fwd, sum_bwd;
1373*15dc779aSAndroid Build Coastguard Worker WORD32 sum_nrg_fwd, sum_nrg_bwd;
1374*15dc779aSAndroid Build Coastguard Worker WORD32 sum_scf_fwd, sum_scf_bwd;
1375*15dc779aSAndroid Build Coastguard Worker WORD32 use_fwd, use_nrg_fwd, use_scf_fwd;
1376*15dc779aSAndroid Build Coastguard Worker
1377*15dc779aSAndroid Build Coastguard Worker sum_fwd = sum_bwd = sum_nrg_fwd = sum_nrg_bwd = sum_scf_fwd = sum_scf_bwd = 0;
1378*15dc779aSAndroid Build Coastguard Worker use_fwd = use_nrg_fwd = use_scf_fwd = 0;
1379*15dc779aSAndroid Build Coastguard Worker
1380*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
1381*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
1382*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1383*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1384*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1385*15dc779aSAndroid Build Coastguard Worker break;
1386*15dc779aSAndroid Build Coastguard Worker
1387*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1388*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1389*15dc779aSAndroid Build Coastguard Worker sum_fwd += ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1390*15dc779aSAndroid Build Coastguard Worker sum_bwd += ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1391*15dc779aSAndroid Build Coastguard Worker break;
1392*15dc779aSAndroid Build Coastguard Worker
1393*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1394*15dc779aSAndroid Build Coastguard Worker sum_nrg_fwd += ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1395*15dc779aSAndroid Build Coastguard Worker sum_nrg_bwd += ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1396*15dc779aSAndroid Build Coastguard Worker break;
1397*15dc779aSAndroid Build Coastguard Worker
1398*15dc779aSAndroid Build Coastguard Worker default:
1399*15dc779aSAndroid Build Coastguard Worker sum_scf_fwd += ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1400*15dc779aSAndroid Build Coastguard Worker sum_scf_bwd += ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1401*15dc779aSAndroid Build Coastguard Worker break;
1402*15dc779aSAndroid Build Coastguard Worker }
1403*15dc779aSAndroid Build Coastguard Worker }
1404*15dc779aSAndroid Build Coastguard Worker }
1405*15dc779aSAndroid Build Coastguard Worker
1406*15dc779aSAndroid Build Coastguard Worker if (sum_fwd < sum_bwd) use_fwd = 1;
1407*15dc779aSAndroid Build Coastguard Worker
1408*15dc779aSAndroid Build Coastguard Worker if (sum_nrg_fwd < sum_nrg_bwd) use_nrg_fwd = 1;
1409*15dc779aSAndroid Build Coastguard Worker
1410*15dc779aSAndroid Build Coastguard Worker if (sum_scf_fwd < sum_scf_bwd) use_scf_fwd = 1;
1411*15dc779aSAndroid Build Coastguard Worker
1412*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
1413*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
1414*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1415*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1416*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1417*15dc779aSAndroid Build Coastguard Worker break;
1418*15dc779aSAndroid Build Coastguard Worker
1419*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1420*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1421*15dc779aSAndroid Build Coastguard Worker if (use_fwd)
1422*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1423*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1424*15dc779aSAndroid Build Coastguard Worker else
1425*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1426*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1427*15dc779aSAndroid Build Coastguard Worker break;
1428*15dc779aSAndroid Build Coastguard Worker
1429*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1430*15dc779aSAndroid Build Coastguard Worker if (use_nrg_fwd)
1431*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1432*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1433*15dc779aSAndroid Build Coastguard Worker else
1434*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1435*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1436*15dc779aSAndroid Build Coastguard Worker break;
1437*15dc779aSAndroid Build Coastguard Worker
1438*15dc779aSAndroid Build Coastguard Worker default:
1439*15dc779aSAndroid Build Coastguard Worker if (use_scf_fwd)
1440*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1441*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1442*15dc779aSAndroid Build Coastguard Worker else
1443*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1444*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds];
1445*15dc779aSAndroid Build Coastguard Worker break;
1446*15dc779aSAndroid Build Coastguard Worker }
1447*15dc779aSAndroid Build Coastguard Worker }
1448*15dc779aSAndroid Build Coastguard Worker }
1449*15dc779aSAndroid Build Coastguard Worker }
1450*15dc779aSAndroid Build Coastguard Worker
ixheaacd_predictive_interpolation(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_aac_dec_overlap_info * ptr_aac_dec_static_channel_info)1451*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_predictive_interpolation(
1452*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
1453*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
1454*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
1455*15dc779aSAndroid Build Coastguard Worker WORD32 band, bnds, group;
1456*15dc779aSAndroid Build Coastguard Worker WORD32 common_min;
1457*15dc779aSAndroid Build Coastguard Worker
1458*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
1459*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
1460*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1461*15dc779aSAndroid Build Coastguard Worker switch (ptr_aac_dec_channel_info->ptr_code_book[bnds]) {
1462*15dc779aSAndroid Build Coastguard Worker case ZERO_HCB:
1463*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = 0;
1464*15dc779aSAndroid Build Coastguard Worker break;
1465*15dc779aSAndroid Build Coastguard Worker
1466*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB:
1467*15dc779aSAndroid Build Coastguard Worker case INTENSITY_HCB2:
1468*15dc779aSAndroid Build Coastguard Worker if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
1469*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB) ||
1470*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
1471*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB2)) {
1472*15dc779aSAndroid Build Coastguard Worker common_min = ixheaac_min32(
1473*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1474*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1475*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1476*15dc779aSAndroid Build Coastguard Worker common_min,
1477*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
1478*15dc779aSAndroid Build Coastguard Worker } else {
1479*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = -110;
1480*15dc779aSAndroid Build Coastguard Worker }
1481*15dc779aSAndroid Build Coastguard Worker break;
1482*15dc779aSAndroid Build Coastguard Worker
1483*15dc779aSAndroid Build Coastguard Worker case NOISE_HCB:
1484*15dc779aSAndroid Build Coastguard Worker if (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] ==
1485*15dc779aSAndroid Build Coastguard Worker NOISE_HCB) {
1486*15dc779aSAndroid Build Coastguard Worker common_min = ixheaac_min32(
1487*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1488*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1489*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1490*15dc779aSAndroid Build Coastguard Worker common_min,
1491*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
1492*15dc779aSAndroid Build Coastguard Worker } else {
1493*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = -110;
1494*15dc779aSAndroid Build Coastguard Worker }
1495*15dc779aSAndroid Build Coastguard Worker break;
1496*15dc779aSAndroid Build Coastguard Worker
1497*15dc779aSAndroid Build Coastguard Worker default:
1498*15dc779aSAndroid Build Coastguard Worker if ((ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1499*15dc779aSAndroid Build Coastguard Worker ZERO_HCB) &&
1500*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1501*15dc779aSAndroid Build Coastguard Worker NOISE_HCB) &&
1502*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1503*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB) &&
1504*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] !=
1505*15dc779aSAndroid Build Coastguard Worker INTENSITY_HCB2)) {
1506*15dc779aSAndroid Build Coastguard Worker common_min = ixheaac_min32(
1507*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds],
1508*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_bwd_arr[bnds]);
1509*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = ixheaac_min32(
1510*15dc779aSAndroid Build Coastguard Worker common_min,
1511*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds]);
1512*15dc779aSAndroid Build Coastguard Worker } else {
1513*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] = 0;
1514*15dc779aSAndroid Build Coastguard Worker }
1515*15dc779aSAndroid Build Coastguard Worker break;
1516*15dc779aSAndroid Build Coastguard Worker }
1517*15dc779aSAndroid Build Coastguard Worker }
1518*15dc779aSAndroid Build Coastguard Worker }
1519*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_rvlc_final_error_detection(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_aac_dec_overlap_info * ptr_aac_dec_static_channel_info)1520*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_rvlc_final_error_detection(
1521*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
1522*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info) {
1523*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
1524*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_complete = 0;
1525*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_length_fwd = 0;
1526*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_length_bwd = 0;
1527*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_length_escape = 0;
1528*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_first_scf = 0;
1529*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_last_scf = 0;
1530*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_first_nrg = 0;
1531*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_last_nrg = 0;
1532*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_first_is = 0;
1533*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_last_is = 0;
1534*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_forbidden_cw_fwd = 0;
1535*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_forbidden_cw_bwd = 0;
1536*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_num_escapes_fwd = 0;
1537*15dc779aSAndroid Build Coastguard Worker UWORD8 err_status_num_escapes_bwd = 0;
1538*15dc779aSAndroid Build Coastguard Worker UWORD8 conceal_status = 1;
1539*15dc779aSAndroid Build Coastguard Worker UWORD8 current_block_type;
1540*15dc779aSAndroid Build Coastguard Worker
1541*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_curr_sf_flag = 1;
1542*15dc779aSAndroid Build Coastguard Worker
1543*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_err_log & RVLC_ERROR_FORBIDDEN_CW_DETECTED_FWD)
1544*15dc779aSAndroid Build Coastguard Worker err_status_forbidden_cw_fwd = 1;
1545*15dc779aSAndroid Build Coastguard Worker
1546*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_err_log & RVLC_ERROR_FORBIDDEN_CW_DETECTED_BWD)
1547*15dc779aSAndroid Build Coastguard Worker err_status_forbidden_cw_bwd = 1;
1548*15dc779aSAndroid Build Coastguard Worker
1549*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_sf_fwd_len) err_status_length_fwd = 1;
1550*15dc779aSAndroid Build Coastguard Worker
1551*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_sf_bwd_len) err_status_length_bwd = 1;
1552*15dc779aSAndroid Build Coastguard Worker
1553*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->sf_esc_present)
1554*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->rvlc_esc_len) err_status_length_escape = 1;
1555*15dc779aSAndroid Build Coastguard Worker
1556*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->sf_used) {
1557*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->firt_scale_fac != (ptr_aac_dec_channel_info->global_gain))
1558*15dc779aSAndroid Build Coastguard Worker err_status_first_scf = 1;
1559*15dc779aSAndroid Build Coastguard Worker
1560*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->last_scale_fac != (ptr_rvlc->rev_global_gain))
1561*15dc779aSAndroid Build Coastguard Worker err_status_last_scf = 1;
1562*15dc779aSAndroid Build Coastguard Worker }
1563*15dc779aSAndroid Build Coastguard Worker
1564*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->noise_used) {
1565*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->first_nrg != (ptr_aac_dec_channel_info->global_gain +
1566*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->dpcm_noise_nrg - 90 - 256))
1567*15dc779aSAndroid Build Coastguard Worker err_status_first_nrg = 1;
1568*15dc779aSAndroid Build Coastguard Worker
1569*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->last_nrg !=
1570*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->rev_global_gain + ptr_rvlc->dpcm_noise_last_pos - 90 - 256))
1571*15dc779aSAndroid Build Coastguard Worker err_status_last_nrg = 1;
1572*15dc779aSAndroid Build Coastguard Worker }
1573*15dc779aSAndroid Build Coastguard Worker
1574*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->intensity_used) {
1575*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->is_first != 0) err_status_first_is = 1;
1576*15dc779aSAndroid Build Coastguard Worker
1577*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->is_last != (ptr_rvlc->dpcm_is_last_pos))
1578*15dc779aSAndroid Build Coastguard Worker err_status_last_is = 1;
1579*15dc779aSAndroid Build Coastguard Worker }
1580*15dc779aSAndroid Build Coastguard Worker
1581*15dc779aSAndroid Build Coastguard Worker if ((ptr_rvlc->num_fwd_esc_words_decoded !=
1582*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded) &&
1583*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->conceal_max == CONCEAL_MAX_INIT)) {
1584*15dc779aSAndroid Build Coastguard Worker err_status_num_escapes_fwd = 1;
1585*15dc779aSAndroid Build Coastguard Worker }
1586*15dc779aSAndroid Build Coastguard Worker
1587*15dc779aSAndroid Build Coastguard Worker if ((ptr_rvlc->num_bwd_esc_words_decoded !=
1588*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded) &&
1589*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT)) {
1590*15dc779aSAndroid Build Coastguard Worker err_status_num_escapes_bwd = 1;
1591*15dc779aSAndroid Build Coastguard Worker }
1592*15dc779aSAndroid Build Coastguard Worker
1593*15dc779aSAndroid Build Coastguard Worker if (err_status_length_escape ||
1594*15dc779aSAndroid Build Coastguard Worker (((ptr_rvlc->conceal_max == CONCEAL_MAX_INIT) &&
1595*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->num_fwd_esc_words_decoded !=
1596*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded) &&
1597*15dc779aSAndroid Build Coastguard Worker (err_status_last_scf || err_status_last_nrg || err_status_last_is))
1598*15dc779aSAndroid Build Coastguard Worker
1599*15dc779aSAndroid Build Coastguard Worker &&
1600*15dc779aSAndroid Build Coastguard Worker
1601*15dc779aSAndroid Build Coastguard Worker ((ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) &&
1602*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->num_bwd_esc_words_decoded !=
1603*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->num_esc_words_decoded) &&
1604*15dc779aSAndroid Build Coastguard Worker (err_status_first_scf || err_status_first_nrg ||
1605*15dc779aSAndroid Build Coastguard Worker err_status_first_is))) ||
1606*15dc779aSAndroid Build Coastguard Worker ((ptr_rvlc->conceal_max == CONCEAL_MAX_INIT) &&
1607*15dc779aSAndroid Build Coastguard Worker ((ptr_rvlc->rev_global_gain - ptr_rvlc->last_scale_fac) < -15)) ||
1608*15dc779aSAndroid Build Coastguard Worker ((ptr_rvlc->conceal_min == CONCEAL_MIN_INIT) &&
1609*15dc779aSAndroid Build Coastguard Worker ((ptr_aac_dec_channel_info->global_gain - ptr_rvlc->firt_scale_fac) <
1610*15dc779aSAndroid Build Coastguard Worker -15))) {
1611*15dc779aSAndroid Build Coastguard Worker if ((ptr_rvlc->conceal_max == CONCEAL_MAX_INIT) ||
1612*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->conceal_min == CONCEAL_MIN_INIT)) {
1613*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max = 0;
1614*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min =
1615*15dc779aSAndroid Build Coastguard Worker ixheaac_max32(0, (ptr_rvlc->num_wind_grps - 1) * 16 +
1616*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->max_sfb_transmitted - 1);
1617*15dc779aSAndroid Build Coastguard Worker } else {
1618*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_max =
1619*15dc779aSAndroid Build Coastguard Worker ixheaac_min32(ptr_rvlc->conceal_max, ptr_rvlc->conceal_max_esc);
1620*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->conceal_min =
1621*15dc779aSAndroid Build Coastguard Worker ixheaac_max32(ptr_rvlc->conceal_min, ptr_rvlc->conceal_min_esc);
1622*15dc779aSAndroid Build Coastguard Worker }
1623*15dc779aSAndroid Build Coastguard Worker }
1624*15dc779aSAndroid Build Coastguard Worker
1625*15dc779aSAndroid Build Coastguard Worker err_status_complete =
1626*15dc779aSAndroid Build Coastguard Worker err_status_last_scf || err_status_first_scf || err_status_last_nrg ||
1627*15dc779aSAndroid Build Coastguard Worker err_status_first_nrg || err_status_last_is || err_status_first_is ||
1628*15dc779aSAndroid Build Coastguard Worker err_status_forbidden_cw_fwd || err_status_forbidden_cw_bwd ||
1629*15dc779aSAndroid Build Coastguard Worker err_status_length_fwd || err_status_length_bwd ||
1630*15dc779aSAndroid Build Coastguard Worker err_status_length_escape || err_status_num_escapes_fwd ||
1631*15dc779aSAndroid Build Coastguard Worker err_status_num_escapes_bwd;
1632*15dc779aSAndroid Build Coastguard Worker
1633*15dc779aSAndroid Build Coastguard Worker current_block_type =
1634*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_channel_info->str_ics_info.window_sequence ==
1635*15dc779aSAndroid Build Coastguard Worker EIGHT_SHORT_SEQUENCE)
1636*15dc779aSAndroid Build Coastguard Worker ? 0
1637*15dc779aSAndroid Build Coastguard Worker : 1;
1638*15dc779aSAndroid Build Coastguard Worker
1639*15dc779aSAndroid Build Coastguard Worker if (!err_status_complete) {
1640*15dc779aSAndroid Build Coastguard Worker WORD32 band;
1641*15dc779aSAndroid Build Coastguard Worker WORD32 group;
1642*15dc779aSAndroid Build Coastguard Worker WORD32 bnds;
1643*15dc779aSAndroid Build Coastguard Worker WORD32 last_sfb_idx;
1644*15dc779aSAndroid Build Coastguard Worker
1645*15dc779aSAndroid Build Coastguard Worker last_sfb_idx = (ptr_rvlc->num_wind_grps > 1) ? 16 : 64;
1646*15dc779aSAndroid Build Coastguard Worker
1647*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
1648*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
1649*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1650*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[bnds] =
1651*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf[bnds] =
1652*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_scf_fwd_arr[bnds];
1653*15dc779aSAndroid Build Coastguard Worker }
1654*15dc779aSAndroid Build Coastguard Worker }
1655*15dc779aSAndroid Build Coastguard Worker
1656*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
1657*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
1658*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1659*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] =
1660*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_code_book[bnds];
1661*15dc779aSAndroid Build Coastguard Worker }
1662*15dc779aSAndroid Build Coastguard Worker for (; band < last_sfb_idx; band++) {
1663*15dc779aSAndroid Build Coastguard Worker bnds = 16 * group + band;
1664*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_cb[bnds] = ZERO_HCB;
1665*15dc779aSAndroid Build Coastguard Worker }
1666*15dc779aSAndroid Build Coastguard Worker }
1667*15dc779aSAndroid Build Coastguard Worker } else {
1668*15dc779aSAndroid Build Coastguard Worker WORD32 band;
1669*15dc779aSAndroid Build Coastguard Worker WORD32 group;
1670*15dc779aSAndroid Build Coastguard Worker
1671*15dc779aSAndroid Build Coastguard Worker if (((ptr_rvlc->conceal_min != CONCEAL_MIN_INIT) ||
1672*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->conceal_max != CONCEAL_MAX_INIT)) &&
1673*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
1674*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_blk_type ==
1675*15dc779aSAndroid Build Coastguard Worker current_block_type) &&
1676*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf_ok &&
1677*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_concealment && conceal_status) {
1678*15dc779aSAndroid Build Coastguard Worker ixheaacd_bi_dir_est_scf_prev_frame_reference(
1679*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info, ptr_aac_dec_static_channel_info);
1680*15dc779aSAndroid Build Coastguard Worker conceal_status = 0;
1681*15dc779aSAndroid Build Coastguard Worker }
1682*15dc779aSAndroid Build Coastguard Worker
1683*15dc779aSAndroid Build Coastguard Worker if ((ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
1684*15dc779aSAndroid Build Coastguard Worker ((ptr_rvlc->conceal_min != CONCEAL_MIN_INIT) ||
1685*15dc779aSAndroid Build Coastguard Worker (ptr_rvlc->conceal_max != CONCEAL_MAX_INIT)) &&
1686*15dc779aSAndroid Build Coastguard Worker !(ptr_aac_dec_static_channel_info->rvlc_prev_sf_ok &&
1687*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_concealment &&
1688*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_blk_type ==
1689*15dc779aSAndroid Build Coastguard Worker current_block_type)) &&
1690*15dc779aSAndroid Build Coastguard Worker conceal_status) {
1691*15dc779aSAndroid Build Coastguard Worker ixheaacd_bi_dir_est_lower_scf_cur_frame(ptr_aac_dec_channel_info);
1692*15dc779aSAndroid Build Coastguard Worker conceal_status = 0;
1693*15dc779aSAndroid Build Coastguard Worker }
1694*15dc779aSAndroid Build Coastguard Worker
1695*15dc779aSAndroid Build Coastguard Worker if ((ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
1696*15dc779aSAndroid Build Coastguard Worker ((err_status_last_scf && err_status_first_scf) ||
1697*15dc779aSAndroid Build Coastguard Worker (err_status_last_nrg && err_status_first_nrg) ||
1698*15dc779aSAndroid Build Coastguard Worker (err_status_last_is && err_status_first_is)) &&
1699*15dc779aSAndroid Build Coastguard Worker !(err_status_forbidden_cw_fwd || err_status_forbidden_cw_bwd ||
1700*15dc779aSAndroid Build Coastguard Worker err_status_length_escape) &&
1701*15dc779aSAndroid Build Coastguard Worker conceal_status) {
1702*15dc779aSAndroid Build Coastguard Worker ixheaacd_statistical_estimation(ptr_aac_dec_channel_info);
1703*15dc779aSAndroid Build Coastguard Worker conceal_status = 0;
1704*15dc779aSAndroid Build Coastguard Worker }
1705*15dc779aSAndroid Build Coastguard Worker
1706*15dc779aSAndroid Build Coastguard Worker if ((ptr_rvlc->conceal_min <= ptr_rvlc->conceal_max) &&
1707*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info->rvlc_prev_sf_ok &&
1708*15dc779aSAndroid Build Coastguard Worker ptr_rvlc->sf_concealment &&
1709*15dc779aSAndroid Build Coastguard Worker (ptr_aac_dec_static_channel_info->rvlc_prev_blk_type ==
1710*15dc779aSAndroid Build Coastguard Worker current_block_type) &&
1711*15dc779aSAndroid Build Coastguard Worker conceal_status) {
1712*15dc779aSAndroid Build Coastguard Worker ixheaacd_predictive_interpolation(ptr_aac_dec_channel_info,
1713*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info);
1714*15dc779aSAndroid Build Coastguard Worker conceal_status = 0;
1715*15dc779aSAndroid Build Coastguard Worker }
1716*15dc779aSAndroid Build Coastguard Worker
1717*15dc779aSAndroid Build Coastguard Worker if (conceal_status) {
1718*15dc779aSAndroid Build Coastguard Worker for (group = 0; group < ptr_rvlc->num_wind_grps; group++) {
1719*15dc779aSAndroid Build Coastguard Worker for (band = 0; band < ptr_rvlc->max_sfb_transmitted; band++) {
1720*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->ptr_scale_factor[16 * group + band] = 0;
1721*15dc779aSAndroid Build Coastguard Worker }
1722*15dc779aSAndroid Build Coastguard Worker }
1723*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_curr_sf_flag = 0;
1724*15dc779aSAndroid Build Coastguard Worker }
1725*15dc779aSAndroid Build Coastguard Worker }
1726*15dc779aSAndroid Build Coastguard Worker }
1727*15dc779aSAndroid Build Coastguard Worker
ixheaacd_rvlc_dec(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ia_aac_dec_overlap_info * ptr_aac_dec_static_channel_info,ia_bit_buf_struct * it_bit_buff)1728*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_rvlc_dec(
1729*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info,
1730*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_overlap_info *ptr_aac_dec_static_channel_info,
1731*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
1732*15dc779aSAndroid Build Coastguard Worker ia_rvlc_info_struct *ptr_rvlc = &ptr_aac_dec_channel_info->ptr_rvlc_info;
1733*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct saved_it_bit_buff;
1734*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE error_code = 0;
1735*15dc779aSAndroid Build Coastguard Worker error_code =
1736*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_init(ptr_rvlc, ptr_aac_dec_channel_info, it_bit_buff);
1737*15dc779aSAndroid Build Coastguard Worker if (error_code) return error_code;
1738*15dc779aSAndroid Build Coastguard Worker
1739*15dc779aSAndroid Build Coastguard Worker ixheaacd_bitbuf_checkpoint(*it_bit_buff, saved_it_bit_buff);
1740*15dc779aSAndroid Build Coastguard Worker if (ptr_rvlc->sf_esc_present)
1741*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_decode_escape(
1742*15dc779aSAndroid Build Coastguard Worker ptr_rvlc, ptr_aac_dec_channel_info->rvlc_scf_esc_arr, it_bit_buff);
1743*15dc779aSAndroid Build Coastguard Worker
1744*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_decode_forward(ptr_rvlc, ptr_aac_dec_channel_info, it_bit_buff);
1745*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_decode_backward(ptr_rvlc, ptr_aac_dec_channel_info,
1746*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
1747*15dc779aSAndroid Build Coastguard Worker ixheaacd_rvlc_final_error_detection(ptr_aac_dec_channel_info,
1748*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_static_channel_info);
1749*15dc779aSAndroid Build Coastguard Worker
1750*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->rvlc_intensity_used = ptr_rvlc->intensity_used;
1751*15dc779aSAndroid Build Coastguard Worker ptr_aac_dec_channel_info->str_pns_info.pns_active = ptr_rvlc->noise_used;
1752*15dc779aSAndroid Build Coastguard Worker
1753*15dc779aSAndroid Build Coastguard Worker ixheaacd_bitbuf_restore(*it_bit_buff, saved_it_bit_buff);
1754*15dc779aSAndroid Build Coastguard Worker return error_code;
1755*15dc779aSAndroid Build Coastguard Worker }
1756