Coverage Report

Created: 2026-09-01 06:32

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
522M
static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) {
29
522M
  WORD32 result;
30
522M
  WORD64 temp_result;
31
32
522M
  temp_result = (WORD64)a * (WORD64)b;
33
522M
  result = (WORD32)(temp_result >> 31);
34
35
522M
  return (result);
36
522M
}
37
38
280k
VOID ixheaacd_memset(FLOAT32 *x, WORD32 n) {
39
280k
  memset(x, 0, n * sizeof(FLOAT32));
40
280k
  return;
41
280k
}
42
43
2.43M
VOID ixheaacd_mem_cpy(const FLOAT32 x[], FLOAT32 y[], WORD32 n) {
44
2.43M
  memcpy(y, x, n * sizeof(FLOAT32));
45
2.43M
  return;
46
2.43M
}
47
48
273k
VOID ixheaacd_vec_cnst_mul(FLOAT32 a, FLOAT32 x[], FLOAT32 z[], WORD32 n) {
49
273k
  WORD32 i;
50
85.0M
  for (i = 0; i < n; i++) {
51
84.8M
    z[i] = (FLOAT32)a * x[i];
52
84.8M
  }
53
273k
  return;
54
273k
}
55
56
VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len,
57
32.6k
                          WORD8 output_q, WORD8 fac_q) {
58
32.6k
  WORD32 i;
59
32.6k
  if (fac_q > output_q) {
60
2.08M
    for (i = 0; i < len; i++) {
61
2.07M
      *dest = ixheaac_add32_sat(*src1, ((*src2) >> (fac_q - output_q)));
62
2.07M
      dest++;
63
2.07M
      src1++;
64
2.07M
      src2++;
65
2.07M
    }
66
23.6k
  } else {
67
5.67M
    for (i = 0; i < len; i++) {
68
5.65M
      *dest = ixheaac_add32_sat(
69
5.65M
          *src1, ixheaac_shl32_sat((*src2), (output_q - fac_q)));
70
5.65M
      dest++;
71
5.65M
      src1++;
72
5.65M
      src2++;
73
5.65M
    }
74
23.6k
  }
75
32.6k
}
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
165k
                               WORD8 shift2) {
81
165k
  WORD32 i;
82
165k
  WORD32 *rsrc2 = src2 + vlen - 1;
83
84
165k
  if (shift1 > shift2) {
85
80.7M
    for (i = 0; i < vlen / 2; i++) {
86
80.6M
      *dest = ixheaac_add32_sat(
87
80.6M
          ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)),
88
80.6M
          ixheaacd_mult32_sh1(*src2, *win_rev));
89
80.6M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
90
80.6M
          ((ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev)) >>
91
80.6M
           (shift1 - shift2)),
92
80.6M
          ixheaacd_mult32_sh1(*rsrc2, *win_fwd));
93
94
80.6M
      src1++;
95
80.6M
      src2++;
96
80.6M
      win_fwd++;
97
80.6M
      win_rev--;
98
80.6M
      rsrc2--;
99
80.6M
      dest++;
100
80.6M
    }
101
162k
    return (shift2);
102
162k
  } else {
103
1.69M
    for (i = 0; i < vlen / 2; i++) {
104
1.69M
      *dest = ixheaac_add32_sat(
105
1.69M
          ixheaacd_mult32_sh1(*src1, *win_fwd),
106
1.69M
          ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1)));
107
108
1.69M
      *(dest + (vlen - (2 * i)) - 1) = ixheaac_add32_sat(
109
1.69M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(*src1), *win_rev),
110
1.69M
          ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1)));
111
1.69M
      src1++;
112
1.69M
      src2++;
113
1.69M
      win_fwd++;
114
1.69M
      win_rev--;
115
1.69M
      rsrc2--;
116
1.69M
      dest++;
117
1.69M
    }
118
3.32k
    return (shift1);
119
3.32k
  }
120
165k
}
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
32.2k
                               WORD8 shiftp, WORD8 shift_olap, WORD8 fac_q) {
127
32.2k
  WORD32 i;
128
32.2k
  WORD32 *dest = p_out_buffer;
129
130
32.2k
  win_fwd += ixheaacd_drc_offset->lfac;
131
132
32.2k
  if (shiftp > fac_q) {
133
18.9k
    if (shift_olap > fac_q) {
134
5.71k
      for (i = 0;
135
3.02M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
136
3.01M
           i++) {
137
3.01M
        dest[i] = over_lap[i] >> (shift_olap - fac_q);
138
3.01M
      }
139
140
5.71k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
141
511k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
142
505k
           i++) {
143
505k
        dest[i] = ixheaac_add32_sat(
144
505k
            (ixheaacd_mult32_sh1(
145
505k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
146
505k
                                            ixheaacd_drc_offset->n_flat_ls +
147
505k
                                            ixheaacd_drc_offset->lfac - i - 1]),
148
505k
                 *win_fwd) >>
149
505k
             (shiftp - fac_q)),
150
505k
            (*fac_data_out));
151
505k
        win_fwd++;
152
505k
        fac_data_out++;
153
505k
      }
154
155
5.71k
      for (;
156
954k
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
157
948k
           i++) {
158
948k
        dest[i] = ixheaac_add32_sat(
159
948k
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
160
948k
                                        ixheaacd_drc_offset->n_flat_ls +
161
948k
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
162
948k
             (shiftp - fac_q)),
163
948k
            (*fac_data_out));
164
948k
        fac_data_out++;
165
948k
      }
166
167
1.34M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
168
1.34M
        dest[i] =
169
1.34M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
170
1.34M
                                       ixheaacd_drc_offset->n_flat_ls +
171
1.34M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
172
1.34M
            (shiftp - fac_q);
173
1.34M
      }
174
5.71k
      return (fac_q);
175
13.2k
    } else {
176
13.2k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
177
13.2k
                                               ixheaacd_drc_offset->lfac));
178
179
13.2k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
180
129k
           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
13.2k
      for (;
195
3.28M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
196
3.26M
           i++) {
197
3.26M
        dest[i] = ixheaac_add32_sat(
198
3.26M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
199
3.26M
                                        ixheaacd_drc_offset->n_flat_ls +
200
3.26M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
201
3.26M
             (shiftp - shift_olap)),
202
3.26M
            (*fac_data_out) >> (fac_q - shift_olap));
203
3.26M
        fac_data_out++;
204
3.26M
      }
205
206
2.60M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
207
2.59M
        dest[i] =
208
2.59M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
209
2.59M
                                       ixheaacd_drc_offset->n_flat_ls +
210
2.59M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
211
2.59M
            (shiftp - shift_olap);
212
2.59M
      }
213
13.2k
      return (shift_olap);
214
13.2k
    }
215
18.9k
  } else {
216
13.2k
    if (shift_olap > shiftp) {
217
7.50k
      for (i = 0;
218
4.30M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
219
4.29M
           i++) {
220
4.29M
        dest[i] = over_lap[i] >> (shift_olap - shiftp);
221
4.29M
      }
222
223
7.50k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
224
53.2k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
225
45.6k
           i++) {
226
45.6k
        dest[i] = ixheaac_add32_sat(
227
45.6k
            ixheaacd_mult32_sh1(
228
45.6k
                ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
229
45.6k
                                           ixheaacd_drc_offset->n_flat_ls +
230
45.6k
                                           ixheaacd_drc_offset->lfac - i - 1]),
231
45.6k
                *win_fwd),
232
45.6k
            (*fac_data_out) >> (fac_q - shiftp));
233
45.6k
        win_fwd++;
234
45.6k
        fac_data_out++;
235
45.6k
      }
236
237
7.50k
      for (;
238
1.87M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
239
1.87M
           i++) {
240
1.87M
        dest[i] = ixheaac_add32_sat(
241
1.87M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
242
1.87M
                                       ixheaacd_drc_offset->n_flat_ls +
243
1.87M
                                       ixheaacd_drc_offset->lfac - i - 1]),
244
1.87M
            (*fac_data_out) >> (fac_q - shiftp));
245
1.87M
        fac_data_out++;
246
1.87M
      }
247
248
1.46M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
249
1.46M
        dest[i] =
250
1.46M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
251
1.46M
                                       ixheaacd_drc_offset->n_flat_ls +
252
1.46M
                                       ixheaacd_drc_offset->lfac - i - 1]);
253
1.46M
      }
254
7.50k
      return (shiftp);
255
7.50k
    } else {
256
5.74k
      memcpy(dest, over_lap, sizeof(WORD32) * (ixheaacd_drc_offset->n_flat_ls +
257
5.74k
                                               ixheaacd_drc_offset->lfac));
258
259
5.74k
      for (i = ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
260
17.2k
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
261
11.4k
           i++) {
262
11.4k
        dest[i] = ixheaac_add32_sat(
263
11.4k
            (ixheaacd_mult32_sh1(
264
11.4k
                 ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
265
11.4k
                                            ixheaacd_drc_offset->n_flat_ls +
266
11.4k
                                            ixheaacd_drc_offset->lfac - i - 1]),
267
11.4k
                 *win_fwd) >>
268
11.4k
             (shiftp - shift_olap)),
269
11.4k
            (*fac_data_out) >> (fac_q - shift_olap));
270
11.4k
        win_fwd++;
271
11.4k
        fac_data_out++;
272
11.4k
      }
273
274
5.74k
      for (;
275
1.46M
           i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3);
276
1.45M
           i++) {
277
1.45M
        dest[i] = ixheaac_add32_sat(
278
1.45M
            (ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
279
1.45M
                                        ixheaacd_drc_offset->n_flat_ls +
280
1.45M
                                        ixheaacd_drc_offset->lfac - i - 1]) >>
281
1.45M
             (shiftp - shift_olap)),
282
1.45M
            (*fac_data_out) >> (fac_q - shift_olap));
283
1.45M
        fac_data_out++;
284
1.45M
      }
285
286
1.11M
      for (; i < ixheaacd_drc_offset->n_long; i++) {
287
1.10M
        dest[i] =
288
1.10M
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 +
289
1.10M
                                       ixheaacd_drc_offset->n_flat_ls +
290
1.10M
                                       ixheaacd_drc_offset->lfac - i - 1]) >>
291
1.10M
            (shiftp - shift_olap);
292
1.10M
      }
293
5.74k
      return (shift_olap);
294
5.74k
    }
295
13.2k
  }
296
32.2k
}
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
29.3k
                               WORD8 shiftp, WORD8 shift_olap) {
303
29.3k
  WORD32 i;
304
29.3k
  WORD32 *dest = p_out_buffer;
305
306
29.3k
  if (shiftp > shift_olap) {
307
19.1k
    memcpy(dest, over_lap, sizeof(FLOAT32) * ixheaacd_drc_offset->n_flat_ls);
308
309
19.1k
    for (i = ixheaacd_drc_offset->n_flat_ls;
310
1.45M
         i < ixheaacd_drc_offset->n_long / 2; i++) {
311
1.43M
      dest[i] = ixheaac_add32_sat(
312
1.43M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
313
1.43M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
314
1.43M
      win_fwd++;
315
1.43M
      win_rev--;
316
1.43M
    }
317
318
19.1k
    for (i = ixheaacd_drc_offset->n_long / 2;
319
1.45M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
320
1.43M
         i++) {
321
1.43M
      dest[i] = ixheaac_add32_sat(
322
1.43M
          (ixheaacd_mult32_sh1(
323
1.43M
               ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
324
1.43M
               *win_fwd) >>
325
1.43M
           (shiftp - shift_olap)),
326
1.43M
          ixheaacd_mult32_sh1(over_lap[i], *win_rev));
327
1.43M
      win_fwd++;
328
1.43M
      win_rev--;
329
1.43M
    }
330
331
8.26M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
332
8.25M
      dest[i] =
333
8.25M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]) >>
334
8.25M
          (shiftp - shift_olap);
335
8.25M
    }
336
337
19.1k
    return (shift_olap);
338
19.1k
  } else {
339
4.36M
    for (i = 0; i < ixheaacd_drc_offset->n_flat_ls; i++) {
340
4.35M
      dest[i] = over_lap[i] >> (shift_olap - shiftp);
341
4.35M
    }
342
343
10.2k
    for (i = ixheaacd_drc_offset->n_flat_ls;
344
770k
         i < ixheaacd_drc_offset->n_long / 2; i++) {
345
759k
      dest[i] = ixheaac_add32_sat(
346
759k
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
347
759k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
348
759k
      win_fwd++;
349
759k
      win_rev--;
350
759k
    }
351
352
10.2k
    for (i = ixheaacd_drc_offset->n_long / 2;
353
770k
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls;
354
759k
         i++) {
355
759k
      dest[i] = ixheaac_add32_sat(
356
759k
          ixheaacd_mult32_sh1(
357
759k
              ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]),
358
759k
              *win_fwd),
359
759k
          ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp));
360
759k
      win_fwd++;
361
759k
      win_rev--;
362
759k
    }
363
364
4.36M
    for (; i < ixheaacd_drc_offset->n_long; i++) {
365
4.35M
      dest[i] =
366
4.35M
          ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]);
367
4.35M
    }
368
369
10.2k
    return (shiftp);
370
10.2k
  }
371
29.3k
}
372
373
VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp,
374
                               offset_lengths *ixheaacd_drc_offset,
375
32.6k
                               WORD8 shiftp, WORD8 shift_olap) {
376
32.6k
  WORD32 i;
377
32.6k
  WORD32 *dest = fp;
378
379
32.6k
  if (shift_olap > shiftp) {
380
15.9k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
381
156k
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
382
154k
        dest[i] = dest[i] >> (shift_olap - shiftp);
383
154k
      }
384
156k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
385
154k
           i++) {
386
154k
        dest[i] = ixheaacd_mult32_sh1(
387
154k
            ixheaac_negate32_sat(src1[ixheaacd_drc_offset->n_short - i - 1]),
388
154k
            src2[i]);
389
154k
      }
390
391
928k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
392
925k
           i++) {
393
925k
        dest[i] = 0;
394
925k
      }
395
13.5k
    } else {
396
1.74M
      for (i = 0; i < ixheaacd_drc_offset->lfac; i++) {
397
1.73M
        dest[i] = dest[i] >> (shift_olap - shiftp);
398
1.73M
      }
399
13.5k
      for (i = ixheaacd_drc_offset->lfac;
400
6.08M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
401
6.07M
           i++) {
402
6.07M
        dest[i] = 0;
403
6.07M
      }
404
13.5k
    }
405
16.6k
  } else {
406
16.6k
    if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) {
407
154k
      for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short;
408
152k
           i++) {
409
152k
        dest[i] =
410
152k
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(
411
152k
                                    src1[ixheaacd_drc_offset->n_short - i - 1]),
412
152k
                                src2[i]) >>
413
152k
            (shiftp - shift_olap);
414
152k
      }
415
416
917k
      for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
417
914k
           i++) {
418
914k
        dest[i] = 0;
419
914k
      }
420
14.2k
    } else {
421
14.2k
      for (i = ixheaacd_drc_offset->lfac;
422
6.38M
           i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac;
423
6.36M
           i++) {
424
6.36M
        dest[i] = 0;
425
6.36M
      }
426
14.2k
    }
427
16.6k
  }
428
32.6k
}
429
430
VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp,
431
                               offset_lengths *ixheaacd_drc_offset,
432
62.1k
                               WORD8 shiftp, WORD8 shift_olap) {
433
62.1k
  WORD32 i;
434
435
62.1k
  WORD32 *win_rev = win_fwd + ixheaacd_drc_offset->n_short - 1;
436
437
62.1k
  if (shift_olap > shiftp) {
438
979k
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
439
964k
      fp[i] = ixheaac_add32_sat(
440
964k
          ixheaacd_mult32_sh1(src1[i], *win_fwd),
441
964k
          (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp)));
442
443
964k
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
444
964k
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev),
445
964k
          (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
446
964k
                               *win_fwd) >>
447
964k
           (shift_olap - shiftp)));
448
964k
      win_fwd++;
449
964k
      win_rev--;
450
964k
    }
451
452
15.1k
    for (i = ixheaacd_drc_offset->n_short;
453
6.76M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
454
6.75M
         i++) {
455
6.75M
      fp[i] = 0;
456
6.75M
    }
457
46.9k
  } else {
458
3.00M
    for (i = 0; i < ixheaacd_drc_offset->n_short / 2; i++) {
459
2.95M
      fp[i] = ixheaac_add32_sat(
460
2.95M
          (ixheaacd_mult32_sh1(src1[i], *win_fwd) >> (shiftp - shift_olap)),
461
2.95M
          ixheaacd_mult32_sh1(fp[i], *win_rev));
462
463
2.95M
      fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaac_add32_sat(
464
2.95M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[i]), *win_rev) >>
465
2.95M
           (shiftp - shift_olap)),
466
2.95M
          ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1],
467
2.95M
                              *win_fwd));
468
469
2.95M
      win_fwd++;
470
2.95M
      win_rev--;
471
2.95M
    }
472
473
46.9k
    for (i = ixheaacd_drc_offset->n_short;
474
20.7M
         i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_short;
475
20.7M
         i++) {
476
20.7M
      fp[i] = 0;
477
20.7M
    }
478
46.9k
  }
479
62.1k
}
480
481
WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp,
482
                                WORD32 n_short, WORD8 shiftp,
483
94.7k
                                WORD8 shift_olap) {
484
94.7k
  WORD32 i;
485
94.7k
  const WORD32 *win_fwd = win_rev - n_short + 1;
486
94.7k
  if (shift_olap > shiftp) {
487
2.01M
    for (i = 0; i < n_short / 2; i++) {
488
1.98M
      fp[i] = ixheaac_add32_sat(
489
1.98M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
490
1.98M
                              *win_rev),
491
1.98M
          (fp[i] >> (shift_olap - shiftp)));
492
493
1.98M
      fp[n_short - i - 1] = ixheaac_add32_sat(
494
1.98M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
495
1.98M
                              *win_fwd),
496
1.98M
          (fp[n_short - i - 1] >> (shift_olap - shiftp)));
497
1.98M
      win_rev--;
498
1.98M
      win_fwd++;
499
1.98M
    }
500
31.1k
    return (shiftp);
501
63.6k
  } else {
502
4.08M
    for (i = 0; i < n_short / 2; i++) {
503
4.02M
      fp[i] = ixheaac_add32_sat(
504
4.02M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
505
4.02M
                               *win_rev) >>
506
4.02M
           (shiftp - shift_olap)),
507
4.02M
          fp[i]);
508
509
4.02M
      fp[n_short - i - 1] = ixheaac_add32_sat(
510
4.02M
          (ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 - i - 1]),
511
4.02M
                               *win_fwd) >>
512
4.02M
           (shiftp - shift_olap)),
513
4.02M
          fp[n_short - i - 1]);
514
515
4.02M
      win_rev--;
516
4.02M
      win_fwd++;
517
4.02M
    }
518
63.6k
    return (shift_olap);
519
63.6k
  }
520
94.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
663k
                                WORD8 output_q) {
526
663k
  WORD32 i;
527
663k
  const WORD32 *win_rev = win_fwd + n_short - 1;
528
663k
  const WORD32 *win_rev1 = win_fwd1 - n_short + 1;
529
663k
  if (shift_olap > output_q) {
530
14.1M
    for (i = 0; i < n_short / 2; i++) {
531
13.9M
      fp[i] = ixheaac_add32_sat(
532
13.9M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
533
13.9M
              (shiftp - output_q),
534
13.9M
          fp[i]);
535
536
13.9M
      fp[n_short - i - 1] = ixheaac_add32_sat(
537
13.9M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
538
13.9M
                              *win_rev) >>
539
13.9M
              (shiftp - output_q),
540
13.9M
          fp[n_short - i - 1]);
541
542
13.9M
      win_fwd++;
543
13.9M
      win_rev--;
544
13.9M
    }
545
217k
    if (flag == 1) {
546
12.1M
      for (; i < n_short; i++) {
547
11.9M
        fp[i + n_short / 2] = ixheaac_add32_sat(
548
11.9M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
549
11.9M
                                *win_fwd1) >>
550
11.9M
                (shiftp - output_q),
551
11.9M
            (fp[i + n_short / 2] >> (shift_olap - output_q)));
552
553
11.9M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
554
11.9M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
555
11.9M
                                *win_rev1) >>
556
11.9M
                (shiftp - output_q),
557
11.9M
            (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)));
558
559
11.9M
        win_fwd1--;
560
11.9M
        win_rev1++;
561
11.9M
      }
562
186k
    } else {
563
2.01M
      for (; i < n_short; i++) {
564
1.98M
        fp[i + n_short / 2] = ixheaac_add32_sat(
565
1.98M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
566
1.98M
            fp[i + n_short / 2] >> (shift_olap - output_q));
567
1.98M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
568
1.98M
            ixheaac_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q),
569
1.98M
            fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q));
570
1.98M
      }
571
31.1k
    }
572
217k
    return (output_q);
573
445k
  } else {
574
28.5M
    for (i = 0; i < n_short / 2; i++) {
575
28.1M
      fp[i] = ixheaac_add32_sat(
576
28.1M
          ixheaacd_mult32_sh1(src1[n_short / 2 + i], *win_fwd) >>
577
28.1M
              (shiftp - shift_olap),
578
28.1M
          fp[i] >> (output_q - shift_olap));
579
580
28.1M
      fp[n_short - i - 1] = ixheaac_add32_sat(
581
28.1M
          ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short / 2 + i]),
582
28.1M
                              *win_rev) >>
583
28.1M
              (shiftp - shift_olap),
584
28.1M
          fp[n_short - i - 1]);
585
586
28.1M
      win_fwd++;
587
28.1M
      win_rev--;
588
28.1M
    }
589
445k
    if (flag == 1) {
590
24.5M
      for (; i < n_short; i++) {
591
24.1M
        fp[i + n_short / 2] = ixheaac_add32_sat(
592
24.1M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
593
24.1M
                                *win_fwd1) >>
594
24.1M
                (shiftp - shift_olap),
595
24.1M
            fp[i + n_short / 2]);
596
597
24.1M
        fp[3 * n_short - n_short / 2 - i - 1] = ixheaac_add32_sat(
598
24.1M
            ixheaacd_mult32_sh1(ixheaac_negate32_sat(src1[n_short - i - 1]),
599
24.1M
                                *win_rev1) >>
600
24.1M
                (shiftp - shift_olap),
601
24.1M
            fp[3 * n_short - n_short / 2 - i - 1]);
602
603
24.1M
        win_fwd1--;
604
24.1M
        win_rev1++;
605
24.1M
      }
606
381k
    } else {
607
4.08M
      for (; i < n_short; i++) {
608
4.02M
        fp[i + n_short / 2] =
609
4.02M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
610
4.02M
                                   (shiftp - shift_olap),
611
4.02M
                               fp[i + n_short / 2]);
612
4.02M
        fp[3 * n_short - n_short / 2 - i - 1] =
613
4.02M
            ixheaac_add32_sat(ixheaac_negate32_sat(src1[n_short - i - 1]) >>
614
4.02M
                                   (shiftp - shift_olap),
615
4.02M
                               fp[3 * n_short - n_short / 2 - i - 1]);
616
4.02M
      }
617
63.6k
    }
618
445k
    return (shift_olap);
619
445k
  }
620
663k
}
621
622
VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1,
623
284k
                         WORD8 shift2) {
624
284k
  WORD32 i;
625
284k
  if (shift1 > shift2) {
626
13.9M
    for (i = 0; i < len; i++) {
627
13.9M
      *dest = *src >> (shift1 - shift2);
628
13.9M
      src++;
629
13.9M
      dest++;
630
13.9M
    }
631
253k
  } else {
632
220M
    for (i = 0; i < len; i++) {
633
220M
      *dest = ixheaac_shl32_sat((*src), (shift2 - shift1));
634
220M
      src++;
635
220M
      dest++;
636
220M
    }
637
253k
  }
638
284k
}
639
640
VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len,
641
227k
                             WORD8 shift1, WORD8 shift2) {
642
227k
  WORD32 i;
643
227k
  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
227k
  } else {
650
227M
    for (i = 0; i < len; i++) {
651
227M
      *dest = ixheaac_add32_sat(ixheaac_shl32_sat((*src), (shift2 - shift1)),
652
227M
                                 ADJ_SCALE);
653
227M
      src++;
654
227M
      dest++;
655
227M
    }
656
227k
  }
657
227k
}