Coverage Report

Created: 2026-01-10 06:30

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
479M
static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) {
29
479M
  WORD32 result;
30
479M
  WORD64 temp_result;
31
32
479M
  temp_result = (WORD64)a * (WORD64)b;
33
479M
  result = (WORD32)(temp_result >> 31);
34
35
479M
  return (result);
36
479M
}
37
38
246k
VOID ixheaacd_memset(FLOAT32 *x, WORD32 n) {
39
246k
  memset(x, 0, n * sizeof(FLOAT32));
40
246k
  return;
41
246k
}
42
43
2.03M
VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n) {
44
2.03M
  memcpy(y, x, n * sizeof(FLOAT32));
45
2.03M
  return;
46
2.03M
}
47
48
236k
VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n) {
49
236k
  WORD32 i;
50
75.1M
  for (i = 0; i < n; i++) {
51
74.9M
    z[i] = (FLOAT32)a * x[i];
52
74.9M
  }
53
236k
  return;
54
236k
}
55
56
VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len,
57
33.2k
                          WORD8 output_q, WORD8 fac_q) {
58
33.2k
  WORD32 i;
59
33.2k
  if (fac_q > output_q) {
60
2.09M
    for (i = 0; i < len; i++) {
61
2.08M
      *dest = ixheaac_add32_sat(*src1, ((*src2) >> (fac_q - output_q)));
62
2.08M
      dest++;
63
2.08M
      src1++;
64
2.08M
      src2++;
65
2.08M
    }
66
24.1k
  } else {
67
5.87M
    for (i = 0; i < len; i++) {
68
5.85M
      *dest = ixheaac_add32_sat(
69
5.85M
          *src1, ixheaac_shl32_sat((*src2), (output_q - fac_q)));
70
5.85M
      dest++;
71
5.85M
      src1++;
72
5.85M
      src2++;
73
5.85M
    }
74
24.1k
  }
75
33.2k
}
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
131k
                               WORD8 shift2) {
81
131k
  WORD32 i;
82
131k
  WORD32 *rsrc2 = src2 + vlen - 1;
83
84
131k
  if (shift1 > shift2) {
85
63.3M
    for (i = 0; i < vlen / 2; i++) {
86
63.2M
      *dest = ixheaac_add32_sat(
87
63.2M
          ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)),
88
63.2M
          ixheaacd_mult32_sh1(*src2, *win_rev));
89
63.2M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
90
63.2M
          ((ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev)) >>
91
63.2M
           (shift1 - shift2)),
92
63.2M
          ixheaacd_mult32_sh1(*rsrc2, *win_fwd));
93
94
63.2M
      src1++;
95
63.2M
      src2++;
96
63.2M
      win_fwd++;
97
63.2M
      win_rev--;
98
63.2M
      rsrc2--;
99
63.2M
      dest++;
100
63.2M
    }
101
128k
    return (shift2);
102
128k
  } else {
103
1.28M
    for (i = 0; i < vlen / 2; i++) {
104
1.28M
      *dest = ixheaac_add32_sat(
105
1.28M
          ixheaacd_mult32_sh1(*src1, *win_fwd),
106
1.28M
          ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1)));
107
108
1.28M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
109
1.28M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev),
110
1.28M
          ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1)));
111
1.28M
      src1++;
112
1.28M
      src2++;
113
1.28M
      win_fwd++;
114
1.28M
      win_rev--;
115
1.28M
      rsrc2--;
116
1.28M
      dest++;
117
1.28M
    }
118
2.57k
    return (shift1);
119
2.57k
  }
120
131k
}
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
34.1k
                               WORD8 shiftp, WORD8 shift_olap, WORD8 fac_q) {
127
34.1k
  WORD32 i;
128
34.1k
  WORD32 *dest = p_out_buffer;
129
130
34.1k
  win_fwd += ixheaacd_drc_offset->lfac;
131
132
34.1k
  if (shiftp > fac_q) {
133
20.8k
    if (shift_olap > fac_q) {
134
4.48k
      for (i = 0;
135
2.38M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
136
2.38M
           i++) {
137
2.38M
        dest[i] = over_lap[i] >> (shift_olap - fac_q);
138
2.38M
      }
139
140
4.48k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
141
375k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
142
370k
           i++) {
143
370k
        dest[i] = ixheaac_add32_sat(
144
370k
            (ixheaacd_mult32_sh1(
145
370k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
146
370k
                                            ixheaacd_drc_offset->n_flat_ls +
147
370k
                                            ixheaacd_drc_offset->lfac - i - 1]),
148
370k
                 *win_fwd) >>
149
370k
             (shiftp - fac_q)),
150
370k
            (*fac_data_out));
151
370k
        win_fwd++;
152
370k
        fac_data_out++;
153
370k
      }
154
155
4.48k
      for (;
156
774k
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
157
769k
           i++) {
158
769k
        dest[i] = ixheaac_add32_sat(
159
769k
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
160
769k
                                        ixheaacd_drc_offset->n_flat_ls +
161
769k
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
162
769k
             (shiftp - fac_q)),
163
769k
            (*fac_data_out));
164
769k
        fac_data_out++;
165
769k
      }
166
167
1.04M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
168
1.04M
        dest[i] =
169
1.04M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
170
1.04M
                                       ixheaacd_drc_offset->n_flat_ls +
171
1.04M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
172
1.04M
            (shiftp - fac_q);
173
1.04M
      }
174
4.48k
      return (fac_q);
175
16.3k
    } else {
176
16.3k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
177
16.3k
                                               ixheaacd_drc_offset->lfac));
178
179
16.3k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
180
133k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
181
116k
           i++) {
182
116k
        dest[i] = ixheaac_add32_sat(
183
116k
            (ixheaacd_mult32_sh1(
184
116k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
185
116k
                                            ixheaacd_drc_offset->n_flat_ls +
186
116k
                                            ixheaacd_drc_offset->lfac - i - 1]),
187
116k
                 *win_fwd) >>
188
116k
             (shiftp - shift_olap)),
189
116k
            (*fac_data_out) >> (fac_q - shift_olap));
190
116k
        win_fwd++;
191
116k
        fac_data_out++;
192
116k
      }
193
194
16.3k
      for (;
195
4.08M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
196
4.06M
           i++) {
197
4.06M
        dest[i] = ixheaac_add32_sat(
198
4.06M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
199
4.06M
                                        ixheaacd_drc_offset->n_flat_ls +
200
4.06M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
201
4.06M
             (shiftp - shift_olap)),
202
4.06M
            (*fac_data_out) >> (fac_q - shift_olap));
203
4.06M
        fac_data_out++;
204
4.06M
      }
205
206
3.21M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
207
3.19M
        dest[i] =
208
3.19M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
209
3.19M
                                       ixheaacd_drc_offset->n_flat_ls +
210
3.19M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
211
3.19M
            (shiftp - shift_olap);
212
3.19M
      }
213
16.3k
      return (shift_olap);
214
16.3k
    }
215
20.8k
  } else {
216
13.2k
    if (shift_olap > shiftp) {
217
8.58k
      for (i = 0;
218
4.91M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
219
4.90M
           i++) {
220
4.90M
        dest[i] = over_lap[i] >> (shift_olap - shiftp);
221
4.90M
      }
222
223
8.58k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
224
69.7k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
225
61.2k
           i++) {
226
61.2k
        dest[i] = ixheaac_add32_sat(
227
61.2k
            ixheaacd_mult32_sh1(
228
61.2k
                ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
229
61.2k
                                           ixheaacd_drc_offset->n_flat_ls +
230
61.2k
                                           ixheaacd_drc_offset->lfac - i - 1]),
231
61.2k
                *win_fwd),
232
61.2k
            (*fac_data_out) >> (fac_q - shiftp));
233
61.2k
        win_fwd++;
234
61.2k
        fac_data_out++;
235
61.2k
      }
236
237
8.58k
      for (;
238
2.13M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
239
2.13M
           i++) {
240
2.13M
        dest[i] = ixheaac_add32_sat(
241
2.13M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
242
2.13M
                                       ixheaacd_drc_offset->n_flat_ls +
243
2.13M
                                       ixheaacd_drc_offset->lfac - i - 1]),
244
2.13M
            (*fac_data_out) >> (fac_q - shiftp));
245
2.13M
        fac_data_out++;
246
2.13M
      }
247
248
1.68M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
249
1.67M
        dest[i] =
250
1.67M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
251
1.67M
                                       ixheaacd_drc_offset->n_flat_ls +
252
1.67M
                                       ixheaacd_drc_offset->lfac - i - 1]);
253
1.67M
      }
254
8.58k
      return (shiftp);
255
8.58k
    } else {
256
4.69k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
257
4.69k
                                               ixheaacd_drc_offset->lfac));
258
259
4.69k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
260
14.8k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
261
10.1k
           i++) {
262
10.1k
        dest[i] = ixheaac_add32_sat(
263
10.1k
            (ixheaacd_mult32_sh1(
264
10.1k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
265
10.1k
                                            ixheaacd_drc_offset->n_flat_ls +
266
10.1k
                                            ixheaacd_drc_offset->lfac - i - 1]),
267
10.1k
                 *win_fwd) >>
268
10.1k
             (shiftp - shift_olap)),
269
10.1k
            (*fac_data_out) >> (fac_q - shift_olap));
270
10.1k
        win_fwd++;
271
10.1k
        fac_data_out++;
272
10.1k
      }
273
274
4.69k
      for (;
275
1.19M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
276
1.19M
           i++) {
277
1.19M
        dest[i] = ixheaac_add32_sat(
278
1.19M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
279
1.19M
                                        ixheaacd_drc_offset->n_flat_ls +
280
1.19M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
281
1.19M
             (shiftp - shift_olap)),
282
1.19M
            (*fac_data_out) >> (fac_q - shift_olap));
283
1.19M
        fac_data_out++;
284
1.19M
      }
285
286
910k
      for (; i < ixheaacd_drc_offset->n_long; i++) {
287
905k
        dest[i] =
288
905k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
289
905k
                                       ixheaacd_drc_offset->n_flat_ls +
290
905k
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
291
905k
            (shiftp - shift_olap);
292
905k
      }
293
4.69k
      return (shift_olap);
294
4.69k
    }
295
13.2k
  }
296
34.1k
}
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
36.2k
                               WORD8 shiftp, WORD8 shift_olap) {
303
36.2k
  WORD32 i;
304
36.2k
  WORD32 *dest = p_out_buffer;
305
306
36.2k
  if (shiftp > shift_olap) {
307
22.3k
    memcpy(dest, over_lap, sizeof(FLOAT32) * ixheaacd_drc_offset->n_flat_ls);
308
309
22.3k
    for (i = ixheaacd_drc_offset->n_flat_ls;
310
1.67M
         i < ixheaacd_drc_offset->n_long / 2; i++) {
311
1.65M
      dest[i] = ixheaac_add32_sat(
312
1.65M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
313
1.65M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
314
1.65M
      win_fwd++;
315
1.65M
      win_rev--;
316
1.65M
    }
317
318
22.3k
    for (i = ixheaacd_drc_offset->n_long / 2;
319
1.67M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
320
1.65M
         i++) {
321
1.65M
      dest[i] = ixheaac_add32_sat(
322
1.65M
          (ixheaacd_mult32_sh1(
323
1.65M
               ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
324
1.65M
               *win_fwd) >>
325
1.65M
           (shiftp - shift_olap)),
326
1.65M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
327
1.65M
      win_fwd++;
328
1.65M
      win_rev--;
329
1.65M
    }
330
331
9.69M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
332
9.67M
      dest[i] =
333
9.67M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]) >>
334
9.67M
          (shiftp - shift_olap);
335
9.67M
    }
336
337
22.3k
    return (shift_olap);
338
22.3k
  } else {
339
6.05M
    for (i = 0; i < ixheaacd_drc_offset->n_flat_ls; i++) {
340
6.04M
      dest[i] = over_lap[i] >> (shift_olap - shiftp);
341
6.04M
    }
342
343
13.9k
    for (i = ixheaacd_drc_offset->n_flat_ls;
344
958k
         i < ixheaacd_drc_offset->n_long / 2; i++) {
345
944k
      dest[i] = ixheaac_add32_sat(
346
944k
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
347
944k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
348
944k
      win_fwd++;
349
944k
      win_rev--;
350
944k
    }
351
352
13.9k
    for (i = ixheaacd_drc_offset->n_long / 2;
353
958k
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
354
944k
         i++) {
355
944k
      dest[i] = ixheaac_add32_sat(
356
944k
          ixheaacd_mult32_sh1(
357
944k
              ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
358
944k
              *win_fwd),
359
944k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
360
944k
      win_fwd++;
361
944k
      win_rev--;
362
944k
    }
363
364
6.05M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
365
6.04M
      dest[i] =
366
6.04M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]);
367
6.04M
    }
368
369
13.9k
    return (shiftp);
370
13.9k
  }
371
36.2k
}
372
373
VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp,
374
                               offset_lengths *ixheaacd_drc_offset,
375
33.2k
                               WORD8 shiftp, WORD8 shift_olap) {
376
33.2k
  WORD32 i;
377
33.2k
  WORD32 *dest = fp;
378
379
33.2k
  if (shift_olap > shiftp) {
380
15.0k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
381
142k
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
382
140k
        dest[i] = dest[i] >> (shift_olap - shiftp);
383
140k
      }
384
142k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
385
140k
           i++) {
386
140k
        dest[i] = ixheaacd_mult32_sh1(
387
140k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_short - i - 1]),
388
140k
            src2[i]);
389
140k
      }
390
391
842k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
392
840k
           i++) {
393
840k
        dest[i] = 0;
394
840k
      }
395
12.8k
    } else {
396
1.66M
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
397
1.65M
        dest[i] = dest[i] >> (shift_olap - shiftp);
398
1.65M
      }
399
12.8k
      for (i = ixheaacd_drc_offset->lfac;
400
5.79M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
401
5.77M
           i++) {
402
5.77M
        dest[i] = 0;
403
5.77M
      }
404
12.8k
    }
405
18.1k
  } else {
406
18.1k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
407
135k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
408
133k
           i++) {
409
133k
        dest[i] =
410
133k
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(
411
133k
                                    src1[ixheaacd_drc_offset->n_short - i - 1]),
412
133k
                                src2[i]) >>
413
133k
            (shiftp - shift_olap);
414
133k
      }
415
416
804k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
417
802k
           i++) {
418
802k
        dest[i] = 0;
419
802k
      }
420
15.9k
    } else {
421
15.9k
      for (i = ixheaacd_drc_offset->lfac;
422
7.16M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
423
7.14M
           i++) {
424
7.14M
        dest[i] = 0;
425
7.14M
      }
426
15.9k
    }
427
18.1k
  }
428
33.2k
}
429
430
VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
431
                               offset_lengths *ixheaacd_drc_offset,
432
75.0k
                               WORD8 shiftp, WORD8 shift_olap) {
433
75.0k
  WORD32 i;
434
435
75.0k
  WORD32 *win_rev = win_fwd + ixheaacd_drc_offset->n_short - 1;
436
437
75.0k
  if (shift_olap > shiftp) {
438
1.22M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
439
1.20M
      fp[i] = ixheaac_add32_sat(
440
1.20M
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
441
1.20M
          (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp)));
442
443
1.20M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
444
1.20M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev),
445
1.20M
          (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
446
1.20M
                               *win_fwd) >>
447
1.20M
           (shift_olap - shiftp)));
448
1.20M
      win_fwd++;
449
1.20M
      win_rev--;
450
1.20M
    }
451
452
19.0k
    for (i = ixheaacd_drc_offset->n_short;
453
8.46M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
454
8.44M
         i++) {
455
8.44M
      fp[i] = 0;
456
8.44M
    }
457
56.0k
  } else {
458
3.57M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
459
3.51M
      fp[i] = ixheaac_add32_sat(
460
3.51M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
461
3.51M
          ixheaacd_mult32_sh1(fp[i], *win_rev));
462
463
3.51M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
464
3.51M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev) >>
465
3.51M
           (shiftp - shift_olap)),
466
3.51M
          ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
467
3.51M
                              *win_fwd));
468
469
3.51M
      win_fwd++;
470
3.51M
      win_rev--;
471
3.51M
    }
472
473
56.0k
    for (i = ixheaacd_drc_offset->n_short;
474
24.6M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
475
24.6M
         i++) {
476
24.6M
      fp[i] = 0;
477
24.6M
    }
478
56.0k
  }
479
75.0k
}
480
481
WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp,
482
                                WORD32 n_short, WORD8 shiftp,
483
108k
                                WORD8 shift_olap) {
484
108k
  WORD32 i;
485
108k
  const WORD32 *win_fwd = win_rev - n_short + 1;
486
108k
  if (shift_olap > shiftp) {
487
2.20M
    for (i = 0; i < n_short / 2; i++) {
488
2.17M
      fp[i] = ixheaac_add32_sat(
489
2.17M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
490
2.17M
                              *win_rev),
491
2.17M
          (fp[i] >> (shift_olap - shiftp)));
492
493
2.17M
      fp[n_short - i - 1] = ixheaac_add32_sat(
494
2.17M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
495
2.17M
                              *win_fwd),
496
2.17M
          (fp[n_short - i - 1] >> (shift_olap - shiftp)));
497
2.17M
      win_rev--;
498
2.17M
      win_fwd++;
499
2.17M
    }
500
34.1k
    return (shiftp);
501
74.1k
  } else {
502
4.74M
    for (i = 0; i < n_short / 2; i++) {
503
4.67M
      fp[i] = ixheaac_add32_sat(
504
4.67M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
505
4.67M
                               *win_rev) >>
506
4.67M
           (shiftp - shift_olap)),
507
4.67M
          fp[i]);
508
509
4.67M
      fp[n_short - i - 1] = ixheaac_add32_sat(
510
4.67M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
511
4.67M
                               *win_fwd) >>
512
4.67M
           (shiftp - shift_olap)),
513
4.67M
          fp[n_short - i - 1]);
514
515
4.67M
      win_rev--;
516
4.67M
      win_fwd++;
517
4.67M
    }
518
74.1k
    return (shift_olap);
519
74.1k
  }
520
108k
}
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
757k
                                WORD8 output_q) {
526
757k
  WORD32 i;
527
757k
  const WORD32 *win_rev = win_fwd + n_short - 1;
528
757k
  const WORD32 *win_rev1 = win_fwd1 - n_short + 1;
529
757k
  if (shift_olap > output_q) {
530
15.4M
    for (i = 0; i < n_short / 2; i++) {
531
15.2M
      fp[i] = ixheaac_add32_sat(
532
15.2M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
533
15.2M
              (shiftp - output_q),
534
15.2M
          fp[i]);
535
536
15.2M
      fp[n_short - i - 1] = ixheaac_add32_sat(
537
15.2M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
538
15.2M
                              *win_rev) >>
539
15.2M
              (shiftp - output_q),
540
15.2M
          fp[n_short - i - 1]);
541
542
15.2M
      win_fwd++;
543
15.2M
      win_rev--;
544
15.2M
    }
545
238k
    if (flag == 1) {
546
13.2M
      for (; i < n_short; i++) {
547
13.0M
        fp[i + n_short / 2] = ixheaac_add32_sat(
548
13.0M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
549
13.0M
                                *win_fwd1) >>
550
13.0M
                (shiftp - output_q),
551
13.0M
            (fp[i + n_short / 2] >> (shift_olap - output_q)));
552
553
13.0M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
554
13.0M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
555
13.0M
                                *win_rev1) >>
556
13.0M
                (shiftp - output_q),
557
13.0M
            (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)));
558
559
13.0M
        win_fwd1--;
560
13.0M
        win_rev1++;
561
13.0M
      }
562
204k
    } else {
563
2.20M
      for (; i < n_short; i++) {
564
2.17M
        fp[i + n_short / 2] = ixheaac_add32_sat(
565
2.17M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
566
2.17M
            fp[i + n_short / 2] >> (shift_olap - output_q));
567
2.17M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
568
2.17M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
569
2.17M
            fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q));
570
2.17M
      }
571
34.1k
    }
572
238k
    return (output_q);
573
519k
  } else {
574
33.2M
    for (i = 0; i < n_short / 2; i++) {
575
32.6M
      fp[i] = ixheaac_add32_sat(
576
32.6M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
577
32.6M
              (shiftp - shift_olap),
578
32.6M
          fp[i] >> (output_q - shift_olap));
579
580
32.6M
      fp[n_short - i - 1] = ixheaac_add32_sat(
581
32.6M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
582
32.6M
                              *win_rev) >>
583
32.6M
              (shiftp - shift_olap),
584
32.6M
          fp[n_short - i - 1]);
585
586
32.6M
      win_fwd++;
587
32.6M
      win_rev--;
588
32.6M
    }
589
519k
    if (flag == 1) {
590
28.4M
      for (; i < n_short; i++) {
591
28.0M
        fp[i + n_short / 2] = ixheaac_add32_sat(
592
28.0M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
593
28.0M
                                *win_fwd1) >>
594
28.0M
                (shiftp - shift_olap),
595
28.0M
            fp[i + n_short / 2]);
596
597
28.0M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
598
28.0M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
599
28.0M
                                *win_rev1) >>
600
28.0M
                (shiftp - shift_olap),
601
28.0M
            fp[3 * n_short - n_short / 2 - i - 1]);
602
603
28.0M
        win_fwd1--;
604
28.0M
        win_rev1++;
605
28.0M
      }
606
444k
    } else {
607
4.74M
      for (; i < n_short; i++) {
608
4.67M
        fp[i + n_short / 2] =
609
4.67M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
610
4.67M
                                   (shiftp - shift_olap),
611
4.67M
                               fp[i + n_short / 2]);
612
4.67M
        fp[3 * n_short - n_short / 2 - i - 1] =
613
4.67M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
614
4.67M
                                   (shiftp - shift_olap),
615
4.67M
                               fp[3 * n_short - n_short / 2 - i - 1]);
616
4.67M
      }
617
74.1k
    }
618
519k
    return (shift_olap);
619
519k
  }
620
757k
}
621
622
VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1,
623
324k
                         WORD8 shift2) {
624
324k
  WORD32 i;
625
324k
  if (shift1 > shift2) {
626
15.2M
    for (i = 0; i < len; i++) {
627
15.2M
      *dest = *src >> (shift1 - shift2);
628
15.2M
      src++;
629
15.2M
      dest++;
630
15.2M
    }
631
290k
  } else {
632
251M
    for (i = 0; i < len; i++) {
633
251M
      *dest = ixheaac_shl32_sat((*src), (shift2 - shift1));
634
251M
      src++;
635
251M
      dest++;
636
251M
    }
637
290k
  }
638
324k
}
639
640
VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len,
641
201k
                             WORD8 shift1, WORD8 shift2) {
642
201k
  WORD32 i;
643
201k
  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
201k
  } else {
650
200M
    for (i = 0; i < len; i++) {
651
200M
      *dest = ixheaac_add32_sat(ixheaac_shl32_sat((*src), (shift2 - shift1)),
652
200M
                                 ADJ_SCALE);
653
200M
      src++;
654
200M
      dest++;
655
200M
    }
656
201k
  }
657
201k
}