Coverage Report

Created: 2025-10-10 06:12

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
580M
static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) {
29
580M
  WORD32 result;
30
580M
  WORD64 temp_result;
31
32
580M
  temp_result = (WORD64)a * (WORD64)b;
33
580M
  result = (WORD32)(temp_result >> 31);
34
35
580M
  return (result);
36
580M
}
37
38
299k
VOID ixheaacd_memset(FLOAT32 *x, WORD32 n) {
39
299k
  memset(x, 0, n * sizeof(FLOAT32));
40
299k
  return;
41
299k
}
42
43
2.48M
VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n) {
44
2.48M
  memcpy(y, x, n * sizeof(FLOAT32));
45
2.48M
  return;
46
2.48M
}
47
48
280k
VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n) {
49
280k
  WORD32 i;
50
86.3M
  for (i = 0; i < n; i++) {
51
86.0M
    z[i] = (FLOAT32)a * x[i];
52
86.0M
  }
53
280k
  return;
54
280k
}
55
56
VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len,
57
32.0k
                          WORD8 output_q, WORD8 fac_q) {
58
32.0k
  WORD32 i;
59
32.0k
  if (fac_q > output_q) {
60
2.15M
    for (i = 0; i < len; i++) {
61
2.14M
      *dest = ixheaac_add32_sat(*src1, ((*src2) >> (fac_q - output_q)));
62
2.14M
      dest++;
63
2.14M
      src1++;
64
2.14M
      src2++;
65
2.14M
    }
66
22.5k
  } else {
67
5.54M
    for (i = 0; i < len; i++) {
68
5.51M
      *dest = ixheaac_add32_sat(
69
5.51M
          *src1, ixheaac_shl32_sat((*src2), (output_q - fac_q)));
70
5.51M
      dest++;
71
5.51M
      src1++;
72
5.51M
      src2++;
73
5.51M
    }
74
22.5k
  }
75
32.0k
}
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
183k
                               WORD8 shift2) {
81
183k
  WORD32 i;
82
183k
  WORD32 *rsrc2 = src2 + vlen - 1;
83
84
183k
  if (shift1 > shift2) {
85
89.0M
    for (i = 0; i < vlen / 2; i++) {
86
88.8M
      *dest = ixheaac_add32_sat(
87
88.8M
          ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)),
88
88.8M
          ixheaacd_mult32_sh1(*src2, *win_rev));
89
88.8M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
90
88.8M
          ((ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev)) >>
91
88.8M
           (shift1 - shift2)),
92
88.8M
          ixheaacd_mult32_sh1(*rsrc2, *win_fwd));
93
94
88.8M
      src1++;
95
88.8M
      src2++;
96
88.8M
      win_fwd++;
97
88.8M
      win_rev--;
98
88.8M
      rsrc2--;
99
88.8M
      dest++;
100
88.8M
    }
101
180k
    return (shift2);
102
180k
  } else {
103
1.03M
    for (i = 0; i < vlen / 2; i++) {
104
1.02M
      *dest = ixheaac_add32_sat(
105
1.02M
          ixheaacd_mult32_sh1(*src1, *win_fwd),
106
1.02M
          ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1)));
107
108
1.02M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
109
1.02M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev),
110
1.02M
          ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1)));
111
1.02M
      src1++;
112
1.02M
      src2++;
113
1.02M
      win_fwd++;
114
1.02M
      win_rev--;
115
1.02M
      rsrc2--;
116
1.02M
      dest++;
117
1.02M
    }
118
2.24k
    return (shift1);
119
2.24k
  }
120
183k
}
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.4k
                               WORD8 shiftp, WORD8 shift_olap, WORD8 fac_q) {
127
34.4k
  WORD32 i;
128
34.4k
  WORD32 *dest = p_out_buffer;
129
130
34.4k
  win_fwd += ixheaacd_drc_offset->lfac;
131
132
34.4k
  if (shiftp > fac_q) {
133
23.1k
    if (shift_olap > fac_q) {
134
6.02k
      for (i = 0;
135
3.22M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
136
3.21M
           i++) {
137
3.21M
        dest[i] = over_lap[i] >> (shift_olap - fac_q);
138
3.21M
      }
139
140
6.02k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
141
479k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
142
473k
           i++) {
143
473k
        dest[i] = ixheaac_add32_sat(
144
473k
            (ixheaacd_mult32_sh1(
145
473k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
146
473k
                                            ixheaacd_drc_offset->n_flat_ls +
147
473k
                                            ixheaacd_drc_offset->lfac - i - 1]),
148
473k
                 *win_fwd) >>
149
473k
             (shiftp - fac_q)),
150
473k
            (*fac_data_out));
151
473k
        win_fwd++;
152
473k
        fac_data_out++;
153
473k
      }
154
155
6.02k
      for (;
156
1.06M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
157
1.06M
           i++) {
158
1.06M
        dest[i] = ixheaac_add32_sat(
159
1.06M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
160
1.06M
                                        ixheaacd_drc_offset->n_flat_ls +
161
1.06M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
162
1.06M
             (shiftp - fac_q)),
163
1.06M
            (*fac_data_out));
164
1.06M
        fac_data_out++;
165
1.06M
      }
166
167
1.39M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
168
1.38M
        dest[i] =
169
1.38M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
170
1.38M
                                       ixheaacd_drc_offset->n_flat_ls +
171
1.38M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
172
1.38M
            (shiftp - fac_q);
173
1.38M
      }
174
6.02k
      return (fac_q);
175
17.1k
    } else {
176
17.1k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
177
17.1k
                                               ixheaacd_drc_offset->lfac));
178
179
17.1k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
180
183k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
181
166k
           i++) {
182
166k
        dest[i] = ixheaac_add32_sat(
183
166k
            (ixheaacd_mult32_sh1(
184
166k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
185
166k
                                            ixheaacd_drc_offset->n_flat_ls +
186
166k
                                            ixheaacd_drc_offset->lfac - i - 1]),
187
166k
                 *win_fwd) >>
188
166k
             (shiftp - shift_olap)),
189
166k
            (*fac_data_out) >> (fac_q - shift_olap));
190
166k
        win_fwd++;
191
166k
        fac_data_out++;
192
166k
      }
193
194
17.1k
      for (;
195
4.22M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
196
4.20M
           i++) {
197
4.20M
        dest[i] = ixheaac_add32_sat(
198
4.20M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
199
4.20M
                                        ixheaacd_drc_offset->n_flat_ls +
200
4.20M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
201
4.20M
             (shiftp - shift_olap)),
202
4.20M
            (*fac_data_out) >> (fac_q - shift_olap));
203
4.20M
        fac_data_out++;
204
4.20M
      }
205
206
3.38M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
207
3.36M
        dest[i] =
208
3.36M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
209
3.36M
                                       ixheaacd_drc_offset->n_flat_ls +
210
3.36M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
211
3.36M
            (shiftp - shift_olap);
212
3.36M
      }
213
17.1k
      return (shift_olap);
214
17.1k
    }
215
23.1k
  } else {
216
11.3k
    if (shift_olap > shiftp) {
217
7.02k
      for (i = 0;
218
4.00M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
219
4.00M
           i++) {
220
4.00M
        dest[i] = over_lap[i] >> (shift_olap - shiftp);
221
4.00M
      }
222
223
7.02k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
224
66.9k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
225
59.9k
           i++) {
226
59.9k
        dest[i] = ixheaac_add32_sat(
227
59.9k
            ixheaacd_mult32_sh1(
228
59.9k
                ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
229
59.9k
                                           ixheaacd_drc_offset->n_flat_ls +
230
59.9k
                                           ixheaacd_drc_offset->lfac - i - 1]),
231
59.9k
                *win_fwd),
232
59.9k
            (*fac_data_out) >> (fac_q - shiftp));
233
59.9k
        win_fwd++;
234
59.9k
        fac_data_out++;
235
59.9k
      }
236
237
7.02k
      for (;
238
1.73M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
239
1.73M
           i++) {
240
1.73M
        dest[i] = ixheaac_add32_sat(
241
1.73M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
242
1.73M
                                       ixheaacd_drc_offset->n_flat_ls +
243
1.73M
                                       ixheaacd_drc_offset->lfac - i - 1]),
244
1.73M
            (*fac_data_out) >> (fac_q - shiftp));
245
1.73M
        fac_data_out++;
246
1.73M
      }
247
248
1.38M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
249
1.37M
        dest[i] =
250
1.37M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
251
1.37M
                                       ixheaacd_drc_offset->n_flat_ls +
252
1.37M
                                       ixheaacd_drc_offset->lfac - i - 1]);
253
1.37M
      }
254
7.02k
      return (shiftp);
255
7.02k
    } else {
256
4.33k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
257
4.33k
                                               ixheaacd_drc_offset->lfac));
258
259
4.33k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
260
18.7k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
261
14.3k
           i++) {
262
14.3k
        dest[i] = ixheaac_add32_sat(
263
14.3k
            (ixheaacd_mult32_sh1(
264
14.3k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
265
14.3k
                                            ixheaacd_drc_offset->n_flat_ls +
266
14.3k
                                            ixheaacd_drc_offset->lfac - i - 1]),
267
14.3k
                 *win_fwd) >>
268
14.3k
             (shiftp - shift_olap)),
269
14.3k
            (*fac_data_out) >> (fac_q - shift_olap));
270
14.3k
        win_fwd++;
271
14.3k
        fac_data_out++;
272
14.3k
      }
273
274
4.33k
      for (;
275
1.09M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
276
1.09M
           i++) {
277
1.09M
        dest[i] = ixheaac_add32_sat(
278
1.09M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
279
1.09M
                                        ixheaacd_drc_offset->n_flat_ls +
280
1.09M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
281
1.09M
             (shiftp - shift_olap)),
282
1.09M
            (*fac_data_out) >> (fac_q - shift_olap));
283
1.09M
        fac_data_out++;
284
1.09M
      }
285
286
841k
      for (; i < ixheaacd_drc_offset->n_long; i++) {
287
836k
        dest[i] =
288
836k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
289
836k
                                       ixheaacd_drc_offset->n_flat_ls +
290
836k
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
291
836k
            (shiftp - shift_olap);
292
836k
      }
293
4.33k
      return (shift_olap);
294
4.33k
    }
295
11.3k
  }
296
34.4k
}
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
24.9k
    memcpy(dest, over_lap, sizeof(FLOAT32) * ixheaacd_drc_offset->n_flat_ls);
308
309
24.9k
    for (i = ixheaacd_drc_offset->n_flat_ls;
310
1.91M
         i < ixheaacd_drc_offset->n_long / 2; i++) {
311
1.89M
      dest[i] = ixheaac_add32_sat(
312
1.89M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
313
1.89M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
314
1.89M
      win_fwd++;
315
1.89M
      win_rev--;
316
1.89M
    }
317
318
24.9k
    for (i = ixheaacd_drc_offset->n_long / 2;
319
1.91M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
320
1.89M
         i++) {
321
1.89M
      dest[i] = ixheaac_add32_sat(
322
1.89M
          (ixheaacd_mult32_sh1(
323
1.89M
               ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
324
1.89M
               *win_fwd) >>
325
1.89M
           (shiftp - shift_olap)),
326
1.89M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
327
1.89M
      win_fwd++;
328
1.89M
      win_rev--;
329
1.89M
    }
330
331
10.7M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
332
10.7M
      dest[i] =
333
10.7M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]) >>
334
10.7M
          (shiftp - shift_olap);
335
10.7M
    }
336
337
24.9k
    return (shift_olap);
338
24.9k
  } else {
339
4.99M
    for (i = 0; i < ixheaacd_drc_offset->n_flat_ls; i++) {
340
4.98M
      dest[i] = over_lap[i] >> (shift_olap - shiftp);
341
4.98M
    }
342
343
11.3k
    for (i = ixheaacd_drc_offset->n_flat_ls;
344
793k
         i < ixheaacd_drc_offset->n_long / 2; i++) {
345
781k
      dest[i] = ixheaac_add32_sat(
346
781k
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
347
781k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
348
781k
      win_fwd++;
349
781k
      win_rev--;
350
781k
    }
351
352
11.3k
    for (i = ixheaacd_drc_offset->n_long / 2;
353
793k
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
354
781k
         i++) {
355
781k
      dest[i] = ixheaac_add32_sat(
356
781k
          ixheaacd_mult32_sh1(
357
781k
              ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
358
781k
              *win_fwd),
359
781k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
360
781k
      win_fwd++;
361
781k
      win_rev--;
362
781k
    }
363
364
4.99M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
365
4.98M
      dest[i] =
366
4.98M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]);
367
4.98M
    }
368
369
11.3k
    return (shiftp);
370
11.3k
  }
371
36.2k
}
372
373
VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp,
374
                               offset_lengths *ixheaacd_drc_offset,
375
32.0k
                               WORD8 shiftp, WORD8 shift_olap) {
376
32.0k
  WORD32 i;
377
32.0k
  WORD32 *dest = fp;
378
379
32.0k
  if (shift_olap > shiftp) {
380
14.2k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
381
139k
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
382
137k
        dest[i] = dest[i] >> (shift_olap - shiftp);
383
137k
      }
384
139k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
385
137k
           i++) {
386
137k
        dest[i] = ixheaacd_mult32_sh1(
387
137k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_short - i - 1]),
388
137k
            src2[i]);
389
137k
      }
390
391
824k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
392
822k
           i++) {
393
822k
        dest[i] = 0;
394
822k
      }
395
12.1k
    } else {
396
1.56M
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
397
1.55M
        dest[i] = dest[i] >> (shift_olap - shiftp);
398
1.55M
      }
399
12.1k
      for (i = ixheaacd_drc_offset->lfac;
400
5.43M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
401
5.42M
           i++) {
402
5.42M
        dest[i] = 0;
403
5.42M
      }
404
12.1k
    }
405
17.7k
  } else {
406
17.7k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
407
115k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
408
113k
           i++) {
409
113k
        dest[i] =
410
113k
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(
411
113k
                                    src1[ixheaacd_drc_offset->n_short - i - 1]),
412
113k
                                src2[i]) >>
413
113k
            (shiftp - shift_olap);
414
113k
      }
415
416
685k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
417
683k
           i++) {
418
683k
        dest[i] = 0;
419
683k
      }
420
15.8k
    } else {
421
15.8k
      for (i = ixheaacd_drc_offset->lfac;
422
7.12M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
423
7.10M
           i++) {
424
7.10M
        dest[i] = 0;
425
7.10M
      }
426
15.8k
    }
427
17.7k
  }
428
32.0k
}
429
430
VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
431
                               offset_lengths *ixheaacd_drc_offset,
432
75.9k
                               WORD8 shiftp, WORD8 shift_olap) {
433
75.9k
  WORD32 i;
434
435
75.9k
  WORD32 *win_rev = win_fwd + ixheaacd_drc_offset->n_short - 1;
436
437
75.9k
  if (shift_olap > shiftp) {
438
1.19M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
439
1.17M
      fp[i] = ixheaac_add32_sat(
440
1.17M
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
441
1.17M
          (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp)));
442
443
1.17M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
444
1.17M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev),
445
1.17M
          (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
446
1.17M
                               *win_fwd) >>
447
1.17M
           (shift_olap - shiftp)));
448
1.17M
      win_fwd++;
449
1.17M
      win_rev--;
450
1.17M
    }
451
452
18.5k
    for (i = ixheaacd_drc_offset->n_short;
453
8.22M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
454
8.20M
         i++) {
455
8.20M
      fp[i] = 0;
456
8.20M
    }
457
57.4k
  } else {
458
3.62M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
459
3.57M
      fp[i] = ixheaac_add32_sat(
460
3.57M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
461
3.57M
          ixheaacd_mult32_sh1(fp[i], *win_rev));
462
463
3.57M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
464
3.57M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev) >>
465
3.57M
           (shiftp - shift_olap)),
466
3.57M
          ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
467
3.57M
                              *win_fwd));
468
469
3.57M
      win_fwd++;
470
3.57M
      win_rev--;
471
3.57M
    }
472
473
57.4k
    for (i = ixheaacd_drc_offset->n_short;
474
25.0M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
475
24.9M
         i++) {
476
24.9M
      fp[i] = 0;
477
24.9M
    }
478
57.4k
  }
479
75.9k
}
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.11M
    for (i = 0; i < n_short / 2; i++) {
488
2.08M
      fp[i] = ixheaac_add32_sat(
489
2.08M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
490
2.08M
                              *win_rev),
491
2.08M
          (fp[i] >> (shift_olap - shiftp)));
492
493
2.08M
      fp[n_short - i - 1] = ixheaac_add32_sat(
494
2.08M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
495
2.08M
                              *win_fwd),
496
2.08M
          (fp[n_short - i - 1] >> (shift_olap - shiftp)));
497
2.08M
      win_rev--;
498
2.08M
      win_fwd++;
499
2.08M
    }
500
32.8k
    return (shiftp);
501
75.1k
  } else {
502
4.77M
    for (i = 0; i < n_short / 2; i++) {
503
4.69M
      fp[i] = ixheaac_add32_sat(
504
4.69M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
505
4.69M
                               *win_rev) >>
506
4.69M
           (shiftp - shift_olap)),
507
4.69M
          fp[i]);
508
509
4.69M
      fp[n_short - i - 1] = ixheaac_add32_sat(
510
4.69M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
511
4.69M
                               *win_fwd) >>
512
4.69M
           (shiftp - shift_olap)),
513
4.69M
          fp[n_short - i - 1]);
514
515
4.69M
      win_rev--;
516
4.69M
      win_fwd++;
517
4.69M
    }
518
75.1k
    return (shift_olap);
519
75.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
756k
                                WORD8 output_q) {
526
756k
  WORD32 i;
527
756k
  const WORD32 *win_rev = win_fwd + n_short - 1;
528
756k
  const WORD32 *win_rev1 = win_fwd1 - n_short + 1;
529
756k
  if (shift_olap > output_q) {
530
14.8M
    for (i = 0; i < n_short / 2; i++) {
531
14.5M
      fp[i] = ixheaac_add32_sat(
532
14.5M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
533
14.5M
              (shiftp - output_q),
534
14.5M
          fp[i]);
535
536
14.5M
      fp[n_short - i - 1] = ixheaac_add32_sat(
537
14.5M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
538
14.5M
                              *win_rev) >>
539
14.5M
              (shiftp - output_q),
540
14.5M
          fp[n_short - i - 1]);
541
542
14.5M
      win_fwd++;
543
14.5M
      win_rev--;
544
14.5M
    }
545
229k
    if (flag == 1) {
546
12.7M
      for (; i < n_short; i++) {
547
12.5M
        fp[i + n_short / 2] = ixheaac_add32_sat(
548
12.5M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
549
12.5M
                                *win_fwd1) >>
550
12.5M
                (shiftp - output_q),
551
12.5M
            (fp[i + n_short / 2] >> (shift_olap - output_q)));
552
553
12.5M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
554
12.5M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
555
12.5M
                                *win_rev1) >>
556
12.5M
                (shiftp - output_q),
557
12.5M
            (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)));
558
559
12.5M
        win_fwd1--;
560
12.5M
        win_rev1++;
561
12.5M
      }
562
197k
    } else {
563
2.11M
      for (; i < n_short; i++) {
564
2.08M
        fp[i + n_short / 2] = ixheaac_add32_sat(
565
2.08M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
566
2.08M
            fp[i + n_short / 2] >> (shift_olap - output_q));
567
2.08M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
568
2.08M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
569
2.08M
            fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q));
570
2.08M
      }
571
32.8k
    }
572
229k
    return (output_q);
573
526k
  } else {
574
33.4M
    for (i = 0; i < n_short / 2; i++) {
575
32.8M
      fp[i] = ixheaac_add32_sat(
576
32.8M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
577
32.8M
              (shiftp - shift_olap),
578
32.8M
          fp[i] >> (output_q - shift_olap));
579
580
32.8M
      fp[n_short - i - 1] = ixheaac_add32_sat(
581
32.8M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
582
32.8M
                              *win_rev) >>
583
32.8M
              (shiftp - shift_olap),
584
32.8M
          fp[n_short - i - 1]);
585
586
32.8M
      win_fwd++;
587
32.8M
      win_rev--;
588
32.8M
    }
589
526k
    if (flag == 1) {
590
28.6M
      for (; i < n_short; i++) {
591
28.1M
        fp[i + n_short / 2] = ixheaac_add32_sat(
592
28.1M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
593
28.1M
                                *win_fwd1) >>
594
28.1M
                (shiftp - shift_olap),
595
28.1M
            fp[i + n_short / 2]);
596
597
28.1M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
598
28.1M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
599
28.1M
                                *win_rev1) >>
600
28.1M
                (shiftp - shift_olap),
601
28.1M
            fp[3 * n_short - n_short / 2 - i - 1]);
602
603
28.1M
        win_fwd1--;
604
28.1M
        win_rev1++;
605
28.1M
      }
606
451k
    } else {
607
4.77M
      for (; i < n_short; i++) {
608
4.69M
        fp[i + n_short / 2] =
609
4.69M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
610
4.69M
                                   (shiftp - shift_olap),
611
4.69M
                               fp[i + n_short / 2]);
612
4.69M
        fp[3 * n_short - n_short / 2 - i - 1] =
613
4.69M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
614
4.69M
                                   (shiftp - shift_olap),
615
4.69M
                               fp[3 * n_short - n_short / 2 - i - 1]);
616
4.69M
      }
617
75.1k
    }
618
526k
    return (shift_olap);
619
526k
  }
620
756k
}
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
14.6M
    for (i = 0; i < len; i++) {
627
14.5M
      *dest = *src >> (shift1 - shift2);
628
14.5M
      src++;
629
14.5M
      dest++;
630
14.5M
    }
631
291k
  } else {
632
250M
    for (i = 0; i < len; i++) {
633
249M
      *dest = ixheaac_shl32_sat((*src), (shift2 - shift1));
634
249M
      src++;
635
249M
      dest++;
636
249M
    }
637
291k
  }
638
324k
}
639
640
VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len,
641
253k
                             WORD8 shift1, WORD8 shift2) {
642
253k
  WORD32 i;
643
253k
  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
253k
  } else {
650
251M
    for (i = 0; i < len; i++) {
651
251M
      *dest = ixheaac_add32_sat(ixheaac_shl32_sat((*src), (shift2 - shift1)),
652
251M
                                 ADJ_SCALE);
653
251M
      src++;
654
251M
      dest++;
655
251M
    }
656
253k
  }
657
253k
}