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