Coverage Report

Created: 2025-10-27 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_acelp_tools.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 <math.h>
21
#include <memory.h>
22
#include "ixheaac_type_def.h"
23
24
#include "ixheaacd_cnst.h"
25
#include "ixheaac_constants.h"
26
#include "ixheaac_basic_ops32.h"
27
#include "ixheaac_basic_ops40.h"
28
29
const FLOAT32 ixheaacd_gamma_table[17] = {
30
    1.0f,      0.92f,     0.8464f,   0.778688f, 0.716393f, 0.659082f,
31
    0.606355f, 0.557847f, 0.513219f, 0.472161f, 0.434389f, 0.399637f,
32
    0.367666f, 0.338253f, 0.311193f, 0.286298f, 0.263394f};
33
34
0
WORD16 ixheaacd_rand_gen(WORD16 *seed) {
35
0
  *seed = (WORD16)(*seed * 31821L + 13849L);
36
0
  return (*seed);
37
0
}
38
39
VOID ixheaacd_preemphsis_tool(WORD32 *signal, WORD32 mu, WORD32 len,
40
0
                              WORD32 mem) {
41
0
  WORD32 i;
42
0
  for (i = len - 1; i > 0; i--) {
43
0
    signal[i] -= (WORD32)ixheaac_mul32_sh(mu, signal[i - 1], 16);
44
0
  }
45
0
  signal[0] -= (WORD32)ixheaac_mul32_sh(mu, mem, 16);
46
0
  return;
47
0
}
48
49
VOID ixheaacd_preemphsis_tool_float(FLOAT32 *signal, FLOAT32 mu, WORD32 len,
50
858k
                                    FLOAT32 mem) {
51
858k
  WORD32 i;
52
113M
  for (i = len - 1; i > 0; i--) {
53
112M
    signal[i] = signal[i] - mu * signal[i - 1];
54
112M
  }
55
858k
  signal[0] -= mu * mem;
56
858k
  return;
57
858k
}
58
59
346k
VOID ixheaacd_deemphsis_tool(FLOAT32 *signal, WORD32 len, FLOAT32 mem) {
60
346k
  WORD32 i;
61
346k
  signal[0] = signal[0] + PREEMPH_FILT_FAC * mem;
62
59.8M
  for (i = 1; i < len; i++) {
63
59.5M
    signal[i] = signal[i] + PREEMPH_FILT_FAC * signal[i - 1];
64
59.5M
  }
65
346k
  return;
66
346k
}
67
68
73.5k
VOID ixheaacd_lpc_wt_synthesis_tool(FLOAT32 a[], FLOAT32 x[], WORD32 l) {
69
73.5k
  FLOAT32 s;
70
73.5k
  WORD32 i, j;
71
72
8.62M
  for (i = 0; i < l; i++) {
73
8.54M
    s = x[i];
74
42.7M
    for (j = 1; j <= ORDER; j += 4) {
75
34.1M
      s -= (a[j] * ixheaacd_gamma_table[j]) * x[i - j];
76
34.1M
      s -= (a[j + 1] * ixheaacd_gamma_table[j + 1]) * x[i - (j + 1)];
77
34.1M
      s -= (a[j + 2] * ixheaacd_gamma_table[j + 2]) * x[i - (j + 2)];
78
34.1M
      s -= (a[j + 3] * ixheaacd_gamma_table[j + 3]) * x[i - (j + 3)];
79
34.1M
    }
80
8.54M
    x[i] = s;
81
8.54M
  }
82
83
73.5k
  return;
84
73.5k
}
85
86
VOID ixheaacd_synthesis_tool_float(FLOAT32 a[], FLOAT32 x[], FLOAT32 y[],
87
688k
                                   WORD32 l, FLOAT32 mem[]) {
88
688k
  FLOAT32 buf[LEN_FRAME * 2];
89
688k
  FLOAT32 s;
90
688k
  FLOAT32 *yy;
91
688k
  WORD32 i, j;
92
688k
  memcpy(buf, mem, ORDER * sizeof(FLOAT32));
93
688k
  yy = &buf[ORDER];
94
55.5M
  for (i = 0; i < l; i++) {
95
54.9M
    s = x[i];
96
274M
    for (j = 1; j <= ORDER; j += 4) {
97
219M
      s -= a[j] * yy[i - j];
98
219M
      s -= a[j + 1] * yy[i - (j + 1)];
99
219M
      s -= a[j + 2] * yy[i - (j + 2)];
100
219M
      s -= a[j + 3] * yy[i - (j + 3)];
101
219M
    }
102
54.9M
    yy[i] = s;
103
54.9M
    y[i] = s;
104
54.9M
  }
105
106
688k
  return;
107
688k
}
108
109
191k
VOID ixheaacd_synthesis_tool_float1(FLOAT32 a[], FLOAT32 x[], WORD32 l) {
110
191k
  FLOAT32 s;
111
191k
  WORD32 i, j;
112
24.2M
  for (i = 0; i < l; i++) {
113
24.1M
    s = x[i];
114
120M
    for (j = 1; j <= ORDER; j += 4) {
115
96.4M
      s -= a[j] * x[i - j];
116
96.4M
      s -= a[j + 1] * x[i - (j + 1)];
117
96.4M
      s -= a[j + 2] * x[i - (j + 2)];
118
96.4M
      s -= a[j + 3] * x[i - (j + 3)];
119
96.4M
    }
120
24.1M
    x[i] = s;
121
24.1M
  }
122
123
191k
  return;
124
191k
}
125
126
VOID ixheaacd_residual_tool(WORD32 *a, WORD32 *x, WORD32 *y, WORD32 l,
127
0
                            WORD32 count) {
128
0
  WORD32 s;
129
0
  WORD32 i, j;
130
0
  WORD32 n = l * count;
131
132
0
  for (i = 0; i < n; i++) {
133
0
    s = x[i];
134
0
    for (j = 1; j <= 16; j++)
135
0
      s += (WORD32)ixheaac_mul32_sh(a[j], x[i - j], 24);
136
0
    y[i] = s;
137
0
  }
138
139
0
  return;
140
0
}
141
142
VOID ixheaacd_residual_tool_float(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l,
143
302k
                                  WORD32 loop_count) {
144
302k
  FLOAT32 s;
145
302k
  WORD32 i, j;
146
719k
  for (j = 0; j < loop_count; j++) {
147
54.4M
    for (i = 0; i < l; i++) {
148
54.0M
      s = x[i];
149
54.0M
      s += a[1] * x[i - 1];
150
54.0M
      s += a[2] * x[i - 2];
151
54.0M
      s += a[3] * x[i - 3];
152
54.0M
      s += a[4] * x[i - 4];
153
54.0M
      s += a[5] * x[i - 5];
154
54.0M
      s += a[6] * x[i - 6];
155
54.0M
      s += a[7] * x[i - 7];
156
54.0M
      s += a[8] * x[i - 8];
157
54.0M
      s += a[9] * x[i - 9];
158
54.0M
      s += a[10] * x[i - 10];
159
54.0M
      s += a[11] * x[i - 11];
160
54.0M
      s += a[12] * x[i - 12];
161
54.0M
      s += a[13] * x[i - 13];
162
54.0M
      s += a[14] * x[i - 14];
163
54.0M
      s += a[15] * x[i - 15];
164
54.0M
      s += a[16] * x[i - 16];
165
54.0M
      y[i] = s;
166
54.0M
    }
167
416k
    a += 17;
168
416k
    x += l;
169
416k
    y += l;
170
416k
  }
171
302k
  return;
172
302k
}
173
174
VOID ixheaacd_residual_tool_float1(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l,
175
37.4k
                                   WORD32 loop_count) {
176
37.4k
  FLOAT32 s;
177
37.4k
  WORD32 i, j;
178
306k
  for (j = 0; j < loop_count; j++) {
179
17.5M
    for (i = 0; i < l; i++) {
180
17.2M
      s = x[i];
181
17.2M
      s += a[1] * x[i - 1];
182
17.2M
      s += a[2] * x[i - 2];
183
17.2M
      s += a[3] * x[i - 3];
184
17.2M
      s += a[4] * x[i - 4];
185
17.2M
      s += a[5] * x[i - 5];
186
17.2M
      s += a[6] * x[i - 6];
187
17.2M
      s += a[7] * x[i - 7];
188
17.2M
      s += a[8] * x[i - 8];
189
17.2M
      s += a[9] * x[i - 9];
190
17.2M
      s += a[10] * x[i - 10];
191
17.2M
      s += a[11] * x[i - 11];
192
17.2M
      s += a[12] * x[i - 12];
193
17.2M
      s += a[13] * x[i - 13];
194
17.2M
      s += a[14] * x[i - 14];
195
17.2M
      s += a[15] * x[i - 15];
196
17.2M
      s += a[16] * x[i - 16];
197
17.2M
      y[i] = s;
198
17.2M
    }
199
269k
    x += l;
200
269k
    y += l;
201
269k
  }
202
37.4k
  return;
203
37.4k
}