Coverage Report

Created: 2025-08-26 06:53

/src/libxaac/decoder/ixheaacd_basic_ops.c
Line
Count
Source (jump to first uncovered line)
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2018 The Android Open Source Project
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at:
8
 *
9
 * http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 *
17
 *****************************************************************************
18
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include <string.h>
21
#include "ixheaac_type_def.h"
22
23
#include "ixheaac_constants.h"
24
25
#include "ixheaac_basic_ops32.h"
26
#include "ixheaacd_windows.h"
27
28
541M
static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) {
29
541M
  WORD32 result;
30
541M
  WORD64 temp_result;
31
32
541M
  temp_result = (WORD64)a * (WORD64)b;
33
541M
  result = (WORD32)(temp_result >> 31);
34
35
541M
  return (result);
36
541M
}
37
38
255k
VOID ixheaacd_memset(FLOAT32 *x, WORD32 n) {
39
255k
  memset(x, 0, n * sizeof(FLOAT32));
40
255k
  return;
41
255k
}
42
43
1.98M
VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n) {
44
1.98M
  memcpy(y, x, n * sizeof(FLOAT32));
45
1.98M
  return;
46
1.98M
}
47
48
211k
VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n) {
49
211k
  WORD32 i;
50
64.2M
  for (i = 0; i < n; i++) {
51
63.9M
    z[i] = (FLOAT32)a * x[i];
52
63.9M
  }
53
211k
  return;
54
211k
}
55
56
VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len,
57
30.3k
                          WORD8 output_q, WORD8 fac_q) {
58
30.3k
  WORD32 i;
59
30.3k
  if (fac_q > output_q) {
60
2.31M
    for (i = 0; i < len; i++) {
61
2.30M
      *dest = ixheaac_add32_sat(*src1, ((*src2) >> (fac_q - output_q)));
62
2.30M
      dest++;
63
2.30M
      src1++;
64
2.30M
      src2++;
65
2.30M
    }
66
20.4k
  } else {
67
4.88M
    for (i = 0; i < len; i++) {
68
4.86M
      *dest = ixheaac_add32_sat(
69
4.86M
          *src1, ixheaac_shl32_sat((*src2), (output_q - fac_q)));
70
4.86M
      dest++;
71
4.86M
      src1++;
72
4.86M
      src2++;
73
4.86M
    }
74
20.4k
  }
75
30.3k
}
76
77
WORD8 ixheaacd_windowing_long1(WORD32 *src1, WORD32 *src2,
78
                               const WORD32 *win_fwd, const WORD32 *win_rev,
79
                               WORD32 *dest, WORD32 vlen, WORD8 shift1,
80
172k
                               WORD8 shift2) {
81
172k
  WORD32 i;
82
172k
  WORD32 *rsrc2 = src2 + vlen - 1;
83
84
172k
  if (shift1 > shift2) {
85
84.7M
    for (i = 0; i < vlen / 2; i++) {
86
84.6M
      *dest = ixheaac_add32_sat(
87
84.6M
          ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)),
88
84.6M
          ixheaacd_mult32_sh1(*src2, *win_rev));
89
84.6M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
90
84.6M
          ((ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev)) >>
91
84.6M
           (shift1 - shift2)),
92
84.6M
          ixheaacd_mult32_sh1(*rsrc2, *win_fwd));
93
94
84.6M
      src1++;
95
84.6M
      src2++;
96
84.6M
      win_fwd++;
97
84.6M
      win_rev--;
98
84.6M
      rsrc2--;
99
84.6M
      dest++;
100
84.6M
    }
101
170k
    return (shift2);
102
170k
  } else {
103
1.26M
    for (i = 0; i < vlen / 2; i++) {
104
1.26M
      *dest = ixheaac_add32_sat(
105
1.26M
          ixheaacd_mult32_sh1(*src1, *win_fwd),
106
1.26M
          ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1)));
107
108
1.26M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
109
1.26M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev),
110
1.26M
          ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1)));
111
1.26M
      src1++;
112
1.26M
      src2++;
113
1.26M
      win_fwd++;
114
1.26M
      win_rev--;
115
1.26M
      rsrc2--;
116
1.26M
      dest++;
117
1.26M
    }
118
2.61k
    return (shift1);
119
2.61k
  }
120
172k
}
121
122
WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd,
123
                               WORD32 *fac_data_out, WORD32 *over_lap,
124
                               WORD32 *p_out_buffer,
125
                               offset_lengths *ixheaacd_drc_offset,
126
26.9k
                               WORD8 shiftp, WORD8 shift_olap, WORD8 fac_q) {
127
26.9k
  WORD32 i;
128
26.9k
  WORD32 *dest = p_out_buffer;
129
130
26.9k
  win_fwd += ixheaacd_drc_offset->lfac;
131
132
26.9k
  if (shiftp > fac_q) {
133
18.7k
    if (shift_olap > fac_q) {
134
4.43k
      for (i = 0;
135
2.42M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
136
2.42M
           i++) {
137
2.42M
        dest[i] = over_lap[i] >> (shift_olap - fac_q);
138
2.42M
      }
139
140
4.43k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
141
245k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
142
240k
           i++) {
143
240k
        dest[i] = ixheaac_add32_sat(
144
240k
            (ixheaacd_mult32_sh1(
145
240k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
146
240k
                                            ixheaacd_drc_offset->n_flat_ls +
147
240k
                                            ixheaacd_drc_offset->lfac - i - 1]),
148
240k
                 *win_fwd) >>
149
240k
             (shiftp - fac_q)),
150
240k
            (*fac_data_out));
151
240k
        win_fwd++;
152
240k
        fac_data_out++;
153
240k
      }
154
155
4.43k
      for (;
156
894k
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
157
890k
           i++) {
158
890k
        dest[i] = ixheaac_add32_sat(
159
890k
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
160
890k
                                        ixheaacd_drc_offset->n_flat_ls +
161
890k
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
162
890k
             (shiftp - fac_q)),
163
890k
            (*fac_data_out));
164
890k
        fac_data_out++;
165
890k
      }
166
167
972k
      for (; i < ixheaacd_drc_offset->n_long; i++) {
168
968k
        dest[i] =
169
968k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
170
968k
                                       ixheaacd_drc_offset->n_flat_ls +
171
968k
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
172
968k
            (shiftp - fac_q);
173
968k
      }
174
4.43k
      return (fac_q);
175
14.3k
    } else {
176
14.3k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
177
14.3k
                                               ixheaacd_drc_offset->lfac));
178
179
14.3k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
180
193k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
181
179k
           i++) {
182
179k
        dest[i] = ixheaac_add32_sat(
183
179k
            (ixheaacd_mult32_sh1(
184
179k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
185
179k
                                            ixheaacd_drc_offset->n_flat_ls +
186
179k
                                            ixheaacd_drc_offset->lfac - i - 1]),
187
179k
                 *win_fwd) >>
188
179k
             (shiftp - shift_olap)),
189
179k
            (*fac_data_out) >> (fac_q - shift_olap));
190
179k
        win_fwd++;
191
179k
        fac_data_out++;
192
179k
      }
193
194
14.3k
      for (;
195
3.49M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
196
3.48M
           i++) {
197
3.48M
        dest[i] = ixheaac_add32_sat(
198
3.48M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
199
3.48M
                                        ixheaacd_drc_offset->n_flat_ls +
200
3.48M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
201
3.48M
             (shiftp - shift_olap)),
202
3.48M
            (*fac_data_out) >> (fac_q - shift_olap));
203
3.48M
        fac_data_out++;
204
3.48M
      }
205
206
2.85M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
207
2.83M
        dest[i] =
208
2.83M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
209
2.83M
                                       ixheaacd_drc_offset->n_flat_ls +
210
2.83M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
211
2.83M
            (shiftp - shift_olap);
212
2.83M
      }
213
14.3k
      return (shift_olap);
214
14.3k
    }
215
18.7k
  } else {
216
8.16k
    if (shift_olap > shiftp) {
217
5.66k
      for (i = 0;
218
3.24M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
219
3.23M
           i++) {
220
3.23M
        dest[i] = over_lap[i] >> (shift_olap - shiftp);
221
3.23M
      }
222
223
5.66k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
224
49.9k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
225
44.2k
           i++) {
226
44.2k
        dest[i] = ixheaac_add32_sat(
227
44.2k
            ixheaacd_mult32_sh1(
228
44.2k
                ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
229
44.2k
                                           ixheaacd_drc_offset->n_flat_ls +
230
44.2k
                                           ixheaacd_drc_offset->lfac - i - 1]),
231
44.2k
                *win_fwd),
232
44.2k
            (*fac_data_out) >> (fac_q - shiftp));
233
44.2k
        win_fwd++;
234
44.2k
        fac_data_out++;
235
44.2k
      }
236
237
5.66k
      for (;
238
1.40M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
239
1.40M
           i++) {
240
1.40M
        dest[i] = ixheaac_add32_sat(
241
1.40M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
242
1.40M
                                       ixheaacd_drc_offset->n_flat_ls +
243
1.40M
                                       ixheaacd_drc_offset->lfac - i - 1]),
244
1.40M
            (*fac_data_out) >> (fac_q - shiftp));
245
1.40M
        fac_data_out++;
246
1.40M
      }
247
248
1.11M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
249
1.10M
        dest[i] =
250
1.10M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
251
1.10M
                                       ixheaacd_drc_offset->n_flat_ls +
252
1.10M
                                       ixheaacd_drc_offset->lfac - i - 1]);
253
1.10M
      }
254
5.66k
      return (shiftp);
255
5.66k
    } else {
256
2.49k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
257
2.49k
                                               ixheaacd_drc_offset->lfac));
258
259
2.49k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
260
9.79k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
261
7.29k
           i++) {
262
7.29k
        dest[i] = ixheaac_add32_sat(
263
7.29k
            (ixheaacd_mult32_sh1(
264
7.29k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
265
7.29k
                                            ixheaacd_drc_offset->n_flat_ls +
266
7.29k
                                            ixheaacd_drc_offset->lfac - i - 1]),
267
7.29k
                 *win_fwd) >>
268
7.29k
             (shiftp - shift_olap)),
269
7.29k
            (*fac_data_out) >> (fac_q - shift_olap));
270
7.29k
        win_fwd++;
271
7.29k
        fac_data_out++;
272
7.29k
      }
273
274
2.49k
      for (;
275
631k
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
276
629k
           i++) {
277
629k
        dest[i] = ixheaac_add32_sat(
278
629k
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
279
629k
                                        ixheaacd_drc_offset->n_flat_ls +
280
629k
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
281
629k
             (shiftp - shift_olap)),
282
629k
            (*fac_data_out) >> (fac_q - shift_olap));
283
629k
        fac_data_out++;
284
629k
      }
285
286
483k
      for (; i < ixheaacd_drc_offset->n_long; i++) {
287
481k
        dest[i] =
288
481k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
289
481k
                                       ixheaacd_drc_offset->n_flat_ls +
290
481k
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
291
481k
            (shiftp - shift_olap);
292
481k
      }
293
2.49k
      return (shift_olap);
294
2.49k
    }
295
8.16k
  }
296
26.9k
}
297
298
WORD8 ixheaacd_windowing_long3(WORD32 *src1, const WORD32 *win_fwd,
299
                               WORD32 *over_lap, WORD32 *p_out_buffer,
300
                               const WORD32 *win_rev,
301
                               offset_lengths *ixheaacd_drc_offset,
302
28.6k
                               WORD8 shiftp, WORD8 shift_olap) {
303
28.6k
  WORD32 i;
304
28.6k
  WORD32 *dest = p_out_buffer;
305
306
28.6k
  if (shiftp > shift_olap) {
307
19.3k
    memcpy(dest, over_lap, sizeof(FLOAT32) * ixheaacd_drc_offset->n_flat_ls);
308
309
19.3k
    for (i = ixheaacd_drc_offset->n_flat_ls;
310
1.46M
         i < ixheaacd_drc_offset->n_long / 2; i++) {
311
1.44M
      dest[i] = ixheaac_add32_sat(
312
1.44M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
313
1.44M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
314
1.44M
      win_fwd++;
315
1.44M
      win_rev--;
316
1.44M
    }
317
318
19.3k
    for (i = ixheaacd_drc_offset->n_long / 2;
319
1.46M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
320
1.44M
         i++) {
321
1.44M
      dest[i] = ixheaac_add32_sat(
322
1.44M
          (ixheaacd_mult32_sh1(
323
1.44M
               ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
324
1.44M
               *win_fwd) >>
325
1.44M
           (shiftp - shift_olap)),
326
1.44M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
327
1.44M
      win_fwd++;
328
1.44M
      win_rev--;
329
1.44M
    }
330
331
8.43M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
332
8.41M
      dest[i] =
333
8.41M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]) >>
334
8.41M
          (shiftp - shift_olap);
335
8.41M
    }
336
337
19.3k
    return (shift_olap);
338
19.3k
  } else {
339
4.03M
    for (i = 0; i < ixheaacd_drc_offset->n_flat_ls; i++) {
340
4.02M
      dest[i] = over_lap[i] >> (shift_olap - shiftp);
341
4.02M
    }
342
343
9.29k
    for (i = ixheaacd_drc_offset->n_flat_ls;
344
662k
         i < ixheaacd_drc_offset->n_long / 2; i++) {
345
653k
      dest[i] = ixheaac_add32_sat(
346
653k
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
347
653k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
348
653k
      win_fwd++;
349
653k
      win_rev--;
350
653k
    }
351
352
9.29k
    for (i = ixheaacd_drc_offset->n_long / 2;
353
662k
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
354
653k
         i++) {
355
653k
      dest[i] = ixheaac_add32_sat(
356
653k
          ixheaacd_mult32_sh1(
357
653k
              ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
358
653k
              *win_fwd),
359
653k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
360
653k
      win_fwd++;
361
653k
      win_rev--;
362
653k
    }
363
364
4.03M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
365
4.02M
      dest[i] =
366
4.02M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]);
367
4.02M
    }
368
369
9.29k
    return (shiftp);
370
9.29k
  }
371
28.6k
}
372
373
VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp,
374
                               offset_lengths *ixheaacd_drc_offset,
375
30.3k
                               WORD8 shiftp, WORD8 shift_olap) {
376
30.3k
  WORD32 i;
377
30.3k
  WORD32 *dest = fp;
378
379
30.3k
  if (shift_olap > shiftp) {
380
12.6k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
381
95.6k
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
382
94.1k
        dest[i] = dest[i] >> (shift_olap - shiftp);
383
94.1k
      }
384
95.6k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
385
94.1k
           i++) {
386
94.1k
        dest[i] = ixheaacd_mult32_sh1(
387
94.1k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_short - i - 1]),
388
94.1k
            src2[i]);
389
94.1k
      }
390
391
566k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
392
564k
           i++) {
393
564k
        dest[i] = 0;
394
564k
      }
395
11.1k
    } else {
396
1.43M
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
397
1.42M
        dest[i] = dest[i] >> (shift_olap - shiftp);
398
1.42M
      }
399
11.1k
      for (i = ixheaacd_drc_offset->lfac;
400
4.98M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
401
4.97M
           i++) {
402
4.97M
        dest[i] = 0;
403
4.97M
      }
404
11.1k
    }
405
17.7k
  } else {
406
17.7k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
407
193k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
408
190k
           i++) {
409
190k
        dest[i] =
410
190k
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(
411
190k
                                    src1[ixheaacd_drc_offset->n_short - i - 1]),
412
190k
                                src2[i]) >>
413
190k
            (shiftp - shift_olap);
414
190k
      }
415
416
1.14M
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
417
1.14M
           i++) {
418
1.14M
        dest[i] = 0;
419
1.14M
      }
420
14.6k
    } else {
421
14.6k
      for (i = ixheaacd_drc_offset->lfac;
422
6.59M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
423
6.58M
           i++) {
424
6.58M
        dest[i] = 0;
425
6.58M
      }
426
14.6k
    }
427
17.7k
  }
428
30.3k
}
429
430
VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
431
                               offset_lengths *ixheaacd_drc_offset,
432
67.4k
                               WORD8 shiftp, WORD8 shift_olap) {
433
67.4k
  WORD32 i;
434
435
67.4k
  WORD32 *win_rev = win_fwd + ixheaacd_drc_offset->n_short - 1;
436
437
67.4k
  if (shift_olap > shiftp) {
438
1.17M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
439
1.15M
      fp[i] = ixheaac_add32_sat(
440
1.15M
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
441
1.15M
          (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp)));
442
443
1.15M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
444
1.15M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev),
445
1.15M
          (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
446
1.15M
                               *win_fwd) >>
447
1.15M
           (shift_olap - shiftp)));
448
1.15M
      win_fwd++;
449
1.15M
      win_rev--;
450
1.15M
    }
451
452
18.6k
    for (i = ixheaacd_drc_offset->n_short;
453
8.09M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
454
8.07M
         i++) {
455
8.07M
      fp[i] = 0;
456
8.07M
    }
457
48.7k
  } else {
458
3.11M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
459
3.06M
      fp[i] = ixheaac_add32_sat(
460
3.06M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
461
3.06M
          ixheaacd_mult32_sh1(fp[i], *win_rev));
462
463
3.06M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
464
3.06M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev) >>
465
3.06M
           (shiftp - shift_olap)),
466
3.06M
          ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
467
3.06M
                              *win_fwd));
468
469
3.06M
      win_fwd++;
470
3.06M
      win_rev--;
471
3.06M
    }
472
473
48.7k
    for (i = ixheaacd_drc_offset->n_short;
474
21.4M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
475
21.4M
         i++) {
476
21.4M
      fp[i] = 0;
477
21.4M
    }
478
48.7k
  }
479
67.4k
}
480
481
WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp,
482
                                WORD32 n_short, WORD8 shiftp,
483
97.7k
                                WORD8 shift_olap) {
484
97.7k
  WORD32 i;
485
97.7k
  const WORD32 *win_fwd = win_rev - n_short + 1;
486
97.7k
  if (shift_olap > shiftp) {
487
1.99M
    for (i = 0; i < n_short / 2; i++) {
488
1.95M
      fp[i] = ixheaac_add32_sat(
489
1.95M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
490
1.95M
                              *win_rev),
491
1.95M
          (fp[i] >> (shift_olap - shiftp)));
492
493
1.95M
      fp[n_short - i - 1] = ixheaac_add32_sat(
494
1.95M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
495
1.95M
                              *win_fwd),
496
1.95M
          (fp[n_short - i - 1] >> (shift_olap - shiftp)));
497
1.95M
      win_rev--;
498
1.95M
      win_fwd++;
499
1.95M
    }
500
31.2k
    return (shiftp);
501
66.5k
  } else {
502
4.26M
    for (i = 0; i < n_short / 2; i++) {
503
4.19M
      fp[i] = ixheaac_add32_sat(
504
4.19M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
505
4.19M
                               *win_rev) >>
506
4.19M
           (shiftp - shift_olap)),
507
4.19M
          fp[i]);
508
509
4.19M
      fp[n_short - i - 1] = ixheaac_add32_sat(
510
4.19M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
511
4.19M
                               *win_fwd) >>
512
4.19M
           (shiftp - shift_olap)),
513
4.19M
          fp[n_short - i - 1]);
514
515
4.19M
      win_rev--;
516
4.19M
      win_fwd++;
517
4.19M
    }
518
66.5k
    return (shift_olap);
519
66.5k
  }
520
97.7k
}
521
522
WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
523
                                WORD32 *win_fwd1, WORD32 n_short, WORD32 flag,
524
                                WORD8 shiftp, WORD8 shift_olap,
525
684k
                                WORD8 output_q) {
526
684k
  WORD32 i;
527
684k
  const WORD32 *win_rev = win_fwd + n_short - 1;
528
684k
  const WORD32 *win_rev1 = win_fwd1 - n_short + 1;
529
684k
  if (shift_olap > output_q) {
530
13.9M
    for (i = 0; i < n_short / 2; i++) {
531
13.7M
      fp[i] = ixheaac_add32_sat(
532
13.7M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
533
13.7M
              (shiftp - output_q),
534
13.7M
          fp[i]);
535
536
13.7M
      fp[n_short - i - 1] = ixheaac_add32_sat(
537
13.7M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
538
13.7M
                              *win_rev) >>
539
13.7M
              (shiftp - output_q),
540
13.7M
          fp[n_short - i - 1]);
541
542
13.7M
      win_fwd++;
543
13.7M
      win_rev--;
544
13.7M
    }
545
218k
    if (flag == 1) {
546
11.9M
      for (; i < n_short; i++) {
547
11.7M
        fp[i + n_short / 2] = ixheaac_add32_sat(
548
11.7M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
549
11.7M
                                *win_fwd1) >>
550
11.7M
                (shiftp - output_q),
551
11.7M
            (fp[i + n_short / 2] >> (shift_olap - output_q)));
552
553
11.7M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
554
11.7M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
555
11.7M
                                *win_rev1) >>
556
11.7M
                (shiftp - output_q),
557
11.7M
            (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)));
558
559
11.7M
        win_fwd1--;
560
11.7M
        win_rev1++;
561
11.7M
      }
562
187k
    } else {
563
1.99M
      for (; i < n_short; i++) {
564
1.95M
        fp[i + n_short / 2] = ixheaac_add32_sat(
565
1.95M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
566
1.95M
            fp[i + n_short / 2] >> (shift_olap - output_q));
567
1.95M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
568
1.95M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
569
1.95M
            fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q));
570
1.95M
      }
571
31.2k
    }
572
218k
    return (output_q);
573
465k
  } else {
574
29.8M
    for (i = 0; i < n_short / 2; i++) {
575
29.3M
      fp[i] = ixheaac_add32_sat(
576
29.3M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
577
29.3M
              (shiftp - shift_olap),
578
29.3M
          fp[i] >> (output_q - shift_olap));
579
580
29.3M
      fp[n_short - i - 1] = ixheaac_add32_sat(
581
29.3M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
582
29.3M
                              *win_rev) >>
583
29.3M
              (shiftp - shift_olap),
584
29.3M
          fp[n_short - i - 1]);
585
586
29.3M
      win_fwd++;
587
29.3M
      win_rev--;
588
29.3M
    }
589
465k
    if (flag == 1) {
590
25.5M
      for (; i < n_short; i++) {
591
25.1M
        fp[i + n_short / 2] = ixheaac_add32_sat(
592
25.1M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
593
25.1M
                                *win_fwd1) >>
594
25.1M
                (shiftp - shift_olap),
595
25.1M
            fp[i + n_short / 2]);
596
597
25.1M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
598
25.1M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
599
25.1M
                                *win_rev1) >>
600
25.1M
                (shiftp - shift_olap),
601
25.1M
            fp[3 * n_short - n_short / 2 - i - 1]);
602
603
25.1M
        win_fwd1--;
604
25.1M
        win_rev1++;
605
25.1M
      }
606
399k
    } else {
607
4.26M
      for (; i < n_short; i++) {
608
4.19M
        fp[i + n_short / 2] =
609
4.19M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
610
4.19M
                                   (shiftp - shift_olap),
611
4.19M
                               fp[i + n_short / 2]);
612
4.19M
        fp[3 * n_short - n_short / 2 - i - 1] =
613
4.19M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
614
4.19M
                                   (shiftp - shift_olap),
615
4.19M
                               fp[3 * n_short - n_short / 2 - i - 1]);
616
4.19M
      }
617
66.5k
    }
618
465k
    return (shift_olap);
619
465k
  }
620
684k
}
621
622
VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1,
623
293k
                         WORD8 shift2) {
624
293k
  WORD32 i;
625
293k
  if (shift1 > shift2) {
626
13.7M
    for (i = 0; i < len; i++) {
627
13.7M
      *dest = *src >> (shift1 - shift2);
628
13.7M
      src++;
629
13.7M
      dest++;
630
13.7M
    }
631
261k
  } else {
632
226M
    for (i = 0; i < len; i++) {
633
226M
      *dest = ixheaac_shl32_sat((*src), (shift2 - shift1));
634
226M
      src++;
635
226M
      dest++;
636
226M
    }
637
261k
  }
638
293k
}
639
640
VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len,
641
228k
                             WORD8 shift1, WORD8 shift2) {
642
228k
  WORD32 i;
643
228k
  if (shift1 > shift2) {
644
0
    for (i = 0; i < len; i++) {
645
0
      *dest = ixheaac_add32_sat((*src >> (shift1 - shift2)), ADJ_SCALE);
646
0
      src++;
647
0
      dest++;
648
0
    }
649
228k
  } else {
650
228M
    for (i = 0; i < len; i++) {
651
228M
      *dest = ixheaac_add32_sat(ixheaac_shl32_sat((*src), (shift2 - shift1)),
652
228M
                                 ADJ_SCALE);
653
228M
      src++;
654
228M
      dest++;
655
228M
    }
656
228k
  }
657
228k
}