Coverage Report

Created: 2025-10-10 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_mps_temp_process.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 <math.h>
21
#include "ixheaac_type_def.h"
22
#include "ixheaac_constants.h"
23
#include "ixheaacd_bitbuffer.h"
24
#include "ixheaacd_common_rom.h"
25
#include "ixheaacd_sbrdecsettings.h"
26
#include "ixheaacd_sbr_scale.h"
27
#include "ixheaacd_env_extr_part.h"
28
#include "ixheaacd_sbr_rom.h"
29
#include "ixheaacd_config.h"
30
#include "ixheaacd_hybrid.h"
31
#include "ixheaacd_ps_dec.h"
32
#include "ixheaacd_qmf_dec.h"
33
#include "ixheaacd_mps_polyphase.h"
34
#include "ixheaacd_mps_struct_def.h"
35
#include "ixheaacd_mps_res_rom.h"
36
#include "ixheaacd_mps_aac_struct.h"
37
#include "ixheaacd_mps_dec.h"
38
#include "ixheaacd_mps_process.h"
39
#include "ixheaacd_lpp_tran.h"
40
#include "ixheaacd_env_extr.h"
41
#include "ixheaacd_env_calc.h"
42
#include "ixheaac_sbr_const.h"
43
#include "ixheaacd_pvc_dec.h"
44
#include "ixheaacd_sbr_dec.h"
45
#include "ixheaacd_audioobjtypes.h"
46
#include "ixheaac_basic_ops32.h"
47
#include "ixheaac_basic_ops40.h"
48
#include "ixheaacd_mps_bitdec.h"
49
#include "ixheaacd_mps_macro_def.h"
50
#include "ixheaacd_mps_get_index.h"
51
#include "ixheaacd_mps_basic_op.h"
52
#include "ixheaacd_mps_tp_process.h"
53
#include "ixheaacd_error_codes.h"
54
9.35M
#define HP_SIZE (9)
55
56
4.95M
#define STP_LPF_COEFF1 (0.950f)
57
3.30M
#define STP_LPF_COEFF2 (0.450f)
58
1.05M
#define STP_UPDATE_ENERGY_RATE (32)
59
#define STP_SCALE_LIMIT (2.82f)
60
3.30M
#define STP_DAMP (0.1f)
61
62
static const FLOAT32 ixheaacd_bp[BP_SIZE] = {
63
  0.0000f, 0.0005f, 0.0092f, 0.0587f, 0.2580f, 0.7392f, 0.9791f,
64
  0.9993f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.9999f, 0.9984f,
65
  0.9908f, 0.9639f, 0.8952f, 0.7711f, 0.6127f, 0.4609f, 0.3391f,
66
  0.2493f, 0.1848f, 0.1387f, 0.1053f};
67
68
static const FLOAT32 ixheaacd_gf[BP_SIZE] = {
69
  0.f,     0.f,     0.f,     0.f,     0.f,
70
  0.f,     1e-008f,   8.1e-007f,   3.61e-006f,  8.41e-006f,
71
  1.6e-005f,   2.704e-005f, 3.969e-005f, 5.625e-005f, 7.396e-005f,
72
  9.801e-005f, 0.00012321f, 0.00015625f, 0.00019881f, 0.00024964f,
73
  0.00032041f, 0.00041209f, 0.00053824f, 0.00070756f, 0.00094249f};
74
75
extern const WORD32 ixheaacd_mps_gain_set_indx[29];
76
77
static VOID ixheaacd_mps_temp_process_scale_calc(ia_mps_dec_state_struct* self,
78
826k
                                                 WORD32 ts, FLOAT32* scale) {
79
826k
  FLOAT32 dir_energy;
80
826k
  FLOAT32 diff_energy[2];
81
826k
  FLOAT32 temp;
82
83
826k
  WORD32 ch, n;
84
826k
  WORD32 left_ch = 0, right_ch = 1;
85
86
826k
  if (self->subband_var.init_flag == 0) {
87
2.12k
    for (ch = 0; ch < 2; ch++) {
88
1.41k
      self->subband_var.tp_scale_last[ch] = 1.0f;
89
1.41k
      self->subband_var.nrg_diff_prev[ch] = 32768 * 32768;
90
1.41k
    }
91
92
708
    self->subband_var.nrg_dir_prev = 32768 * 32768;
93
708
    self->subband_var.init_flag = 1;
94
708
  }
95
96
826k
  if (self->subband_var.update_old_ener == STP_UPDATE_ENERGY_RATE) {
97
25.1k
    self->subband_var.update_old_ener = 1;
98
25.1k
    self->subband_var.nrg_dir_prev = self->subband_var.nrg_dir;
99
75.4k
    for (ch = 0; ch < self->out_ch_count; ch++)
100
50.3k
      self->subband_var.nrg_diff_prev[ch] = self->subband_var.nrg_diff[ch];
101
25.1k
  } else
102
800k
    self->subband_var.update_old_ener++;
103
104
826k
  dir_energy = 0;
105
106
16.5M
  for (n = 6; n < BP_SIZE; n++) {
107
15.6M
    FLOAT32 dir_left_re = self->hyb_dir_out[left_ch][ts][n + 7].re;
108
15.6M
    FLOAT32 dir_right_re = self->hyb_dir_out[right_ch][ts][n + 7].re;
109
15.6M
    FLOAT32 dir_left_im = self->hyb_dir_out[left_ch][ts][n + 7].im;
110
15.6M
    FLOAT32 dir_right_im = self->hyb_dir_out[right_ch][ts][n + 7].im;
111
112
15.6M
    temp = ((dir_left_re + dir_right_re) * (dir_left_re + dir_right_re)) +
113
15.6M
           ((dir_left_im + dir_right_im) * (dir_left_im + dir_right_im));
114
15.6M
    dir_energy += temp * ixheaacd_bp[n] * ixheaacd_bp[n] * ixheaacd_gf[n] *
115
15.6M
                  ixheaacd_gf[n];
116
15.6M
  }
117
118
826k
  self->subband_var.nrg_dir =
119
826k
      (FLOAT32)(STP_LPF_COEFF1 * self->subband_var.nrg_dir +
120
826k
                (1.0 - STP_LPF_COEFF1) * dir_energy);
121
122
826k
  dir_energy /= (self->subband_var.nrg_dir_prev + ABS_THR);
123
124
2.47M
  for (ch = 0; ch < self->out_ch_count; ch++) {
125
1.65M
    diff_energy[ch] = 0;
126
33.0M
    for (n = 6; n < BP_SIZE; n++) {
127
31.3M
      FLOAT32 diff_re = self->hyb_diff_out[ch][ts][n + 7].re;
128
31.3M
      FLOAT32 diff_im = self->hyb_diff_out[ch][ts][n + 7].im;
129
130
31.3M
      temp = (diff_re * diff_re) + (diff_im * diff_im);
131
31.3M
      diff_energy[ch] += temp * ixheaacd_bp[n] * ixheaacd_bp[n] *
132
31.3M
                         ixheaacd_gf[n] * ixheaacd_gf[n];
133
31.3M
    }
134
135
1.65M
    self->subband_var.nrg_diff[ch] =
136
1.65M
        (FLOAT32)(STP_LPF_COEFF1 * self->subband_var.nrg_diff[ch] +
137
1.65M
                  (1.0 - STP_LPF_COEFF1) * diff_energy[ch]);
138
1.65M
    diff_energy[ch] /= (self->subband_var.nrg_diff_prev[ch] + ABS_THR);
139
1.65M
  }
140
141
826k
  scale[left_ch] = (FLOAT32)sqrt((dir_energy) / (diff_energy[left_ch] + 1e-9));
142
826k
  scale[right_ch] =
143
826k
      (FLOAT32)sqrt((dir_energy) / (diff_energy[right_ch] + 1e-9));
144
145
2.47M
  for (ch = 0; ch < self->out_ch_count; ch++) {
146
1.65M
    scale[ch] = STP_DAMP + (1 - STP_DAMP) * scale[ch];
147
1.65M
  }
148
149
2.47M
  for (ch = 0; ch < self->out_ch_count; ch++) {
150
1.65M
    scale[ch] =
151
1.65M
        min(max(scale[ch], (FLOAT32)(1.0 / STP_SCALE_LIMIT)), STP_SCALE_LIMIT);
152
1.65M
  }
153
154
2.47M
  for (ch = 0; ch < self->out_ch_count; ch++) {
155
1.65M
    scale[ch] =
156
1.65M
        (FLOAT32)(STP_LPF_COEFF2 * scale[ch] +
157
1.65M
                  (1.0 - STP_LPF_COEFF2) * self->subband_var.tp_scale_last[ch]);
158
1.65M
    self->subband_var.tp_scale_last[ch] = scale[ch];
159
1.65M
  }
160
826k
}
161
162
826k
static VOID ixheaacd_mps_subbandtp(ia_mps_dec_state_struct* self, WORD32 ts) {
163
826k
  FLOAT32 scale[2];
164
826k
  WORD32 ch, n;
165
826k
  WORD32 no_scaling;
166
826k
  FLOAT32 temp;
167
826k
  const WORD32 ixheaacd_hybrid_to_qmf_map[] = {0, 0, 0, 0, 0, 0, 1, 1, 2, 2};
168
826k
  const WORD32 ixheaacd_hybrid_to_qmf_map_ldmps[] = {0, 1, 2};
169
826k
  const WORD32* ptr_ixheaacd_hybrid_to_qmf_map;
170
826k
  WORD32 loop_counter = 0;
171
172
826k
  if (self->ldmps_config.ldmps_present_flag) {
173
22.0k
    ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map_ldmps;
174
22.0k
    loop_counter = 3;
175
803k
  } else {
176
803k
    ptr_ixheaacd_hybrid_to_qmf_map = ixheaacd_hybrid_to_qmf_map;
177
803k
    loop_counter = 10;
178
803k
  }
179
180
826k
  ixheaacd_mps_temp_process_scale_calc(self, ts, scale);
181
182
2.47M
  for (ch = 0; ch < self->out_ch_count; ch++) {
183
1.65M
    no_scaling = 1;
184
185
1.65M
    if ((self->config->bs_temp_shape_config == 1) ||
186
0
        (self->config->bs_temp_shape_config == 2))
187
1.65M
      no_scaling = !self->temp_shape_enable_ch_stp[ch];
188
189
1.65M
    if (no_scaling == 1) {
190
103M
      for (n = 0; n < self->hyb_band_count_max; n++) {
191
102M
        self->hyb_dir_out[ch][ts][n].re += self->hyb_diff_out[ch][ts][n].re;
192
102M
        self->hyb_dir_out[ch][ts][n].im += self->hyb_diff_out[ch][ts][n].im;
193
102M
      }
194
1.58M
    } else {
195
69.0k
      if (self->ldmps_config.ldmps_present_flag) {
196
71.0k
        for (n = 0; n < 3; n++) {
197
53.3k
          temp = (FLOAT32)(scale[ch] *
198
53.3k
                           ixheaacd_bp[ptr_ixheaacd_hybrid_to_qmf_map[n]]);
199
53.3k
          self->hyb_dir_out[ch][ts][n].re +=
200
53.3k
              (self->hyb_diff_out[ch][ts][n].re * temp);
201
53.3k
          self->hyb_dir_out[ch][ts][n].im +=
202
53.3k
              (self->hyb_diff_out[ch][ts][n].im * temp);
203
53.3k
        }
204
51.2k
      } else {
205
564k
        for (n = 0; n < loop_counter; n++) {
206
512k
          temp = (FLOAT32)(scale[ch] *
207
512k
                           ixheaacd_bp[ptr_ixheaacd_hybrid_to_qmf_map[n]]);
208
512k
          self->hyb_dir_out[ch][ts][n].re +=
209
512k
              (self->hyb_diff_out[ch][ts][n].re * temp);
210
512k
          self->hyb_dir_out[ch][ts][n].im +=
211
512k
              (self->hyb_diff_out[ch][ts][n].im * temp);
212
512k
        }
213
51.2k
      }
214
690k
      for (n = 7; n < HP_SIZE - 3 + 10; n++) {
215
621k
        temp = (FLOAT32)(scale[ch] * ixheaacd_bp[n + 3 - 10]);
216
621k
        self->hyb_dir_out[ch][ts][n].re +=
217
621k
            (self->hyb_diff_out[ch][ts][n].re * temp);
218
621k
        self->hyb_dir_out[ch][ts][n].im +=
219
621k
            (self->hyb_diff_out[ch][ts][n].im * temp);
220
621k
      }
221
2.20M
      for (; n < self->hyb_band_count_max; n++) {
222
2.13M
        temp = (FLOAT32)(scale[ch]);
223
2.13M
        self->hyb_dir_out[ch][ts][n].re +=
224
2.13M
            (self->hyb_diff_out[ch][ts][n].re * temp);
225
2.13M
        self->hyb_dir_out[ch][ts][n].im +=
226
2.13M
            (self->hyb_diff_out[ch][ts][n].im * temp);
227
2.13M
      }
228
69.0k
    }
229
1.65M
  }
230
826k
}
231
232
111k
WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) {
233
111k
  WORD32 ch, ts, hyb;
234
111k
  WORD32 err = 0;
235
111k
  ia_sbr_frame_info_data_struct* ptr_frame_data =
236
111k
      (ia_sbr_frame_info_data_struct*)self->p_sbr_frame[0];
237
111k
  if (self->res_bands != 28) {
238
93.4k
    if (self->config->bs_temp_shape_config == 1) {
239
26.2k
      WORD32 dif_s = ((self->res_bands == 0)
240
26.2k
                          ? 0
241
26.2k
                          : ixheaacd_mps_gain_set_indx[self->res_bands]);
242
78.6k
      for (ch = 0; ch < self->out_ch_count; ch++) {
243
1.70M
        for (ts = 0; ts < self->time_slots; ts++) {
244
14.2M
          for (hyb = dif_s; hyb < HYBRID_BAND_BORDER; hyb++) {
245
12.5M
            self->hyb_dir_out[ch][ts][hyb].re +=
246
12.5M
                self->hyb_diff_out[ch][ts][hyb].re;
247
12.5M
            self->hyb_dir_out[ch][ts][hyb].im +=
248
12.5M
                self->hyb_diff_out[ch][ts][hyb].im;
249
12.5M
            self->hyb_diff_out[ch][ts][hyb].re = 0;
250
12.5M
            self->hyb_diff_out[ch][ts][hyb].im = 0;
251
12.5M
          }
252
1.65M
        }
253
52.4k
      }
254
255
852k
      for (ts = 0; ts < self->time_slots; ts++)
256
826k
        ixheaacd_mps_subbandtp(self, ts);
257
258
67.2k
    } else {
259
67.2k
      WORD32 dif_s = ((self->res_bands == 0)
260
67.2k
                          ? 0
261
67.2k
                          : ixheaacd_mps_gain_set_indx[self->res_bands]);
262
201k
      for (ch = 0; ch < self->out_ch_count; ch++) {
263
5.38M
        for (ts = 0; ts < self->time_slots; ts++) {
264
184M
          for (hyb = dif_s; hyb < self->hyb_band_count_max; hyb++) {
265
179M
            self->hyb_dir_out[ch][ts][hyb].re +=
266
179M
                self->hyb_diff_out[ch][ts][hyb].re;
267
179M
            self->hyb_dir_out[ch][ts][hyb].im +=
268
179M
                self->hyb_diff_out[ch][ts][hyb].im;
269
179M
          }
270
5.24M
        }
271
134k
      }
272
67.2k
    }
273
93.4k
  }
274
275
111k
  ixheaacd_mps_qmf_hyb_synthesis(self);
276
277
111k
  if (self->ldmps_config.ldmps_present_flag != 1) {
278
325k
    for (ch = 0; ch < self->out_ch_count; ch++) {
279
216k
      err =
280
216k
          ixheaacd_sbr_dec_from_mps(&self->qmf_out_dir[ch][0][0].re, self->p_sbr_dec[ch],
281
216k
                                    self->p_sbr_frame[ch], self->p_sbr_header[ch], self->ec_flag);
282
216k
      if (err) return err;
283
216k
    }
284
108k
  }
285
286
111k
  if (self->object_type == AOT_ER_AAC_ELD || self->object_type == AOT_ER_AAC_LD)
287
2.72k
    self->synth_count = self->hyb_band_count[0];
288
108k
  else
289
108k
  {
290
108k
    if (ptr_frame_data->mps_sbr_flag) {
291
53.3k
      self->synth_count =
292
53.3k
        ptr_frame_data->pstr_sbr_header->pstr_freq_band_data->sub_band_end;
293
53.3k
    }
294
55.0k
    else {
295
55.0k
      self->synth_count = self->band_count[0];
296
55.0k
    }
297
108k
  }
298
299
111k
  ixheaacd_mps_synt_calc(self);
300
111k
  return err;
301
111k
}
302
303
224k
static VOID ixheaacd_subband_tp(ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ts) {
304
224k
  ia_mps_dec_tp_process_tables_struct *tp_process_table_ptr =
305
224k
      pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr;
306
224k
  const WORD32 *sqrt_tab =
307
224k
      pstr_mps_state->ia_mps_dec_mps_table.common_table_ptr->sqrt_tab;
308
224k
  ia_mps_dec_subband_tp_params_struct *sub_band_tp =
309
224k
      pstr_mps_state->mps_persistent_mem.sub_band_params;
310
224k
  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
311
312
224k
  WORD32 temp_1, temp_2;
313
224k
  WORD16 qtemp1, qtemp2;
314
224k
  WORD32 *qmf_output_real_dry;
315
224k
  WORD32 *qmf_output_imag_dry;
316
224k
  WORD32 *qmf_output_real_wet;
317
224k
  WORD32 *qmf_output_imag_wet;
318
319
224k
  WORD32 *dmx_real;
320
224k
  WORD32 *dmx_imag;
321
224k
  WORD32 *dry_ener;
322
224k
  WORD32 *wet_ener;
323
224k
  WORD16 *q_dry_ener;
324
224k
  WORD16 *q_wet_ener;
325
326
224k
  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
327
224k
  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
328
224k
  WORD32 *scale;
329
224k
  WORD16 *q_scale;
330
224k
  WORD32 damp, one_minus_damp;
331
224k
  WORD32 temp;
332
333
224k
  WORD32 *prev_tp_scale = sub_band_tp->prev_tp_scale;
334
335
224k
  WORD32 *old_wet_ener = sub_band_tp->old_wet_ener;
336
224k
  WORD16 *q_old_wet_ener = sub_band_tp->q_old_wet_ener;
337
338
224k
  WORD32 *run_wet_ener = sub_band_tp->run_wet_ener;
339
224k
  WORD16 *q_run_wet_ener = sub_band_tp->q_run_wet_ener;
340
341
224k
  WORD32 *old_dry_ener = sub_band_tp->old_dry_ener;
342
224k
  WORD16 *q_old_dry_ener = sub_band_tp->q_old_dry_ener;
343
344
224k
  WORD32 *run_dry_ener = sub_band_tp->run_dry_ener;
345
224k
  WORD16 *q_run_dry_ener = sub_band_tp->q_run_dry_ener;
346
347
224k
  WORD32 *hyb_output_real_dry, *hyb_output_imag_dry;
348
349
224k
  WORD32 *p_hyb_out_dry_real, *p_hyb_out_dry_imag;
350
351
224k
  WORD32 ch, n, no_scaling, i, k = 0, offset;
352
224k
  WORD32 i_lf = 0, i_rf = 0, i_c = 0, i_lfe = 0, i_ls = 0, i_rs = 0, i_al = 0, i_ar = 0;
353
354
224k
  WORD32 loop_counter = 0;
355
356
224k
  WORD32 num_input_channels = pstr_mps_state->num_input_channels;
357
224k
  WORD32 num_output_channels = pstr_mps_state->num_output_channels;
358
224k
  WORD32 hybrid_bands = pstr_mps_state->hybrid_bands;
359
360
224k
  WORD32 tree_config = pstr_mps_state->tree_config;
361
362
224k
  dry_ener = pstr_mps_state->mps_scratch_mem_v;
363
224k
  q_dry_ener = (WORD16 *)pstr_mps_state->mps_scratch_mem_v +
364
224k
               IXHEAAC_GET_SIZE_ALIGNED_TYPE(INPUT_CHX2, sizeof(*q_dry_ener), BYTE_ALIGN_8);
365
366
224k
  wet_ener =
367
224k
      dry_ener + IXHEAAC_GET_SIZE_ALIGNED_TYPE(INPUT_CHX1_5, sizeof(*wet_ener), BYTE_ALIGN_8);
368
224k
  q_wet_ener = q_dry_ener +
369
224k
               IXHEAAC_GET_SIZE_ALIGNED_TYPE(IN_CH_2XOUT_CH, sizeof(*q_wet_ener), BYTE_ALIGN_8);
370
371
224k
  scale = wet_ener + IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUTPUT_CHX1_5, sizeof(*scale), BYTE_ALIGN_8);
372
224k
  q_scale =
373
224k
      q_wet_ener + IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUTPUT_CHX3, sizeof(*q_scale), BYTE_ALIGN_8);
374
375
224k
  dmx_real =
376
224k
      scale + IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUTPUT_CHX1_5, sizeof(*dmx_real), BYTE_ALIGN_8);
377
224k
  dmx_imag =
378
224k
      dmx_real + IXHEAAC_GET_SIZE_ALIGNED_TYPE(IN_CHXBP_SIZE, sizeof(*dmx_imag), BYTE_ALIGN_8);
379
380
224k
  qmf_output_real_dry = dmx_imag + IXHEAAC_GET_SIZE_ALIGNED_TYPE(
381
224k
                                       IN_CHXBP_SIZE, sizeof(*qmf_output_real_dry), BYTE_ALIGN_8);
382
383
224k
  qmf_output_imag_dry =
384
224k
      qmf_output_real_dry +
385
224k
      IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUT_CHXQB, sizeof(*qmf_output_imag_dry), BYTE_ALIGN_8);
386
387
224k
  qmf_output_real_wet =
388
224k
      qmf_output_imag_dry +
389
224k
      IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUT_CHXQB, sizeof(*qmf_output_real_wet), BYTE_ALIGN_8);
390
391
224k
  qmf_output_imag_wet =
392
224k
      qmf_output_real_wet +
393
224k
      IXHEAAC_GET_SIZE_ALIGNED_TYPE(OUT_CHXQB, sizeof(*qmf_output_imag_wet), BYTE_ALIGN_8);
394
395
224k
  if (sub_band_tp->update_old_ener == STP_UPDATE_ENERGY_RATE) {
396
5.53k
    sub_band_tp->update_old_ener = 1;
397
36.2k
    for (ch = 0; ch < num_input_channels; ch++) {
398
30.7k
      old_dry_ener[ch] = run_dry_ener[ch];
399
30.7k
      q_old_dry_ener[ch] = q_run_dry_ener[ch];
400
30.7k
    }
401
49.3k
    for (ch = 0; ch < num_output_channels; ch++) {
402
43.7k
      old_wet_ener[ch] = run_wet_ener[ch];
403
43.7k
      q_old_wet_ener[ch] = q_run_wet_ener[ch];
404
43.7k
    }
405
5.53k
  } else
406
218k
    sub_band_tp->update_old_ener++;
407
408
2.01M
  for (ch = 0; ch < MAX_OUTPUT_CHANNELS_MPS; ch++) {
409
1.79M
    scale[ch] = ONE_IN_Q15;
410
1.79M
    q_scale[ch] = 15;
411
1.79M
  }
412
413
224k
  switch (tree_config) {
414
3.53k
    case TREE_5151:
415
3.53k
      i_lf = 0;
416
3.53k
      i_rf = 1;
417
3.53k
      i_c = 2;
418
3.53k
      i_lfe = 3;
419
3.53k
      i_ls = 4;
420
3.53k
      i_rs = 5;
421
3.53k
      loop_counter = 6;
422
3.53k
      break;
423
19.0k
    case TREE_5152:
424
19.0k
      i_lf = 0;
425
19.0k
      i_rf = 2;
426
19.0k
      i_c = 4;
427
19.0k
      i_lfe = 5;
428
19.0k
      i_ls = 1;
429
19.0k
      i_rs = 3;
430
19.0k
      loop_counter = 5;
431
19.0k
      break;
432
8.36k
    case TREE_525:
433
8.36k
      i_lf = 0;
434
8.36k
      i_rf = 2;
435
8.36k
      i_c = 4;
436
8.36k
      i_lfe = 5;
437
8.36k
      i_ls = 1;
438
8.36k
      i_rs = 3;
439
8.36k
      loop_counter = 4;
440
8.36k
      break;
441
15.2k
    case TREE_7271:
442
19.8k
    case TREE_7272:
443
188k
    case TREE_7572:
444
188k
      i_lf = 0;
445
188k
      i_rf = 3;
446
188k
      i_c = 6;
447
188k
      i_lfe = 7;
448
188k
      i_ls = 2;
449
188k
      i_rs = 5;
450
188k
      i_al = 1;
451
188k
      i_ar = 4;
452
188k
      loop_counter = 6;
453
188k
      break;
454
5.11k
    case TREE_7571:
455
5.11k
      i_lf = 0;
456
5.11k
      i_rf = 3;
457
5.11k
      i_c = 6;
458
5.11k
      i_lfe = 7;
459
5.11k
      i_ls = 2;
460
5.11k
      i_rs = 5;
461
5.11k
      i_al = 1;
462
5.11k
      i_ar = 4;
463
5.11k
      loop_counter = 5;
464
5.11k
      break;
465
0
    default:
466
0
      break;
467
224k
  }
468
469
224k
  offset = ts * MAX_HYBRID_BANDS;
470
224k
  p_buffer_real = p_array_struct->buf_real + offset + HYBRID_BAND_BORDER;
471
224k
  p_buffer_imag = p_array_struct->buf_imag + offset + HYBRID_BAND_BORDER;
472
473
1.95M
  for (ch = 0; ch < num_output_channels; ch++) {
474
1.73M
    p_buffer_re = p_buffer_real;
475
1.73M
    p_buffer_im = p_buffer_imag;
476
477
36.3M
    for (i = QMF_OUT_START_IDX; i < BP_SIZE; i++) {
478
34.6M
      *qmf_output_real_wet++ = *p_buffer_re++;
479
34.6M
      *qmf_output_imag_wet++ = *p_buffer_im++;
480
34.6M
    }
481
1.73M
    p_buffer_real += TSXHB;
482
1.73M
    p_buffer_imag += TSXHB;
483
1.73M
  }
484
224k
  i = QMF_OUT_OFFSET * num_output_channels;
485
224k
  qmf_output_real_wet -= i;
486
224k
  qmf_output_imag_wet -= i;
487
488
224k
  p_buffer_re = qmf_output_real_dry;
489
224k
  p_buffer_im = qmf_output_imag_dry;
490
491
224k
  hyb_output_real_dry =
492
224k
      p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 6;
493
224k
  hyb_output_imag_dry =
494
224k
      p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 6;
495
496
1.52M
  for (ch = 0; ch < loop_counter; ch++) {
497
1.30M
    *p_buffer_re++ = hyb_output_real_dry[0] + hyb_output_real_dry[1];
498
1.30M
    *p_buffer_im++ = hyb_output_imag_dry[0] + hyb_output_imag_dry[1];
499
500
1.30M
    hyb_output_real_dry += TSXHB;
501
1.30M
    hyb_output_imag_dry += TSXHB;
502
1.30M
  }
503
504
224k
  hyb_output_real_dry =
505
224k
      p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 8;
506
224k
  hyb_output_imag_dry =
507
224k
      p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 8;
508
509
1.52M
  for (ch = 0; ch < loop_counter; ch++) {
510
1.30M
    *p_buffer_re++ = hyb_output_real_dry[0] + hyb_output_real_dry[1];
511
1.30M
    *p_buffer_im++ = hyb_output_imag_dry[0] + hyb_output_imag_dry[1];
512
513
1.30M
    hyb_output_real_dry += TSXHB;
514
1.30M
    hyb_output_imag_dry += TSXHB;
515
1.30M
  }
516
517
224k
  p_hyb_out_dry_real =
518
224k
      p_array_struct->hyb_output_real_dry + ts * MAX_HYBRID_BANDS + 10;
519
224k
  p_hyb_out_dry_imag =
520
224k
      p_array_struct->hyb_output_imag_dry + ts * MAX_HYBRID_BANDS + 10;
521
522
5.15M
  for (i = 3; i < BP_SIZE; i++) {
523
4.93M
    hyb_output_real_dry = p_hyb_out_dry_real;
524
4.93M
    hyb_output_imag_dry = p_hyb_out_dry_imag;
525
526
33.6M
    for (ch = 0; ch < loop_counter; ch++) {
527
28.7M
      *p_buffer_re++ = *hyb_output_real_dry;
528
28.7M
      *p_buffer_im++ = *hyb_output_imag_dry;
529
530
28.7M
      hyb_output_real_dry += TSXHB;
531
28.7M
      hyb_output_imag_dry += TSXHB;
532
28.7M
    }
533
4.93M
    p_hyb_out_dry_real++;
534
4.93M
    p_hyb_out_dry_imag++;
535
4.93M
  }
536
537
5.60M
  for (n = 1; n < BP_SIZE; n++) {
538
5.38M
    switch (tree_config) {
539
84.8k
      case TREE_5151:
540
84.8k
        *dmx_real = *qmf_output_real_dry++;
541
84.8k
        *dmx_real += *qmf_output_real_dry++;
542
84.8k
        *dmx_real += *qmf_output_real_dry++;
543
84.8k
        qmf_output_real_dry++;
544
84.8k
        *dmx_real += *qmf_output_real_dry++;
545
84.8k
        *dmx_real += *qmf_output_real_dry++;
546
547
84.8k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
548
84.8k
                                               tp_process_table_ptr->bpxgf[n]);
549
84.8k
        dmx_real++;
550
84.8k
        dmx_real++;
551
552
84.8k
        break;
553
456k
      case TREE_5152:
554
456k
        *dmx_real = *qmf_output_real_dry++;
555
456k
        *dmx_real += *qmf_output_real_dry++;
556
456k
        *dmx_real += *qmf_output_real_dry++;
557
456k
        *dmx_real += *qmf_output_real_dry++;
558
456k
        *dmx_real += *qmf_output_real_dry++;
559
560
456k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
561
456k
                                               tp_process_table_ptr->bpxgf[n]);
562
456k
        dmx_real++;
563
456k
        dmx_real++;
564
565
456k
        break;
566
200k
      case TREE_525:
567
200k
        *dmx_real = *qmf_output_real_dry++;
568
200k
        *dmx_real += *qmf_output_real_dry++;
569
200k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
570
200k
                                               tp_process_table_ptr->bpxgf[n]);
571
200k
        dmx_real++;
572
573
200k
        *dmx_real = *qmf_output_real_dry++;
574
200k
        *dmx_real += *qmf_output_real_dry++;
575
200k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
576
200k
                                               tp_process_table_ptr->bpxgf[n]);
577
200k
        dmx_real++;
578
579
200k
        break;
580
364k
      case TREE_7271:
581
475k
      case TREE_7272:
582
475k
        *dmx_real = *qmf_output_real_dry++;
583
475k
        *dmx_real += *qmf_output_real_dry++;
584
475k
        *dmx_real += *qmf_output_real_dry++;
585
586
475k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
587
475k
                                               tp_process_table_ptr->bpxgf[n]);
588
475k
        dmx_real++;
589
590
475k
        *dmx_real = *qmf_output_real_dry++;
591
475k
        *dmx_real += *qmf_output_real_dry++;
592
475k
        *dmx_real += *qmf_output_real_dry++;
593
594
475k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
595
475k
                                               tp_process_table_ptr->bpxgf[n]);
596
475k
        dmx_real++;
597
598
475k
        break;
599
122k
      case TREE_7571:
600
601
122k
        *dmx_real = *qmf_output_real_dry++;
602
122k
        *dmx_real += *qmf_output_real_dry++;
603
604
122k
        qmf_output_real_dry++;
605
606
122k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
607
122k
                                               tp_process_table_ptr->bpxgf[n]);
608
122k
        dmx_real++;
609
610
122k
        *dmx_real = *qmf_output_real_dry++;
611
122k
        *dmx_real += *qmf_output_real_dry++;
612
613
122k
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
614
122k
                                               tp_process_table_ptr->bpxgf[n]);
615
122k
        dmx_real++;
616
617
122k
        break;
618
4.04M
      case TREE_7572:
619
4.04M
        qmf_output_real_dry++;
620
4.04M
        *dmx_real = *qmf_output_real_dry++;
621
4.04M
        *dmx_real += *qmf_output_real_dry++;
622
623
4.04M
        qmf_output_real_dry++;
624
4.04M
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
625
4.04M
                                               tp_process_table_ptr->bpxgf[n]);
626
4.04M
        dmx_real++;
627
628
4.04M
        *dmx_real = *qmf_output_real_dry++;
629
4.04M
        *dmx_real += *qmf_output_real_dry++;
630
631
4.04M
        *dmx_real = ixheaacd_mps_mult32_shr_30(*dmx_real,
632
4.04M
                                               tp_process_table_ptr->bpxgf[n]);
633
4.04M
        dmx_real++;
634
635
4.04M
        break;
636
0
      default:
637
0
        break;
638
5.38M
    }
639
5.38M
  }
640
224k
  dmx_real -= DMX_OFFSET;
641
642
5.60M
  for (n = 1; n < BP_SIZE; n++) {
643
5.38M
    switch (tree_config) {
644
84.8k
      case TREE_5151:
645
84.8k
        *dmx_imag = *qmf_output_imag_dry++;
646
84.8k
        *dmx_imag += *qmf_output_imag_dry++;
647
84.8k
        *dmx_imag += *qmf_output_imag_dry++;
648
649
84.8k
        qmf_output_imag_dry++;
650
651
84.8k
        *dmx_imag += *qmf_output_imag_dry++;
652
84.8k
        *dmx_imag++ += *qmf_output_imag_dry++;
653
654
84.8k
        dmx_imag++;
655
656
84.8k
        dmx_imag[0] = ixheaacd_mps_mult32_shr_30(
657
84.8k
            dmx_imag[0], tp_process_table_ptr->bpxgf[n]);
658
84.8k
        break;
659
456k
      case TREE_5152:
660
661
456k
        *dmx_imag = *qmf_output_imag_dry++;
662
456k
        *dmx_imag += *qmf_output_imag_dry++;
663
456k
        *dmx_imag += *qmf_output_imag_dry++;
664
665
456k
        *dmx_imag += *qmf_output_imag_dry++;
666
456k
        *dmx_imag++ += *qmf_output_imag_dry++;
667
668
456k
        dmx_imag++;
669
670
456k
        dmx_imag[0] = ixheaacd_mps_mult32_shr_30(
671
456k
            dmx_imag[0], tp_process_table_ptr->bpxgf[n]);
672
456k
        break;
673
200k
      case TREE_525:
674
200k
        *dmx_imag = *qmf_output_imag_dry++;
675
200k
        *dmx_imag += *qmf_output_imag_dry++;
676
200k
        *dmx_imag = ixheaacd_mps_mult32_shr_30(dmx_imag[0],
677
200k
                                               tp_process_table_ptr->bpxgf[n]);
678
200k
        dmx_imag++;
679
680
200k
        *dmx_imag = *qmf_output_imag_dry++;
681
200k
        *dmx_imag += *qmf_output_imag_dry++;
682
200k
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
683
200k
                                               tp_process_table_ptr->bpxgf[n]);
684
200k
        dmx_imag++;
685
200k
        break;
686
364k
      case TREE_7271:
687
475k
      case TREE_7272:
688
475k
        *dmx_imag = *qmf_output_imag_dry++;
689
475k
        *dmx_imag += *qmf_output_imag_dry++;
690
475k
        *dmx_imag += *qmf_output_imag_dry++;
691
475k
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
692
475k
                                               tp_process_table_ptr->bpxgf[n]);
693
475k
        dmx_imag++;
694
695
475k
        *dmx_imag = *qmf_output_imag_dry++;
696
475k
        *dmx_imag += *qmf_output_imag_dry++;
697
475k
        *dmx_imag += *qmf_output_imag_dry++;
698
699
475k
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
700
475k
                                               tp_process_table_ptr->bpxgf[n]);
701
475k
        dmx_imag++;
702
703
475k
        break;
704
122k
      case TREE_7571:
705
122k
        *dmx_imag = *qmf_output_imag_dry++;
706
122k
        *dmx_imag += *qmf_output_imag_dry++;
707
122k
        qmf_output_imag_dry++;
708
122k
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
709
122k
                                               tp_process_table_ptr->bpxgf[n]);
710
122k
        dmx_imag++;
711
712
122k
        *dmx_imag = *qmf_output_imag_dry++;
713
122k
        *dmx_imag += *qmf_output_imag_dry++;
714
122k
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
715
122k
                                               tp_process_table_ptr->bpxgf[n]);
716
122k
        dmx_imag++;
717
718
122k
        break;
719
4.04M
      case TREE_7572:
720
4.04M
        qmf_output_imag_dry++;
721
722
4.04M
        *dmx_imag = *qmf_output_imag_dry++;
723
4.04M
        *dmx_imag += *qmf_output_imag_dry++;
724
725
4.04M
        qmf_output_imag_dry++;
726
727
4.04M
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
728
4.04M
                                               tp_process_table_ptr->bpxgf[n]);
729
4.04M
        dmx_imag++;
730
731
4.04M
        *dmx_imag = *qmf_output_imag_dry++;
732
4.04M
        *dmx_imag += *qmf_output_imag_dry++;
733
4.04M
        *dmx_imag = ixheaacd_mps_mult32_shr_30(*dmx_imag,
734
4.04M
                                               tp_process_table_ptr->bpxgf[n]);
735
4.04M
        dmx_imag++;
736
737
4.04M
        break;
738
0
      default:
739
0
        break;
740
5.38M
    }
741
5.38M
  }
742
224k
  dmx_imag -= DMX_OFFSET;
743
744
650k
  for (ch = 0; ch < min(2, num_input_channels); ch++) {
745
426k
    dry_ener[ch] = 0;
746
426k
    q_dry_ener[ch] = 15;
747
748
10.6M
    for (n = 1; n < BP_SIZE; n++) {
749
10.2M
      qtemp1 = 10;
750
10.2M
      temp_1 = ixheaacd_mps_mult32(*dmx_real, *dmx_real, &qtemp1, qtemp1);
751
10.2M
      dmx_real += 2;
752
10.2M
      dry_ener[ch] =
753
10.2M
          ixheaacd_mps_add32(dry_ener[ch], temp_1, &q_dry_ener[ch], qtemp1);
754
755
10.2M
      qtemp1 = 10;
756
10.2M
      temp_1 = ixheaacd_mps_mult32(*dmx_imag, *dmx_imag, &qtemp1, qtemp1);
757
10.2M
      dmx_imag += 2;
758
10.2M
      dry_ener[ch] =
759
10.2M
          ixheaacd_mps_add32(dry_ener[ch], temp_1, &q_dry_ener[ch], qtemp1);
760
10.2M
    }
761
426k
    dmx_real -= DMX_OFFSET_MINUS_ONE;
762
426k
    dmx_imag -= DMX_OFFSET_MINUS_ONE;
763
764
426k
    temp_1 = ixheaacd_mps_mult32_shr_15(run_dry_ener[ch], STP_LPF_COEFF1_FIX);
765
766
426k
    temp_2 = ONE_IN_Q15 - STP_LPF_COEFF1_FIX;
767
426k
    temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, dry_ener[ch]);
768
769
426k
    run_dry_ener[ch] = ixheaacd_mps_add32(temp_1, temp_2, &(q_run_dry_ener[ch]),
770
426k
                                          q_dry_ener[ch]);
771
772
426k
    qtemp1 = q_old_dry_ener[ch];
773
426k
    temp_1 = ixheaacd_mps_add32(old_dry_ener[ch], ABS_THR_FIX, &qtemp1, 15);
774
426k
    ;
775
776
426k
    dry_ener[ch] = ixheaacd_mps_div_32(dry_ener[ch], temp_1, &qtemp2);
777
426k
    q_dry_ener[ch] = qtemp2 + q_dry_ener[ch] - qtemp1;
778
426k
  }
779
780
1.95M
  for (ch = 0; ch < num_output_channels; ch++) {
781
1.73M
    if (ch == i_lfe) continue;
782
1.50M
    if ((tree_config >= TREE_525) && (ch == i_c)) continue;
783
1.30M
    if ((tree_config == TREE_7571) && ((ch == i_ls) || (ch == i_rs))) continue;
784
1.29M
    if ((tree_config == TREE_7572) && ((ch == i_lf) || (ch == i_rf))) continue;
785
786
959k
    wet_ener[ch] = 0;
787
959k
    q_wet_ener[ch] = 15;
788
789
959k
    wet_ener[ch] = 0;
790
959k
    q_wet_ener[ch] = 15;
791
20.1M
    for (n = FIVE; n < BP_SIZE; n++) {
792
19.1M
      qtemp1 = 10;
793
19.1M
      temp_1 = ixheaacd_mps_mult32(*qmf_output_real_wet, *qmf_output_real_wet,
794
19.1M
                                   &qtemp1, qtemp1);
795
19.1M
      qmf_output_real_wet++;
796
797
19.1M
      qtemp2 = 10;
798
19.1M
      temp_2 = ixheaacd_mps_mult32(*qmf_output_imag_wet, *qmf_output_imag_wet,
799
19.1M
                                   &qtemp2, qtemp2);
800
19.1M
      qmf_output_imag_wet++;
801
802
19.1M
      temp_1 = ixheaacd_mps_add32(temp_1, temp_2, &qtemp1, qtemp2);
803
804
19.1M
      temp_1 = ixheaacd_mps_mult32(temp_1, tp_process_table_ptr->bp2xgf2[n],
805
19.1M
                                   &qtemp1, 57);
806
807
19.1M
      wet_ener[ch] =
808
19.1M
          ixheaacd_mps_add32(wet_ener[ch], temp_1, &q_wet_ener[ch], qtemp1);
809
19.1M
    }
810
959k
    temp_1 = ixheaacd_mps_mult32_shr_15(run_wet_ener[ch], STP_LPF_COEFF1_FIX);
811
812
959k
    temp_2 = ONE_IN_Q15 - STP_LPF_COEFF1_FIX;
813
814
959k
    temp_2 = ixheaacd_mps_mult32_shr_15(temp_2, wet_ener[ch]);
815
816
959k
    run_wet_ener[ch] =
817
959k
        ixheaacd_mps_add32(temp_1, temp_2, &q_run_wet_ener[ch], q_wet_ener[ch]);
818
819
959k
    qtemp1 = q_old_wet_ener[ch];
820
959k
    temp_1 = ixheaacd_mps_add32(old_wet_ener[ch], ABS_THR_FIX, &qtemp1, 15);
821
822
959k
    wet_ener[ch] = ixheaacd_mps_div_32(wet_ener[ch], temp_1, &qtemp2);
823
959k
    q_wet_ener[ch] = qtemp2 + q_wet_ener[ch] - qtemp1;
824
959k
  }
825
826
224k
  damp = POINT_ONE_Q15;
827
224k
  one_minus_damp = POINT_NINE_Q15;
828
224k
  switch (tree_config) {
829
3.53k
    case TREE_5151:
830
22.5k
    case TREE_5152:
831
22.5k
      if (wet_ener[i_lf] != 0) {
832
10.1k
        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
833
10.1k
        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
834
12.3k
      } else {
835
12.3k
        temp_1 = ixheaac_norm32(dry_ener[0]);
836
12.3k
        scale[i_lf] = dry_ener[0] << temp_1;
837
12.3k
        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
838
12.3k
      }
839
22.5k
      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
840
841
22.5k
      if (wet_ener[i_rf] != 0) {
842
10.1k
        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_rf], &qtemp2);
843
10.1k
        q_scale[i_rf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_rf];
844
12.4k
      } else {
845
12.4k
        temp_1 = ixheaac_norm32(dry_ener[0]);
846
12.4k
        scale[i_rf] = dry_ener[0] << temp_1;
847
12.4k
        q_scale[i_rf] = q_dry_ener[0] + temp_1 - 30;
848
12.4k
      }
849
22.5k
      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
850
851
22.5k
      if (wet_ener[i_c] != 0) {
852
6.84k
        scale[i_c] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_c], &qtemp2);
853
6.84k
        q_scale[i_c] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_c];
854
15.7k
      } else {
855
15.7k
        temp_1 = ixheaac_norm32(dry_ener[0]);
856
15.7k
        scale[i_c] = dry_ener[0] << temp_1;
857
15.7k
        q_scale[i_c] = q_dry_ener[0] + temp_1 - 30;
858
15.7k
      }
859
22.5k
      scale[i_c] = ixheaacd_mps_sqrt(scale[i_c], &(q_scale[i_c]), sqrt_tab);
860
861
22.5k
      if (wet_ener[i_ls] != 0) {
862
7.38k
        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
863
7.38k
        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
864
15.1k
      } else {
865
15.1k
        temp_1 = ixheaac_norm32(dry_ener[0]);
866
15.1k
        scale[i_ls] = dry_ener[0] << temp_1;
867
15.1k
        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
868
15.1k
      }
869
22.5k
      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
870
871
22.5k
      if (wet_ener[i_rs] != 0) {
872
8.14k
        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_rs], &qtemp2);
873
8.14k
        q_scale[i_rs] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_rs];
874
14.4k
      } else {
875
14.4k
        temp_1 = ixheaac_norm32(dry_ener[0]);
876
14.4k
        scale[i_rs] = dry_ener[0] << temp_1;
877
14.4k
        q_scale[i_rs] = q_dry_ener[0] + temp_1 - 30;
878
14.4k
      }
879
22.5k
      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
880
881
158k
      for (ch = 0; ch < 6; ch++) {
882
135k
        if (ch == 3 && tree_config == 0) continue;
883
131k
        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
884
131k
        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
885
131k
        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
886
131k
        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
887
131k
        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
888
58.8k
          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
889
131k
      }
890
891
22.5k
      break;
892
8.36k
    case TREE_525:
893
8.36k
      if (wet_ener[i_lf] != 0) {
894
1.02k
        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
895
1.02k
        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
896
7.33k
      } else {
897
7.33k
        temp_1 = ixheaac_norm32(dry_ener[0]);
898
7.33k
        scale[i_lf] = dry_ener[0] << temp_1;
899
7.33k
        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
900
7.33k
      }
901
8.36k
      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
902
903
8.36k
      if (wet_ener[i_rf] != 0) {
904
1.09k
        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
905
1.09k
        q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
906
7.26k
      } else {
907
7.26k
        temp_1 = ixheaac_norm32(dry_ener[1]);
908
7.26k
        scale[i_rf] = dry_ener[1] << temp_1;
909
7.26k
        q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
910
7.26k
      }
911
8.36k
      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
912
913
8.36k
      if (wet_ener[i_ls] != 0) {
914
953
        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
915
953
        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
916
7.40k
      } else {
917
7.40k
        temp_1 = ixheaac_norm32(dry_ener[0]);
918
7.40k
        scale[i_ls] = dry_ener[0] << temp_1;
919
7.40k
        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
920
7.40k
      }
921
8.36k
      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
922
923
8.36k
      if (wet_ener[i_rs] != 0) {
924
1.06k
        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
925
1.06k
        q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
926
7.29k
      } else {
927
7.29k
        temp_1 = ixheaac_norm32(dry_ener[1]);
928
7.29k
        scale[i_rs] = dry_ener[1] << temp_1;
929
7.29k
        q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
930
7.29k
      }
931
8.36k
      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
932
933
41.8k
      for (ch = 0; ch < 4; ch++) {
934
33.4k
        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
935
33.4k
        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
936
33.4k
        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
937
33.4k
        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
938
33.4k
        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
939
24.6k
          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
940
33.4k
      }
941
8.36k
      break;
942
15.2k
    case TREE_7271:
943
19.8k
    case TREE_7272:
944
19.8k
      if (wet_ener[i_lf] != 0) {
945
1.09k
        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
946
1.09k
        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
947
18.7k
      } else {
948
18.7k
        temp_1 = ixheaac_norm32(dry_ener[0]);
949
18.7k
        scale[i_lf] = dry_ener[0] << temp_1;
950
18.7k
        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
951
18.7k
      }
952
19.8k
      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
953
954
19.8k
      if (wet_ener[i_rf] != 0) {
955
1.61k
        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
956
1.61k
        q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
957
18.1k
      } else {
958
18.1k
        temp_1 = ixheaac_norm32(dry_ener[1]);
959
18.1k
        scale[i_rf] = dry_ener[1] << temp_1;
960
18.1k
        q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
961
18.1k
      }
962
19.8k
      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
963
964
19.8k
      if (wet_ener[i_ls] != 0) {
965
548
        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
966
548
        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
967
19.2k
      } else {
968
19.2k
        temp_1 = ixheaac_norm32(dry_ener[0]);
969
19.2k
        scale[i_ls] = dry_ener[0] << temp_1;
970
19.2k
        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
971
19.2k
      }
972
19.8k
      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
973
974
19.8k
      if (wet_ener[i_rs] != 0) {
975
1.05k
        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
976
1.05k
        q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
977
18.7k
      } else {
978
18.7k
        temp_1 = ixheaac_norm32(dry_ener[1]);
979
18.7k
        scale[i_rs] = dry_ener[1] << temp_1;
980
18.7k
        q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
981
18.7k
      }
982
19.8k
      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
983
984
19.8k
      if (wet_ener[i_al] != 0) {
985
799
        scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
986
799
        q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
987
19.0k
      } else {
988
19.0k
        temp_1 = ixheaac_norm32(dry_ener[0]);
989
19.0k
        scale[i_al] = dry_ener[0] << temp_1;
990
19.0k
        q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
991
19.0k
      }
992
19.8k
      scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
993
994
19.8k
      if (wet_ener[i_ar] != 0) {
995
741
        scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
996
741
        q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
997
19.0k
      } else {
998
19.0k
        temp_1 = ixheaac_norm32(dry_ener[1]);
999
19.0k
        scale[i_ar] = dry_ener[1] << temp_1;
1000
19.0k
        q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
1001
19.0k
      }
1002
19.8k
      scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
1003
1004
138k
      for (ch = 0; ch < 6; ch++) {
1005
118k
        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
1006
118k
        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
1007
118k
        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
1008
118k
        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
1009
118k
        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
1010
63.7k
          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
1011
118k
      }
1012
1013
19.8k
      break;
1014
5.11k
    case TREE_7571:
1015
5.11k
      if (wet_ener[i_lf] != 0) {
1016
278
        scale[i_lf] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_lf], &qtemp2);
1017
278
        q_scale[i_lf] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_lf];
1018
4.83k
      } else {
1019
4.83k
        temp_1 = ixheaac_norm32(dry_ener[0]);
1020
4.83k
        scale[i_lf] = dry_ener[0] << temp_1;
1021
4.83k
        q_scale[i_lf] = q_dry_ener[0] + temp_1 - 30;
1022
4.83k
      }
1023
5.11k
      scale[i_lf] = ixheaacd_mps_sqrt(scale[i_lf], &(q_scale[i_lf]), sqrt_tab);
1024
1025
5.11k
      if (wet_ener[i_rf] != 0) {
1026
0
        scale[i_rf] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rf], &qtemp2);
1027
0
        q_scale[i_rf] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rf];
1028
5.11k
      } else {
1029
5.11k
        temp_1 = ixheaac_norm32(dry_ener[1]);
1030
5.11k
        scale[i_rf] = dry_ener[1] << temp_1;
1031
5.11k
        q_scale[i_rf] = q_dry_ener[1] + temp_1 - 30;
1032
5.11k
      }
1033
5.11k
      scale[i_rf] = ixheaacd_mps_sqrt(scale[i_rf], &(q_scale[i_rf]), sqrt_tab);
1034
1035
5.11k
      if (wet_ener[i_al] != 0) {
1036
268
        scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
1037
268
        q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
1038
4.84k
      } else {
1039
4.84k
        temp_1 = ixheaac_norm32(dry_ener[0]);
1040
4.84k
        scale[i_al] = dry_ener[0] << temp_1;
1041
4.84k
        q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
1042
4.84k
      }
1043
5.11k
      scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
1044
1045
5.11k
      if (wet_ener[i_ar] != 0) {
1046
158
        scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
1047
158
        q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
1048
4.95k
      } else {
1049
4.95k
        temp_1 = ixheaac_norm32(dry_ener[1]);
1050
4.95k
        scale[i_ar] = dry_ener[1] << temp_1;
1051
4.95k
        q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
1052
4.95k
      }
1053
5.11k
      scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
1054
30.6k
      for (ch = 0; ch < FIVE; ch++) {
1055
25.5k
        if (ch == 2) continue;
1056
20.4k
        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
1057
20.4k
        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
1058
20.4k
        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
1059
20.4k
        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
1060
20.4k
        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
1061
7.94k
          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
1062
20.4k
      }
1063
1064
5.11k
      break;
1065
168k
    case TREE_7572:
1066
168k
      if (wet_ener[i_ls] != 0) {
1067
2.22k
        scale[i_ls] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_ls], &qtemp2);
1068
2.22k
        q_scale[i_ls] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_ls];
1069
166k
      } else {
1070
166k
        temp_1 = ixheaac_norm32(dry_ener[0]);
1071
166k
        scale[i_ls] = dry_ener[0] << temp_1;
1072
166k
        q_scale[i_ls] = q_dry_ener[0] + temp_1 - 30;
1073
166k
      }
1074
168k
      scale[i_ls] = ixheaacd_mps_sqrt(scale[i_ls], &(q_scale[i_ls]), sqrt_tab);
1075
1076
168k
      if (wet_ener[i_rs] != 0) {
1077
0
        scale[i_rs] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_rs], &qtemp2);
1078
0
        q_scale[i_rs] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_rs];
1079
168k
      } else {
1080
168k
        temp_1 = ixheaac_norm32(dry_ener[1]);
1081
168k
        scale[i_rs] = dry_ener[1] << temp_1;
1082
168k
        q_scale[i_rs] = q_dry_ener[1] + temp_1 - 30;
1083
168k
      }
1084
168k
      scale[i_rs] = ixheaacd_mps_sqrt(scale[i_rs], &(q_scale[i_rs]), sqrt_tab);
1085
1086
168k
      if (wet_ener[i_al] != 0) {
1087
0
        scale[i_al] = ixheaacd_mps_div_32(dry_ener[0], wet_ener[i_al], &qtemp2);
1088
0
        q_scale[i_al] = qtemp2 + q_dry_ener[0] - q_wet_ener[i_al];
1089
168k
      } else {
1090
168k
        temp_1 = ixheaac_norm32(dry_ener[0]);
1091
168k
        scale[i_al] = dry_ener[0] << temp_1;
1092
168k
        q_scale[i_al] = q_dry_ener[0] + temp_1 - 30;
1093
168k
      }
1094
168k
      scale[i_al] = ixheaacd_mps_sqrt(scale[i_al], &(q_scale[i_al]), sqrt_tab);
1095
1096
168k
      if (wet_ener[i_ar] != 0) {
1097
2.23k
        scale[i_ar] = ixheaacd_mps_div_32(dry_ener[1], wet_ener[i_ar], &qtemp2);
1098
2.23k
        q_scale[i_ar] = qtemp2 + q_dry_ener[1] - q_wet_ener[i_ar];
1099
166k
      } else {
1100
166k
        temp_1 = ixheaac_norm32(dry_ener[1]);
1101
166k
        scale[i_ar] = dry_ener[1] << temp_1;
1102
166k
        q_scale[i_ar] = q_dry_ener[1] + temp_1 - 30;
1103
166k
      }
1104
168k
      scale[i_ar] = ixheaacd_mps_sqrt(scale[i_ar], &(q_scale[i_ar]), sqrt_tab);
1105
1.17M
      for (ch = 0; ch < 6; ch++) {
1106
1.01M
        if (ch == 3 || ch == 0) continue;
1107
673k
        temp_1 = ixheaacd_mps_mult32_shr_15(scale[ch], one_minus_damp);
1108
673k
        scale[ch] = ixheaacd_mps_add32(temp_1, damp, &(q_scale[ch]), 15);
1109
673k
        scale[ch] = ixheaacd_mps_convert_to_qn(scale[ch], q_scale[ch], 15);
1110
673k
        if (scale[ch] > STP_SCALE_LIMIT_FIX) scale[ch] = STP_SCALE_LIMIT_FIX;
1111
673k
        if (scale[ch] < ONE_BY_STP_SCALE_LIMIT)
1112
48.0k
          scale[ch] = ONE_BY_STP_SCALE_LIMIT;
1113
673k
      }
1114
1115
168k
      break;
1116
0
    default:
1117
0
      break;
1118
224k
  }
1119
1120
1.95M
  for (ch = 0; ch < num_output_channels; ch++) {
1121
1.73M
    temp_1 = ixheaacd_mps_mult32_shr_15(STP_LPF_COEFF2_FIX, scale[ch]);
1122
1.73M
    temp_2 =
1123
1.73M
        ixheaacd_mps_mult32_shr_15(ONE_MINUS_STP_LPF_COEFF2, prev_tp_scale[ch]);
1124
1.73M
    scale[ch] = temp_1 + temp_2;
1125
1.73M
    prev_tp_scale[ch] = scale[ch];
1126
1.73M
  }
1127
1128
224k
  offset = ts * MAX_HYBRID_BANDS;
1129
224k
  p_buffer_real = p_array_struct->buf_real + offset + HYBRID_BAND_BORDER;
1130
224k
  p_buffer_imag = p_array_struct->buf_imag + offset + HYBRID_BAND_BORDER;
1131
1132
224k
  p_buf_real = p_array_struct->buffer_real + offset + FIVE;
1133
224k
  p_buf_imag = p_array_struct->buffer_imag + offset + FIVE;
1134
1135
224k
  p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry +
1136
224k
                       ts * MAX_HYBRID_BANDS + HYBRID_BAND_BORDER;
1137
224k
  p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry +
1138
224k
                       ts * MAX_HYBRID_BANDS + HYBRID_BAND_BORDER;
1139
1140
1.95M
  for (ch = 0; ch < num_output_channels; ch++) {
1141
1.73M
    no_scaling = 1;
1142
1143
1.73M
    ixheaacd_get_ch_idx(pstr_mps_state, ch, &i);
1144
1.73M
    if (i != -1) {
1145
959k
      no_scaling = !pstr_mps_state->aux_struct->temp_shape_enable_channel_stp[i];
1146
959k
    }
1147
1.73M
    p_buffer_re = p_buffer_real;
1148
1.73M
    p_buffer_im = p_buffer_imag;
1149
1150
1.73M
    p_buf_re = p_buf_real;
1151
1.73M
    p_buf_im = p_buf_imag;
1152
1153
1.73M
    hyb_output_real_dry = p_hyb_out_dry_real;
1154
1.73M
    hyb_output_imag_dry = p_hyb_out_dry_imag;
1155
1156
1.73M
    if (no_scaling == 1) {
1157
8.33M
      for (n = HYBRID_BAND_BORDER; n < (HP_SIZE + QMF_TO_HYB_OFFSET); n++) {
1158
6.67M
        *p_buf_re++ = *hyb_output_real_dry++ + *p_buffer_re++;
1159
1160
6.67M
        *p_buf_im++ = *hyb_output_imag_dry++ + *p_buffer_im++;
1161
6.67M
      }
1162
1163
56.0M
      for (; n < hybrid_bands; n++, k++) {
1164
54.3M
        temp = (no_scaling ? ONE_IN_Q15 : scale[ch]);
1165
1166
54.3M
        *p_buf_re++ = *hyb_output_real_dry++ + *p_buffer_re++;
1167
1168
54.3M
        *p_buf_im++ = *hyb_output_imag_dry++ + *p_buffer_im++;
1169
54.3M
      }
1170
1.66M
    } else {
1171
324k
      for (n = HYBRID_BAND_BORDER; n < (HP_SIZE + QMF_TO_HYB_OFFSET); n++) {
1172
259k
        temp = ixheaacd_mps_mult32_shr_30(
1173
259k
            scale[ch], tp_process_table_ptr->bp[n - QMF_TO_HYB_OFFSET]);
1174
1175
259k
        *p_buf_re++ = *hyb_output_real_dry++ +
1176
259k
                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_re);
1177
259k
        p_buffer_re++;
1178
1179
259k
        *p_buf_im++ = *hyb_output_imag_dry++ +
1180
259k
                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_im);
1181
259k
        p_buffer_im++;
1182
259k
      }
1183
1184
2.05M
      for (; n < hybrid_bands; n++, k++) {
1185
1.98M
        temp = (no_scaling ? ONE_IN_Q15 : scale[ch]);
1186
1187
1.98M
        *p_buf_re++ = *hyb_output_real_dry++ +
1188
1.98M
                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_re);
1189
1.98M
        p_buffer_re++;
1190
1191
1.98M
        *p_buf_im++ = *hyb_output_imag_dry++ +
1192
1.98M
                      ixheaacd_mps_mult32_shr_15(temp, *p_buffer_im);
1193
1.98M
        p_buffer_im++;
1194
1.98M
      }
1195
64.8k
    }
1196
1197
1.73M
    p_buffer_real += TSXHB;
1198
1.73M
    p_buffer_imag += TSXHB;
1199
1200
1.73M
    p_buf_real += TSXHB;
1201
1.73M
    p_buf_imag += TSXHB;
1202
1203
1.73M
    p_hyb_out_dry_real += TSXHB;
1204
1.73M
    p_hyb_out_dry_imag += TSXHB;
1205
1.73M
  }
1206
1207
224k
  return;
1208
224k
}
1209
1210
14.7k
VOID ixheaacd_tp_process(ia_heaac_mps_state_struct *pstr_mps_state) {
1211
14.7k
  WORD32 ch, ts, hyb, n;
1212
14.7k
  WORD32 temp, temp_1, temp_2;
1213
14.7k
  ia_mps_dec_synthesis_interface *syn = pstr_mps_state->syn;
1214
14.7k
  WORD32 *hyb_output_real_wet, *hyb_output_imag_wet;
1215
14.7k
  WORD32 *hyb_output_real_dry, *hyb_output_imag_dry;
1216
1217
14.7k
  WORD32 *p_buffer_real, *p_buffer_imag, *p_buffer_re, *p_buffer_im;
1218
14.7k
  WORD32 *p_buf_real, *p_buf_imag, *p_buf_re, *p_buf_im;
1219
14.7k
  WORD32 *buf_real, *buf_imag;
1220
1221
14.7k
  WORD32 num_output_channels = pstr_mps_state->num_output_channels;
1222
14.7k
  WORD32 time_slots = pstr_mps_state->time_slots;
1223
14.7k
  WORD32 qmf_bands = pstr_mps_state->qmf_bands;
1224
14.7k
  WORD32 num_output_channels_at = pstr_mps_state->num_output_channels_at;
1225
14.7k
  WORD32 tree_config = pstr_mps_state->tree_config;
1226
14.7k
  WORD32 up_mix_type = pstr_mps_state->up_mix_type;
1227
14.7k
  WORD32 tp_hyb_band_border = pstr_mps_state->tp_hyb_band_border;
1228
1229
14.7k
  ia_mps_dec_reuse_array_struct *p_array_struct = pstr_mps_state->array_struct;
1230
14.7k
  WORD32 *p_hyb_out_dry_real = p_array_struct->hyb_output_real_dry;
1231
14.7k
  WORD32 *p_hyb_out_dry_imag = p_array_struct->hyb_output_imag_dry;
1232
14.7k
  WORD32 *p_hyb_out_dry_re, *p_hyb_out_dry_im;
1233
1234
14.7k
  WORD32 *p_time_out;
1235
1236
14.7k
  p_buffer_real = p_array_struct->buf_real;
1237
14.7k
  p_buffer_imag = p_array_struct->buf_imag;
1238
1239
14.7k
  p_buf_real = p_array_struct->buffer_real;
1240
14.7k
  p_buf_imag = p_array_struct->buffer_imag;
1241
1242
14.7k
  if (!pstr_mps_state->scaling_enable) {
1243
60.5k
    for (ch = 0; ch < num_output_channels; ch++) {
1244
53.6k
      p_buffer_re = p_buffer_real;
1245
53.6k
      p_buffer_im = p_buffer_imag;
1246
1247
53.6k
      p_buf_re = p_buf_real;
1248
53.6k
      p_buf_im = p_buf_imag;
1249
1250
53.6k
      p_hyb_out_dry_re = p_hyb_out_dry_real;
1251
53.6k
      p_hyb_out_dry_im = p_hyb_out_dry_imag;
1252
1253
1.70M
      for (ts = 0; ts < time_slots; ts++) {
1254
1.64M
        hyb_output_real_wet = p_buffer_re;
1255
1.64M
        hyb_output_imag_wet = p_buffer_im;
1256
1.64M
        hyb_output_real_dry = p_hyb_out_dry_re;
1257
1.64M
        hyb_output_imag_dry = p_hyb_out_dry_im;
1258
1259
1.64M
        buf_real = p_buf_re;
1260
1.64M
        buf_imag = p_buf_im;
1261
1262
1.64M
        temp_1 = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1263
1.64M
        temp_2 = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1264
9.87M
        for (n = 1; n < 6; n++) {
1265
8.23M
          temp_1 += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1266
8.23M
          temp_2 += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1267
8.23M
        }
1268
1269
1.64M
        *buf_real++ = temp_1;
1270
1.64M
        *buf_imag++ = temp_2;
1271
1272
1.64M
        temp = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1273
1.64M
        *buf_real = temp + *hyb_output_real_dry++ + *hyb_output_real_wet++;
1274
1.64M
        temp = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1275
1.64M
        *buf_imag = temp + *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1276
1277
1.64M
        buf_real++;
1278
1.64M
        buf_imag++;
1279
1280
1.64M
        temp = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1281
1.64M
        *buf_real = temp + *hyb_output_real_dry++ + *hyb_output_real_wet++;
1282
1.64M
        temp = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1283
1.64M
        *buf_imag = temp + *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1284
1285
1.64M
        buf_real++;
1286
1.64M
        buf_imag++;
1287
1288
100M
        for (n = 0; n < qmf_bands; n++) {
1289
98.4M
          *buf_real++ = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1290
98.4M
          *buf_imag++ = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1291
98.4M
        }
1292
1293
1.64M
        p_buffer_re += MAX_HYBRID_BANDS;
1294
1.64M
        p_buffer_im += MAX_HYBRID_BANDS;
1295
1296
1.64M
        p_buf_re += MAX_HYBRID_BANDS;
1297
1.64M
        p_buf_im += MAX_HYBRID_BANDS;
1298
1299
1.64M
        p_hyb_out_dry_re += MAX_HYBRID_BANDS;
1300
1.64M
        p_hyb_out_dry_im += MAX_HYBRID_BANDS;
1301
1.64M
      }
1302
53.6k
      p_buffer_real += TSXHB;
1303
53.6k
      p_buffer_imag += TSXHB;
1304
1305
53.6k
      p_buf_real += TSXHB;
1306
53.6k
      p_buf_imag += TSXHB;
1307
1308
53.6k
      p_hyb_out_dry_real += TSXHB;
1309
53.6k
      p_hyb_out_dry_imag += TSXHB;
1310
53.6k
    }
1311
7.81k
  } else {
1312
68.0k
    for (ch = 0; ch < num_output_channels; ch++) {
1313
60.2k
      p_buffer_re = p_buffer_real;
1314
60.2k
      p_buffer_im = p_buffer_imag;
1315
1316
60.2k
      p_buf_re = p_buf_real;
1317
60.2k
      p_buf_im = p_buf_imag;
1318
1319
60.2k
      p_hyb_out_dry_re = p_hyb_out_dry_real;
1320
60.2k
      p_hyb_out_dry_im = p_hyb_out_dry_imag;
1321
1322
1.79M
      for (ts = 0; ts < time_slots; ts++) {
1323
1.73M
        hyb_output_real_wet = p_buffer_re;
1324
1.73M
        hyb_output_imag_wet = p_buffer_im;
1325
1.73M
        hyb_output_real_dry = p_hyb_out_dry_re;
1326
1.73M
        hyb_output_imag_dry = p_hyb_out_dry_im;
1327
1328
1.73M
        buf_real = p_buf_re;
1329
1.73M
        buf_imag = p_buf_im;
1330
1331
1.73M
        temp_1 = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1332
1.73M
        temp_2 = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1333
10.3M
        for (n = 1; n < 6; n++) {
1334
8.66M
          temp_1 += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1335
8.66M
          temp_2 += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1336
8.66M
        }
1337
1338
1.73M
        *buf_real++ = temp_1;
1339
1.73M
        *buf_imag++ = temp_2;
1340
1341
1.73M
        *buf_real = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1342
1.73M
        *buf_real += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1343
1344
1.73M
        *buf_imag = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1345
1.73M
        *buf_imag += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1346
1347
1.73M
        buf_real++;
1348
1.73M
        buf_imag++;
1349
1350
1.73M
        *buf_real = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1351
1.73M
        *buf_real += *hyb_output_real_dry++ + *hyb_output_real_wet++;
1352
1.73M
        *buf_imag = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1353
1.73M
        *buf_imag += *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1354
1355
1.73M
        buf_real++;
1356
1.73M
        buf_imag++;
1357
1358
5.19M
        for (hyb = 3; hyb < tp_hyb_band_border - QMF_TO_HYB_OFFSET; hyb++) {
1359
3.46M
          *buf_real++ = *hyb_output_real_dry++ + *hyb_output_real_wet++;
1360
3.46M
          *buf_imag++ = *hyb_output_imag_dry++ + *hyb_output_imag_wet++;
1361
3.46M
        }
1362
1.73M
        p_buffer_re += MAX_HYBRID_BANDS;
1363
1.73M
        p_buffer_im += MAX_HYBRID_BANDS;
1364
1365
1.73M
        p_buf_re += MAX_HYBRID_BANDS;
1366
1.73M
        p_buf_im += MAX_HYBRID_BANDS;
1367
1368
1.73M
        p_hyb_out_dry_re += MAX_HYBRID_BANDS;
1369
1.73M
        p_hyb_out_dry_im += MAX_HYBRID_BANDS;
1370
1.73M
      }
1371
60.2k
      p_buffer_real += TSXHB;
1372
60.2k
      p_buffer_imag += TSXHB;
1373
1374
60.2k
      p_buf_real += TSXHB;
1375
60.2k
      p_buf_imag += TSXHB;
1376
1377
60.2k
      p_hyb_out_dry_real += TSXHB;
1378
60.2k
      p_hyb_out_dry_imag += TSXHB;
1379
60.2k
    }
1380
1381
232k
    for (ts = 0; ts < time_slots; ts++) {
1382
224k
      ixheaacd_subband_tp(pstr_mps_state, ts);
1383
224k
    }
1384
7.81k
  }
1385
1386
14.7k
  if ((!pstr_mps_state->bs_config.arbitrary_tree) &&
1387
14.7k
      ((up_mix_type != 2) && (up_mix_type != 3))) {
1388
14.7k
    WORD32 *time_out_5xxx =
1389
14.7k
        pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->time_out_idx_5xxx;
1390
14.7k
    WORD32 *time_out_7xxx =
1391
14.7k
        pstr_mps_state->ia_mps_dec_mps_table.tp_process_table_ptr->time_out_idx_7xxx;
1392
1393
14.7k
    p_buf_real = p_array_struct->buffer_real;
1394
14.7k
    p_buf_imag = p_array_struct->buffer_imag;
1395
1396
128k
    for (ch = 0; ch < num_output_channels_at; ch++) {
1397
113k
      WORD32 tempch = 0;
1398
113k
      switch (tree_config) {
1399
2.01k
        case TREE_5151:
1400
2.01k
          tempch = ch;
1401
2.01k
          break;
1402
5.10k
        case TREE_5152:
1403
10.2k
        case TREE_525:
1404
10.2k
          tempch = time_out_5xxx[ch];
1405
10.2k
          break;
1406
7.60k
        case TREE_7271:
1407
9.92k
        case TREE_7272:
1408
11.8k
        case TREE_7571:
1409
101k
        case TREE_7572:
1410
101k
          tempch = time_out_7xxx[ch];
1411
101k
          break;
1412
0
        default:
1413
0
          break;
1414
113k
      }
1415
113k
      p_time_out = p_array_struct->time_out + tempch * QBXTS;
1416
113k
      syn->syn_filter_bank(&pstr_mps_state->syn_qmf_bank, p_buf_real, p_buf_imag,
1417
113k
                           p_time_out, ch, qmf_bands, time_slots,
1418
113k
                           pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
1419
1420
113k
      p_buf_real += TSXHB;
1421
113k
      p_buf_imag += TSXHB;
1422
113k
    }
1423
14.7k
  } else {
1424
10
    p_time_out = p_array_struct->time_out;
1425
88
    for (ch = 0; ch < num_output_channels_at; ch++) {
1426
78
      syn->syn_filter_bank(&pstr_mps_state->syn_qmf_bank, p_buf_real, p_buf_imag,
1427
78
                           p_time_out, ch, qmf_bands, time_slots,
1428
78
                           pstr_mps_state->ia_mps_dec_mps_table.qmf_table_ptr);
1429
1430
78
      p_buf_real += TSXHB;
1431
78
      p_buf_imag += TSXHB;
1432
78
      p_time_out += QBXTS;
1433
78
    }
1434
10
  }
1435
1436
14.7k
  return;
1437
14.7k
}