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 <stdio.h>
21#include <string.h>
22#include <stdlib.h>
23
24#include <ixheaacd_type_def.h>
25
26#include "ixheaacd_cnst.h"
27
28#include "ixheaacd_bitbuffer.h"
29
30#include "ixheaacd_interface.h"
31#include "ixheaacd_acelp_info.h"
32
33#include "ixheaacd_tns_usac.h"
34#include "ixheaacd_acelp_info.h"
35
36#include "ixheaacd_sbrdecsettings.h"
37#include "ixheaacd_info.h"
38#include "ixheaacd_sbr_common.h"
39#include "ixheaacd_drc_data_struct.h"
40#include "ixheaacd_drc_dec.h"
41
42#include "ixheaacd_sbrdecoder.h"
43#include "ixheaacd_mps_polyphase.h"
44#include "ixheaacd_sbr_const.h"
45
46#include "ixheaacd_main.h"
47#include "ixheaacd_arith_dec.h"
48#include "ixheaacd_tns_usac.h"
49
50#include "ixheaacd_bit_extract.h"
51
52#include "ixheaacd_constants.h"
53#include <ixheaacd_type_def.h>
54#include <ixheaacd_basic_ops32.h>
55#include <ixheaacd_basic_ops40.h>
56
57#include "ixheaacd_func_def.h"
58
59#include "ixheaacd_defines.h"
60#include "ixheaacd_windows.h"
61
62#include "ixheaacd_vec_baisc_ops.h"
63#include "ixheaacd_config.h"
64
65const WORD16 ixheaacd_mdst_fcoeff_long_sin[] = {0, 0, -16384, 0, 16384, 0, 0};
66const WORD16 ixheaacd_mdst_fcoeff_long_kbd[] = {-2998, 0, -19052, 0,
67                                                19052, 0, 2998};
68const WORD16 ixheaacd_mdst_fcoeff_long_sin_kbd[] = {-1499, -1876, -17718, 0,
69                                                    17718, 1876,  1499};
70const WORD16 ixheaacd_mdst_fcoeff_long_kbd_sin[] = {-1499, 1876,  -17718, 0,
71                                                    17718, -1876, 1499};
72
73const WORD16 *ixheaacd_mdst_fcoeff_longshort_curr[2][2] = {
74    {ixheaacd_mdst_fcoeff_long_sin, ixheaacd_mdst_fcoeff_long_sin_kbd},
75    {ixheaacd_mdst_fcoeff_long_kbd_sin, ixheaacd_mdst_fcoeff_long_kbd}};
76
77const WORD16 ixheaacd_mdst_fcoeff_start_sin[] = {-3364, -3401, -18584, 0,
78                                                 18584, 3401,  3364};
79const WORD16 ixheaacd_mdst_fcoeff_start_kbd[] = {-4932, -1572, -19942, 0,
80                                                 19942, 1572,  4932};
81const WORD16 ixheaacd_mdst_fcoeff_start_sin_kbd[] = {-3433, -3447, -18608, 0,
82                                                     18608, 3447,  3433};
83const WORD16 ixheaacd_mdst_fcoeff_start_kbd_sin[] = {-4863, -1525, -19918, 0,
84                                                     19918, 1525,  4863};
85
86const WORD16 *ixheaacd_mdst_fcoeff_start_curr[2][2] = {
87    {ixheaacd_mdst_fcoeff_start_sin, ixheaacd_mdst_fcoeff_start_sin_kbd},
88    {ixheaacd_mdst_fcoeff_start_kbd_sin, ixheaacd_mdst_fcoeff_start_kbd}};
89
90const WORD16 ixheaacd_mdst_fcoeff_stop_sin[] = {-3364, 3401,  -18584, 0,
91                                                18584, -3401, 3364};
92const WORD16 ixheaacd_mdst_fcoeff_stop_kbd[] = {-4932, 1572,  -19942, 0,
93                                                19942, -1572, 4932};
94const WORD16 ixheaacd_mdst_fcoeff_stop_sin_kbd[] = {-4863, 1525,  -19918, 0,
95                                                    19918, -1525, 4863};
96const WORD16 ixheaacd_mdst_fcoeff_stop_kbd_sin[] = {-3433, 3447,  -18608, 0,
97                                                    18608, -3447, 3433};
98
99const WORD16 *ixheaacd_mdst_fcoeff_stop_cur[2][2] = {
100    {ixheaacd_mdst_fcoeff_stop_sin, ixheaacd_mdst_fcoeff_stop_sin_kbd},
101    {ixheaacd_mdst_fcoeff_stop_kbd_sin, ixheaacd_mdst_fcoeff_stop_kbd}};
102
103const WORD16 ixheaacd_mdst_fcoeff_stopstart_sin[] = {-6728, 0, -20785, 0,
104                                                     20785, 0, 6728};
105const WORD16 ixheaacd_mdst_fcoeff_stopstart_kbd[] = {-6866, -0, -20831, 0,
106                                                     20831, 0,  6866};
107const WORD16 ixheaacd_mdst_fcoeff_stopstart_sin_kbd[] = {-6797, -46, -20808, 0,
108                                                         20808, 46,  6797};
109const WORD16 ixheaacd_mdst_fcoeff_stopstart_kbd_sin[] = {-6797, 46, -20808, 0,
110                                                         20808, 46, 6797};
111
112const WORD16 *ixheaacd_mdst_fcoeff_stopstart_cur[2][2] = {
113    {ixheaacd_mdst_fcoeff_stopstart_sin,
114     ixheaacd_mdst_fcoeff_stopstart_sin_kbd},
115    {ixheaacd_mdst_fcoeff_stopstart_kbd_sin,
116     ixheaacd_mdst_fcoeff_stopstart_kbd}};
117
118const WORD16 ixheaacd_mdst_fcoeff_l_s_start_left_sin[] = {
119    -0, 3477, 8192, 10430, 8192, 3477, -0};
120const WORD16 ixheaacd_mdst_fcoeff_l_s_start_left_kbd[] = {
121    1950, 4054, 6114, 6982, 6114, 4054, 1950};
122
123const WORD16 ixheaacd_mdst_fcoeff_stop_stopstart_left_sin[] = {
124    1262, 1285, 1299, 1304, 1299, 1285, 1262};
125const WORD16 ixheaacd_mdst_fcoeff_stop_stopstart_left_kbd[] = {
126    857, 866, 871, 873, 871, 866, 857};
127
128const WORD16 *ixheaacd_mdst_fcoeff_l_s_start_left_prev[2] = {
129    ixheaacd_mdst_fcoeff_l_s_start_left_sin,
130    ixheaacd_mdst_fcoeff_l_s_start_left_kbd};
131const WORD16 *ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[2] = {
132    ixheaacd_mdst_fcoeff_stop_stopstart_left_sin,
133    ixheaacd_mdst_fcoeff_stop_stopstart_left_kbd};
134
135#define ONE_BY_TWO_POW_14 0.00006103515625
136#define ONE_BY_TWO_POW_15 0.000030517578125
137
138void ixheaacd_usac_cplx_save_prev(ia_sfb_info_struct *info, WORD32 *l_spec,
139                                  WORD32 *r_spec, WORD32 *l_spec_prev,
140                                  WORD32 *r_spec_prev) {
141  WORD32 ixheaacd_drc_offset;
142
143  ixheaacd_drc_offset = info->samp_per_bk - info->bins_per_sbk;
144
145  memcpy(l_spec_prev + ixheaacd_drc_offset, l_spec + ixheaacd_drc_offset,
146         sizeof(WORD32) * info->bins_per_sbk);
147  memcpy(r_spec_prev + ixheaacd_drc_offset, r_spec + ixheaacd_drc_offset,
148         sizeof(WORD32) * info->bins_per_sbk);
149}
150
151static WORD32 ixheaacd_cplx_pred_data(
152    ia_usac_data_struct *usac_data,
153    ia_usac_tmp_core_coder_struct *pstr_core_coder, WORD32 num_window_groups,
154    ia_bit_buf_struct *it_bit_buff) {
155  ia_huff_code_book_struct *ptr_huff_code_book = &ixheaacd_book;
156  ia_huff_code_word_struct *ptr_huff_code_word =
157      ptr_huff_code_book->pstr_huff_code_word;
158  WORD32 cplx_pred_all;
159  WORD32 delta_code_time;
160  WORD32 g, sfb;
161  WORD32 dpcm_alpha, last_alpha_q_re, last_alpha_q_im;
162  UWORD8 max_sfb_ste = pstr_core_coder->max_sfb_ste;
163
164  WORD32(*alpha_q_re)[SFB_NUM_MAX] = usac_data->alpha_q_re;
165  WORD32(*alpha_q_im)[SFB_NUM_MAX] = usac_data->alpha_q_im;
166  WORD32 *alpha_q_re_prev = usac_data->alpha_q_re_prev;
167  WORD32 *alpha_q_im_prev = usac_data->alpha_q_im_prev;
168  UWORD8(*cplx_pred_used)[SFB_NUM_MAX] = usac_data->cplx_pred_used;
169
170  cplx_pred_all = ixheaacd_read_bits_buf(it_bit_buff, 1);
171
172  if (cplx_pred_all == 0) {
173    for (g = 0; g < num_window_groups; g++) {
174      for (sfb = 0; sfb < max_sfb_ste; sfb += SFB_PER_PRED_BAND) {
175        cplx_pred_used[g][sfb] = ixheaacd_read_bits_buf(it_bit_buff, 1);
176
177        if (sfb + 1 < max_sfb_ste)
178          cplx_pred_used[g][sfb + 1] = cplx_pred_used[g][sfb];
179      }
180      for (sfb = max_sfb_ste; sfb < SFB_NUM_MAX; sfb++)
181        cplx_pred_used[g][sfb] = 0;
182    }
183  } else {
184    for (g = 0; g < num_window_groups; g++) {
185      for (sfb = 0; sfb < max_sfb_ste; sfb++) cplx_pred_used[g][sfb] = 1;
186
187      for (sfb = max_sfb_ste; sfb < SFB_NUM_MAX; sfb++)
188        cplx_pred_used[g][sfb] = 0;
189    }
190  }
191
192  pstr_core_coder->pred_dir = ixheaacd_read_bits_buf(it_bit_buff, 1);
193
194  pstr_core_coder->complex_coef = ixheaacd_read_bits_buf(it_bit_buff, 1);
195
196  if (pstr_core_coder->complex_coef) {
197    if (usac_data->usac_independency_flg)
198      pstr_core_coder->use_prev_frame = 0;
199    else
200      pstr_core_coder->use_prev_frame = ixheaacd_read_bits_buf(it_bit_buff, 1);
201  }
202
203  if (usac_data->usac_independency_flg)
204    delta_code_time = 0;
205  else
206    delta_code_time = ixheaacd_read_bits_buf(it_bit_buff, 1);
207
208  for (g = 0; g < num_window_groups; g++) {
209    for (sfb = 0; sfb < max_sfb_ste; sfb += SFB_PER_PRED_BAND) {
210      if (delta_code_time == 1) {
211        last_alpha_q_re = alpha_q_re_prev[sfb];
212        last_alpha_q_im = alpha_q_im_prev[sfb];
213      } else {
214        if (sfb > 0) {
215          last_alpha_q_re = alpha_q_re[g][sfb - 1];
216          last_alpha_q_im = alpha_q_im[g][sfb - 1];
217        } else {
218          last_alpha_q_re = last_alpha_q_im = 0;
219        }
220      }
221
222      if (cplx_pred_used[g][sfb] == 1) {
223        dpcm_alpha =
224            -ixheaacd_huff_codeword(ptr_huff_code_word, 0, it_bit_buff) + 60;
225        alpha_q_re[g][sfb] = dpcm_alpha + last_alpha_q_re;
226
227        if (pstr_core_coder->complex_coef) {
228          dpcm_alpha =
229              -ixheaacd_huff_codeword(ptr_huff_code_word, 0, it_bit_buff) + 60;
230          alpha_q_im[g][sfb] = dpcm_alpha + last_alpha_q_im;
231        } else {
232          alpha_q_im[g][sfb] = 0;
233        }
234      } else {
235        alpha_q_re[g][sfb] = 0;
236        alpha_q_im[g][sfb] = 0;
237      }
238
239      if ((sfb + 1) < max_sfb_ste) {
240        alpha_q_re[g][sfb + 1] = alpha_q_re[g][sfb];
241        alpha_q_im[g][sfb + 1] = alpha_q_im[g][sfb];
242      }
243
244      alpha_q_re_prev[sfb] = alpha_q_re[g][sfb];
245      alpha_q_im_prev[sfb] = alpha_q_im[g][sfb];
246    }
247    for (sfb = max_sfb_ste; sfb < SFB_NUM_MAX; sfb++) {
248      alpha_q_re[g][sfb] = 0;
249      alpha_q_im[g][sfb] = 0;
250      alpha_q_re_prev[sfb] = 0;
251      alpha_q_im_prev[sfb] = 0;
252    }
253  }
254
255  return 1;
256}
257
258static WORD32 ixheaacd_read_ms_mask(
259    ia_usac_data_struct *usac_data,
260    ia_usac_tmp_core_coder_struct *pstr_core_coder,
261    ia_bit_buf_struct *it_bit_buff, WORD32 chn) {
262  WORD32 g, sfb;
263  WORD32 ms_mask_present;
264
265  UWORD8 *sfb_group = usac_data->group_dis[chn];
266  UWORD8 max_sfb = pstr_core_coder->max_sfb_ste;
267  UWORD8 *ms_used = usac_data->ms_used[chn];
268  ia_sfb_info_struct *info = usac_data->pstr_sfb_info[chn];
269
270  ms_mask_present = ixheaacd_read_bits_buf(it_bit_buff, 2);
271
272  switch (ms_mask_present) {
273    case 0:
274
275      break;
276
277    case 1:
278      for (g = 0; g < info->max_win_len; g = *sfb_group++) {
279        for (sfb = 0; sfb < max_sfb; sfb++) {
280          *ms_used = ixheaacd_read_bits_buf(it_bit_buff, 1);
281          ms_used++;
282        }
283        for (; sfb < info->sfb_per_sbk; sfb++) {
284          *ms_used = 0;
285          ms_used++;
286        }
287      }
288
289      break;
290    case 2:
291      for (g = 0; g < info->max_win_len; g = *sfb_group++)
292        for (sfb = 0; sfb < info->sfb_per_sbk; sfb++) *ms_used++ = 1;
293      break;
294
295    case 3:
296
297      ixheaacd_cplx_pred_data(usac_data, pstr_core_coder, info->num_groups,
298                              it_bit_buff);
299      return 3;
300  }
301
302  for (sfb = 0; sfb < SFB_NUM_MAX; sfb++) {
303    usac_data->alpha_q_re_prev[sfb] = 0;
304    usac_data->alpha_q_im_prev[sfb] = 0;
305  }
306  return ms_mask_present;
307}
308
309VOID ixheaacd_ms_stereo(ia_usac_data_struct *usac_data, WORD32 *r_spec,
310                        WORD32 *l_spec, WORD32 chn, WORD32 nband) {
311  WORD32 temp_r, temp_l;
312  WORD32 sfb, k, grp, grp_len;
313  ia_sfb_info_struct *ptr_sfb_info = usac_data->pstr_sfb_info[chn];
314  UWORD8 *ms_used = usac_data->ms_used[chn];
315  WORD32 ixheaacd_drc_offset = 0;
316
317  for (grp = 0; grp < ptr_sfb_info->num_groups; grp++) {
318    for (grp_len = 0; grp_len < ptr_sfb_info->group_len[grp]; grp_len++) {
319      ixheaacd_drc_offset = 0;
320      for (sfb = 0; sfb < nband; sfb++) {
321        ixheaacd_drc_offset += ptr_sfb_info->sfb_width[sfb];
322        if (ms_used[sfb]) {
323          for (k = 0; k < ptr_sfb_info->sfb_width[sfb]; k++) {
324            temp_r = *r_spec;
325            temp_l = *l_spec;
326            *l_spec = ixheaacd_add32_sat(temp_r, temp_l);
327            *r_spec = ixheaacd_sub32_sat(temp_l, temp_r);
328            r_spec++;
329            l_spec++;
330          }
331        } else {
332          r_spec += ptr_sfb_info->sfb_width[sfb];
333          l_spec += ptr_sfb_info->sfb_width[sfb];
334        }
335      }
336
337      l_spec = l_spec + ptr_sfb_info->bins_per_sbk - ixheaacd_drc_offset;
338      r_spec = r_spec + ptr_sfb_info->bins_per_sbk - ixheaacd_drc_offset;
339    }
340
341    ms_used += ptr_sfb_info->sfb_per_sbk;
342  }
343}
344
345static VOID ixheaacd_filter_and_add(const WORD32 *in, const WORD32 length,
346                                    const WORD16 *filter, WORD32 *out,
347                                    const WORD32 factor_even,
348                                    const WORD32 factor_odd) {
349  WORD32 i;
350  WORD64 sum;
351
352  sum = ixheaacd_mult32x32in64(in[2], filter[0]);
353  sum = ixheaacd_mac32x32in64(sum, in[1], filter[1]);
354  sum = ixheaacd_mac32x32in64(sum, in[0], filter[2]);
355  sum = ixheaacd_mac32x32in64_n(sum, &in[0], &filter[3], 4);
356  *out += (WORD32)((sum * factor_even) >> 15);
357  out++;
358
359  sum = ixheaacd_mult32x32in64(in[1], filter[0]);
360  sum = ixheaacd_mac32x32in64(sum, in[0], filter[1]);
361  sum = ixheaacd_mac32x32in64_n(sum, &in[0], &filter[2], 5);
362  *out += (WORD32)((sum * factor_odd) >> 15);
363  out++;
364
365  sum = ixheaacd_mult32x32in64(in[0], filter[0]);
366  sum = ixheaacd_mac32x32in64_n(sum, &in[0], &filter[1], 6);
367  *out += (WORD32)((sum * factor_even) >> 15);
368  out++;
369
370  for (i = 3; i < length - 4; i += 2) {
371    sum = 0;
372    sum = ixheaacd_mac32x32in64_7(sum, &in[i - 3], filter);
373    *out += (WORD32)((sum * factor_odd) >> 15);
374    out++;
375
376    sum = 0;
377    sum = ixheaacd_mac32x32in64_7(sum, &in[i - 2], filter);
378    *out += (WORD32)((sum * factor_even) >> 15);
379    out++;
380  }
381  i = length - 3;
382  sum = 0;
383  sum = ixheaacd_mac32x32in64_n(sum, &in[i - 3], filter, 6);
384  sum = ixheaacd_mac32x32in64(sum, in[i + 2], filter[6]);
385  *out += (WORD32)((sum * factor_odd) >> 15);
386
387  out++;
388  i = length - 2;
389  sum = 0;
390  sum = ixheaacd_mac32x32in64_n(sum, &in[i - 3], filter, 5);
391  sum = ixheaacd_mac32x32in64(sum, in[i + 1], filter[5]);
392  sum = ixheaacd_mac32x32in64(sum, in[i], filter[6]);
393
394  *out += (WORD32)((sum * factor_even) >> 15);
395  out++;
396
397  i = length - 1;
398  sum = 0;
399  sum = ixheaacd_mac32x32in64_n(sum, &in[i - 3], filter, 4);
400  sum = ixheaacd_mac32x32in64(sum, in[i], filter[4]);
401  sum = ixheaacd_mac32x32in64(sum, in[i - 1], filter[5]);
402  sum = ixheaacd_mac32x32in64(sum, in[i - 2], filter[6]);
403
404  *out += (WORD32)((sum * factor_odd) >> 15);
405}
406
407static WORD32 ixheaacd_estimate_dmx_im(const WORD32 *dmx_re,
408                                       const WORD32 *dmx_re_prev,
409                                       WORD32 *dmx_im,
410                                       ia_sfb_info_struct *pstr_sfb_info,
411                                       WORD32 window, const WORD32 w_shape,
412                                       const WORD32 prev_w_shape) {
413  WORD32 i;
414  const WORD16 *mdst_fcoeff_curr, *mdst_fcoeff_prev;
415  WORD32 err = 0;
416
417  switch (window) {
418    case ONLY_LONG_SEQUENCE:
419    case EIGHT_SHORT_SEQUENCE:
420      mdst_fcoeff_curr =
421          ixheaacd_mdst_fcoeff_longshort_curr[prev_w_shape][w_shape];
422      mdst_fcoeff_prev = ixheaacd_mdst_fcoeff_l_s_start_left_prev[prev_w_shape];
423      break;
424    case LONG_START_SEQUENCE:
425      mdst_fcoeff_curr = ixheaacd_mdst_fcoeff_start_curr[prev_w_shape][w_shape];
426      mdst_fcoeff_prev = ixheaacd_mdst_fcoeff_l_s_start_left_prev[prev_w_shape];
427      break;
428    case LONG_STOP_SEQUENCE:
429      mdst_fcoeff_curr = ixheaacd_mdst_fcoeff_stop_cur[prev_w_shape][w_shape];
430      mdst_fcoeff_prev =
431          ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[prev_w_shape];
432      break;
433    case STOP_START_SEQUENCE:
434      mdst_fcoeff_curr =
435          ixheaacd_mdst_fcoeff_stopstart_cur[prev_w_shape][w_shape];
436      mdst_fcoeff_prev =
437          ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[prev_w_shape];
438      break;
439    default:
440      mdst_fcoeff_curr =
441          ixheaacd_mdst_fcoeff_stopstart_cur[prev_w_shape][w_shape];
442      mdst_fcoeff_prev =
443          ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[prev_w_shape];
444      break;
445  }
446
447  for (i = 0; i < pstr_sfb_info->max_win_len; i++) {
448    ixheaacd_filter_and_add(dmx_re, pstr_sfb_info->bins_per_sbk,
449                            mdst_fcoeff_curr, dmx_im, 1, 1);
450
451    if (dmx_re_prev)
452      ixheaacd_filter_and_add(dmx_re_prev, pstr_sfb_info->bins_per_sbk,
453                              mdst_fcoeff_prev, dmx_im, -1, 1);
454
455    dmx_re_prev = dmx_re;
456    dmx_re += pstr_sfb_info->bins_per_sbk;
457    dmx_im += pstr_sfb_info->bins_per_sbk;
458  }
459  return err;
460}
461
462static WORD32 ixheaacd_cplx_pred_upmixing(
463    ia_usac_data_struct *usac_data, WORD32 *l_spec, WORD32 *r_spec,
464    ia_usac_tmp_core_coder_struct *pstr_core_coder, WORD32 chn) {
465  ia_sfb_info_struct *pstr_sfb_info = usac_data->pstr_sfb_info[chn];
466  WORD32 *dmx_re = &usac_data->scratch_buffer[0];
467  WORD32 *dmx_im = &usac_data->x_ac_dec[0];
468
469  WORD32 grp, sfb, grp_len, i = 0, k;
470  WORD32 *dmx_re_prev = usac_data->dmx_re_prev;
471  const WORD32(*alpha_q_re)[SFB_NUM_MAX] = usac_data->alpha_q_re;
472  const WORD32(*alpha_q_im)[SFB_NUM_MAX] = usac_data->alpha_q_im;
473  WORD32 err = 0;
474
475  UWORD8(*cplx_pred_used)[SFB_NUM_MAX] = usac_data->cplx_pred_used;
476
477  WORD32 alpha_q_re_temp;
478  WORD32 alpha_q_im_temp;
479  WORD32 factor = 1;
480
481  if (pstr_core_coder->pred_dir) factor = -1;
482
483  for (grp = 0; grp < pstr_sfb_info->num_groups; grp++) {
484    for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
485      for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
486        if (cplx_pred_used[grp][sfb] == 1) {
487          memcpy(&dmx_re[i], &l_spec[i],
488                 pstr_sfb_info->sfb_width[sfb] * sizeof(WORD32));
489          i += pstr_sfb_info->sfb_width[sfb];
490        }
491
492        else {
493          for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
494            dmx_re[i] = (WORD32)(
495                ((WORD64)l_spec[i] + ((WORD64)factor * (WORD64)r_spec[i])) >>
496                1);
497          }
498        }
499      }
500    }
501  }
502
503  memset(dmx_im, 0, sizeof(WORD32) * BLOCK_LEN_LONG);
504
505  if (pstr_core_coder->complex_coef) {
506    WORD32 *p_dmx_re_prev =
507        pstr_core_coder->use_prev_frame ? dmx_re_prev : NULL;
508    err = ixheaacd_estimate_dmx_im(dmx_re, p_dmx_re_prev, dmx_im, pstr_sfb_info,
509                                   usac_data->window_sequence[chn],
510                                   usac_data->window_shape[chn],
511                                   usac_data->window_shape_prev[chn]);
512    if (err == -1) return err;
513
514    for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) {
515      for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
516        for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
517          alpha_q_re_temp = alpha_q_re[grp][sfb] * 1677722;
518          alpha_q_im_temp = alpha_q_im[grp][sfb] * 1677722;
519          if (cplx_pred_used[grp][sfb]) {
520            for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
521              WORD32 mid_side = r_spec[i] -
522                                (WORD32)((WORD64)ixheaacd_mult32x32in64(
523                                             alpha_q_re_temp, l_spec[i]) >>
524                                         24) -
525                                (WORD32)((WORD64)ixheaacd_mult32x32in64(
526                                             alpha_q_im_temp, dmx_im[i]) >>
527                                         24);
528              r_spec[i] = (factor) * (l_spec[i] - mid_side);
529              l_spec[i] = l_spec[i] + mid_side;
530            }
531
532          } else {
533            i += pstr_sfb_info->sfb_width[sfb];
534          }
535        }
536      }
537    }
538  } else {
539    for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) {
540      for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) {
541        for (sfb = 0; sfb < pstr_sfb_info->sfb_per_sbk; sfb++) {
542          alpha_q_re_temp = alpha_q_re[grp][sfb] * 1677722;
543          if (cplx_pred_used[grp][sfb]) {
544            for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) {
545              WORD32 mid_side = ixheaacd_sub32_sat(
546                  r_spec[i], (WORD32)((WORD64)ixheaacd_mult32x32in64(
547                                          alpha_q_re_temp, l_spec[i]) >>
548                                      24));
549
550              r_spec[i] = (factor) * (ixheaacd_sub32_sat(l_spec[i], mid_side));
551              l_spec[i] = ixheaacd_add32_sat(l_spec[i], mid_side);
552            }
553
554          } else {
555            i += pstr_sfb_info->sfb_width[sfb];
556          }
557        }
558      }
559    }
560  }
561
562  return err;
563}
564
565static VOID ixheaacd_cplx_prev_mdct_dmx(ia_sfb_info_struct *pstr_sfb_info,
566                                        WORD32 *l_spec, WORD32 *r_spec,
567                                        WORD32 *dmx_re_prev, WORD32 pred_dir) {
568  WORD32 offs, i;
569  WORD32 factor = 1;
570  if (pred_dir) factor = -1;
571
572  offs = pstr_sfb_info->samp_per_bk - pstr_sfb_info->bins_per_sbk;
573
574  for (i = 0; i < pstr_sfb_info->bins_per_sbk; i++)
575    dmx_re_prev[i] = (WORD32)(((WORD64)l_spec[i + offs] +
576                               ((WORD64)factor * (WORD64)r_spec[i + offs])) >>
577                              1);
578}
579
580WORD32 ixheaacd_ics_info(ia_usac_data_struct *usac_data, WORD32 chn,
581                         UWORD8 *max_sfb, ia_bit_buf_struct *it_bit_buff,
582                         WORD32 window_sequence_last
583
584                         )
585
586{
587  WORD32 win;
588  WORD32 mask = 0x40;
589
590  UWORD8 *scf_group_ptr = usac_data->group_dis[chn];
591
592  win = ixheaacd_read_bits_buf(it_bit_buff, 2);
593
594  win = usac_data->window_sequence[chn] =
595      ixheaacd_win_seq_select(win, window_sequence_last);
596  if (win == -1) return -1;
597
598  usac_data->pstr_sfb_info[chn] =
599      usac_data->pstr_usac_winmap[usac_data->window_sequence[chn]];
600
601  usac_data->window_shape[chn] = (WORD32)ixheaacd_read_bits_buf(it_bit_buff, 1);
602
603  if (usac_data->pstr_usac_winmap[win]->islong) {
604    *max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 6);
605    *scf_group_ptr = 1;
606
607  } else {
608    WORD32 i, scale_factor_grouping;
609
610    *max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 4);
611
612    scale_factor_grouping = ixheaacd_read_bits_buf(it_bit_buff, 7);
613
614    for (i = 1; i < 8; i++) {
615      if (!(scale_factor_grouping & mask)) *scf_group_ptr++ = i;
616
617      mask = mask >> 1;
618    }
619    *scf_group_ptr++ = i;
620
621    ixheaacd_calc_grp_offset(usac_data->pstr_usac_winmap[win],
622                             &usac_data->group_dis[chn][0]);
623  }
624
625  if (*max_sfb > usac_data->pstr_sfb_info[chn]->sfb_per_sbk) {
626    *max_sfb = usac_data->pstr_sfb_info[chn]->sfb_per_sbk;
627    return 0;
628  }
629
630  return 0;
631}
632
633WORD32 ixheaacd_core_coder_data(WORD32 id, ia_usac_data_struct *usac_data,
634                                WORD32 elem_idx, WORD32 *chan_offset,
635                                ia_bit_buf_struct *it_bit_buff,
636                                WORD32 nr_core_coder_channels) {
637  WORD32 err_code = 0;
638  WORD32 k = 0, ch = 0, chn, left = 0, right = 0;
639
640  ia_usac_tmp_core_coder_struct str_tmp_core_coder;
641  ia_usac_tmp_core_coder_struct *pstr_core_coder = &str_tmp_core_coder;
642  ia_td_frame_data_struct td_frame;
643
644  memset(&td_frame, 0, sizeof(td_frame));
645  pstr_core_coder->tns_on_lr = 0;
646  pstr_core_coder->pred_dir = 0;
647  if (id != ID_USAC_LFE) {
648    for (ch = 0; ch < nr_core_coder_channels; ch++)
649      pstr_core_coder->core_mode[ch] = ixheaacd_read_bits_buf(it_bit_buff, 1);
650  } else {
651    for (ch = 0; ch < nr_core_coder_channels; ch++)
652      pstr_core_coder->core_mode[ch] = 0;
653  }
654
655  if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
656      pstr_core_coder->core_mode[1] == 0) {
657    pstr_core_coder->tns_active = ixheaacd_read_bits_buf(it_bit_buff, 1);
658    pstr_core_coder->common_window = ixheaacd_read_bits_buf(it_bit_buff, 1);
659
660    if (pstr_core_coder->common_window) {
661      left = *chan_offset;
662      right = *chan_offset + 1;
663
664      err_code =
665          ixheaacd_ics_info(usac_data, left, &pstr_core_coder->max_sfb[left],
666                            it_bit_buff, usac_data->window_sequence_last[left]);
667
668      if (err_code == -1) return err_code;
669
670      pstr_core_coder->common_max_sfb = ixheaacd_read_bits_buf(it_bit_buff, 1);
671
672      if (pstr_core_coder->common_max_sfb == 0) {
673        if (usac_data->window_sequence[left] == EIGHT_SHORT_SEQUENCE)
674          pstr_core_coder->max_sfb[right] =
675              ixheaacd_read_bits_buf(it_bit_buff, 4);
676        else
677          pstr_core_coder->max_sfb[right] =
678              ixheaacd_read_bits_buf(it_bit_buff, 6);
679      } else {
680        pstr_core_coder->max_sfb[right] = pstr_core_coder->max_sfb[left];
681      }
682
683      pstr_core_coder->max_sfb_ste =
684          max(pstr_core_coder->max_sfb[left], pstr_core_coder->max_sfb[right]);
685
686      usac_data->window_sequence[right] = usac_data->window_sequence[left];
687      usac_data->window_shape[right] = usac_data->window_shape[left];
688      memcpy(&usac_data->group_dis[right][0], &usac_data->group_dis[left][0],
689             8);
690      usac_data->pstr_sfb_info[right] = usac_data->pstr_sfb_info[left];
691      if (pstr_core_coder->max_sfb[right] >
692          usac_data->pstr_sfb_info[right]->sfb_per_sbk)
693        pstr_core_coder->max_sfb[right] =
694            usac_data->pstr_sfb_info[right]->sfb_per_sbk;
695
696      pstr_core_coder->ms_mask_present[0] =
697          ixheaacd_read_ms_mask(usac_data, pstr_core_coder, it_bit_buff, left);
698    } else {
699      left = *chan_offset;
700      right = *chan_offset + 1;
701
702      pstr_core_coder->ms_mask_present[0] = 0;
703      pstr_core_coder->ms_mask_present[1] = 0;
704
705      for (k = 0; k < SFB_NUM_MAX; k++) {
706        usac_data->alpha_q_re_prev[k] = 0;
707        usac_data->alpha_q_im_prev[k] = 0;
708      }
709    }
710
711    if (usac_data->tw_mdct[elem_idx] == 1) {
712      pstr_core_coder->common_tw = ixheaacd_read_bits_buf(it_bit_buff, 1);
713
714      if (pstr_core_coder->common_tw == 1) {
715        usac_data->tw_data_present[left] =
716            ixheaacd_read_bits_buf(it_bit_buff, 1);
717        usac_data->tw_data_present[right] = usac_data->tw_data_present[left];
718        if (usac_data->tw_data_present[left]) {
719          for (k = 0; k < NUM_TW_NODES; k++) {
720            usac_data->tw_ratio[left][k] =
721                ixheaacd_read_bits_buf(it_bit_buff, 3);
722            usac_data->tw_ratio[right][k] = usac_data->tw_ratio[left][k];
723          }
724        }
725      }
726    }
727
728    if (pstr_core_coder->tns_active) {
729      if (pstr_core_coder->common_window) {
730        pstr_core_coder->common_tns = ixheaacd_read_bits_buf(it_bit_buff, 1);
731
732      } else {
733        pstr_core_coder->common_tns = 0;
734      }
735
736      pstr_core_coder->tns_on_lr = ixheaacd_read_bits_buf(it_bit_buff, 1);
737
738      if (pstr_core_coder->common_tns) {
739        ixheaacd_read_tns_u(usac_data->pstr_sfb_info[0],
740                            &usac_data->pstr_tns[left][0], it_bit_buff);
741        memcpy(&usac_data->pstr_tns[right][0], &usac_data->pstr_tns[left][0],
742               sizeof(ia_tns_frame_info_struct));
743
744        pstr_core_coder->tns_data_present[0] = 2;
745        pstr_core_coder->tns_data_present[1] = 2;
746      } else {
747        pstr_core_coder->tns_present_both =
748            ixheaacd_read_bits_buf(it_bit_buff, 1);
749
750        if (pstr_core_coder->tns_present_both) {
751          pstr_core_coder->tns_data_present[0] = 1;
752          pstr_core_coder->tns_data_present[1] = 1;
753        } else {
754          pstr_core_coder->tns_data_present[1] =
755              ixheaacd_read_bits_buf(it_bit_buff, 1);
756          pstr_core_coder->tns_data_present[0] =
757              1 - pstr_core_coder->tns_data_present[1];
758        }
759      }
760    } else {
761      pstr_core_coder->common_tns = 0;
762      pstr_core_coder->tns_data_present[0] = 0;
763      pstr_core_coder->tns_data_present[1] = 0;
764    }
765
766  } else {
767    pstr_core_coder->common_window = 0;
768    pstr_core_coder->common_tw = 0;
769    left = *chan_offset;
770    right = *chan_offset;
771    if (nr_core_coder_channels == 2) right = *chan_offset + 1;
772  }
773
774  for (ch = 0, chn = *chan_offset; ch < nr_core_coder_channels; ch++, chn++) {
775    if (pstr_core_coder->core_mode[ch] == 1) {
776      err_code =
777          ixheaacd_tw_buff_update(usac_data, chn, usac_data->str_tddec[chn]);
778      if (err_code == -1) return err_code;
779
780      if (!usac_data->td_frame_prev[chn]) {
781        ixheaacd_fix2flt_data(usac_data, usac_data->str_tddec[chn], chn);
782      }
783
784      for (k = 0; k < usac_data->ccfl; k++) {
785        usac_data->time_sample_vector[chn][k] =
786            (FLOAT32)((FLOAT32)usac_data->output_data_ptr[chn][k] *
787                      (FLOAT32)(ONE_BY_TWO_POW_15));
788      }
789      usac_data->present_chan = chn;
790      err_code =
791          ixheaacd_lpd_channel_stream(usac_data, &td_frame, it_bit_buff,
792                                      usac_data->time_sample_vector[chn]);
793      if (err_code == -1) return err_code;
794
795      for (k = 0; k < usac_data->ccfl; k++) {
796        usac_data->output_data_ptr[chn][k] = (WORD32)(
797            usac_data->time_sample_vector[chn][k] * (FLOAT32)((WORD64)1 << 15));
798      }
799
800      usac_data->window_shape[chn] = WIN_SEL_0;
801
802      ixheaacd_td_frm_dec(usac_data, chn, td_frame.mod[0]);
803
804      for (k = 0; k < usac_data->ccfl; k++) {
805        usac_data->time_sample_vector[chn][k] =
806            (FLOAT32)((FLOAT32)usac_data->output_data_ptr[chn][k] *
807                      (FLOAT32)(ONE_BY_TWO_POW_15));
808      }
809
810      usac_data->window_shape_prev[chn] = usac_data->window_shape[chn];
811      usac_data->window_sequence_last[chn] = EIGHT_SHORT_SEQUENCE;
812
813    } else {
814      memset(usac_data->coef_fix[chn], 0,
815             LN2 * sizeof(*usac_data->coef_fix[0]));
816
817      if (usac_data->str_tddec[chn] && usac_data->td_frame_prev[chn]) {
818        ixheaacd_lpd_dec_update(usac_data->str_tddec[chn], usac_data, chn);
819      }
820
821      if (id != ID_USAC_LFE) {
822        if ((nr_core_coder_channels == 1) ||
823            (pstr_core_coder->core_mode[0] != pstr_core_coder->core_mode[1]))
824          pstr_core_coder->tns_data_present[ch] =
825              ixheaacd_read_bits_buf(it_bit_buff, 1);
826      }
827
828      err_code = ixheaacd_fd_channel_stream(
829          usac_data, pstr_core_coder, &pstr_core_coder->max_sfb[ch],
830          usac_data->window_sequence_last[chn], chn,
831          usac_data->noise_filling_config[elem_idx], ch, it_bit_buff);
832      if (err_code == -1) return err_code;
833    }
834  }
835
836  if (pstr_core_coder->core_mode[0] == CORE_MODE_FD &&
837      pstr_core_coder->core_mode[1] == CORE_MODE_FD &&
838      nr_core_coder_channels == 2) {
839    ixheaacd_cplx_prev_mdct_dmx(
840        usac_data->pstr_sfb_info[left], usac_data->coef_save[left],
841        usac_data->coef_save[right], usac_data->dmx_re_prev,
842        pstr_core_coder->pred_dir);
843  }
844
845  if (pstr_core_coder->tns_on_lr == 0 && (id != ID_USAC_LFE)) {
846    for (ch = 0, chn = left; chn <= right; ch++, chn++) {
847      if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
848        ixheaacd_tns_apply(
849            usac_data, usac_data->coef_fix[chn], pstr_core_coder->max_sfb[ch],
850            usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
851      }
852    }
853  }
854
855  if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 &&
856      pstr_core_coder->core_mode[1] == 0) {
857    if (pstr_core_coder->ms_mask_present[0] == 3) {
858      err_code = ixheaacd_cplx_pred_upmixing(
859          usac_data, usac_data->coef_fix[left], usac_data->coef_fix[right],
860          pstr_core_coder, left);
861      if (err_code == -1) return err_code;
862
863    } else if (pstr_core_coder->ms_mask_present[0] > 0) {
864      ixheaacd_ms_stereo(
865          usac_data, usac_data->coef_fix[right], usac_data->coef_fix[left],
866          left, pstr_core_coder->max_sfb[right] > pstr_core_coder->max_sfb[left]
867                    ? pstr_core_coder->max_sfb[right]
868                    : pstr_core_coder->max_sfb[left]);
869    }
870
871    if (pstr_core_coder->tns_on_lr) {
872      for (ch = 0, chn = left; chn <= right; ch++, chn++) {
873        if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
874          ixheaacd_tns_apply(
875              usac_data, usac_data->coef_fix[chn], pstr_core_coder->max_sfb[ch],
876              usac_data->pstr_sfb_info[chn], usac_data->pstr_tns[chn]);
877        }
878      }
879    }
880
881    ixheaacd_usac_cplx_save_prev(
882        usac_data->pstr_sfb_info[left], usac_data->coef_fix[left],
883        usac_data->coef_fix[right], usac_data->coef_save[left],
884        usac_data->coef_save[right]);
885  }
886
887  for (ch = left; ch <= right; ch++) {
888    if (pstr_core_coder->core_mode[ch] == CORE_MODE_FD) {
889      if (usac_data->tw_mdct[elem_idx]) {
890        err_code = -1;
891        return err_code;
892
893      } else {
894        err_code = ixheaacd_fd_frm_dec(usac_data, ch);
895        if (err_code == -1) return err_code;
896
897        for (k = 0; k < usac_data->ccfl; k++) {
898          usac_data->time_sample_vector[ch][k] =
899              (FLOAT32)((FLOAT32)usac_data->output_data_ptr[ch][k] *
900                        (FLOAT32)(ONE_BY_TWO_POW_15));
901        }
902      }
903
904      usac_data->window_shape_prev[ch] = usac_data->window_shape[ch];
905      usac_data->window_sequence_last[ch] = usac_data->window_sequence[ch];
906    }
907  }
908
909  for (ch = 0, chn = left; chn <= right; chn++, ch++)
910    usac_data->td_frame_prev[chn] = pstr_core_coder->core_mode[ch];
911
912  return 0;
913}
914