Coverage Report

Created: 2026-05-30 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_mps_smoothing.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 "ixheaac_type_def.h"
21
#include "ixheaacd_bitbuffer.h"
22
#include "ixheaacd_common_rom.h"
23
#include "ixheaacd_sbrdecsettings.h"
24
#include "ixheaacd_sbr_scale.h"
25
#include "ixheaacd_env_extr_part.h"
26
#include "ixheaacd_sbr_rom.h"
27
#include "ixheaacd_hybrid.h"
28
#include "ixheaacd_ps_dec.h"
29
#include "ixheaacd_config.h"
30
#include "ixheaacd_qmf_dec.h"
31
#include "ixheaacd_mps_polyphase.h"
32
#include "ixheaacd_mps_struct_def.h"
33
#include "ixheaacd_mps_res_rom.h"
34
#include "ixheaacd_mps_aac_struct.h"
35
#include "ixheaac_constants.h"
36
#include "ixheaac_basic_ops32.h"
37
#include "ixheaac_basic_ops40.h"
38
#include "ixheaacd_mps_dec.h"
39
#include "ixheaac_error_standards.h"
40
#include "ixheaacd_error_codes.h"
41
#include "ixheaacd_mps_macro_def.h"
42
#include "ixheaacd_mps_smoothing.h"
43
#include "ixheaacd_mps_tonality.h"
44
#ifndef MULT
45
2.92M
#define MULT(a, b) (a * b)
46
#endif
47
5.09k
#define ONE_BY_128_IN_Q30 (8388608)
48
5.09k
#define ONE_IN_Q30 (1073741824)
49
643k
#define PI_IN_Q27 (421657440)
50
1.76k
#define FIFTY_X_PI_BY_180_Q27 (117127067)
51
3.33k
#define TWENTY_FIVE_X_PI_BY_180_Q27 (58563533)
52
1.95M
#define Q28_VALUE (1 << 28)
53
307k
#define Q28_FLOAT_VAL ((FLOAT32)(1 << 28))
54
153k
#define ONE_BY_Q28_FLOAT_VAL (1.0f / Q28_FLOAT_VAL)
55
56
VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing(
57
79.5k
    ia_mps_dec_state_struct *self) {
58
79.5k
  WORD32 smooth_band;
59
79.5k
  FLOAT32 delta, one_minus_delta;
60
79.5k
  WORD32 ps = 0, pb, row, col;
61
79.5k
  WORD32 res_bands = 0;
62
79.5k
  WORD32 *p_smoothing_data;
63
64
79.5k
  if (self->residual_coding) res_bands = self->max_res_bands;
65
66
79.5k
  p_smoothing_data = &self->smoothing_data[ps][res_bands];
67
68
79.5k
  delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps];
69
79.5k
  one_minus_delta = 1.0f - delta;
70
71
721k
  for (pb = res_bands; pb < self->bs_param_bands; pb++) {
72
642k
    smooth_band = *p_smoothing_data++;
73
642k
    if (smooth_band) {
74
132k
      for (row = 0; row < MAX_M_OUTPUT; row++) {
75
264k
        for (col = 0; col < MAX_M_INPUT; col++) {
76
176k
          self->m1_param_re[ps][pb][row][col] =
77
176k
              (MULT(delta, self->m1_param_re[ps][pb][row][col]) +
78
176k
               MULT(one_minus_delta, self->m1_param_re_prev[pb][row][col]));
79
176k
          self->m1_param_im[ps][pb][row][col] =
80
176k
              (MULT(delta, self->m1_param_im[ps][pb][row][col]) +
81
176k
               MULT(one_minus_delta, self->m1_param_im_prev[pb][row][col]));
82
176k
          self->m2_decor_re[ps][pb][row][col] =
83
176k
              (MULT(delta, self->m2_decor_re[ps][pb][row][col]) +
84
176k
               MULT(one_minus_delta, self->m2_decor_re_prev[pb][row][col]));
85
176k
          self->m2_decor_im[ps][pb][row][col] =
86
176k
              (MULT(delta, self->m2_decor_im[ps][pb][row][col]) +
87
176k
               MULT(one_minus_delta, self->m2_decor_im_prev[pb][row][col]));
88
176k
          self->m2_resid_re[ps][pb][row][col] =
89
176k
              (MULT(delta, self->m2_resid_re[ps][pb][row][col]) +
90
176k
               MULT(one_minus_delta, self->m2_resid_re_prev[pb][row][col]));
91
176k
          self->m2_resid_im[ps][pb][row][col] =
92
176k
              (MULT(delta, self->m2_resid_im[ps][pb][row][col]) +
93
176k
               MULT(one_minus_delta, self->m2_resid_im_prev[pb][row][col]));
94
176k
        }
95
88.2k
      }
96
44.1k
      self->pre_mix_req++;
97
44.1k
    }
98
642k
  }
99
100
94.7k
  for (ps = 1; ps < self->num_parameter_sets; ps++) {
101
15.1k
    delta = self->param_slot_diff[ps] * self->inv_smoothing_time[ps];
102
15.1k
    one_minus_delta = 1.0f - delta;
103
104
15.1k
    p_smoothing_data = &self->smoothing_data[ps][res_bands];
105
106
146k
    for (pb = res_bands; pb < self->bs_param_bands; pb++) {
107
131k
      smooth_band = *p_smoothing_data++;
108
131k
      if (smooth_band) {
109
50.5k
        for (row = 0; row < MAX_M_OUTPUT; row++) {
110
101k
          for (col = 0; col < MAX_M_INPUT; col++) {
111
67.3k
            self->m1_param_re[ps][pb][row][col] =
112
67.3k
                (MULT(delta, self->m1_param_re[ps][pb][row][col]) +
113
67.3k
                 MULT(one_minus_delta,
114
67.3k
                      self->m1_param_re[ps - 1][pb][row][col]));
115
67.3k
            self->m1_param_im[ps][pb][row][col] =
116
67.3k
                (MULT(delta, self->m1_param_im[ps][pb][row][col]) +
117
67.3k
                 MULT(one_minus_delta,
118
67.3k
                      self->m1_param_im[ps - 1][pb][row][col]));
119
67.3k
            self->m2_resid_re[ps][pb][row][col] =
120
67.3k
                (MULT(delta, self->m2_resid_re[ps][pb][row][col]) +
121
67.3k
                 MULT(one_minus_delta,
122
67.3k
                      self->m2_resid_re[ps - 1][pb][row][col]));
123
67.3k
            self->m2_decor_re[ps][pb][row][col] =
124
67.3k
                (MULT(delta, self->m2_decor_re[ps][pb][row][col]) +
125
67.3k
                 MULT(one_minus_delta,
126
67.3k
                      self->m2_decor_re[ps - 1][pb][row][col]));
127
67.3k
            self->m2_decor_im[ps][pb][row][col] =
128
67.3k
                (MULT(delta, self->m2_decor_im[ps][pb][row][col]) +
129
67.3k
                 MULT(one_minus_delta,
130
67.3k
                      self->m2_decor_im[ps - 1][pb][row][col]));
131
67.3k
            self->m2_resid_im[ps][pb][row][col] =
132
67.3k
                (MULT(delta, self->m2_resid_im[ps][pb][row][col]) +
133
67.3k
                 MULT(one_minus_delta,
134
67.3k
                      self->m2_resid_im[ps - 1][pb][row][col]));
135
67.3k
          }
136
33.6k
        }
137
16.8k
        self->pre_mix_req++;
138
16.8k
      }
139
131k
    }
140
15.1k
  }
141
79.5k
}
142
143
79.5k
VOID ixheaacd_mps_smoothing_opd(ia_mps_dec_state_struct *self) {
144
79.5k
  WORD32 ps, pb;
145
79.5k
  WORD32 delta, one_minus_delta;
146
147
79.5k
  if (self->opd_smoothing_mode == 0) {
148
1.05M
    for (pb = 0; pb < self->bs_param_bands; pb++) {
149
979k
      self->opd_smooth.smooth_l_phase[pb] =
150
979k
          ((WORD32)(self->phase_l[self->num_parameter_sets - 1][pb] *
151
979k
                    Q28_VALUE)) >>
152
979k
          1;
153
979k
      self->opd_smooth.smooth_r_phase[pb] =
154
979k
          ((WORD32)(self->phase_r[self->num_parameter_sets - 1][pb] *
155
979k
                    Q28_VALUE)) >>
156
979k
          1;
157
979k
    }
158
77.2k
    return;
159
77.2k
  }
160
7.44k
  for (ps = 0; ps < self->num_parameter_sets; ps++) {
161
5.09k
    WORD32 thr = self->bs_frame.ipd_data.bs_quant_coarse_xxx[ps]
162
5.09k
                  ? FIFTY_X_PI_BY_180_Q27
163
5.09k
                  : TWENTY_FIVE_X_PI_BY_180_Q27;
164
165
5.09k
    delta = self->param_slot_diff[ps] * ONE_BY_128_IN_Q30;
166
5.09k
    one_minus_delta = ONE_IN_Q30 - delta;
167
168
82.0k
    for (pb = 0; pb < self->bs_param_bands; pb++) {
169
76.9k
      WORD32 ltemp, rtemp, tmp;
170
76.9k
      ltemp = ((WORD32)(self->phase_l[ps][pb] * Q28_FLOAT_VAL)) >> 1;
171
76.9k
      rtemp = ((WORD32)(self->phase_r[ps][pb] * Q28_FLOAT_VAL)) >> 1;
172
173
79.7k
      while (ltemp > self->opd_smooth.smooth_l_phase[pb] + PI_IN_Q27)
174
2.87k
        ltemp -= 2 * PI_IN_Q27;
175
79.8k
      while (ltemp < self->opd_smooth.smooth_l_phase[pb] - PI_IN_Q27)
176
2.92k
        ltemp += 2 * PI_IN_Q27;
177
78.9k
      while (rtemp > self->opd_smooth.smooth_r_phase[pb] + PI_IN_Q27)
178
2.06k
        rtemp -= 2 * PI_IN_Q27;
179
79.1k
      while (rtemp < self->opd_smooth.smooth_r_phase[pb] - PI_IN_Q27)
180
2.20k
        rtemp += 2 * PI_IN_Q27;
181
182
76.9k
      self->opd_smooth.smooth_l_phase[pb] =
183
76.9k
          (ixheaac_mult32_shl(delta, ltemp) +
184
76.9k
           ixheaac_mult32_shl(one_minus_delta,
185
76.9k
                               self->opd_smooth.smooth_l_phase[pb]))
186
76.9k
          << 1;
187
76.9k
      self->opd_smooth.smooth_r_phase[pb] =
188
76.9k
          (ixheaac_mult32_shl(delta, rtemp) +
189
76.9k
           ixheaac_mult32_shl(one_minus_delta,
190
76.9k
                               self->opd_smooth.smooth_r_phase[pb]))
191
76.9k
          << 1;
192
193
76.9k
      tmp = (ltemp - rtemp) - (self->opd_smooth.smooth_l_phase[pb] -
194
76.9k
                               self->opd_smooth.smooth_r_phase[pb]);
195
76.9k
      while (tmp > PI_IN_Q27) tmp -= 2 * PI_IN_Q27;
196
77.2k
      while (tmp < -PI_IN_Q27) tmp += 2 * PI_IN_Q27;
197
198
76.9k
      if (ixheaac_abs32(tmp) > thr) {
199
5.74k
        self->opd_smooth.smooth_l_phase[pb] = ltemp;
200
5.74k
        self->opd_smooth.smooth_r_phase[pb] = rtemp;
201
5.74k
      }
202
203
77.5k
      while (self->opd_smooth.smooth_l_phase[pb] > 2 * PI_IN_Q27)
204
651
        self->opd_smooth.smooth_l_phase[pb] -= 2 * PI_IN_Q27;
205
79.7k
      while (self->opd_smooth.smooth_l_phase[pb] < 0)
206
2.79k
        self->opd_smooth.smooth_l_phase[pb] += 2 * PI_IN_Q27;
207
77.8k
      while (self->opd_smooth.smooth_r_phase[pb] > 2 * PI_IN_Q27)
208
921
        self->opd_smooth.smooth_r_phase[pb] -= 2 * PI_IN_Q27;
209
78.7k
      while (self->opd_smooth.smooth_r_phase[pb] < 0)
210
1.81k
        self->opd_smooth.smooth_r_phase[pb] += 2 * PI_IN_Q27;
211
212
76.9k
      self->phase_l[ps][pb] =
213
76.9k
          (self->opd_smooth.smooth_l_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL;
214
76.9k
      self->phase_r[ps][pb] =
215
76.9k
          (self->opd_smooth.smooth_r_phase[pb] << 1) * ONE_BY_Q28_FLOAT_VAL;
216
76.9k
    }
217
5.09k
  }
218
2.34k
}
219
220
static VOID ixheaacd_calc_filter_coeff(
221
25.1k
    ia_heaac_mps_state_struct *pstr_mps_state, WORD32 ps, WORD32 *delta) {
222
25.1k
  WORD32 d_slots;
223
25.1k
  WORD32 *param_slot = pstr_mps_state->aux_struct->param_slot;
224
25.1k
  WORD32 *smg_time = pstr_mps_state->aux_struct->smg_time;
225
226
25.1k
  if (ps == 0)
227
13.7k
    d_slots = param_slot[ps] + 1;
228
11.3k
  else
229
11.3k
    d_slots = param_slot[ps] - param_slot[ps - 1];
230
231
25.1k
  if (pstr_mps_state->smooth_control) {
232
25.1k
    switch (smg_time[ps]) {
233
1.36k
      case SMG_TIME_64:
234
1.36k
        *delta = d_slots << 9;
235
1.36k
        break;
236
496
      case SMG_TIME_128:
237
496
        *delta = d_slots << 8;
238
496
        break;
239
19.6k
      case SMG_TIME_256:
240
19.6k
        *delta = d_slots << 7;
241
19.6k
        break;
242
1.63k
      case SMG_TIME_512:
243
1.63k
        *delta = d_slots << 6;
244
1.63k
        break;
245
2.02k
      default:
246
2.02k
        break;
247
25.1k
    }
248
25.1k
  } else {
249
0
    *delta = d_slots << 7;
250
0
  }
251
252
25.1k
  return;
253
25.1k
}
254
255
13.7k
VOID ixheaacd_smooth_m1m2(ia_heaac_mps_state_struct *pstr_mps_state) {
256
13.7k
  ia_heaac_mps_state_struct *curr_state = pstr_mps_state;
257
13.7k
  ia_mps_persistent_mem *persistent_mem = &curr_state->mps_persistent_mem;
258
13.7k
  ia_mps_dec_auxilary_struct *p_aux_struct = pstr_mps_state->aux_struct;
259
13.7k
  ia_mps_dec_m2_param_struct *m2_param = p_aux_struct->m2_param;
260
13.7k
  ia_mps_dec_m1_param_struct *m1_param = pstr_mps_state->array_struct->m1_param;
261
13.7k
  WORD32 *m1_param_real_prev = persistent_mem->m1_param_real_prev;
262
13.7k
  WORD32 *m2_decor_real_prev = persistent_mem->m2_decor_real_prev;
263
13.7k
  WORD32 *m2_resid_real_prev = persistent_mem->m2_resid_real_prev;
264
265
13.7k
  WORD32 num_parameter_bands = curr_state->num_parameter_bands;
266
13.7k
  WORD32 num_direct_signals = curr_state->num_direct_signals;
267
13.7k
  WORD32 num_decor_signals = curr_state->num_decor_signals;
268
13.7k
  WORD32 m1_param_imag_present = curr_state->m1_param_imag_present;
269
13.7k
  WORD32 m2_param_imag_present = curr_state->m2_param_imag_present;
270
13.7k
  WORD32 col_counter = num_direct_signals + num_decor_signals;
271
13.7k
  WORD32 num_parameter_sets = curr_state->num_parameter_sets;
272
13.7k
  WORD32 num_output_channels = curr_state->num_output_channels;
273
13.7k
  WORD32 num_v_channels = curr_state->num_v_channels;
274
13.7k
  WORD32 num_x_channels = curr_state->num_x_channels;
275
13.7k
  WORD32 smooth_control = curr_state->smooth_control;
276
13.7k
  WORD32 smooth_config = curr_state->smooth_config;
277
13.7k
  WORD32 resid_col_counter;
278
13.7k
  WORD32 smooth_band_arr[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS];
279
280
13.7k
  WORD32 *delta, *one_minus_delta, *delta_ptr, *one_minus_delta_ptr;
281
13.7k
  WORD32 *param_r, *param_i, *param_prev_r, *param_prev_i;
282
283
13.7k
  WORD32 *ton;
284
13.7k
  WORD32 i, ps, pb, row, col;
285
13.7k
  WORD32 res_bands = 0;
286
13.7k
  WORD32 idx = 0;
287
288
13.7k
  WORD32 *m2_decor_imag_prev = persistent_mem->m2_decor_imag_prev;
289
13.7k
  WORD32 *m2_resid_imag_prev = persistent_mem->m2_resid_imag_prev;
290
13.7k
  WORD32 *m1_param_imag_prev = persistent_mem->m1_param_imag_prev;
291
292
13.7k
  ton = pstr_mps_state->mps_scratch_mem_v;
293
13.7k
  delta = delta_ptr =
294
13.7k
      ton + IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_BANDS, sizeof(*delta), BYTE_ALIGN_8);
295
13.7k
  one_minus_delta = one_minus_delta_ptr =
296
13.7k
      delta +
297
13.7k
      IXHEAAC_GET_SIZE_ALIGNED_TYPE(MAX_PARAMETER_SETS, sizeof(*one_minus_delta), BYTE_ALIGN_8);
298
299
13.7k
  param_r = curr_state->res_bands;
300
13.7k
  if (curr_state->residual_coding) {
301
3.98k
    for (i = 0; i < MAX_RESIDUAL_CHANNELS_MPS; i++) {
302
3.62k
      if (param_r[i] > res_bands) {
303
407
        res_bands = param_r[i];
304
407
      }
305
3.62k
    }
306
362
  }
307
308
13.7k
  if (curr_state->arbitrary_downmix == 2) {
309
147
    if (res_bands < curr_state->arbdmx_residual_bands) {
310
131
      res_bands = curr_state->arbdmx_residual_bands;
311
131
    }
312
147
  }
313
314
13.7k
  if (smooth_config) {
315
0
    ixheaacd_measure_tonality(pstr_mps_state, ton);
316
0
  }
317
318
38.9k
  for (ps = 0; ps < num_parameter_sets; ps++) {
319
25.1k
    ixheaacd_calc_filter_coeff(pstr_mps_state, ps, delta);
320
25.1k
    *one_minus_delta++ = (1 << 15) - *delta++;
321
25.1k
  }
322
323
13.7k
  if (smooth_control) {
324
38.9k
    for (ps = 0; ps < num_parameter_sets; ps++) {
325
25.1k
      if (ps < 8) {
326
465k
        for (pb = 0; pb < num_parameter_bands; pb++) {
327
440k
          smooth_band_arr[ps][pb] = pstr_mps_state->aux_struct->smg_data[ps][pb];
328
440k
        }
329
25.1k
      }
330
25.1k
    }
331
13.7k
  } else if (smooth_config) {
332
0
    for (ps = 0; ps < num_parameter_sets; ps++) {
333
0
      for (pb = 0; pb < num_parameter_bands; pb++) {
334
0
        smooth_band_arr[ps][pb] = (ton[pb] > POINT_EIGHT_Q15);
335
0
      }
336
0
    }
337
0
  }
338
339
13.7k
  if (!(smooth_control == 0 && smooth_config == 0)) {
340
13.7k
    if (m1_param_imag_present) {
341
10.4k
      WORD32 *ptr_r1 = &m1_param->m1_param_real[0][0][0][0];
342
10.4k
      WORD32 *ptr_i1 = &m1_param->m1_param_imag[0][0][0][0];
343
92.9k
      for (row = 0; row < num_v_channels; row++) {
344
82.4k
        WORD32 *ptr_r2 = ptr_r1;
345
82.4k
        WORD32 *ptr_i2 = ptr_i1;
346
556k
        for (col = 0; col < num_x_channels; col++) {
347
473k
          param_r = ptr_r2;
348
473k
          param_i = ptr_i2;
349
473k
          m1_param_real_prev += res_bands;
350
473k
          m1_param_imag_prev += res_bands;
351
352
9.76M
          for (pb = res_bands; pb < num_parameter_bands; pb++) {
353
9.29M
            if (smooth_band_arr[0][pb]) {
354
3.68M
              WORD64 acc;
355
356
3.68M
              acc = (WORD64)((WORD64)param_r[pb] * (WORD64)(*delta_ptr) +
357
3.68M
                             (WORD64)(*m1_param_real_prev) *
358
3.68M
                                 (WORD64)(*one_minus_delta_ptr));
359
360
3.68M
              acc >>= 15;
361
362
3.68M
              param_r[pb] = (WORD32)acc;
363
364
3.68M
              acc = (WORD64)((WORD64)param_i[pb] * (WORD64)(*delta_ptr) +
365
3.68M
                             (WORD64)(*m1_param_imag_prev) *
366
3.68M
                                 (WORD64)(*one_minus_delta_ptr));
367
368
3.68M
              acc >>= 15;
369
370
3.68M
              param_i[pb] = (WORD32)acc;
371
3.68M
            }
372
9.29M
            m1_param_real_prev++;
373
9.29M
            m1_param_imag_prev++;
374
9.29M
          }
375
473k
          param_r += MAX_PARAMETER_BANDS;
376
473k
          param_i += MAX_PARAMETER_BANDS;
377
378
774k
          for (ps = 1; ps < num_parameter_sets; ps++) {
379
300k
            WORD32 del = delta_ptr[ps];
380
300k
            WORD32 one_minus_del = one_minus_delta_ptr[ps];
381
382
300k
            param_prev_r = param_r - MAX_PARAMETER_BANDS;
383
300k
            param_prev_i = param_i - MAX_PARAMETER_BANDS;
384
385
6.09M
            for (pb = res_bands; pb < num_parameter_bands; pb++) {
386
5.79M
              if (smooth_band_arr[ps][pb]) {
387
2.17M
                WORD64 acc;
388
389
2.17M
                acc = (WORD64)((WORD64)param_r[pb] * (WORD64)(del) +
390
2.17M
                               (WORD64)param_prev_r[pb] *
391
2.17M
                                   (WORD64)(one_minus_del));
392
393
2.17M
                acc >>= 15;
394
395
2.17M
                param_r[pb] = (WORD32)acc;
396
397
2.17M
                acc = (WORD64)((WORD64)param_i[pb] * (WORD64)(del) +
398
2.17M
                               (WORD64)param_prev_i[pb] *
399
2.17M
                                   (WORD64)(one_minus_del));
400
401
2.17M
                acc >>= 15;
402
403
2.17M
                param_i[pb] = (WORD32)acc;
404
2.17M
              }
405
5.79M
            }
406
300k
            param_r += MAX_PARAMETER_BANDS;
407
300k
            param_i += MAX_PARAMETER_BANDS;
408
300k
          }
409
473k
          ptr_r2 += PBXPS;
410
473k
          ptr_i2 += PBXPS;
411
473k
        }
412
82.4k
        ptr_r1 += INCHXPBXPS;
413
82.4k
        ptr_i1 += INCHXPBXPS;
414
82.4k
      }
415
10.4k
    } else {
416
3.34k
      WORD32 *ptr1 = (WORD32 *)m1_param;
417
418
24.0k
      for (row = 0; row < num_v_channels; row++) {
419
20.7k
        WORD32 *ptr2 = ptr1;
420
421
98.5k
        for (col = 0; col < num_x_channels; col++) {
422
77.8k
          WORD32 *param_r = ptr2;
423
424
77.8k
          WORD32 del = delta_ptr[0];
425
77.8k
          WORD32 one_minus_del = one_minus_delta_ptr[0];
426
427
77.8k
          m1_param_real_prev += res_bands;
428
429
1.37M
          for (pb = res_bands; pb < num_parameter_bands; pb++) {
430
1.29M
            if (smooth_band_arr[0][pb]) {
431
692k
              WORD64 acc;
432
433
692k
              acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del)) +
434
692k
                    (WORD64)((WORD64)(*m1_param_real_prev) *
435
692k
                             (WORD64)(one_minus_del));
436
437
692k
              param_r[pb] = (WORD32)(acc >> 15);
438
692k
            }
439
1.29M
            m1_param_real_prev++;
440
1.29M
          }
441
77.8k
          param_r += MAX_PARAMETER_BANDS;
442
443
134k
          for (ps = 1; ps < num_parameter_sets; ps++) {
444
56.6k
            WORD32 del = delta_ptr[ps];
445
56.6k
            WORD32 one_minus_del = one_minus_delta_ptr[ps];
446
447
56.6k
            param_prev_r = param_r - MAX_PARAMETER_BANDS;
448
449
834k
            for (pb = res_bands; pb < num_parameter_bands; pb++) {
450
778k
              if (smooth_band_arr[ps][pb]) {
451
384k
                WORD64 acc;
452
453
384k
                acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del) +
454
384k
                      (WORD64)((WORD64)(param_prev_r[pb]) *
455
384k
                               (WORD64)one_minus_del);
456
457
384k
                param_r[pb] = (WORD32)(acc >> 15);
458
384k
              }
459
778k
            }
460
56.6k
            param_r += MAX_PARAMETER_BANDS;
461
56.6k
          }
462
77.8k
          ptr2 += PBXPS;
463
77.8k
        }
464
20.7k
        ptr1 += INCHXPBXPS;
465
20.7k
      }
466
3.34k
    }
467
468
13.7k
    if (curr_state->residual_coding)
469
362
      resid_col_counter = col_counter;
470
13.4k
    else
471
13.4k
      resid_col_counter = num_direct_signals;
472
473
13.7k
    idx = 0;
474
13.7k
    if (m2_param_imag_present) {
475
0
      WORD32 *ptr_r1 = &m2_param->m2_resid_real[0][0][0];
476
0
      WORD32 *ptr_i1 = &m2_param->m2_resid_imag[0][0][0];
477
0
      for (row = 0; row < num_output_channels; row++) {
478
0
        for (col = 0; col < resid_col_counter; col++) {
479
0
          if (curr_state->m2_param_present[row][col] & 2) {
480
0
            WORD32 del = *delta_ptr;
481
0
            WORD32 one_minus_del = *one_minus_delta_ptr;
482
483
0
            param_r = ptr_r1;
484
0
            param_i = ptr_i1;
485
486
0
            m2_resid_real_prev += res_bands;
487
0
            m2_resid_imag_prev += res_bands;
488
489
0
            for (pb = res_bands; pb < num_parameter_bands; pb++) {
490
0
              if (smooth_band_arr[0][pb]) {
491
0
                WORD64 acc;
492
0
                acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del) +
493
0
                               (WORD64)(*m2_resid_real_prev) *
494
0
                                   (WORD64)(one_minus_del));
495
496
0
                acc >>= 15;
497
0
                param_r[pb] = (WORD32)acc;
498
499
0
                acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)(del) +
500
0
                               (WORD64)(*m2_resid_imag_prev) *
501
0
                                   (WORD64)(one_minus_del));
502
503
0
                acc >>= 15;
504
0
                param_i[pb] = (WORD32)acc;
505
0
              }
506
507
0
              m2_resid_real_prev++;
508
0
              m2_resid_imag_prev++;
509
0
            }
510
511
0
            param_r += MAX_PARAMETER_BANDS;
512
0
            param_i += MAX_PARAMETER_BANDS;
513
514
0
            for (ps = 1; ps < num_parameter_sets; ps++) {
515
0
              WORD32 del = delta_ptr[ps];
516
0
              WORD32 one_minus_del = one_minus_delta_ptr[ps];
517
518
0
              param_prev_r = param_r - MAX_PARAMETER_BANDS;
519
0
              param_prev_i = param_i - MAX_PARAMETER_BANDS;
520
0
              for (pb = res_bands; pb < num_parameter_bands; pb++) {
521
0
                if (smooth_band_arr[ps][pb]) {
522
0
                  WORD64 acc;
523
0
                  acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)(del) +
524
0
                                 (WORD64)(param_prev_r[pb]) *
525
0
                                     (WORD64)(one_minus_del));
526
527
0
                  acc >>= 15;
528
0
                  param_r[pb] = (WORD32)acc;
529
530
0
                  acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)(del) +
531
0
                                 (WORD64)(param_prev_i[pb]) *
532
0
                                     (WORD64)(one_minus_del));
533
534
0
                  acc >>= 15;
535
0
                  param_i[pb] = (WORD32)acc;
536
0
                }
537
0
              }
538
0
              param_r += MAX_PARAMETER_BANDS;
539
0
              param_i += MAX_PARAMETER_BANDS;
540
0
            }
541
0
            idx++;
542
0
            ptr_r1 += PBXPS;
543
0
            ptr_i1 += PBXPS;
544
0
          }
545
0
        }
546
0
      }
547
548
0
      idx = 0;
549
550
0
      ptr_r1 = &m2_param->m2_resid_real[0][0][0];
551
0
      ptr_i1 = &m2_param->m2_resid_imag[0][0][0];
552
0
      for (row = 0; row < num_output_channels; row++) {
553
0
        for (col = num_direct_signals; col < col_counter; col++) {
554
0
          if (curr_state->m2_param_present[row][col] & 1) {
555
0
            WORD32 del = *delta_ptr;
556
0
            WORD32 one_minus_del = *one_minus_delta_ptr;
557
0
            m2_decor_real_prev += res_bands;
558
0
            m2_decor_imag_prev += res_bands;
559
560
0
            param_r = ptr_r1;
561
0
            param_i = ptr_i1;
562
563
0
            for (pb = res_bands; pb < num_parameter_bands; pb++) {
564
0
              if (smooth_band_arr[0][pb]) {
565
0
                WORD64 acc;
566
0
                acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del +
567
0
                               (WORD64)(*m2_decor_real_prev) *
568
0
                                   (WORD64)one_minus_del);
569
0
                acc >>= 15;
570
0
                param_r[pb] = (WORD32)acc;
571
572
0
                acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)del +
573
0
                               (WORD64)(*m2_decor_imag_prev) *
574
0
                                   (WORD64)one_minus_del);
575
0
                acc >>= 15;
576
0
                param_i[pb] = (WORD32)acc;
577
0
              }
578
0
              m2_decor_real_prev++;
579
0
              m2_decor_imag_prev++;
580
0
            }
581
582
0
            param_r += MAX_PARAMETER_BANDS;
583
0
            param_i += MAX_PARAMETER_BANDS;
584
585
0
            for (ps = 1; ps < num_parameter_sets; ps++) {
586
0
              WORD32 del = delta_ptr[ps];
587
0
              WORD32 one_minus_del = one_minus_delta_ptr[ps];
588
0
              param_prev_r = param_r - MAX_PARAMETER_BANDS;
589
0
              param_prev_i = param_i - MAX_PARAMETER_BANDS;
590
0
              for (pb = res_bands; pb < num_parameter_bands; pb++) {
591
0
                if (smooth_band_arr[ps][pb]) {
592
0
                  WORD64 acc;
593
594
0
                  acc = (WORD64)((WORD64)(param_r[pb]) * (WORD64)del +
595
0
                                 (WORD64)(param_prev_r[pb]) *
596
0
                                     (WORD64)one_minus_del);
597
0
                  acc >>= 15;
598
0
                  param_r[pb] = (WORD32)acc;
599
600
0
                  acc = (WORD64)((WORD64)(param_i[pb]) * (WORD64)del +
601
0
                                 (WORD64)(param_prev_i[pb]) *
602
0
                                     (WORD64)one_minus_del);
603
0
                  acc >>= 15;
604
0
                  param_i[pb] = (WORD32)acc;
605
0
                }
606
0
              }
607
0
              param_r += MAX_PARAMETER_BANDS;
608
0
              param_i += MAX_PARAMETER_BANDS;
609
0
            }
610
611
0
            idx++;
612
0
            ptr_r1 += PBXPS;
613
0
            ptr_i1 += PBXPS;
614
0
          }
615
0
        }
616
0
      }
617
13.7k
    } else {
618
13.7k
      WORD32 *ptr1 = &m2_param->m2_resid_real[0][0][0];
619
620
121k
      for (row = 0; row < num_output_channels; row++) {
621
687k
        for (col = 0; col < resid_col_counter; col++) {
622
579k
          if (curr_state->m2_param_present[row][col] & 2) {
623
109k
            WORD32 *ptr2 = ptr1;
624
109k
            WORD32 del = *delta_ptr;
625
109k
            WORD32 one_minus_del = *one_minus_delta_ptr;
626
109k
            m2_resid_real_prev += res_bands;
627
628
2.05M
            for (pb = res_bands; pb < num_parameter_bands; pb++) {
629
1.94M
              if (smooth_band_arr[0][pb]) {
630
751k
                WORD64 acc;
631
632
751k
                acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)(del) +
633
751k
                               (WORD64)(*m2_resid_real_prev) *
634
751k
                                   (WORD64)(one_minus_del));
635
636
751k
                acc >>= 15;
637
751k
                ptr2[pb] = (WORD32)acc;
638
751k
              }
639
640
1.94M
              m2_resid_real_prev++;
641
1.94M
            }
642
643
109k
            ptr2 += MAX_PARAMETER_BANDS;
644
645
196k
            for (ps = 1; ps < num_parameter_sets; ps++) {
646
86.4k
              WORD32 del = delta_ptr[ps];
647
86.4k
              WORD32 one_minus_del = one_minus_delta_ptr[ps];
648
649
86.4k
              param_prev_r = ptr2 - MAX_PARAMETER_BANDS;
650
651
1.48M
              for (pb = res_bands; pb < num_parameter_bands; pb++) {
652
1.40M
                if (smooth_band_arr[ps][pb]) {
653
525k
                  WORD64 acc;
654
655
525k
                  acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)(del) +
656
525k
                                 (WORD64)(*param_prev_r) *
657
525k
                                     (WORD64)(one_minus_del));
658
659
525k
                  acc >>= 15;
660
525k
                  ptr2[pb] = (WORD32)acc;
661
525k
                }
662
663
1.40M
                param_prev_r++;
664
1.40M
              }
665
86.4k
              ptr2 += MAX_PARAMETER_BANDS;
666
86.4k
            }
667
109k
            idx++;
668
109k
            ptr1 += PBXPS;
669
109k
          }
670
579k
        }
671
107k
      }
672
13.7k
      idx = 0;
673
13.7k
      ptr1 = &m2_param->m2_decor_real[0][0][0];
674
675
121k
      for (row = 0; row < num_output_channels; row++) {
676
346k
        for (col = num_direct_signals; col < col_counter; col++) {
677
238k
          if (curr_state->m2_param_present[row][col] & 1) {
678
66.4k
            WORD32 *ptr2 = ptr1;
679
66.4k
            m2_decor_real_prev += res_bands;
680
681
66.4k
            param_r = &m2_param->m2_decor_real[idx][0][res_bands];
682
1.17M
            for (pb = res_bands; pb < num_parameter_bands; pb++) {
683
1.10M
              if (smooth_band_arr[0][pb]) {
684
397k
                WORD64 acc;
685
397k
                acc = (WORD64)((WORD64)(ptr2[pb]) * (WORD64)*delta_ptr +
686
397k
                               (WORD64)(*m2_decor_real_prev) *
687
397k
                                   (WORD64)*one_minus_delta_ptr);
688
397k
                acc >>= 15;
689
397k
                ptr2[pb] = (WORD32)acc;
690
397k
              }
691
1.10M
              m2_decor_real_prev++;
692
1.10M
            }
693
66.4k
            ptr2 += MAX_PARAMETER_BANDS;
694
695
133k
            for (ps = 1; ps < num_parameter_sets; ps++) {
696
66.6k
              WORD32 del = delta_ptr[ps];
697
66.6k
              WORD32 one_minus_del = one_minus_delta_ptr[ps];
698
699
66.6k
              param_prev_r = ptr2 - MAX_PARAMETER_BANDS;
700
1.05M
              for (pb = res_bands; pb < num_parameter_bands; pb++) {
701
984k
                if (smooth_band_arr[ps][pb]) {
702
366k
                  WORD64 acc;
703
704
366k
                  acc =
705
366k
                      (WORD64)((WORD64)(ptr2[pb]) * (WORD64)del +
706
366k
                               (WORD64)(*param_prev_r) * (WORD64)one_minus_del);
707
366k
                  acc >>= 15;
708
366k
                  ptr2[pb] = (WORD32)acc;
709
366k
                }
710
711
984k
                param_prev_r++;
712
984k
              }
713
714
66.6k
              ptr2 += MAX_PARAMETER_BANDS;
715
66.6k
            }
716
717
66.4k
            idx++;
718
719
66.4k
            ptr1 += PBXPS;
720
66.4k
          }
721
238k
        }
722
107k
      }
723
13.7k
    }
724
13.7k
  }
725
13.7k
  return;
726
13.7k
}