1 /******************************************************************************
2 * *
3 * Copyright (C) 2018 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19 */
20 #include <string.h>
21 #include <ixheaacd_type_def.h>
22
23 #include "ixheaacd_constants.h"
24
25 #include <ixheaacd_basic_ops32.h>
26 #include "ixheaacd_windows.h"
27
ixheaacd_mult32_sh1(WORD32 a,WORD32 b)28 static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) {
29 WORD32 result;
30 WORD64 temp_result;
31
32 temp_result = (WORD64)a * (WORD64)b;
33 result = (WORD32)(temp_result >> 31);
34
35 return (result);
36 }
37
ixheaacd_memset(FLOAT32 * x,WORD32 n)38 VOID ixheaacd_memset(FLOAT32 *x, WORD32 n) {
39 memset(x, 0, n * sizeof(FLOAT32));
40 return;
41 }
42
ixheaacd_mem_cpy(const FLOAT32 x[],FLOAT32 y[],WORD32 n)43 VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n) {
44 memcpy(y, x, n * sizeof(FLOAT32));
45 return;
46 }
47
ixheaacd_vec_cnst_mul(FLOAT32 a,FLOAT32 x[],FLOAT32 z[],WORD32 n)48 VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n) {
49 WORD32 i;
50 for (i = 0; i < n; i++) {
51 z[i] = (FLOAT32)a * x[i];
52 }
53 return;
54 }
55
ixheaacd_combine_fac(WORD32 * src1,WORD32 * src2,WORD32 * dest,WORD32 len,WORD8 output_q,WORD8 fac_q)56 VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len,
57 WORD8 output_q, WORD8 fac_q) {
58 WORD32 i;
59 if (fac_q > output_q) {
60 for (i = 0; i < len; i++) {
61 *dest = ixheaacd_add32_sat(*src1, ((*src2) >> (fac_q - output_q)));
62 dest++;
63 src1++;
64 src2++;
65 }
66 } else {
67 for (i = 0; i < len; i++) {
68 *dest = ixheaacd_add32_sat(*src1, ((*src2) << (output_q - fac_q)));
69 dest++;
70 src1++;
71 src2++;
72 }
73 }
74 }
75
ixheaacd_windowing_long1(WORD32 * src1,WORD32 * src2,const WORD32 * win_fwd,const WORD32 * win_rev,WORD32 * dest,WORD32 vlen,WORD8 shift1,WORD8 shift2)76 WORD8 ixheaacd_windowing_long1(WORD32 *src1, WORD32 *src2,
77 const WORD32 *win_fwd, const WORD32 *win_rev,
78 WORD32 *dest, WORD32 vlen, WORD8 shift1,
79 WORD8 shift2) {
80 WORD32 i;
81 WORD32 *rsrc2 = src2 + vlen - 1;
82
83 if (shift1 > shift2) {
84 for (i = 0; i < vlen / 2; i++) {
85 *dest = ixheaacd_add32_sat(
86 ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)),
87 ixheaacd_mult32_sh1(*src2, *win_rev));
88 *(dest + (vlen - (2 * i)) - 1) = ixheaacd_add32_sat(
89 ((ixheaacd_mult32_sh1(-(*src1), *win_rev)) >> (shift1 - shift2)),
90 ixheaacd_mult32_sh1(*rsrc2, *win_fwd));
91
92 src1++;
93 src2++;
94 win_fwd++;
95 win_rev--;
96 rsrc2--;
97 dest++;
98 }
99 return (shift2);
100 } else {
101 for (i = 0; i < vlen / 2; i++) {
102 *dest = ixheaacd_add32_sat(
103 ixheaacd_mult32_sh1(*src1, *win_fwd),
104 ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1)));
105
106 *(dest + (vlen - (2 * i)) - 1) = ixheaacd_add32_sat(
107 ixheaacd_mult32_sh1(-(*src1), *win_rev),
108 ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1)));
109 src1++;
110 src2++;
111 win_fwd++;
112 win_rev--;
113 rsrc2--;
114 dest++;
115 }
116 return (shift1);
117 }
118 }
119
ixheaacd_windowing_long2(WORD32 * src1,const WORD32 * win_fwd,WORD32 * fac_data_out,WORD32 * over_lap,WORD32 * p_out_buffer,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap,WORD8 fac_q)120 WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd,
121 WORD32 *fac_data_out, WORD32 *over_lap,
122 WORD32 *p_out_buffer,
123 offset_lengths *ixheaacd_drc_offset,
124 WORD8 shiftp, WORD8 shift_olap, WORD8 fac_q) {
125 WORD32 i;
126 WORD32 *dest = p_out_buffer;
127
128 win_fwd += ixheaacd_drc_offset->lfac;
129
130 if (shiftp > fac_q) {
131 if (shift_olap > fac_q) {
132 for (i = 0;
133 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
134 i++) {
135 dest[i] = over_lap[i] >> (shift_olap - fac_q);
136 }
137
138 for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
139 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
140 i++) {
141 dest[i] = ixheaacd_add32_sat(
142 (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 +
143 ixheaacd_drc_offset->n_flat_ls +
144 ixheaacd_drc_offset->lfac - i - 1],
145 *win_fwd) >>
146 (shiftp - fac_q)),
147 (*fac_data_out));
148 win_fwd++;
149 fac_data_out++;
150 }
151
152 for (;
153 i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
154 i++) {
155 dest[i] =
156 ixheaacd_add32_sat((-src1[ixheaacd_drc_offset->n_long / 2 +
157 ixheaacd_drc_offset->n_flat_ls +
158 ixheaacd_drc_offset->lfac - i - 1] >>
159 (shiftp - fac_q)),
160 (*fac_data_out));
161 fac_data_out++;
162 }
163
164 for (; i < ixheaacd_drc_offset->n_long; i++) {
165 dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 +
166 ixheaacd_drc_offset->n_flat_ls +
167 ixheaacd_drc_offset->lfac - i - 1] >>
168 (shiftp - fac_q);
169 }
170 return (fac_q);
171 } else {
172 memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
173 ixheaacd_drc_offset->lfac));
174
175 for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
176 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
177 i++) {
178 dest[i] = ixheaacd_add32_sat(
179 (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 +
180 ixheaacd_drc_offset->n_flat_ls +
181 ixheaacd_drc_offset->lfac - i - 1],
182 *win_fwd) >>
183 (shiftp - shift_olap)),
184 (*fac_data_out) >> (fac_q - shift_olap));
185 win_fwd++;
186 fac_data_out++;
187 }
188
189 for (;
190 i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
191 i++) {
192 dest[i] =
193 ixheaacd_add32_sat((-src1[ixheaacd_drc_offset->n_long / 2 +
194 ixheaacd_drc_offset->n_flat_ls +
195 ixheaacd_drc_offset->lfac - i - 1] >>
196 (shiftp - shift_olap)),
197 (*fac_data_out) >> (fac_q - shift_olap));
198 fac_data_out++;
199 }
200
201 for (; i < ixheaacd_drc_offset->n_long; i++) {
202 dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 +
203 ixheaacd_drc_offset->n_flat_ls +
204 ixheaacd_drc_offset->lfac - i - 1] >>
205 (shiftp - shift_olap);
206 }
207 return (shift_olap);
208 }
209 } else {
210 if (shift_olap > shiftp) {
211 for (i = 0;
212 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
213 i++) {
214 dest[i] = over_lap[i] >> (shift_olap - shiftp);
215 }
216
217 for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
218 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
219 i++) {
220 dest[i] = ixheaacd_add32_sat(
221 ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 +
222 ixheaacd_drc_offset->n_flat_ls +
223 ixheaacd_drc_offset->lfac - i - 1],
224 *win_fwd),
225 (*fac_data_out) >> (fac_q - shiftp));
226 win_fwd++;
227 fac_data_out++;
228 }
229
230 for (;
231 i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
232 i++) {
233 dest[i] = ixheaacd_add32_sat(-src1[ixheaacd_drc_offset->n_long / 2 +
234 ixheaacd_drc_offset->n_flat_ls +
235 ixheaacd_drc_offset->lfac - i - 1],
236 (*fac_data_out) >> (fac_q - shiftp));
237 fac_data_out++;
238 }
239
240 for (; i < ixheaacd_drc_offset->n_long; i++) {
241 dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 +
242 ixheaacd_drc_offset->n_flat_ls +
243 ixheaacd_drc_offset->lfac - i - 1];
244 }
245 return (shiftp);
246 } else {
247 memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
248 ixheaacd_drc_offset->lfac));
249
250 for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
251 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
252 i++) {
253 dest[i] = ixheaacd_add32_sat(
254 (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 +
255 ixheaacd_drc_offset->n_flat_ls +
256 ixheaacd_drc_offset->lfac - i - 1],
257 *win_fwd) >>
258 (shiftp - shift_olap)),
259 (*fac_data_out) >> (fac_q - shift_olap));
260 win_fwd++;
261 fac_data_out++;
262 }
263
264 for (;
265 i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
266 i++) {
267 dest[i] =
268 ixheaacd_add32_sat((-src1[ixheaacd_drc_offset->n_long / 2 +
269 ixheaacd_drc_offset->n_flat_ls +
270 ixheaacd_drc_offset->lfac - i - 1] >>
271 (shiftp - shift_olap)),
272 (*fac_data_out) >> (fac_q - shift_olap));
273 fac_data_out++;
274 }
275
276 for (; i < ixheaacd_drc_offset->n_long; i++) {
277 dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 +
278 ixheaacd_drc_offset->n_flat_ls +
279 ixheaacd_drc_offset->lfac - i - 1] >>
280 (shiftp - shift_olap);
281 }
282 return (shift_olap);
283 }
284 }
285 }
286
ixheaacd_windowing_long3(WORD32 * src1,const WORD32 * win_fwd,WORD32 * over_lap,WORD32 * p_out_buffer,const WORD32 * win_rev,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap)287 WORD8 ixheaacd_windowing_long3(WORD32 *src1, const WORD32 *win_fwd,
288 WORD32 *over_lap, WORD32 *p_out_buffer,
289 const WORD32 *win_rev,
290 offset_lengths *ixheaacd_drc_offset,
291 WORD8 shiftp, WORD8 shift_olap) {
292 WORD32 i;
293 WORD32 *dest = p_out_buffer;
294
295 if (shiftp > shift_olap) {
296 memcpy(dest, over_lap, sizeof(FLOAT32) * ixheaacd_drc_offset->n_flat_ls);
297
298 for (i = ixheaacd_drc_offset->n_flat_ls;
299 i < ixheaacd_drc_offset->n_long / 2; i++) {
300 dest[i] = ixheaacd_add32_sat(
301 (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
302 ixheaacd_mult32_sh1(over_lap[i], *win_rev));
303 win_fwd++;
304 win_rev--;
305 }
306
307 for (i = ixheaacd_drc_offset->n_long / 2;
308 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
309 i++) {
310 dest[i] = ixheaacd_add32_sat(
311 (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long - i - 1],
312 *win_fwd) >>
313 (shiftp - shift_olap)),
314 ixheaacd_mult32_sh1(over_lap[i], *win_rev));
315 win_fwd++;
316 win_rev--;
317 }
318
319 for (; i < ixheaacd_drc_offset->n_long; i++) {
320 dest[i] =
321 -src1[ixheaacd_drc_offset->n_long - i - 1] >> (shiftp - shift_olap);
322 }
323
324 return (shift_olap);
325 } else {
326 for (i = 0; i < ixheaacd_drc_offset->n_flat_ls; i++) {
327 dest[i] = over_lap[i] >> (shift_olap - shiftp);
328 }
329
330 for (i = ixheaacd_drc_offset->n_flat_ls;
331 i < ixheaacd_drc_offset->n_long / 2; i++) {
332 dest[i] = ixheaacd_add32_sat(
333 ixheaacd_mult32_sh1(src1[i], *win_fwd),
334 ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
335 win_fwd++;
336 win_rev--;
337 }
338
339 for (i = ixheaacd_drc_offset->n_long / 2;
340 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
341 i++) {
342 dest[i] = ixheaacd_add32_sat(
343 ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long - i - 1],
344 *win_fwd),
345 ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
346 win_fwd++;
347 win_rev--;
348 }
349
350 for (; i < ixheaacd_drc_offset->n_long; i++) {
351 dest[i] = -src1[ixheaacd_drc_offset->n_long - i - 1];
352 }
353
354 return (shiftp);
355 }
356 }
357
ixheaacd_windowing_short1(WORD32 * src1,WORD32 * src2,WORD32 * fp,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap)358 VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp,
359 offset_lengths *ixheaacd_drc_offset,
360 WORD8 shiftp, WORD8 shift_olap) {
361 WORD32 i;
362 WORD32 *dest = fp;
363
364 if (shift_olap > shiftp) {
365 if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
366 for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
367 dest[i] = dest[i] >> (shift_olap - shiftp);
368 }
369 for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
370 i++) {
371 dest[i] = ixheaacd_mult32_sh1(
372 -src1[ixheaacd_drc_offset->n_short - i - 1], src2[i]);
373 }
374
375 for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
376 i++) {
377 dest[i] = 0;
378 }
379 } else {
380 for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
381 dest[i] = dest[i] >> (shift_olap - shiftp);
382 }
383 for (i = ixheaacd_drc_offset->lfac;
384 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
385 i++) {
386 dest[i] = 0;
387 }
388 }
389 } else {
390 if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
391 for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
392 i++) {
393 dest[i] = ixheaacd_mult32_sh1(
394 -src1[ixheaacd_drc_offset->n_short - i - 1], src2[i]) >>
395 (shiftp - shift_olap);
396 }
397
398 for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
399 i++) {
400 dest[i] = 0;
401 }
402 } else {
403 for (i = ixheaacd_drc_offset->lfac;
404 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
405 i++) {
406 dest[i] = 0;
407 }
408 }
409 }
410 }
411
ixheaacd_windowing_short2(WORD32 * src1,WORD32 * win_fwd,WORD32 * fp,offset_lengths * ixheaacd_drc_offset,WORD8 shiftp,WORD8 shift_olap)412 VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
413 offset_lengths *ixheaacd_drc_offset,
414 WORD8 shiftp, WORD8 shift_olap) {
415 WORD32 i;
416
417 WORD32 *win_rev = win_fwd + ixheaacd_drc_offset->n_short - 1;
418
419 if (shift_olap > shiftp) {
420 for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
421 fp[i] = ixheaacd_add32_sat(
422 ixheaacd_mult32_sh1(src1[i], *win_fwd),
423 (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp)));
424
425 fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaacd_add32_sat(
426 ixheaacd_mult32_sh1(-src1[i], *win_rev),
427 (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
428 *win_fwd) >>
429 (shift_olap - shiftp)));
430 win_fwd++;
431 win_rev--;
432 }
433
434 for (i = ixheaacd_drc_offset->n_short;
435 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
436 i++) {
437 fp[i] = 0;
438 }
439 } else {
440 for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
441 fp[i] = ixheaacd_add32_sat(
442 (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
443 ixheaacd_mult32_sh1(fp[i], *win_rev));
444
445 fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaacd_add32_sat(
446 (ixheaacd_mult32_sh1(-src1[i], *win_rev) >> (shiftp - shift_olap)),
447 ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
448 *win_fwd));
449
450 win_fwd++;
451 win_rev--;
452 }
453
454 for (i = ixheaacd_drc_offset->n_short;
455 i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
456 i++) {
457 fp[i] = 0;
458 }
459 }
460 }
461
ixheaacd_windowing_short3(WORD32 * src1,WORD32 * win_rev,WORD32 * fp,WORD32 n_short,WORD8 shiftp,WORD8 shift_olap)462 WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp,
463 WORD32 n_short, WORD8 shiftp,
464 WORD8 shift_olap) {
465 WORD32 i;
466 const WORD32 *win_fwd = win_rev - n_short + 1;
467 if (shift_olap > shiftp) {
468 for (i = 0; i < n_short / 2; i++) {
469 fp[i] = ixheaacd_add32_sat(
470 ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_rev),
471 (fp[i] >> (shift_olap - shiftp)));
472
473 fp[n_short - i - 1] = ixheaacd_add32_sat(
474 ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_fwd),
475 (fp[n_short - i - 1] >> (shift_olap - shiftp)));
476 win_rev--;
477 win_fwd++;
478 }
479 return (shiftp);
480 } else {
481 for (i = 0; i < n_short / 2; i++) {
482 fp[i] = ixheaacd_add32_sat(
483 (ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_rev) >>
484 (shiftp - shift_olap)),
485 fp[i]);
486
487 fp[n_short - i - 1] = ixheaacd_add32_sat(
488 (ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_fwd) >>
489 (shiftp - shift_olap)),
490 fp[n_short - i - 1]);
491
492 win_rev--;
493 win_fwd++;
494 }
495 return (shift_olap);
496 }
497 }
498
ixheaacd_windowing_short4(WORD32 * src1,WORD32 * win_fwd,WORD32 * fp,WORD32 * win_fwd1,WORD32 n_short,WORD32 flag,WORD8 shiftp,WORD8 shift_olap,WORD8 output_q)499 WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
500 WORD32 *win_fwd1, WORD32 n_short, WORD32 flag,
501 WORD8 shiftp, WORD8 shift_olap,
502 WORD8 output_q) {
503 WORD32 i;
504 const WORD32 *win_rev = win_fwd + n_short - 1;
505 const WORD32 *win_rev1 = win_fwd1 - n_short + 1;
506 if (shift_olap > output_q) {
507 for (i = 0; i < n_short / 2; i++) {
508 fp[i] = ixheaacd_add32_sat(
509 ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
510 (shiftp - output_q),
511 fp[i]);
512
513 fp[n_short - i - 1] = ixheaacd_add32_sat(
514 ixheaacd_mult32_sh1(-src1[n_short / 2 + i], *win_rev) >>
515 (shiftp - output_q),
516 fp[n_short - i - 1]);
517
518 win_fwd++;
519 win_rev--;
520 }
521 if (flag == 1) {
522 for (; i < n_short; i++) {
523 fp[i + n_short / 2] = ixheaacd_add32_sat(
524 ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_fwd1) >>
525 (shiftp - output_q),
526 (fp[i + n_short / 2] >> (shift_olap - output_q)));
527
528 fp[3 * n_short - n_short / 2 - i - 1] = ixheaacd_add32_sat(
529 ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_rev1) >>
530 (shiftp - output_q),
531 (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)));
532
533 win_fwd1--;
534 win_rev1++;
535 }
536 } else {
537 for (; i < n_short; i++) {
538 fp[i + n_short / 2] =
539 ixheaacd_add32_sat(-src1[n_short - i - 1] >> (shiftp - output_q),
540 fp[i + n_short / 2] >> (shift_olap - output_q));
541 fp[3 * n_short - n_short / 2 - i - 1] = ixheaacd_add32_sat(
542 -src1[n_short - i - 1] >> (shiftp - output_q),
543 fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q));
544 }
545 }
546 return (output_q);
547 } else {
548 for (i = 0; i < n_short / 2; i++) {
549 fp[i] = ixheaacd_add32_sat(
550 ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
551 (shiftp - shift_olap),
552 fp[i] >> (output_q - shift_olap));
553
554 fp[n_short - i - 1] = ixheaacd_add32_sat(
555 ixheaacd_mult32_sh1(-src1[n_short / 2 + i], *win_rev) >>
556 (shiftp - shift_olap),
557 fp[n_short - i - 1]);
558
559 win_fwd++;
560 win_rev--;
561 }
562 if (flag == 1) {
563 for (; i < n_short; i++) {
564 fp[i + n_short / 2] = ixheaacd_add32_sat(
565 ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_fwd1) >>
566 (shiftp - shift_olap),
567 fp[i + n_short / 2]);
568
569 fp[3 * n_short - n_short / 2 - i - 1] = ixheaacd_add32_sat(
570 ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_rev1) >>
571 (shiftp - shift_olap),
572 fp[3 * n_short - n_short / 2 - i - 1]);
573
574 win_fwd1--;
575 win_rev1++;
576 }
577 } else {
578 for (; i < n_short; i++) {
579 fp[i + n_short / 2] =
580 ixheaacd_add32_sat(-src1[n_short - i - 1] >> (shiftp - shift_olap),
581 fp[i + n_short / 2]);
582 fp[3 * n_short - n_short / 2 - i - 1] =
583 ixheaacd_add32_sat(-src1[n_short - i - 1] >> (shiftp - shift_olap),
584 fp[3 * n_short - n_short / 2 - i - 1]);
585 }
586 }
587 return (shift_olap);
588 }
589 }
590
ixheaacd_scale_down(WORD32 * dest,WORD32 * src,WORD32 len,WORD8 shift1,WORD8 shift2)591 VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1,
592 WORD8 shift2) {
593 WORD32 i;
594 if (shift1 > shift2) {
595 for (i = 0; i < len; i++) {
596 *dest = *src >> (shift1 - shift2);
597 src++;
598 dest++;
599 }
600 } else {
601 for (i = 0; i < len; i++) {
602 *dest = *src << (shift2 - shift1);
603 src++;
604 dest++;
605 }
606 }
607 }
608