Coverage Report

Created: 2026-02-07 06:17

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