• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <string.h>
24 
25 #include "ixheaacd_type_def.h"
26 #include "ixheaacd_constants.h"
27 #include "ixheaacd_basic_ops32.h"
28 #include "ixheaacd_basic_ops16.h"
29 #include "ixheaacd_basic_ops40.h"
30 
31 #include "ixheaacd_defines.h"
32 #include "ixheaacd_cnst.h"
33 #include "ixheaacd_aac_rom.h"
34 #include "ixheaacd_lt_predict.h"
35 #include "ixheaacd_ec_defines.h"
36 #include "ixheaacd_ec_struct_def.h"
37 #include "ixheaacd_audioobjtypes.h"
38 
39 #include "ixheaacd_bitbuffer.h"
40 #include "ixheaacd_pulsedata.h"
41 #include "ixheaacd_pns.h"
42 #include "ixheaacd_channelinfo.h"
43 #include "ixheaacd_tns.h"
44 #include "ixheaacd_aac_imdct.h"
45 
46 static const WORD32 ixheaacd_codebook_Q30[8] = {
47     612922971,  747985734,  872956397,  978505219,
48     1057528322, 1146642451, 1282693056, 1470524861};
49 
50 #define SHIFT_VAL 8
51 #define SHIFT_VAL1 (15 - SHIFT_VAL)
52 
ixheaacd_lt_prediction(ia_aac_dec_channel_info_struct * ptr_aac_dec_channel_info,ltp_info * ltp,WORD32 * spec,ia_aac_dec_tables_struct * aac_tables_ptr,UWORD16 win_shape_prev,UWORD32 sr_index,UWORD32 object_type,UWORD32 frame_len,WORD32 * in_data,WORD32 * out_data)53 VOID ixheaacd_lt_prediction(
54     ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ltp_info *ltp,
55     WORD32 *spec, ia_aac_dec_tables_struct *aac_tables_ptr,
56     UWORD16 win_shape_prev, UWORD32 sr_index, UWORD32 object_type,
57     UWORD32 frame_len, WORD32 *in_data, WORD32 *out_data) {
58   ia_ics_info_struct *ptr_ics_info = &ptr_aac_dec_channel_info->str_ics_info;
59   WORD16 *lt_pred_stat = ptr_aac_dec_channel_info->ltp_buf;
60   UWORD16 win_shape = ptr_aac_dec_channel_info->str_ics_info.window_shape;
61   WORD16 sfb;
62   WORD16 bin, i, num_samples;
63   const WORD8 *swb_offset = aac_tables_ptr->scale_factor_bands_long[sr_index];
64   WORD32 *ptr_spec = &spec[0];
65   WORD32 *ptr_x_est = &out_data[0];
66 
67   if (512 == ptr_ics_info->frame_length) {
68     swb_offset = aac_tables_ptr->scale_fac_bands_512[sr_index];
69   } else if (480 == ptr_ics_info->frame_length) {
70     swb_offset = aac_tables_ptr->scale_fac_bands_480[sr_index];
71   }
72 
73   if (ptr_ics_info->window_sequence != EIGHT_SHORT_SEQUENCE) {
74     if (ltp->data_present) {
75       num_samples = frame_len << 1;
76 
77       for (i = 0; i < num_samples; i++) {
78         in_data[i] =
79             ixheaacd_shr32(ixheaacd_mult32x16in32_shl_sat(
80                                ixheaacd_codebook_Q30[ltp->coef],
81                                lt_pred_stat[num_samples + i - ltp->lag]),
82                            SHIFT_VAL);
83       }
84 
85       ixheaacd_filter_bank_ltp(aac_tables_ptr, ptr_ics_info->window_sequence,
86                                win_shape, win_shape_prev, in_data, out_data,
87                                object_type, frame_len);
88 
89       if (ptr_aac_dec_channel_info->str_tns_info.tns_data_present == 1)
90         ixheaacd_aac_tns_process(ptr_aac_dec_channel_info, 1, aac_tables_ptr,
91                                  object_type, 0, out_data);
92 
93       for (sfb = 0; sfb < ltp->last_band; sfb++) {
94         WORD8 sfb_width = swb_offset[sfb];
95         if (ltp->long_used[sfb]) {
96           for (bin = sfb_width - 1; bin >= 0; bin--) {
97             WORD32 temp = *ptr_spec;
98             temp = ixheaacd_add32_sat(temp,
99                                       ixheaacd_shr32(*ptr_x_est++, SHIFT_VAL1));
100             *ptr_spec++ = temp;
101           }
102         } else {
103           ptr_spec += sfb_width;
104           ptr_x_est += sfb_width;
105         }
106       }
107     }
108   }
109 }
110 
ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct * aac_tables_ptr,WORD16 window_sequence,WORD16 window_shape,WORD16 window_shape_prev,WORD32 * in_data,WORD32 * out_mdct,UWORD32 object_type,UWORD32 frame_len)111 VOID ixheaacd_filter_bank_ltp(ia_aac_dec_tables_struct *aac_tables_ptr,
112                               WORD16 window_sequence, WORD16 window_shape,
113                               WORD16 window_shape_prev, WORD32 *in_data,
114                               WORD32 *out_mdct, UWORD32 object_type,
115                               UWORD32 frame_len) {
116   WORD32 i;
117 
118   const WORD16 *window_long = NULL;
119   const WORD16 *window_long_prev = NULL;
120   const WORD16 *window_short = NULL;
121   const WORD16 *window_short_prev = NULL;
122 
123   UWORD16 nlong = frame_len;
124   UWORD16 nlong2 = frame_len << 1;
125   UWORD16 nshort = frame_len / 8;
126   UWORD16 nflat_ls = (nlong - nshort) / 2;
127   WORD32 imdct_scale = 0;
128   WORD32 expo = 0;
129 
130   if (object_type == AOT_ER_AAC_LD) {
131     if (!window_shape) {
132       if (512 == frame_len) {
133         window_long =
134             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_512;
135       } else {
136         window_long =
137             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_480;
138       }
139     } else {
140       if (512 == frame_len) {
141         window_long =
142             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win;
143       } else {
144         window_long =
145             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win_480;
146       }
147     }
148 
149     if (!window_shape_prev) {
150       if (512 == frame_len) {
151         window_long_prev =
152             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_512;
153       } else {
154         window_long_prev =
155             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->window_sine_480;
156       }
157     } else {
158       if (512 == frame_len) {
159         window_long_prev =
160             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win;
161       } else {
162         window_long_prev =
163             (WORD16 *)aac_tables_ptr->pstr_imdct_tables->low_overlap_win_480;
164       }
165     }
166 
167     if (!window_shape)
168       window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_sine;
169     else
170       window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd;
171     if (!window_shape_prev)
172       window_short_prev =
173           aac_tables_ptr->pstr_imdct_tables->only_short_window_sine;
174     else
175       window_short_prev =
176           aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd;
177 
178   } else {
179     if (!window_shape)
180       window_long = aac_tables_ptr->pstr_imdct_tables->only_long_window_sine;
181     else
182       window_long = aac_tables_ptr->pstr_imdct_tables->only_long_window_kbd;
183     if (!window_shape_prev)
184       window_long_prev =
185           aac_tables_ptr->pstr_imdct_tables->only_long_window_sine;
186     else
187       window_long_prev =
188           aac_tables_ptr->pstr_imdct_tables->only_long_window_kbd;
189 
190     if (!window_shape)
191       window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_sine;
192     else
193       window_short = aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd;
194     if (!window_shape_prev)
195       window_short_prev =
196           aac_tables_ptr->pstr_imdct_tables->only_short_window_sine;
197     else
198       window_short_prev =
199           aac_tables_ptr->pstr_imdct_tables->only_short_window_kbd;
200   }
201 
202   switch (window_sequence) {
203     case ONLY_LONG_SEQUENCE:
204 
205       if ((512 != nlong) && (480 != nlong)) {
206         for (i = 0; i<nlong>> 1; i++) {
207           in_data[i] =
208               ixheaacd_mult32x16in32_shl(in_data[i], window_long_prev[2 * i]);
209 
210           in_data[i + nlong] = ixheaacd_mult32x16in32_shl(
211               in_data[i + nlong], window_long[2 * i + 1]);
212         }
213         for (i = 0; i<nlong>> 1; i++) {
214           in_data[i + (nlong >> 1)] = ixheaacd_mult32x16in32_shl(
215               in_data[i + (nlong >> 1)], window_long_prev[nlong - 1 - 2 * i]);
216 
217           in_data[i + nlong + (nlong >> 1)] =
218               ixheaacd_mult32x16in32_shl(in_data[i + nlong + (nlong >> 1)],
219                                          window_long[nlong - 1 - 2 * i - 1]);
220         }
221 
222       } else {
223         WORD32 *win1, *win2;
224         WORD32 *ptr_in1, *ptr_in2;
225         win1 = (WORD32 *)window_long_prev;
226         win2 = (WORD32 *)window_long;
227         ptr_in1 = &in_data[0];
228         ptr_in2 = &in_data[nlong];
229 
230         for (i = nlong - 1; i >= 0; i--) {
231           WORD32 temp1 = ixheaacd_mult32_shl(*ptr_in1, *win1++);
232           WORD32 temp2 = ixheaacd_mult32_shl(*ptr_in2, win2[i]);
233 
234           *ptr_in1++ = temp1;
235           *ptr_in2++ = temp2;
236         }
237       }
238 
239       for (i = 0; i < nlong / 2; i++) {
240         out_mdct[nlong / 2 + i] =
241             ixheaacd_sub32(in_data[i], in_data[nlong - 1 - i]);
242         out_mdct[i] = (-ixheaacd_add32(in_data[nlong + i + nlong / 2],
243                                        in_data[nlong2 - nlong / 2 - 1 - i]));
244       }
245 
246       if (512 == nlong || (480 == nlong)) {
247         if (512 == nlong)
248           ixheaacd_inverse_transform_512(
249               out_mdct, in_data, &imdct_scale,
250               aac_tables_ptr->pstr_imdct_tables->cosine_array_1024,
251               aac_tables_ptr->pstr_imdct_tables, object_type);
252 
253         else
254           ixheaacd_mdct_480_ld(out_mdct, in_data, &imdct_scale, 1,
255                                aac_tables_ptr->pstr_imdct_tables, object_type);
256 
257         imdct_scale += 1;
258 
259         if (imdct_scale > 0) {
260           WORD32 *ptr_out_mdct = &out_mdct[0];
261 
262           for (i = nlong - 1; i >= 0; i -= 4) {
263             *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale);
264             ptr_out_mdct++;
265             *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale);
266             ptr_out_mdct++;
267             *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale);
268             ptr_out_mdct++;
269             *ptr_out_mdct = ixheaacd_shl32(*ptr_out_mdct, imdct_scale);
270             ptr_out_mdct++;
271           }
272         } else if (imdct_scale < 0) {
273           WORD32 *ptr_out_mdct = &out_mdct[0];
274           imdct_scale = -imdct_scale;
275           for (i = nlong - 1; i >= 0; i -= 4) {
276             *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale);
277             ptr_out_mdct++;
278             *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale);
279             ptr_out_mdct++;
280             *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale);
281             ptr_out_mdct++;
282             *ptr_out_mdct = ixheaacd_shr32(*ptr_out_mdct, imdct_scale);
283             ptr_out_mdct++;
284           }
285         }
286       }
287 
288       else if (1024 == nlong) {
289         expo = ixheaacd_calc_max_spectral_line_dec(out_mdct, 1024) - 1;
290 
291         expo = 8 - expo;
292 
293         imdct_scale = ixheaacd_inverse_transform(
294             out_mdct, in_data, aac_tables_ptr->pstr_imdct_tables, expo, 1024);
295 
296         ixheaacd_post_twiddle_dec(in_data, out_mdct,
297                                   aac_tables_ptr->pstr_imdct_tables, 1024);
298 
299         imdct_scale += 1;
300 
301         for (i = 0; i < nlong; i++) {
302           out_mdct[i] = ixheaacd_shl32_dir(in_data[i], imdct_scale);
303         }
304       }
305 
306       break;
307 
308     case LONG_START_SEQUENCE:
309 
310       for (i = 0; i<nlong>> 1; i++)
311         in_data[i] =
312             ixheaacd_mult32x16in32_shl(in_data[i], window_long_prev[2 * i]);
313 
314       for (i = 0; i<nlong>> 1; i++)
315         in_data[i + (nlong >> 1)] = ixheaacd_mult32x16in32_shl(
316             in_data[i + (nlong >> 1)], window_long_prev[nlong - 1 - 2 * i - 1]);
317 
318       for (i = 0; i<nshort>> 1; i++)
319         in_data[i + nlong + nflat_ls + (nshort >> 1)] =
320             ixheaacd_mult32x16in32_shl(
321                 in_data[i + nlong + nflat_ls + (nshort >> 1)],
322                 window_short[nshort - 1 - 2 * i - 1]);
323 
324       for (i = 0; i < nflat_ls; i++) in_data[i + nlong + nflat_ls + nshort] = 0;
325 
326       for (i = 0; i < nlong / 2; i++) {
327         out_mdct[nlong / 2 + i] =
328             ixheaacd_sub32(in_data[i], in_data[nlong - 1 - i]);
329         out_mdct[nlong / 2 - 1 - i] =
330             -ixheaacd_add32(in_data[nlong + i], in_data[nlong2 - 1 - i]);
331       }
332 
333       {
334         expo = ixheaacd_calc_max_spectral_line_dec(out_mdct, 1024) - 1;
335 
336         expo = 8 - expo;
337         imdct_scale = ixheaacd_inverse_transform(
338             out_mdct, in_data, aac_tables_ptr->pstr_imdct_tables, expo, 1024);
339 
340         ixheaacd_post_twiddle_dec(in_data, out_mdct,
341                                   aac_tables_ptr->pstr_imdct_tables, 1024);
342       }
343 
344       imdct_scale += 1;
345 
346       for (i = 0; i < nlong; i++) {
347         out_mdct[i] = ixheaacd_shl32_dir(in_data[i], imdct_scale);
348       }
349       break;
350 
351     case LONG_STOP_SEQUENCE:
352       for (i = 0; i < nflat_ls; i++) in_data[i] = 0;
353 
354       for (i = 0; i<nshort>> 1; i++)
355         in_data[i + nflat_ls] = ixheaacd_mult32x16in32_shl(
356             in_data[i + nflat_ls], window_short_prev[2 * i]);
357 
358       for (i = 0; i<nshort>> 1; i++)
359         in_data[i + nflat_ls + (nshort >> 1)] =
360             ixheaacd_mult32x16in32_shl(in_data[i + nflat_ls + (nshort >> 1)],
361                                        window_short_prev[127 - 2 * i]);
362 
363       for (i = 0; i<nlong>> 1; i++)
364         in_data[i + nlong] = ixheaacd_mult32x16in32_shl(in_data[i + nlong],
365                                                         window_long[2 * i + 1]);
366 
367       for (i = 0; i<nlong>> 1; i++)
368         in_data[i + nlong + (nlong >> 1)] =
369             ixheaacd_mult32x16in32_shl(in_data[i + nlong + (nlong >> 1)],
370                                        window_long[nlong - 1 - 2 * i - 1]);
371 
372       for (i = 0; i < nlong / 2; i++) {
373         out_mdct[nlong / 2 + i] =
374             ixheaacd_sub32(in_data[i], in_data[nlong - 1 - i]);
375         out_mdct[nlong / 2 - 1 - i] =
376             -ixheaacd_add32(in_data[nlong + i], in_data[nlong2 - 1 - i]);
377       }
378 
379       {
380         expo = ixheaacd_calc_max_spectral_line_dec(out_mdct, 1024) - 1;
381 
382         expo = 8 - expo;
383         imdct_scale = ixheaacd_inverse_transform(
384             out_mdct, in_data, aac_tables_ptr->pstr_imdct_tables, expo, 1024);
385 
386         ixheaacd_post_twiddle_dec(in_data, out_mdct,
387                                   aac_tables_ptr->pstr_imdct_tables, 1024);
388       }
389 
390       imdct_scale += 1;
391 
392       for (i = 0; i < nlong; i++) {
393         out_mdct[i] = ixheaacd_shl32_dir(in_data[i], imdct_scale);
394       }
395 
396       break;
397   }
398 }
399 
ixheaacd_lt_update_state(WORD16 * lt_pred_stat,VOID * time_t,WORD32 * overlap,WORD32 frame_len,WORD32 object_type,WORD32 stride,WORD16 window_sequence,WORD16 * p_window_next,WORD slot_element)400 VOID ixheaacd_lt_update_state(WORD16 *lt_pred_stat, VOID *time_t,
401                               WORD32 *overlap, WORD32 frame_len,
402                               WORD32 object_type, WORD32 stride,
403                               WORD16 window_sequence, WORD16 *p_window_next,
404                               WORD slot_element) {
405   WORD32 i;
406 
407   if (object_type == AOT_ER_AAC_LD) {
408     WORD16 *ptr_ltp_state0 = &lt_pred_stat[0];
409     WORD16 *ptr_ltp_state_fl = &lt_pred_stat[frame_len + 0];
410     WORD16 *ptr_ltp_state_2fl = &lt_pred_stat[(frame_len * 2) + 0];
411     WORD16 *time = (WORD16 *)time_t - slot_element;
412     WORD16 *ptr_time_in = &time[0 * stride];
413 
414     for (i = 0; i < frame_len; i++) {
415       *ptr_ltp_state0++ = *ptr_ltp_state_fl;
416       *ptr_ltp_state_fl++ = *ptr_ltp_state_2fl;
417       *ptr_ltp_state_2fl++ = *ptr_time_in;
418       ptr_time_in += stride;
419     }
420 
421   } else {
422     WORD16 *ptr_ltp_state0 = &lt_pred_stat[0];
423     WORD16 *ptr_ltp_state_fl = &lt_pred_stat[frame_len + 0];
424     WORD32 *time = (WORD32 *)time_t;
425     WORD32 *ptr_time_in = &time[0 * stride];
426 
427     time = (WORD32 *)time_t;
428 
429     for (i = 0; i < frame_len; i++) {
430       *ptr_ltp_state0++ = *ptr_ltp_state_fl;
431       *ptr_ltp_state_fl++ =
432           ixheaacd_round16(ixheaacd_shl32_sat(*ptr_time_in, 2));
433       ptr_time_in += stride;
434     }
435   }
436 
437   if ((window_sequence == ONLY_LONG_SEQUENCE) ||
438       (window_sequence == LONG_STOP_SEQUENCE)) {
439     if (512 == frame_len) {
440       WORD32 *window = (WORD32 *)p_window_next;
441 
442       for (i = 0; i < 256; i++) {
443         lt_pred_stat[(frame_len * 3) + i] =
444             ixheaacd_round16(ixheaacd_mult16x16in32_shl(
445                 (WORD16)ixheaacd_shl16(
446                     (WORD16)-ixheaacd_sat16(overlap[255 - i]), 1),
447                 (WORD16)ixheaacd_shr32(window[511 - i], 15)));
448 
449         lt_pred_stat[(frame_len * 3) + 256 + i] =
450             ixheaacd_round16(ixheaacd_mult16x16in32_shl(
451                 (WORD16)ixheaacd_shl16((WORD16)-ixheaacd_sat16(overlap[i]), 1),
452                 (WORD16)ixheaacd_shr32(window[255 - i], 15)));
453       }
454     } else if (480 == frame_len) {
455       WORD32 *window = (WORD32 *)p_window_next;
456 
457       for (i = 0; i < 240; i++) {
458         lt_pred_stat[(frame_len * 3) + i] =
459             ixheaacd_round16(ixheaacd_mult16x16in32_shl(
460                 (WORD16)ixheaacd_shl16(
461                     (WORD16)-ixheaacd_sat16(overlap[239 - i]), 1),
462                 (WORD16)ixheaacd_shr32(window[479 - i], 15)));
463 
464         lt_pred_stat[(frame_len * 3) + 240 + i] =
465             ixheaacd_round16(ixheaacd_mult16x16in32_shl(
466                 (WORD16)ixheaacd_shl16((WORD16)-ixheaacd_sat16(overlap[i]), 1),
467                 (WORD16)ixheaacd_shr32(window[239 - i], 15)));
468       }
469     } else {
470       for (i = 0; i < 512; i++) {
471         lt_pred_stat[(frame_len * 2) + i] = ixheaacd_round16(
472             ixheaacd_shl32_sat(ixheaacd_mult16x16in32_shl(
473                                    (WORD16)-ixheaacd_sat16(overlap[511 - i]),
474                                    p_window_next[2 * i + 1]),
475                                1));
476 
477         lt_pred_stat[(frame_len * 2) + 512 + i] =
478             ixheaacd_round16(ixheaacd_shl32_sat(
479                 ixheaacd_mult16x16in32_shl((WORD16)-ixheaacd_sat16(overlap[i]),
480                                            p_window_next[1023 - 2 * i - 1]),
481                 1));
482       }
483     }
484 
485   } else if (window_sequence == LONG_START_SEQUENCE) {
486     for (i = 0; i < 448; i++) {
487       lt_pred_stat[(frame_len * 2) + i] =
488           ixheaacd_shl16((WORD16)-ixheaacd_sat16(overlap[511 - i]), 1);
489     }
490     for (i = 0; i < 64; i++) {
491       lt_pred_stat[(frame_len * 2) + 448 + i] =
492           ixheaacd_round16(ixheaacd_shl32_sat(
493               ixheaacd_mult16x16in32_shl(
494                   (WORD16)-ixheaacd_sat16(overlap[511 - 448 - i]),
495                   p_window_next[2 * i + 1]),
496               1));
497     }
498     for (i = 0; i < 64; i++) {
499       lt_pred_stat[(frame_len * 2) + 512 + i] =
500           ixheaacd_round16(ixheaacd_shl32_sat(
501               ixheaacd_mult16x16in32_shl((WORD16)-ixheaacd_sat16(overlap[i]),
502                                          p_window_next[127 - 2 * i - 1]),
503               1));
504     }
505     for (i = 576; i < 1024; i++) {
506       lt_pred_stat[(frame_len * 2) + i] = 0;
507     }
508   } else {
509     for (i = 0; i < 448; i++) {
510       lt_pred_stat[(frame_len * 2) + i] =
511           ixheaacd_shl16(ixheaacd_sat16(overlap[i]), 1);
512     }
513     for (i = 0; i < 64; i++) {
514       lt_pred_stat[(frame_len * 2) + 448 + i] = ixheaacd_round16(
515           ixheaacd_shl32_sat(ixheaacd_mult16x16in32_shl(
516                                  (WORD16)-ixheaacd_sat16(overlap[511 - i]),
517                                  p_window_next[2 * i + 1]),
518                              1));
519     }
520     for (i = 0; i < 64; i++) {
521       lt_pred_stat[(frame_len * 2) + 512 + i] = ixheaacd_round16(
522           ixheaacd_shl32_sat(ixheaacd_mult16x16in32_shl(
523                                  (WORD16)-ixheaacd_sat16(overlap[448 + i]),
524                                  p_window_next[127 - 2 * i - 1]),
525                              1));
526     }
527     for (i = 576; i < 1024; i++) {
528       lt_pred_stat[(frame_len * 2) + i] = 0;
529     }
530   }
531 }
532