Coverage Report

Created: 2025-09-17 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_ps_dec_flt.c
Line
Count
Source
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 <math.h>
22
#include "ixheaacd_sbr_common.h"
23
#include "ixheaac_type_def.h"
24
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops16.h"
28
#include "ixheaac_basic_ops40.h"
29
#include "ixheaac_basic_ops_arr.h"
30
#include "ixheaac_basic_ops.h"
31
32
#include "ixheaacd_defines.h"
33
#include "ixheaac_basic_op.h"
34
#include "ixheaacd_intrinsics.h"
35
#include "ixheaacd_common_rom.h"
36
#include "ixheaacd_basic_funcs.h"
37
#include "ixheaacd_bitbuffer.h"
38
#include "ixheaacd_sbrdecsettings.h"
39
#include "ixheaacd_defines.h"
40
41
#include "ixheaacd_pns.h"
42
43
#include "ixheaacd_aac_rom.h"
44
#include "ixheaacd_pulsedata.h"
45
46
#include "ixheaacd_drc_data_struct.h"
47
#include "ixheaacd_lt_predict.h"
48
#include "ixheaacd_cnst.h"
49
#include "ixheaacd_ec_defines.h"
50
#include "ixheaacd_ec_struct_def.h"
51
#include "ixheaacd_channelinfo.h"
52
#include "ixheaacd_drc_dec.h"
53
54
#include "ixheaacd_sbrdecoder.h"
55
#include "ixheaacd_sbr_scale.h"
56
#include "ixheaacd_lpp_tran.h"
57
#include "ixheaacd_env_extr_part.h"
58
#include "ixheaacd_sbr_rom.h"
59
60
#include "ixheaacd_hybrid.h"
61
#include "ixheaacd_ps_dec.h"
62
63
#include "ixheaacd_env_extr.h"
64
65
#include "ixheaacd_ps_dec.h"
66
67
#include "ixheaacd_qmf_dec.h"
68
#include "ixheaacd_env_calc.h"
69
#include "ixheaac_sbr_const.h"
70
71
#include "ixheaacd_pvc_dec.h"
72
#include "ixheaacd_sbr_dec.h"
73
#include "ixheaacd_function_selector.h"
74
75
VOID ixheaacd_k_chan_filt(const FLOAT32 *ptr_qmf_re, const FLOAT32 *ptr_qmf_im,
76
                          FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_QMF_CHANNELS],
77
                          FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_QMF_CHANNELS], WORD32 nSamples,
78
                          WORD32 k, WORD32 bCplx, const FLOAT32 *p,
79
56.4k
                          FLOAT32 *cos_sin_mod_tbl) {
80
56.4k
  WORD32 i, n, q;
81
56.4k
  FLOAT32 real, imag;
82
56.4k
  FLOAT32 cos_val, sin_val;
83
56.4k
  FLOAT32 *p_real_imag = cos_sin_mod_tbl;
84
85
56.4k
  if (bCplx) {
86
621k
    for (i = 0; i < nSamples; i++) {
87
5.42M
      for (q = 0; q < k; q++) {
88
4.81M
        real = 0;
89
4.81M
        imag = 0;
90
67.4M
        for (n = 0; n < 13; n++) {
91
62.6M
          cos_val = *p_real_imag++;
92
62.6M
          sin_val = *p_real_imag++;
93
62.6M
          real += p[n] * (ptr_qmf_re[n + i] * cos_val - ptr_qmf_im[n + i] * sin_val);
94
62.6M
          imag += p[n] * (ptr_qmf_im[n + i] * cos_val + ptr_qmf_re[n + i] * sin_val);
95
62.6M
        }
96
4.81M
        ptr_tmp_hyb_re[i][q] = real;
97
4.81M
        ptr_tmp_hyb_im[i][q] = imag;
98
4.81M
      }
99
602k
      p_real_imag -= (13 * k * 2);
100
602k
    }
101
37.6k
  } else {
102
1.24M
    for (i = 0; i < nSamples; i++) {
103
3.61M
      for (q = 0; q < k; q++) {
104
2.40M
        real = 0;
105
2.40M
        imag = 0;
106
33.7M
        for (n = 0; n < 13; n++) {
107
31.3M
          cos_val = *p_real_imag++;
108
31.3M
          real += p[n] * (ptr_qmf_re[n + i] * cos_val);
109
31.3M
          imag += p[n] * (ptr_qmf_im[n + i] * cos_val);
110
31.3M
        }
111
2.40M
        ptr_tmp_hyb_re[i][q] = real;
112
2.40M
        ptr_tmp_hyb_im[i][q] = imag;
113
2.40M
      }
114
1.20M
      p_real_imag -= (13 * k);
115
1.20M
    }
116
37.6k
  }
117
56.4k
}
118
119
VOID ixheaacd_hyb_anal(const FLOAT32 **ptr_qmf_re, const FLOAT32 **ptr_qmf_im,
120
                       ia_ps_dec_struct *ptr_ps_dec, ia_ps_tables_struct *ptr_ps_tables,
121
37.6k
                       WORD32 use_34_st_bands) {
122
37.6k
  WORD32 k, n, band;
123
37.6k
  WORD32 band_res;
124
37.6k
  WORD32 frame_size;
125
37.6k
  WORD32 ch_offset = 0;
126
37.6k
  FLOAT32(*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS];
127
37.6k
  FLOAT32(*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS];
128
37.6k
  ia_hybrid_flt_struct *ptr_hybrid;
129
37.6k
  if (!use_34_st_bands) {
130
18.8k
    ptr_tmp_hyb_re = ptr_ps_dec->hyb_left_re;
131
18.8k
    ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im;
132
18.8k
    ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20;
133
18.8k
  } else {
134
18.8k
    ptr_tmp_hyb_re = NULL;
135
18.8k
    ptr_tmp_hyb_im = ptr_ps_dec->hyb_left_im;
136
18.8k
    ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34;
137
18.8k
  }
138
37.6k
  frame_size = ptr_hybrid->frame_size;
139
188k
  for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) {
140
150k
    band_res = ptr_hybrid->ptr_resol[band];
141
142
150k
    memcpy(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_qmf_buf_re[band],
143
150k
           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_re[0]));
144
150k
    memcpy(ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_qmf_buf_im[band],
145
150k
           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_work_im[0]));
146
147
4.97M
    for (n = 0; n < frame_size; n++) {
148
4.81M
      ptr_hybrid->ptr_work_re[(HYBRID_FILTER_LENGTH - 1) + n] =
149
4.81M
          ptr_qmf_re[n + HYBRID_FILTER_DELAY][band];
150
4.81M
      ptr_hybrid->ptr_work_im[(HYBRID_FILTER_LENGTH - 1) + n] =
151
4.81M
          ptr_qmf_im[n + HYBRID_FILTER_DELAY][band];
152
4.81M
    }
153
154
150k
    memcpy(ptr_hybrid->ptr_qmf_buf_re[band], ptr_hybrid->ptr_work_re + frame_size,
155
150k
           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_re[band][0]));
156
150k
    memcpy(ptr_hybrid->ptr_qmf_buf_im[band], ptr_hybrid->ptr_work_im + frame_size,
157
150k
           (HYBRID_FILTER_LENGTH - 1) * sizeof(ptr_hybrid->ptr_qmf_buf_im[band][0]));
158
159
150k
    if (ptr_tmp_hyb_re) {
160
56.4k
      switch (band_res) {
161
37.6k
        case NO_HYBRID_CHANNELS_2:
162
37.6k
          ixheaacd_k_chan_filt(
163
37.6k
              ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
164
37.6k
              ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_2, REAL,
165
37.6k
              ptr_ps_tables->p2_13_20,
166
37.6k
              &ptr_ps_tables->cos_mod_2channel[0][0]);
167
37.6k
          break;
168
0
        case NO_HYBRID_CHANNELS_4:
169
0
          ixheaacd_k_chan_filt(
170
0
              ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
171
0
              ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_4, CPLX,
172
0
              ptr_ps_tables->p4_13_34,
173
0
              &ptr_ps_tables->cos_sin_mod_4channel[0][0]);
174
0
          break;
175
18.8k
        case NO_HYBRID_CHANNELS_8:
176
18.8k
          ixheaacd_k_chan_filt(
177
18.8k
              ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im, ptr_hybrid->ptr_temp_re,
178
18.8k
              ptr_hybrid->ptr_temp_im, frame_size, NO_HYBRID_CHANNELS_8, CPLX,
179
18.8k
              use_34_st_bands ? ptr_ps_tables->p8_13_34 : ptr_ps_tables->p8_13_20,
180
18.8k
              &ptr_ps_tables->cos_sin_mod_8channel[0][0]);
181
18.8k
          break;
182
0
        case NO_HYBRID_CHANNELS_12:
183
0
          ixheaacd_k_chan_filt(ptr_hybrid->ptr_work_re, ptr_hybrid->ptr_work_im,
184
0
                               ptr_hybrid->ptr_temp_re, ptr_hybrid->ptr_temp_im, frame_size,
185
0
                               NO_HYBRID_CHANNELS_12, CPLX, ptr_ps_tables->p12_13_34,
186
0
                               &ptr_ps_tables->cos_sin_mod_12channel[0][0]);
187
0
          break;
188
0
        default:
189
0
          break;
190
56.4k
      }
191
192
1.86M
      for (n = 0; n < frame_size; n++) {
193
9.03M
        for (k = 0; k < (WORD32)band_res; k++) {
194
7.22M
          ptr_tmp_hyb_re[n][ch_offset + k] = ptr_hybrid->ptr_temp_re[n][k];
195
7.22M
          ptr_tmp_hyb_im[n][ch_offset + k] = ptr_hybrid->ptr_temp_im[n][k];
196
7.22M
        }
197
1.80M
      }
198
56.4k
      ch_offset += band_res;
199
56.4k
    }
200
150k
  }
201
37.6k
}
202
203
VOID ixheaacd_hyb_synth(
204
    FLOAT32 (*ptr_tmp_hyb_re)[MAX_NUM_COLUMNS],
205
    FLOAT32 (*ptr_tmp_hyb_im)[MAX_NUM_COLUMNS],
206
    FLOAT32 **ptr_qmf_re,
207
    FLOAT32 **ptr_qmf_im,
208
37.6k
    ia_hybrid_flt_struct *ptr_hybrid) {
209
37.6k
  WORD32 k, n, band;
210
37.6k
  WORD16 band_res;
211
37.6k
  WORD32 frame_size = ptr_hybrid->frame_size;
212
37.6k
  WORD32 ch_offset = 0;
213
214
150k
  for (band = 0; band < ptr_hybrid->num_qmf_bands; band++) {
215
112k
    band_res = ptr_hybrid->ptr_resol[band];
216
217
3.72M
    for (n = 0; n < frame_size; n++) {
218
3.61M
      ptr_qmf_re[n][band] = ptr_qmf_im[n][band] = 0;
219
220
18.0M
      for (k = 0; k < (WORD32)band_res; k++) {
221
14.4M
        ptr_qmf_re[n][band] += ptr_tmp_hyb_re[n][ch_offset + k];
222
14.4M
        ptr_qmf_im[n][band] += ptr_tmp_hyb_im[n][ch_offset + k];
223
14.4M
      }
224
3.61M
    }
225
112k
    ch_offset += band_res;
226
112k
  }
227
37.6k
}
228
229
0
VOID ixheaacd_map_34_float_to_20(FLOAT32 *ptr_index) {
230
0
  ptr_index[0] = (2 * ptr_index[0] + ptr_index[1]) / 3.0f;
231
0
  ptr_index[1] = (ptr_index[1] + 2 * ptr_index[2]) / 3.0f;
232
0
  ptr_index[2] = (2 * ptr_index[3] + ptr_index[4]) / 3.0f;
233
0
  ptr_index[3] = (ptr_index[4] + 2 * ptr_index[5]) / 3.0f;
234
0
  ptr_index[4] = (ptr_index[6] + ptr_index[7]) / 2.0f;
235
0
  ptr_index[5] = (ptr_index[8] + ptr_index[9]) / 2.0f;
236
0
  ptr_index[6] = ptr_index[10];
237
0
  ptr_index[7] = ptr_index[11];
238
0
  ptr_index[8] = (ptr_index[12] + ptr_index[13]) / 2.0f;
239
0
  ptr_index[9] = (ptr_index[14] + ptr_index[15]) / 2.0f;
240
0
  ptr_index[10] = ptr_index[16];
241
0
  ptr_index[11] = ptr_index[17];
242
0
  ptr_index[12] = ptr_index[18];
243
0
  ptr_index[13] = ptr_index[19];
244
0
  ptr_index[14] = (ptr_index[20] + ptr_index[21]) / 2.0f;
245
0
  ptr_index[15] = (ptr_index[22] + ptr_index[23]) / 2.0f;
246
0
  ptr_index[16] = (ptr_index[24] + ptr_index[25]) / 2.0f;
247
0
  ptr_index[17] = (ptr_index[26] + ptr_index[27]) / 2.0f;
248
0
  ptr_index[18] = (ptr_index[28] + ptr_index[29] + ptr_index[30] + ptr_index[31]) / 4.0f;
249
0
  ptr_index[19] = (ptr_index[32] + ptr_index[33]) / 2.0f;
250
0
}
251
252
0
VOID ixheaacd_map_20_float_to_34(FLOAT32 *ptr_index) {
253
0
  FLOAT32 arr_temp[NUM_HI_RES_BINS];
254
0
  WORD32 i;
255
256
0
  arr_temp[0] = ptr_index[0];
257
0
  arr_temp[1] = (ptr_index[0] + ptr_index[1]) / 2.0f;
258
0
  arr_temp[2] = ptr_index[1];
259
0
  arr_temp[3] = ptr_index[2];
260
0
  arr_temp[4] = (ptr_index[2] + ptr_index[3]) / 2.0f;
261
0
  arr_temp[5] = ptr_index[3];
262
0
  arr_temp[6] = ptr_index[4];
263
0
  arr_temp[7] = ptr_index[4];
264
0
  arr_temp[8] = ptr_index[5];
265
0
  arr_temp[9] = ptr_index[5];
266
0
  arr_temp[10] = ptr_index[6];
267
0
  arr_temp[11] = ptr_index[7];
268
0
  arr_temp[12] = ptr_index[8];
269
0
  arr_temp[13] = ptr_index[8];
270
0
  arr_temp[14] = ptr_index[9];
271
0
  arr_temp[15] = ptr_index[9];
272
0
  arr_temp[16] = ptr_index[10];
273
0
  arr_temp[17] = ptr_index[11];
274
0
  arr_temp[18] = ptr_index[12];
275
0
  arr_temp[19] = ptr_index[13];
276
0
  arr_temp[20] = ptr_index[14];
277
0
  arr_temp[21] = ptr_index[14];
278
0
  arr_temp[22] = ptr_index[15];
279
0
  arr_temp[23] = ptr_index[15];
280
0
  arr_temp[24] = ptr_index[16];
281
0
  arr_temp[25] = ptr_index[16];
282
0
  arr_temp[26] = ptr_index[17];
283
0
  arr_temp[27] = ptr_index[17];
284
0
  arr_temp[28] = ptr_index[18];
285
0
  arr_temp[29] = ptr_index[18];
286
0
  arr_temp[30] = ptr_index[18];
287
0
  arr_temp[31] = ptr_index[18];
288
0
  arr_temp[32] = ptr_index[19];
289
0
  arr_temp[33] = ptr_index[19];
290
291
0
  for (i = 0; i < 34; i++) {
292
0
    ptr_index[i] = arr_temp[i];
293
0
  }
294
0
}
295
296
WORD32 ixheaacd_create_ps_esbr_dec(ia_ps_dec_struct *ptr_ps_dec_struct,
297
                                   ia_ps_tables_struct *ptr_ps_tables, UWORD32 noQmfChans,
298
17.3k
                                   UWORD32 num_sub_samples, WORD32 ps_mode) {
299
17.3k
  UWORD32 i;
300
17.3k
  ia_ps_dec_struct *ptr_ps_dec = ptr_ps_dec_struct;
301
302
17.3k
  ptr_ps_dec = ptr_ps_dec_struct;
303
304
17.3k
  ptr_ps_dec->num_sub_samples = num_sub_samples;
305
17.3k
  ptr_ps_dec->num_chans = noQmfChans;
306
17.3k
  ptr_ps_dec->ps_mode = ps_mode;
307
308
17.3k
  ptr_ps_dec->ps_data_present = 0;
309
17.3k
  ptr_ps_dec->enable_iid = 0;
310
17.3k
  ptr_ps_dec->iid_mode = 0;
311
17.3k
  ptr_ps_dec->enable_icc = 0;
312
17.3k
  ptr_ps_dec->icc_mode = 0;
313
17.3k
  ptr_ps_dec->enable_ext = 0;
314
315
17.3k
  ptr_ps_dec->use_pca_rot_flg = 0;
316
17.3k
  ptr_ps_dec->freq_res_ipd = 0;
317
17.3k
  ptr_ps_dec->use_34_st_bands = 0;
318
17.3k
  ptr_ps_dec->use_34_st_bands_prev = 0;
319
320
17.3k
  ptr_ps_dec->str_flt_hybrid20.frame_size = ptr_ps_dec->num_sub_samples;
321
17.3k
  ptr_ps_dec->str_flt_hybrid20.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID20;
322
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb20[0];
323
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_work_re = &ptr_ps_dec->hyb_work_re_20[0];
324
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_work_im = &ptr_ps_dec->hyb_work_im_20[0];
325
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_20;
326
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_20;
327
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_temp_re = ptr_ps_dec->hyb_temp_re_20;
328
17.3k
  ptr_ps_dec->str_flt_hybrid20.ptr_temp_im = ptr_ps_dec->hyb_temp_im_20;
329
330
17.3k
  ptr_ps_dec->str_flt_hybrid34.frame_size = ptr_ps_dec->num_sub_samples;
331
17.3k
  ptr_ps_dec->str_flt_hybrid34.num_qmf_bands = NUM_QMF_BANDS_IN_HYBRID34;
332
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_resol = (WORD16 *)&ptr_ps_tables->band_res_hyb34[0];
333
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_work_re = &ptr_ps_dec->hyb_work_re_34[0];
334
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_work_im = &ptr_ps_dec->hyb_work_im_34[0];
335
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_re = ptr_ps_dec->hyb_qmf_buf_re_34;
336
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_qmf_buf_im = ptr_ps_dec->hyb_qmf_buf_im_34;
337
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_temp_re = ptr_ps_dec->hyb_temp_re_34;
338
17.3k
  ptr_ps_dec->str_flt_hybrid34.ptr_temp_im = ptr_ps_dec->hyb_temp_im_34;
339
340
17.3k
  ptr_ps_dec->delay_buf_idx = 0;
341
342
1.12M
  for (i = 0; i < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; i++) {
343
1.11M
    ptr_ps_dec->delay_qmf_delay_buf_idx[i] = 0;
344
1.11M
    ptr_ps_dec->delay_qmf_delay_num_samp[i] = ptr_ps_tables->qmf_delay_idx_tbl[i];
345
1.11M
  }
346
347
608k
  for (i = 0; i < NUM_HI_RES_BINS; i++) {
348
590k
    ptr_ps_dec->h11_re_prev[i] = 1.0f;
349
590k
    ptr_ps_dec->h12_re_prev[i] = 1.0f;
350
590k
  }
351
352
17.3k
  memset(ptr_ps_dec->h11_im_prev, 0, sizeof(ptr_ps_dec->h11_im_prev));
353
17.3k
  memset(ptr_ps_dec->h12_im_prev, 0, sizeof(ptr_ps_dec->h12_im_prev));
354
17.3k
  memset(ptr_ps_dec->h21_re_prev, 0, sizeof(ptr_ps_dec->h21_re_prev));
355
17.3k
  memset(ptr_ps_dec->h22_re_prev, 0, sizeof(ptr_ps_dec->h22_re_prev));
356
17.3k
  memset(ptr_ps_dec->h21_im_prev, 0, sizeof(ptr_ps_dec->h21_im_prev));
357
17.3k
  memset(ptr_ps_dec->h22_im_prev, 0, sizeof(ptr_ps_dec->h22_im_prev));
358
359
17.3k
  memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
360
17.3k
  memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
361
17.3k
  memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
362
17.3k
  memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
363
364
608k
  for (i = 0; i < NUM_HI_RES_BINS; i++) {
365
590k
    ptr_ps_dec->peak_decay_fast_bin[i] = 0.0f;
366
590k
    ptr_ps_dec->prev_nrg_bin[i] = 0.0f;
367
590k
    ptr_ps_dec->prev_peak_diff_bin[i] = 0.0f;
368
590k
  }
369
370
17.3k
  memset(ptr_ps_dec->qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->qmf_delay_buf_re));
371
17.3k
  memset(ptr_ps_dec->qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->qmf_delay_buf_im));
372
17.3k
  memset(ptr_ps_dec->sub_qmf_delay_buf_re, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_re));
373
17.3k
  memset(ptr_ps_dec->sub_qmf_delay_buf_im, 0, sizeof(ptr_ps_dec->sub_qmf_delay_buf_im));
374
375
69.5k
  for (i = 0; i < NUM_SER_AP_LINKS; i++) {
376
52.1k
    memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
377
52.1k
           sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
378
52.1k
    memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
379
52.1k
           sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
380
52.1k
    memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
381
52.1k
           sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
382
52.1k
    memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
383
52.1k
           sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
384
52.1k
  }
385
386
17.3k
  return 0;
387
17.3k
}
388
389
VOID ixheaacd_esbr_apply_ps(ia_ps_dec_struct *ptr_ps_dec,
390
                            FLOAT32 **pp_qmf_buf_re_left,
391
                            FLOAT32 **pp_qmf_buf_im_left,
392
                            FLOAT32 **pp_qmf_buf_re_right,
393
                            FLOAT32 **pp_qmf_buf_im_right,
394
                            WORD32 usb, ia_ps_tables_struct *ptr_ps_tables,
395
18.8k
                            WORD32 num_time_slot) {
396
18.8k
  WORD32 sb;
397
18.8k
  WORD32 i, k;
398
399
18.8k
  WORD32 max_num_column;
400
401
18.8k
  if (num_time_slot == 15)
402
0
    max_num_column = MAX_NUM_COLUMNS_960;
403
18.8k
  else
404
18.8k
    max_num_column = MAX_NUM_COLUMNS;
405
406
18.8k
  if (ptr_ps_dec->use_34_st_bands) {
407
0
    ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_34_tbl[0];
408
0
    ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_34[0];
409
0
    ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid34;
410
0
    ptr_ps_dec->num_groups = NUM_IID_GROUPS_HI_RES;
411
0
    ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS_HI_RES;
412
0
    ptr_ps_dec->num_bins = NUM_HI_RES_BINS;
413
0
    ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS_HI_RES;
414
18.8k
  } else {
415
18.8k
    ptr_ps_dec->ptr_group_borders = (WORD32 *)&ptr_ps_tables->group_borders_20_tbl[0];
416
18.8k
    ptr_ps_dec->ptr_bins_group_map = (WORD32 *)&ptr_ps_tables->bin_group_map_20[0];
417
18.8k
    ptr_ps_dec->ptr_hybrid = &ptr_ps_dec->str_flt_hybrid20;
418
18.8k
    ptr_ps_dec->num_groups = NUM_IID_GROUPS;
419
18.8k
    ptr_ps_dec->num_sub_qmf_groups = SUBQMF_GROUPS;
420
18.8k
    ptr_ps_dec->num_bins = NUM_MID_RES_BINS;
421
18.8k
    ptr_ps_dec->first_delay_gr = SUBQMF_GROUPS;
422
18.8k
  }
423
424
771k
  for (sb = usb; sb < ptr_ps_dec->num_chans; sb++) {
425
3.01M
    for (i = 0; i < NUM_SER_AP_LINKS; i++) {
426
11.2M
      for (k = 0; k < ptr_ps_dec->delay_sample_ser[i]; k++) {
427
9.03M
        ptr_ps_dec->ser_qmf_delay_buf_re[i][k][sb] = 0;
428
9.03M
        ptr_ps_dec->ser_qmf_delay_buf_im[i][k][sb] = 0;
429
9.03M
      }
430
2.25M
    }
431
11.2M
    for (k = 0; k < HIGH_DEL; k++) {
432
10.5M
      ptr_ps_dec->qmf_delay_buf_re[k][sb] = 0;
433
10.5M
      ptr_ps_dec->qmf_delay_buf_im[k][sb] = 0;
434
10.5M
    }
435
753k
  }
436
18.8k
  ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left,
437
18.8k
                    (const FLOAT32 **)pp_qmf_buf_im_left,
438
18.8k
                    ptr_ps_dec, ptr_ps_tables, 0);
439
18.8k
  ixheaacd_hyb_anal((const FLOAT32 **)pp_qmf_buf_re_left,
440
18.8k
                    (const FLOAT32 **)pp_qmf_buf_im_left,
441
18.8k
                    ptr_ps_dec, ptr_ps_tables, 1);
442
443
18.8k
  if (!ptr_ps_dec->use_34_st_bands) {
444
18.8k
    WORD32 k;
445
621k
    for (k = 0; k < (WORD32)ptr_ps_dec->num_sub_samples; k++) {
446
602k
      ptr_ps_dec->hyb_left_re[k][3] += ptr_ps_dec->hyb_left_re[k][4];
447
602k
      ptr_ps_dec->hyb_left_im[k][3] += ptr_ps_dec->hyb_left_im[k][4];
448
602k
      ptr_ps_dec->hyb_left_re[k][4] = 0.;
449
602k
      ptr_ps_dec->hyb_left_im[k][4] = 0.;
450
451
602k
      ptr_ps_dec->hyb_left_re[k][2] += ptr_ps_dec->hyb_left_re[k][5];
452
602k
      ptr_ps_dec->hyb_left_im[k][2] += ptr_ps_dec->hyb_left_im[k][5];
453
602k
      ptr_ps_dec->hyb_left_re[k][5] = 0.;
454
602k
      ptr_ps_dec->hyb_left_im[k][5] = 0.;
455
602k
    }
456
18.8k
  }
457
458
18.8k
  if (ptr_ps_dec->ps_mode & 0x0080) {
459
0
    WORD32 i, j;
460
0
    for (i = 0; i < max_num_column; i++) {
461
0
      for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) {
462
0
        pp_qmf_buf_im_right[i][j] = pp_qmf_buf_im_left[i][j];
463
0
        pp_qmf_buf_re_right[i][j] = pp_qmf_buf_re_left[i][j];
464
0
      }
465
0
    }
466
0
    for (i = 0; i < max_num_column; i++) {
467
0
      for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) {
468
0
        ptr_ps_dec->hyb_right_re[i][j] = ptr_ps_dec->hyb_left_re[i][j];
469
0
        ptr_ps_dec->hyb_right_im[i][j] = ptr_ps_dec->hyb_left_im[i][j];
470
0
      }
471
0
    }
472
18.8k
  } else {
473
18.8k
    if (ptr_ps_dec->ps_mode & 0x0002) {
474
0
      WORD32 i, j;
475
0
      for (i = 0; i < max_num_column; i++) {
476
0
        for (j = 0; j < NUM_OF_QUAD_MIRROR_FILTER_CHNLS; j++) {
477
0
          pp_qmf_buf_im_right[i][j] = 0.;
478
0
          pp_qmf_buf_re_right[i][j] = 0.;
479
0
        }
480
0
      }
481
0
      for (i = 0; i < max_num_column; i++) {
482
0
        for (j = 0; j < NUM_SUB_QMF_CHANNELS_HI_RES; j++) {
483
0
          ptr_ps_dec->hyb_right_re[i][j] = 0.;
484
0
          ptr_ps_dec->hyb_right_im[i][j] = 0.;
485
0
        }
486
0
      }
487
18.8k
    } else {
488
18.8k
      ixheaacd_esbr_ps_de_correlate(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left,
489
18.8k
                                    pp_qmf_buf_re_right, pp_qmf_buf_im_right,
490
18.8k
                                    ptr_ps_tables);
491
18.8k
    }
492
493
18.8k
    if (!(ptr_ps_dec->ps_mode & 0x0040)) {
494
18.8k
      ixheaacd_esbr_ps_apply_rotation(ptr_ps_dec, pp_qmf_buf_re_left, pp_qmf_buf_im_left,
495
18.8k
                                      pp_qmf_buf_re_right, pp_qmf_buf_im_right,
496
18.8k
                                      ptr_ps_tables);
497
18.8k
    }
498
18.8k
  }
499
500
18.8k
  ixheaacd_hyb_synth(ptr_ps_dec->hyb_left_re, ptr_ps_dec->hyb_left_im,
501
18.8k
                     pp_qmf_buf_re_left, pp_qmf_buf_im_left, ptr_ps_dec->ptr_hybrid);
502
503
18.8k
  ixheaacd_hyb_synth(ptr_ps_dec->hyb_right_re, ptr_ps_dec->hyb_right_im,
504
18.8k
                     pp_qmf_buf_re_right, pp_qmf_buf_im_right, ptr_ps_dec->ptr_hybrid);
505
506
18.8k
  ptr_ps_dec->use_34_st_bands_prev = ptr_ps_dec->use_34_st_bands;
507
508
18.8k
}
509
510
VOID ixheaacd_esbr_ps_de_correlate(
511
    ia_ps_dec_struct *ptr_ps_dec,
512
    FLOAT32 **pp_qmf_buf_re_left,
513
    FLOAT32 **pp_qmf_buf_im_left,
514
    FLOAT32 **pp_qmf_buf_re_right,
515
    FLOAT32 **pp_qmf_buf_im_right,
516
18.8k
    ia_ps_tables_struct *ptr_ps_tables) {
517
18.8k
  WORD32 sb, maxsb, gr, k;
518
18.8k
  WORD32 m;
519
18.8k
  WORD32 l_delay = 0;
520
18.8k
  WORD32 l_ser_delay_arr[NUM_SER_AP_LINKS] = {0};
521
18.8k
  FLOAT32 re_left;
522
18.8k
  FLOAT32 im_left;
523
18.8k
  FLOAT32 peak_diff, nrg, trans_ratio;
524
525
18.8k
  FLOAT32(*pp_hyb_left_re)[MAX_NUM_COLUMNS];
526
18.8k
  FLOAT32(*pp_hyb_left_im)[MAX_NUM_COLUMNS];
527
18.8k
  FLOAT32(*pp_hyb_right_re)[MAX_NUM_COLUMNS];
528
18.8k
  FLOAT32(*pp_hyb_right_im)[MAX_NUM_COLUMNS];
529
530
18.8k
  FLOAT32(*ppp_ser_sub_qmf_dealy_buf_re)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
531
18.8k
  FLOAT32(*ppp_ser_sub_qmf_dealy_buf_im)[5][NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
532
18.8k
  FLOAT32(*pp_sub_qmf_delay_buf_re)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
533
18.8k
  FLOAT32(*pp_sub_qmf_delay_buf_im)[NUM_OF_QUAD_MIRROR_FILTER_CHNLS];
534
535
18.8k
  FLOAT32 *pp_frac_delay_phase_fac_re;
536
18.8k
  FLOAT32 *pp_frac_delay_phase_fac_im;
537
18.8k
  FLOAT32(*pp_frac_delay_phase_fac_ser_re)[NUM_SER_AP_LINKS];
538
18.8k
  FLOAT32(*pp_frac_delay_phase_fac_ser_im)[NUM_SER_AP_LINKS];
539
540
18.8k
  WORD32 *p_delay_qmf_delay_num_samp = NULL;
541
18.8k
  WORD32 *p_delay_qmf_delay_buf_idx = NULL;
542
543
18.8k
  FLOAT32 pow_arr[32][NUM_HI_RES_BINS];
544
18.8k
  FLOAT32 trans_ratio_arr[32][NUM_HI_RES_BINS];
545
18.8k
  WORD32 bin;
546
18.8k
  FLOAT32 decay_cutoff;
547
548
18.8k
  pp_hyb_left_re = ptr_ps_dec->hyb_left_re;
549
18.8k
  pp_hyb_left_im = ptr_ps_dec->hyb_left_im;
550
18.8k
  pp_hyb_right_re = ptr_ps_dec->hyb_right_re;
551
18.8k
  pp_hyb_right_im = ptr_ps_dec->hyb_right_im;
552
553
18.8k
  ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_sub_qmf_dealy_buf_re;
554
18.8k
  ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_sub_qmf_dealy_buf_im;
555
556
18.8k
  pp_sub_qmf_delay_buf_re = ptr_ps_dec->sub_qmf_delay_buf_re;
557
18.8k
  pp_sub_qmf_delay_buf_im = ptr_ps_dec->sub_qmf_delay_buf_im;
558
559
18.8k
  if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) {
560
0
    if (ptr_ps_dec->use_34_st_bands) {
561
0
      WORD32 i;
562
0
      for (i = 0; i < NUM_SER_AP_LINKS; i++) {
563
0
        memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
564
0
               sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
565
0
        memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
566
0
               sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
567
0
        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
568
0
               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
569
0
        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
570
0
               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
571
0
      }
572
0
      return;
573
0
    } else {
574
0
      WORD32 i;
575
0
      for (i = 0; i < NUM_SER_AP_LINKS; i++) {
576
0
        memset(&ptr_ps_dec->ser_qmf_delay_buf_re[i][0][0], 0,
577
0
               sizeof(ptr_ps_dec->ser_qmf_delay_buf_re[i]));
578
0
        memset(&ptr_ps_dec->ser_qmf_delay_buf_im[i][0][0], 0,
579
0
               sizeof(ptr_ps_dec->ser_qmf_delay_buf_im[i]));
580
0
        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i][0][0], 0,
581
0
               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_re[i]));
582
0
        memset(&ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i][0][0], 0,
583
0
               sizeof(ptr_ps_dec->ser_sub_qmf_dealy_buf_im[i]));
584
0
      }
585
586
0
      return;
587
0
    }
588
0
  }
589
590
18.8k
  if (ptr_ps_dec->use_34_st_bands) {
591
0
    pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_34;
592
0
    pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_34;
593
0
    pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_34;
594
0
    pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_34;
595
18.8k
  } else {
596
18.8k
    pp_frac_delay_phase_fac_re = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_re_20;
597
18.8k
    pp_frac_delay_phase_fac_im = ptr_ps_tables->frac_delay_phase_fac_qmf_sub_im_20;
598
18.8k
    pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_re_20;
599
18.8k
    pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->frac_delay_phase_fac_ser_qmf_sub_im_20;
600
18.8k
  }
601
602
621k
  for (k = 0; k < 32; k++) {
603
21.0M
    for (bin = 0; bin < NUM_HI_RES_BINS; bin++) {
604
20.4M
      pow_arr[k][bin] = 0;
605
20.4M
    }
606
602k
  }
607
608
207k
  for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) {
609
188k
    bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
610
188k
    maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1;
611
376k
    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
612
188k
      for (k = ptr_ps_dec->border_position[0];
613
6.21M
           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
614
6.02M
        im_left = pp_hyb_left_re[k][sb];
615
6.02M
        re_left = pp_hyb_left_im[k][sb];
616
6.02M
        pow_arr[k][bin] += im_left * im_left + re_left * re_left;
617
6.02M
      }
618
188k
    }
619
188k
  }
620
244k
  for (; gr < ptr_ps_dec->num_groups; gr++) {
621
225k
    bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
622
225k
    maxsb = ptr_ps_dec->ptr_group_borders[gr + 1];
623
1.37M
    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
624
1.14M
      for (k = ptr_ps_dec->border_position[0];
625
37.9M
           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
626
36.7M
        im_left = pp_qmf_buf_re_left[k][sb];
627
36.7M
        re_left = pp_qmf_buf_im_left[k][sb];
628
36.7M
        pow_arr[k][bin] += im_left * im_left + re_left * re_left;
629
36.7M
      }
630
1.14M
    }
631
225k
  }
632
633
395k
  for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
634
376k
    for (k = ptr_ps_dec->border_position[0];
635
12.4M
         k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
636
12.0M
      FLOAT32 q = 1.5f;
637
638
12.0M
      ptr_ps_dec->peak_decay_fast_bin[bin] *= PEAK_DECAY_FACTOR_FAST;
639
12.0M
      if (ptr_ps_dec->peak_decay_fast_bin[bin] < pow_arr[k][bin])
640
376k
        ptr_ps_dec->peak_decay_fast_bin[bin] = pow_arr[k][bin];
641
642
12.0M
      peak_diff = ptr_ps_dec->prev_peak_diff_bin[bin];
643
12.0M
      peak_diff += INIT_FILT_COEFF * (ptr_ps_dec->peak_decay_fast_bin[bin] -
644
12.0M
                                      pow_arr[k][bin] -
645
12.0M
                                      ptr_ps_dec->prev_peak_diff_bin[bin]);
646
12.0M
      ptr_ps_dec->prev_peak_diff_bin[bin] = peak_diff;
647
648
12.0M
      nrg = ptr_ps_dec->prev_nrg_bin[bin];
649
12.0M
      nrg += INIT_FILT_COEFF * (pow_arr[k][bin] - ptr_ps_dec->prev_nrg_bin[bin]);
650
12.0M
      ptr_ps_dec->prev_nrg_bin[bin] = nrg;
651
12.0M
      if (q * peak_diff <= nrg) {
652
10.9M
        trans_ratio_arr[k][bin] = 1.0f;
653
10.9M
      } else {
654
1.09M
        trans_ratio_arr[k][bin] = nrg / (q * peak_diff);
655
1.09M
      }
656
12.0M
    }
657
376k
  }
658
659
18.8k
  if (ptr_ps_dec->use_34_st_bands) {
660
0
    decay_cutoff = DECAY_CUTOFF_HI_RES;
661
18.8k
  } else {
662
18.8k
    decay_cutoff = DECAY_CUTOFF;
663
18.8k
  }
664
665
207k
  for (gr = 0; gr < ptr_ps_dec->num_sub_qmf_groups; gr++) {
666
188k
    maxsb = ptr_ps_dec->ptr_group_borders[gr] + 1;
667
668
376k
    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
669
188k
      FLOAT32 decay_scale_factor;
670
671
188k
      decay_scale_factor = 1.0f;
672
673
188k
      decay_scale_factor = max(decay_scale_factor, 0.0f);
674
675
188k
      l_delay = ptr_ps_dec->delay_buf_idx;
676
753k
      for (k = 0; k < NUM_SER_AP_LINKS; k++)
677
564k
        l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k];
678
679
188k
      for (k = ptr_ps_dec->border_position[0];
680
6.21M
           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
681
6.02M
        FLOAT32 real, imag, real0, imag0, r_r0, i_r0;
682
683
6.02M
        im_left = pp_hyb_left_re[k][sb];
684
6.02M
        re_left = pp_hyb_left_im[k][sb];
685
686
6.02M
        {
687
6.02M
          real0 = pp_sub_qmf_delay_buf_re[l_delay][sb];
688
6.02M
          imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb];
689
6.02M
          pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left;
690
6.02M
          pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left;
691
692
6.02M
          real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 *
693
6.02M
                 pp_frac_delay_phase_fac_im[sb];
694
6.02M
          imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 *
695
6.02M
                 pp_frac_delay_phase_fac_re[sb];
696
697
6.02M
          r_r0 = real;
698
6.02M
          i_r0 = imag;
699
24.0M
          for (m = 0; m < NUM_SER_AP_LINKS; m++) {
700
18.0M
            real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb];
701
18.0M
            imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb];
702
18.0M
            real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] -
703
18.0M
                   imag0 * pp_frac_delay_phase_fac_ser_im[sb][m];
704
18.0M
            imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] +
705
18.0M
                   imag0 * pp_frac_delay_phase_fac_ser_re[sb][m];
706
707
18.0M
            real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0;
708
18.0M
            imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0;
709
18.0M
            ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] =
710
18.0M
                r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real;
711
18.0M
            ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] =
712
18.0M
                i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag;
713
18.0M
            r_r0 = real;
714
18.0M
            i_r0 = imag;
715
18.0M
          }
716
6.02M
        }
717
718
6.02M
        bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
719
6.02M
        trans_ratio = trans_ratio_arr[k][bin];
720
721
6.02M
        pp_hyb_right_re[k][sb] = trans_ratio * r_r0;
722
6.02M
        pp_hyb_right_im[k][sb] = trans_ratio * i_r0;
723
724
6.02M
        if (++l_delay >= DEL_ALL_PASS) l_delay = 0;
725
726
24.0M
        for (m = 0; m < NUM_SER_AP_LINKS; m++) {
727
18.0M
          if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) {
728
4.71M
            l_ser_delay_arr[m] = 0;
729
4.71M
          }
730
18.0M
        }
731
6.02M
      }
732
188k
    }
733
188k
  }
734
18.8k
  {
735
18.8k
    ppp_ser_sub_qmf_dealy_buf_re = ptr_ps_dec->ser_qmf_delay_buf_re;
736
18.8k
    ppp_ser_sub_qmf_dealy_buf_im = ptr_ps_dec->ser_qmf_delay_buf_im;
737
738
18.8k
    pp_sub_qmf_delay_buf_re = ptr_ps_dec->qmf_delay_buf_re;
739
18.8k
    pp_sub_qmf_delay_buf_im = ptr_ps_dec->qmf_delay_buf_im;
740
741
18.8k
    pp_frac_delay_phase_fac_re = ptr_ps_tables->qmf_fract_delay_phase_factor_re;
742
18.8k
    pp_frac_delay_phase_fac_im = ptr_ps_tables->qmf_fract_delay_phase_factor_im;
743
744
18.8k
    pp_frac_delay_phase_fac_ser_re = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_re;
745
18.8k
    pp_frac_delay_phase_fac_ser_im = ptr_ps_tables->qmf_ser_fract_delay_phase_factor_im;
746
747
18.8k
    p_delay_qmf_delay_buf_idx = ptr_ps_dec->delay_qmf_delay_buf_idx;
748
18.8k
    p_delay_qmf_delay_num_samp = ptr_ps_dec->delay_qmf_delay_num_samp;
749
18.8k
  }
750
244k
  for (; gr < ptr_ps_dec->num_groups; gr++) {
751
225k
    maxsb = ptr_ps_dec->ptr_group_borders[gr + 1];
752
753
1.37M
    for (sb = ptr_ps_dec->ptr_group_borders[gr]; sb < maxsb; sb++) {
754
1.14M
      FLOAT32 decay_scale_factor;
755
1.14M
      if (sb <= decay_cutoff)
756
18.8k
        decay_scale_factor = 1.0f;
757
1.12M
      else
758
1.12M
        decay_scale_factor = 1.0f + decay_cutoff * DECAY_SLOPE - DECAY_SLOPE * sb;
759
760
1.14M
      decay_scale_factor = max(decay_scale_factor, 0.0f);
761
762
1.14M
      l_delay = ptr_ps_dec->delay_buf_idx;
763
4.59M
      for (k = 0; k < NUM_SER_AP_LINKS; k++)
764
3.44M
        l_ser_delay_arr[k] = ptr_ps_dec->delay_buf_idx_ser[k];
765
766
1.14M
      for (k = ptr_ps_dec->border_position[0];
767
37.9M
           k < ptr_ps_dec->border_position[ptr_ps_dec->num_env]; k++) {
768
36.7M
        FLOAT32 real, imag, real0, imag0, r_r0, i_r0;
769
770
36.7M
        im_left = pp_qmf_buf_re_left[k][sb];
771
36.7M
        re_left = pp_qmf_buf_im_left[k][sb];
772
773
36.7M
        if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) {
774
24.7M
          real = pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb];
775
24.7M
          imag = pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb];
776
24.7M
          r_r0 = real;
777
24.7M
          i_r0 = imag;
778
24.7M
          pp_sub_qmf_delay_buf_re[p_delay_qmf_delay_buf_idx[sb]][sb] = im_left;
779
24.7M
          pp_sub_qmf_delay_buf_im[p_delay_qmf_delay_buf_idx[sb]][sb] = re_left;
780
24.7M
        } else {
781
12.0M
          real0 = pp_sub_qmf_delay_buf_re[l_delay][sb];
782
12.0M
          imag0 = pp_sub_qmf_delay_buf_im[l_delay][sb];
783
12.0M
          pp_sub_qmf_delay_buf_re[l_delay][sb] = im_left;
784
12.0M
          pp_sub_qmf_delay_buf_im[l_delay][sb] = re_left;
785
786
12.0M
          real = real0 * pp_frac_delay_phase_fac_re[sb] - imag0 *
787
12.0M
                 pp_frac_delay_phase_fac_im[sb];
788
12.0M
          imag = real0 * pp_frac_delay_phase_fac_im[sb] + imag0 *
789
12.0M
                 pp_frac_delay_phase_fac_re[sb];
790
791
12.0M
          r_r0 = real;
792
12.0M
          i_r0 = imag;
793
48.1M
          for (m = 0; m < NUM_SER_AP_LINKS; m++) {
794
36.1M
            real0 = ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb];
795
36.1M
            imag0 = ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb];
796
36.1M
            real = real0 * pp_frac_delay_phase_fac_ser_re[sb][m] -
797
36.1M
                   imag0 * pp_frac_delay_phase_fac_ser_im[sb][m];
798
36.1M
            imag = real0 * pp_frac_delay_phase_fac_ser_im[sb][m] +
799
36.1M
                   imag0 * pp_frac_delay_phase_fac_ser_re[sb][m];
800
801
36.1M
            real += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * r_r0;
802
36.1M
            imag += -decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * i_r0;
803
36.1M
            ppp_ser_sub_qmf_dealy_buf_re[m][l_ser_delay_arr[m]][sb] =
804
36.1M
                r_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * real;
805
36.1M
            ppp_ser_sub_qmf_dealy_buf_im[m][l_ser_delay_arr[m]][sb] =
806
36.1M
                i_r0 + decay_scale_factor * ptr_ps_tables->all_pass_link_decay_ser[m] * imag;
807
36.1M
            r_r0 = real;
808
36.1M
            i_r0 = imag;
809
36.1M
          }
810
12.0M
        }
811
812
36.7M
        bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[gr];
813
36.7M
        trans_ratio = trans_ratio_arr[k][bin];
814
815
36.7M
        pp_qmf_buf_re_right[k][sb] = trans_ratio * r_r0;
816
36.7M
        pp_qmf_buf_im_right[k][sb] = trans_ratio * i_r0;
817
818
36.7M
        if (++l_delay >= DEL_ALL_PASS) l_delay = 0;
819
820
36.7M
        if (gr >= ptr_ps_dec->first_delay_gr && sb >= NUM_OF_ALL_PASS_CHNLS) {
821
24.7M
          if (++p_delay_qmf_delay_buf_idx[sb] >= p_delay_qmf_delay_num_samp[sb]) {
822
17.9M
            p_delay_qmf_delay_buf_idx[sb] = 0;
823
17.9M
          }
824
24.7M
        }
825
826
147M
        for (m = 0; m < NUM_SER_AP_LINKS; m++) {
827
110M
          if (++l_ser_delay_arr[m] >= ptr_ps_dec->delay_sample_ser[m]) {
828
28.7M
            l_ser_delay_arr[m] = 0;
829
28.7M
          }
830
110M
        }
831
36.7M
      }
832
1.14M
    }
833
225k
  }
834
835
18.8k
  ptr_ps_dec->delay_buf_idx = l_delay;
836
75.3k
  for (m = 0; m < NUM_SER_AP_LINKS; m++) {
837
56.4k
    ptr_ps_dec->delay_buf_idx_ser[m] = l_ser_delay_arr[m];
838
56.4k
  }
839
18.8k
}
840
841
VOID ixheaacd_esbr_ps_apply_rotation(
842
    ia_ps_dec_struct *ptr_ps_dec,
843
    FLOAT32 **pp_qmf_buf_re_left,
844
    FLOAT32 **pp_qmf_buf_im_left,
845
    FLOAT32 **pp_qmf_buf_re_right,
846
    FLOAT32 **pp_qmf_buf_im_right,
847
18.8k
    ia_ps_tables_struct *ptr_ps_tables) {
848
18.8k
  WORD32 i;
849
18.8k
  WORD32 group;
850
18.8k
  WORD32 bin = 0;
851
18.8k
  WORD32 subband, max_subband;
852
18.8k
  WORD32 env;
853
18.8k
  FLOAT32(*p_hyb_left_re)[MAX_NUM_COLUMNS];
854
18.8k
  FLOAT32(*p_hyb_left_im)[MAX_NUM_COLUMNS];
855
18.8k
  FLOAT32(*p_hyb_rigth_re)[MAX_NUM_COLUMNS];
856
18.8k
  FLOAT32(*p_hyb_rigth_im)[MAX_NUM_COLUMNS];
857
18.8k
  FLOAT32 scale_fac_l, scale_fac_r;
858
18.8k
  FLOAT32 alpha, beta;
859
18.8k
  FLOAT32 ipd, opd;
860
18.8k
  FLOAT32 ipd1, opd1;
861
18.8k
  FLOAT32 ipd2, opd2;
862
863
18.8k
  FLOAT32 h11r, h12r, h21r, h22r;
864
18.8k
  FLOAT32 h11i, h12i, h21i, h22i;
865
18.8k
  FLOAT32 H11r, H12r, H21r, H22r;
866
18.8k
  FLOAT32 H11i, H12i, H21i, H22i;
867
18.8k
  FLOAT32 deltaH11r, deltaH12r, deltaH21r, deltaH22r;
868
18.8k
  FLOAT32 deltaH11i, deltaH12i, deltaH21i, deltaH22i;
869
18.8k
  FLOAT32 l_left_re, l_left_im;
870
18.8k
  FLOAT32 l_right_re, l_right_im;
871
872
18.8k
  WORD32 L;
873
18.8k
  FLOAT32 *ptr_scale_factors;
874
18.8k
  const WORD32 *ptr_quantized_iids;
875
18.8k
  WORD32 num_iid_steps;
876
877
18.8k
  if (ptr_ps_dec->iid_quant) {
878
887
    num_iid_steps = NUM_IID_STEPS_FINE;
879
887
    ptr_scale_factors = ptr_ps_tables->scale_factors_fine_flt;
880
887
    ptr_quantized_iids = ptr_ps_tables->quantized_iids_fine;
881
17.9k
  } else {
882
17.9k
    num_iid_steps = NUM_IID_STEPS;
883
17.9k
    ptr_scale_factors = ptr_ps_tables->scale_factors_flt;
884
17.9k
    ptr_quantized_iids = ptr_ps_tables->quantized_iids;
885
17.9k
  }
886
887
18.8k
  if (ptr_ps_dec->use_34_st_bands != ptr_ps_dec->use_34_st_bands_prev) {
888
0
    if (ptr_ps_dec->use_34_st_bands) {
889
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_re_prev);
890
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_re_prev);
891
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_re_prev);
892
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_re_prev);
893
894
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h11_im_prev);
895
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h12_im_prev);
896
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h21_im_prev);
897
0
      ixheaacd_map_20_float_to_34(ptr_ps_dec->h22_im_prev);
898
899
0
      memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
900
0
      memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
901
0
      memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
902
0
      memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
903
0
    } else {
904
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_re_prev);
905
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_re_prev);
906
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_re_prev);
907
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_re_prev);
908
909
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h11_im_prev);
910
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h12_im_prev);
911
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h21_im_prev);
912
0
      ixheaacd_map_34_float_to_20(ptr_ps_dec->h22_im_prev);
913
914
0
      memset(ptr_ps_dec->ipd_idx_map_1, 0, sizeof(ptr_ps_dec->ipd_idx_map_1));
915
0
      memset(ptr_ps_dec->opd_idx_map_1, 0, sizeof(ptr_ps_dec->opd_idx_map_1));
916
0
      memset(ptr_ps_dec->ipd_idx_map_2, 0, sizeof(ptr_ps_dec->ipd_idx_map_2));
917
0
      memset(ptr_ps_dec->opd_idx_map_2, 0, sizeof(ptr_ps_dec->opd_idx_map_2));
918
0
    }
919
0
  }
920
921
38.3k
  for (env = 0; env < ptr_ps_dec->num_env; env++) {
922
410k
    for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
923
390k
      if (!ptr_ps_dec->use_pca_rot_flg) {
924
390k
        scale_fac_r = ptr_scale_factors[num_iid_steps +
925
390k
                      ptr_ps_dec->iid_par_table[env][bin]];
926
390k
        scale_fac_l = ptr_scale_factors[num_iid_steps -
927
390k
                      ptr_ps_dec->iid_par_table[env][bin]];
928
929
390k
        alpha = ptr_ps_tables->alphas[ptr_ps_dec->icc_par_table[env][bin]];
930
931
390k
        beta = alpha * (scale_fac_r - scale_fac_l) / PSC_SQRT2F;
932
933
390k
        h11r = (FLOAT32)(scale_fac_l * cos(beta + alpha));
934
390k
        h12r = (FLOAT32)(scale_fac_r * cos(beta - alpha));
935
390k
        h21r = (FLOAT32)(scale_fac_l * sin(beta + alpha));
936
390k
        h22r = (FLOAT32)(scale_fac_r * sin(beta - alpha));
937
390k
      } else {
938
0
        FLOAT32 c, rho, mu, alpha, gamma;
939
0
        WORD32 i;
940
941
0
        i = ptr_ps_dec->iid_par_table[env][bin];
942
0
        c = (FLOAT32)pow(
943
0
            10.0,
944
0
            ((i) ? (((i > 0) ? 1 : -1) * ptr_quantized_iids[((i > 0) ? i : -i) - 1]) : 0.) /
945
0
                20.0);
946
0
        rho = ptr_ps_tables->quantized_rhos[ptr_ps_dec->icc_par_table[env][bin]];
947
0
        rho = max(rho, 0.05f);
948
949
0
        if (rho == 0.0f && c == 1.) {
950
0
          alpha = (FLOAT32)PI / 4.0f;
951
0
        } else {
952
0
          if (rho <= 0.05f) {
953
0
            rho = 0.05f;
954
0
          }
955
0
          alpha = 0.5f * (FLOAT32)atan((2.0f * c * rho) / (c * c - 1.0f));
956
957
0
          if (alpha < 0.) {
958
0
            alpha += (FLOAT32)PI / 2.0f;
959
0
          }
960
0
        }
961
0
        mu = c + 1.0f / c;
962
0
        mu = 1 + (4.0f * rho * rho - 4.0f) / (mu * mu);
963
0
        gamma = (FLOAT32)atan(sqrt((1.0f - sqrt(mu)) / (1.0f + sqrt(mu))));
964
965
0
        h11r = (FLOAT32)(sqrt(2.) * cos(alpha) * cos(gamma));
966
0
        h12r = (FLOAT32)(sqrt(2.) * sin(alpha) * cos(gamma));
967
0
        h21r = (FLOAT32)(sqrt(2.) * -sin(alpha) * sin(gamma));
968
0
        h22r = (FLOAT32)(sqrt(2.) * cos(alpha) * sin(gamma));
969
0
      }
970
971
390k
      if (bin >= ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]) {
972
223k
        h11i = h12i = h21i = h22i = 0.0f;
973
223k
      } else {
974
166k
        ipd = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map[env][bin];
975
166k
        opd = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map[env][bin];
976
166k
        ipd1 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_1[bin];
977
166k
        opd1 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_1[bin];
978
166k
        ipd2 = (IPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->ipd_idx_map_2[bin];
979
166k
        opd2 = (OPD_SCALE_FACTOR * 2.0f) * ptr_ps_dec->opd_idx_map_2[bin];
980
981
166k
        l_left_re = (FLOAT32)cos(ipd);
982
166k
        l_left_im = (FLOAT32)sin(ipd);
983
166k
        l_right_re = (FLOAT32)cos(opd);
984
166k
        l_right_im = (FLOAT32)sin(opd);
985
986
166k
        l_left_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(ipd1);
987
166k
        l_left_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(ipd1);
988
166k
        l_right_re += PHASE_SMOOTH_HIST1 * (FLOAT32)cos(opd1);
989
166k
        l_right_im += PHASE_SMOOTH_HIST1 * (FLOAT32)sin(opd1);
990
991
166k
        l_left_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(ipd2);
992
166k
        l_left_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(ipd2);
993
166k
        l_right_re += PHASE_SMOOTH_HIST2 * (FLOAT32)cos(opd2);
994
166k
        l_right_im += PHASE_SMOOTH_HIST2 * (FLOAT32)sin(opd2);
995
996
166k
        ipd = (FLOAT32)atan2(l_left_im, l_left_re);
997
166k
        opd = (FLOAT32)atan2(l_right_im, l_right_re);
998
999
166k
        l_left_re = (FLOAT32)cos(opd);
1000
166k
        l_left_im = (FLOAT32)sin(opd);
1001
166k
        opd -= ipd;
1002
166k
        l_right_re = (FLOAT32)cos(opd);
1003
166k
        l_right_im = (FLOAT32)sin(opd);
1004
1005
166k
        h11i = h11r * l_left_im;
1006
166k
        h12i = h12r * l_right_im;
1007
166k
        h21i = h21r * l_left_im;
1008
166k
        h22i = h22r * l_right_im;
1009
1010
166k
        h11r *= l_left_re;
1011
166k
        h12r *= l_right_re;
1012
166k
        h21r *= l_left_re;
1013
166k
        h22r *= l_right_re;
1014
166k
      }
1015
1016
390k
      ptr_ps_dec->h11_re_vec[bin] = h11r;
1017
390k
      ptr_ps_dec->h12_re_vec[bin] = h12r;
1018
390k
      ptr_ps_dec->h21_re_vec[bin] = h21r;
1019
390k
      ptr_ps_dec->h22_re_vec[bin] = h22r;
1020
390k
      ptr_ps_dec->h11_im_vec[bin] = h11i;
1021
390k
      ptr_ps_dec->h12_im_vec[bin] = h12i;
1022
390k
      ptr_ps_dec->h21_im_vec[bin] = h21i;
1023
390k
      ptr_ps_dec->h22_im_vec[bin] = h22i;
1024
1025
390k
    }
1026
1027
19.5k
    p_hyb_left_re = ptr_ps_dec->hyb_left_re;
1028
19.5k
    p_hyb_left_im = ptr_ps_dec->hyb_left_im;
1029
19.5k
    p_hyb_rigth_re = ptr_ps_dec->hyb_right_re;
1030
19.5k
    p_hyb_rigth_im = ptr_ps_dec->hyb_right_im;
1031
1032
214k
    for (group = 0; group < ptr_ps_dec->num_sub_qmf_groups; group++) {
1033
195k
      bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group];
1034
1035
195k
      max_subband = ptr_ps_dec->ptr_group_borders[group] + 1;
1036
1037
195k
      L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env];
1038
1039
195k
      H11r = ptr_ps_dec->h11_re_prev[bin];
1040
195k
      H12r = ptr_ps_dec->h12_re_prev[bin];
1041
195k
      H21r = ptr_ps_dec->h21_re_prev[bin];
1042
195k
      H22r = ptr_ps_dec->h22_re_prev[bin];
1043
195k
      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1044
39.0k
        H11i = -ptr_ps_dec->h11_im_prev[bin];
1045
39.0k
        H12i = -ptr_ps_dec->h12_im_prev[bin];
1046
39.0k
        H21i = -ptr_ps_dec->h21_im_prev[bin];
1047
39.0k
        H22i = -ptr_ps_dec->h22_im_prev[bin];
1048
156k
      } else {
1049
156k
        H11i = ptr_ps_dec->h11_im_prev[bin];
1050
156k
        H12i = ptr_ps_dec->h12_im_prev[bin];
1051
156k
        H21i = ptr_ps_dec->h21_im_prev[bin];
1052
156k
        H22i = ptr_ps_dec->h22_im_prev[bin];
1053
156k
      }
1054
1055
195k
      h11r = ptr_ps_dec->h11_re_vec[bin];
1056
195k
      h12r = ptr_ps_dec->h12_re_vec[bin];
1057
195k
      h21r = ptr_ps_dec->h21_re_vec[bin];
1058
195k
      h22r = ptr_ps_dec->h22_re_vec[bin];
1059
195k
      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1060
39.0k
        h11i = -ptr_ps_dec->h11_im_vec[bin];
1061
39.0k
        h12i = -ptr_ps_dec->h12_im_vec[bin];
1062
39.0k
        h21i = -ptr_ps_dec->h21_im_vec[bin];
1063
39.0k
        h22i = -ptr_ps_dec->h22_im_vec[bin];
1064
156k
      } else {
1065
156k
        h11i = ptr_ps_dec->h11_im_vec[bin];
1066
156k
        h12i = ptr_ps_dec->h12_im_vec[bin];
1067
156k
        h21i = ptr_ps_dec->h21_im_vec[bin];
1068
156k
        h22i = ptr_ps_dec->h22_im_vec[bin];
1069
156k
      }
1070
1071
195k
      deltaH11r = (h11r - H11r) / L;
1072
195k
      deltaH12r = (h12r - H12r) / L;
1073
195k
      deltaH21r = (h21r - H21r) / L;
1074
195k
      deltaH22r = (h22r - H22r) / L;
1075
1076
195k
      deltaH11i = (h11i - H11i) / L;
1077
195k
      deltaH12i = (h12i - H12i) / L;
1078
195k
      deltaH21i = (h21i - H21i) / L;
1079
195k
      deltaH22i = (h22i - H22i) / L;
1080
1081
6.22M
      for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1];
1082
6.02M
           i++) {
1083
6.02M
        H11r += deltaH11r;
1084
6.02M
        H12r += deltaH12r;
1085
6.02M
        H21r += deltaH21r;
1086
6.02M
        H22r += deltaH22r;
1087
1088
6.02M
        H11i += deltaH11i;
1089
6.02M
        H12i += deltaH12i;
1090
6.02M
        H21i += deltaH21i;
1091
6.02M
        H22i += deltaH22i;
1092
1093
12.0M
        for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband;
1094
6.02M
             subband++) {
1095
6.02M
          l_left_re = H11r * p_hyb_left_re[i][subband] - H11i * p_hyb_left_im[i][subband] +
1096
6.02M
                      H21r * p_hyb_rigth_re[i][subband] - H21i * p_hyb_rigth_im[i][subband];
1097
1098
6.02M
          l_left_im = H11i * p_hyb_left_re[i][subband] + H11r * p_hyb_left_im[i][subband] +
1099
6.02M
                      H21i * p_hyb_rigth_re[i][subband] + H21r * p_hyb_rigth_im[i][subband];
1100
1101
6.02M
          l_right_re = H12r * p_hyb_left_re[i][subband] - H12i * p_hyb_left_im[i][subband] +
1102
6.02M
                       H22r * p_hyb_rigth_re[i][subband] - H22i * p_hyb_rigth_im[i][subband];
1103
1104
6.02M
          l_right_im = H12i * p_hyb_left_re[i][subband] + H12r * p_hyb_left_im[i][subband] +
1105
6.02M
                       H22i * p_hyb_rigth_re[i][subband] + H22r * p_hyb_rigth_im[i][subband];
1106
1107
6.02M
          p_hyb_left_re[i][subband] = l_left_re;
1108
6.02M
          p_hyb_left_im[i][subband] = l_left_im;
1109
6.02M
          p_hyb_rigth_re[i][subband] = l_right_re;
1110
6.02M
          p_hyb_rigth_im[i][subband] = l_right_im;
1111
6.02M
        }
1112
6.02M
      }
1113
195k
    }
1114
1115
254k
    for (; group < ptr_ps_dec->num_groups; group++) {
1116
234k
      bin = (~NEGATE_IPD_MASK) & ptr_ps_dec->ptr_bins_group_map[group];
1117
1118
234k
      max_subband = ptr_ps_dec->ptr_group_borders[group + 1];
1119
1120
234k
      L = ptr_ps_dec->border_position[env + 1] - ptr_ps_dec->border_position[env];
1121
1122
234k
      H11r = ptr_ps_dec->h11_re_prev[bin];
1123
234k
      H12r = ptr_ps_dec->h12_re_prev[bin];
1124
234k
      H21r = ptr_ps_dec->h21_re_prev[bin];
1125
234k
      H22r = ptr_ps_dec->h22_re_prev[bin];
1126
234k
      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1127
0
        H11i = -ptr_ps_dec->h11_im_prev[bin];
1128
0
        H12i = -ptr_ps_dec->h12_im_prev[bin];
1129
0
        H21i = -ptr_ps_dec->h21_im_prev[bin];
1130
0
        H22i = -ptr_ps_dec->h22_im_prev[bin];
1131
234k
      } else {
1132
234k
        H11i = ptr_ps_dec->h11_im_prev[bin];
1133
234k
        H12i = ptr_ps_dec->h12_im_prev[bin];
1134
234k
        H21i = ptr_ps_dec->h21_im_prev[bin];
1135
234k
        H22i = ptr_ps_dec->h22_im_prev[bin];
1136
234k
      }
1137
1138
234k
      h11r = ptr_ps_dec->h11_re_vec[bin];
1139
234k
      h12r = ptr_ps_dec->h12_re_vec[bin];
1140
234k
      h21r = ptr_ps_dec->h21_re_vec[bin];
1141
234k
      h22r = ptr_ps_dec->h22_re_vec[bin];
1142
234k
      if ((NEGATE_IPD_MASK & ptr_ps_dec->ptr_bins_group_map[group]) != 0) {
1143
0
        h11i = -ptr_ps_dec->h11_im_vec[bin];
1144
0
        h12i = -ptr_ps_dec->h12_im_vec[bin];
1145
0
        h21i = -ptr_ps_dec->h21_im_vec[bin];
1146
0
        h22i = -ptr_ps_dec->h22_im_vec[bin];
1147
234k
      } else {
1148
234k
        h11i = ptr_ps_dec->h11_im_vec[bin];
1149
234k
        h12i = ptr_ps_dec->h12_im_vec[bin];
1150
234k
        h21i = ptr_ps_dec->h21_im_vec[bin];
1151
234k
        h22i = ptr_ps_dec->h22_im_vec[bin];
1152
234k
      }
1153
1154
234k
      deltaH11r = (h11r - H11r) / L;
1155
234k
      deltaH12r = (h12r - H12r) / L;
1156
234k
      deltaH21r = (h21r - H21r) / L;
1157
234k
      deltaH22r = (h22r - H22r) / L;
1158
1159
234k
      deltaH11i = (h11i - H11i) / L;
1160
234k
      deltaH12i = (h12i - H12i) / L;
1161
234k
      deltaH21i = (h21i - H21i) / L;
1162
234k
      deltaH22i = (h22i - H22i) / L;
1163
1164
7.46M
      for (i = ptr_ps_dec->border_position[env]; i < ptr_ps_dec->border_position[env + 1];
1165
7.22M
           i++) {
1166
7.22M
        H11r += deltaH11r;
1167
7.22M
        H12r += deltaH12r;
1168
7.22M
        H21r += deltaH21r;
1169
7.22M
        H22r += deltaH22r;
1170
1171
7.22M
        H11i += deltaH11i;
1172
7.22M
        H12i += deltaH12i;
1173
7.22M
        H21i += deltaH21i;
1174
7.22M
        H22i += deltaH22i;
1175
1176
43.9M
        for (subband = ptr_ps_dec->ptr_group_borders[group]; subband < max_subband;
1177
36.7M
             subband++) {
1178
36.7M
          l_left_re = H11r * pp_qmf_buf_re_left[i][subband] - H11i *
1179
36.7M
                      pp_qmf_buf_im_left[i][subband] +
1180
36.7M
                      H21r * pp_qmf_buf_re_right[i][subband] - H21i *
1181
36.7M
                      pp_qmf_buf_im_right[i][subband];
1182
1183
36.7M
          l_left_im = H11i * pp_qmf_buf_re_left[i][subband] + H11r *
1184
36.7M
                      pp_qmf_buf_im_left[i][subband] +
1185
36.7M
                      H21i * pp_qmf_buf_re_right[i][subband] + H21r *
1186
36.7M
                      pp_qmf_buf_im_right[i][subband];
1187
1188
36.7M
          l_right_re = H12r * pp_qmf_buf_re_left[i][subband] - H12i *
1189
36.7M
                       pp_qmf_buf_im_left[i][subband] +
1190
36.7M
                       H22r * pp_qmf_buf_re_right[i][subband] - H22i *
1191
36.7M
                       pp_qmf_buf_im_right[i][subband];
1192
1193
36.7M
          l_right_im = H12i * pp_qmf_buf_re_left[i][subband] + H12r *
1194
36.7M
                       pp_qmf_buf_im_left[i][subband] +
1195
36.7M
                       H22i * pp_qmf_buf_re_right[i][subband] + H22r *
1196
36.7M
                       pp_qmf_buf_im_right[i][subband];
1197
1198
36.7M
          pp_qmf_buf_re_left[i][subband] = l_left_re;
1199
36.7M
          pp_qmf_buf_im_left[i][subband] = l_left_im;
1200
36.7M
          pp_qmf_buf_re_right[i][subband] = l_right_re;
1201
36.7M
          pp_qmf_buf_im_right[i][subband] = l_right_im;
1202
36.7M
        }
1203
7.22M
      }
1204
234k
    }
1205
410k
    for (bin = 0; bin < ptr_ps_dec->num_bins; bin++) {
1206
390k
      ptr_ps_dec->h11_re_prev[bin] = ptr_ps_dec->h11_re_vec[bin];
1207
390k
      ptr_ps_dec->h12_re_prev[bin] = ptr_ps_dec->h12_re_vec[bin];
1208
390k
      ptr_ps_dec->h21_re_prev[bin] = ptr_ps_dec->h21_re_vec[bin];
1209
390k
      ptr_ps_dec->h22_re_prev[bin] = ptr_ps_dec->h22_re_vec[bin];
1210
1211
390k
      ptr_ps_dec->h11_im_prev[bin] = ptr_ps_dec->h11_im_vec[bin];
1212
390k
      ptr_ps_dec->h12_im_prev[bin] = ptr_ps_dec->h12_im_vec[bin];
1213
390k
      ptr_ps_dec->h21_im_prev[bin] = ptr_ps_dec->h21_im_vec[bin];
1214
390k
      ptr_ps_dec->h22_im_prev[bin] = ptr_ps_dec->h22_im_vec[bin];
1215
390k
    }
1216
1217
186k
    for (bin = 0; bin < ptr_ps_tables->ipd_bins_tbl[ptr_ps_dec->freq_res_ipd]; bin++) {
1218
166k
      ptr_ps_dec->ipd_idx_map_2[bin] = ptr_ps_dec->ipd_idx_map_1[bin];
1219
166k
      ptr_ps_dec->opd_idx_map_2[bin] = ptr_ps_dec->opd_idx_map_1[bin];
1220
166k
      ptr_ps_dec->ipd_idx_map_1[bin] = ptr_ps_dec->ipd_idx_map[env][bin];
1221
166k
      ptr_ps_dec->opd_idx_map_1[bin] = ptr_ps_dec->opd_idx_map[env][bin];
1222
166k
    }
1223
19.5k
  }
1224
18.8k
}