Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | * AAC Spectral Band Replication decoding functions | ||
3 | * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl ) | ||
4 | * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com> | ||
5 | * | ||
6 | * This file is part of FFmpeg. | ||
7 | * | ||
8 | * FFmpeg is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU Lesser General Public | ||
10 | * License as published by the Free Software Foundation; either | ||
11 | * version 2.1 of the License, or (at your option) any later version. | ||
12 | * | ||
13 | * FFmpeg is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * Lesser General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU Lesser General Public | ||
19 | * License along with FFmpeg; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
21 | */ | ||
22 | |||
23 | /** | ||
24 | * @file | ||
25 | * AAC Spectral Band Replication decoding functions | ||
26 | * @author Robert Swain ( rob opendot cl ) | ||
27 | */ | ||
28 | #define USE_FIXED 0 | ||
29 | |||
30 | #include "aac.h" | ||
31 | #include "sbr.h" | ||
32 | #include "aacsbr.h" | ||
33 | #include "aacsbrdata.h" | ||
34 | #include "aacps.h" | ||
35 | #include "sbrdsp.h" | ||
36 | #include "libavutil/internal.h" | ||
37 | #include "libavutil/intfloat.h" | ||
38 | #include "libavutil/libm.h" | ||
39 | #include "libavutil/avassert.h" | ||
40 | #include "libavutil/mem_internal.h" | ||
41 | |||
42 | #include <stdint.h> | ||
43 | #include <float.h> | ||
44 | #include <math.h> | ||
45 | |||
46 | /** | ||
47 | * 2^(x) for integer x | ||
48 | * @return correctly rounded float | ||
49 | */ | ||
50 | 140760 | static av_always_inline float exp2fi(int x) { | |
51 | /* Normal range */ | ||
52 |
2/4✓ Branch 0 taken 140760 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 140760 times.
✗ Branch 3 not taken.
|
140760 | if (-126 <= x && x <= 128) |
53 | 140760 | return av_int2float((x+127) << 23); | |
54 | /* Too large */ | ||
55 | ✗ | else if (x > 128) | |
56 | ✗ | return INFINITY; | |
57 | /* Subnormal numbers */ | ||
58 | ✗ | else if (x > -150) | |
59 | ✗ | return av_int2float(1 << (x+149)); | |
60 | /* Negligibly small */ | ||
61 | else | ||
62 | ✗ | return 0; | |
63 | } | ||
64 | |||
65 | static void aacsbr_func_ptr_init(AACSBRContext *c); | ||
66 | |||
67 | 116 | static void make_bands(int16_t* bands, int start, int stop, int num_bands) | |
68 | { | ||
69 | int k, previous, present; | ||
70 | float base, prod; | ||
71 | |||
72 | 116 | base = powf((float)stop / start, 1.0f / num_bands); | |
73 | 116 | prod = start; | |
74 | 116 | previous = start; | |
75 | |||
76 |
2/2✓ Branch 0 taken 1194 times.
✓ Branch 1 taken 116 times.
|
1310 | for (k = 0; k < num_bands-1; k++) { |
77 | 1194 | prod *= base; | |
78 | 1194 | present = lrintf(prod); | |
79 | 1194 | bands[k] = present - previous; | |
80 | 1194 | previous = present; | |
81 | } | ||
82 | 116 | bands[num_bands-1] = stop - previous; | |
83 | 116 | } | |
84 | |||
85 | /// Dequantization and stereo decoding (14496-3 sp04 p203) | ||
86 | 4450 | static void sbr_dequant(SpectralBandReplication *sbr, int id_aac) | |
87 | { | ||
88 | int k, e; | ||
89 | int ch; | ||
90 | static const double exp2_tab[2] = {1, M_SQRT2}; | ||
91 |
4/4✓ Branch 0 taken 2181 times.
✓ Branch 1 taken 2269 times.
✓ Branch 2 taken 1345 times.
✓ Branch 3 taken 836 times.
|
5795 | if (id_aac == TYPE_CPE && sbr->bs_coupling) { |
92 |
2/2✓ Branch 0 taken 305 times.
✓ Branch 1 taken 1040 times.
|
1345 | int pan_offset = sbr->data[0].bs_amp_res ? 12 : 24; |
93 |
2/2✓ Branch 0 taken 1758 times.
✓ Branch 1 taken 1345 times.
|
3103 | for (e = 1; e <= sbr->data[0].bs_num_env; e++) { |
94 |
2/2✓ Branch 0 taken 18385 times.
✓ Branch 1 taken 1758 times.
|
20143 | for (k = 0; k < sbr->n[sbr->data[0].bs_freq_res[e]]; k++) { |
95 | float temp1, temp2, fac; | ||
96 |
2/2✓ Branch 0 taken 7387 times.
✓ Branch 1 taken 10998 times.
|
18385 | if (sbr->data[0].bs_amp_res) { |
97 | 7387 | temp1 = exp2fi(sbr->data[0].env_facs_q[e][k] + 7); | |
98 | 7387 | temp2 = exp2fi(pan_offset - sbr->data[1].env_facs_q[e][k]); | |
99 | } | ||
100 | else { | ||
101 | 10998 | temp1 = exp2fi((sbr->data[0].env_facs_q[e][k]>>1) + 7) * | |
102 | 10998 | exp2_tab[sbr->data[0].env_facs_q[e][k] & 1]; | |
103 | 10998 | temp2 = exp2fi((pan_offset - sbr->data[1].env_facs_q[e][k])>>1) * | |
104 | 10998 | exp2_tab[(pan_offset - sbr->data[1].env_facs_q[e][k]) & 1]; | |
105 | } | ||
106 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 18385 times.
|
18385 | if (temp1 > 1E20) { |
107 | ✗ | av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n"); | |
108 | ✗ | temp1 = 1; | |
109 | } | ||
110 | 18385 | fac = temp1 / (1.0f + temp2); | |
111 | 18385 | sbr->data[0].env_facs[e][k] = fac; | |
112 | 18385 | sbr->data[1].env_facs[e][k] = fac * temp2; | |
113 | } | ||
114 | } | ||
115 |
2/2✓ Branch 0 taken 1650 times.
✓ Branch 1 taken 1345 times.
|
2995 | for (e = 1; e <= sbr->data[0].bs_num_noise; e++) { |
116 |
2/2✓ Branch 0 taken 4367 times.
✓ Branch 1 taken 1650 times.
|
6017 | for (k = 0; k < sbr->n_q; k++) { |
117 | 4367 | float temp1 = exp2fi(NOISE_FLOOR_OFFSET - sbr->data[0].noise_facs_q[e][k] + 1); | |
118 | 4367 | float temp2 = exp2fi(12 - sbr->data[1].noise_facs_q[e][k]); | |
119 | float fac; | ||
120 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4367 times.
|
4367 | av_assert0(temp1 <= 1E20); |
121 | 4367 | fac = temp1 / (1.0f + temp2); | |
122 | 4367 | sbr->data[0].noise_facs[e][k] = fac; | |
123 | 4367 | sbr->data[1].noise_facs[e][k] = fac * temp2; | |
124 | } | ||
125 | } | ||
126 | } else { // SCE or one non-coupled CPE | ||
127 |
4/4✓ Branch 0 taken 2508 times.
✓ Branch 1 taken 4538 times.
✓ Branch 2 taken 3941 times.
✓ Branch 3 taken 3105 times.
|
7046 | for (ch = 0; ch < (id_aac == TYPE_CPE) + 1; ch++) { |
128 |
2/2✓ Branch 0 taken 6056 times.
✓ Branch 1 taken 3941 times.
|
9997 | for (e = 1; e <= sbr->data[ch].bs_num_env; e++) |
129 |
2/2✓ Branch 0 taken 76169 times.
✓ Branch 1 taken 6056 times.
|
82225 | for (k = 0; k < sbr->n[sbr->data[ch].bs_freq_res[e]]; k++){ |
130 |
2/2✓ Branch 0 taken 44051 times.
✓ Branch 1 taken 32118 times.
|
76169 | if (sbr->data[ch].bs_amp_res) |
131 | 44051 | sbr->data[ch].env_facs[e][k] = exp2fi(sbr->data[ch].env_facs_q[e][k] + 6); | |
132 | else | ||
133 | 32118 | sbr->data[ch].env_facs[e][k] = exp2fi((sbr->data[ch].env_facs_q[e][k]>>1) + 6) | |
134 | 32118 | * exp2_tab[sbr->data[ch].env_facs_q[e][k] & 1]; | |
135 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 76169 times.
|
76169 | if (sbr->data[ch].env_facs[e][k] > 1E20) { |
136 | ✗ | av_log(NULL, AV_LOG_ERROR, "envelope scalefactor overflow in dequant\n"); | |
137 | ✗ | sbr->data[ch].env_facs[e][k] = 1; | |
138 | } | ||
139 | } | ||
140 | |||
141 |
2/2✓ Branch 0 taken 5496 times.
✓ Branch 1 taken 3941 times.
|
9437 | for (e = 1; e <= sbr->data[ch].bs_num_noise; e++) |
142 |
2/2✓ Branch 0 taken 19087 times.
✓ Branch 1 taken 5496 times.
|
24583 | for (k = 0; k < sbr->n_q; k++) |
143 | 19087 | sbr->data[ch].noise_facs[e][k] = | |
144 | 19087 | exp2fi(NOISE_FLOOR_OFFSET - sbr->data[ch].noise_facs_q[e][k]); | |
145 | } | ||
146 | } | ||
147 | 4450 | } | |
148 | |||
149 | /** High Frequency Generation (14496-3 sp04 p214+) and Inverse Filtering | ||
150 | * (14496-3 sp04 p214) | ||
151 | * Warning: This routine does not seem numerically stable. | ||
152 | */ | ||
153 | 6631 | static void sbr_hf_inverse_filter(SBRDSPContext *dsp, | |
154 | float (*alpha0)[2], float (*alpha1)[2], | ||
155 | const float X_low[32][40][2], int k0) | ||
156 | { | ||
157 | int k; | ||
158 |
2/2✓ Branch 0 taken 124324 times.
✓ Branch 1 taken 6631 times.
|
130955 | for (k = 0; k < k0; k++) { |
159 | 124324 | LOCAL_ALIGNED_16(float, phi, [3], [2][2]); | |
160 | float dk; | ||
161 | |||
162 | 124324 | dsp->autocorrelate(X_low[k], phi); | |
163 | |||
164 | 124324 | dk = phi[2][1][0] * phi[1][0][0] - | |
165 | 124324 | (phi[1][1][0] * phi[1][1][0] + phi[1][1][1] * phi[1][1][1]) / 1.000001f; | |
166 | |||
167 |
2/2✓ Branch 0 taken 4007 times.
✓ Branch 1 taken 120317 times.
|
124324 | if (!dk) { |
168 | 4007 | alpha1[k][0] = 0; | |
169 | 4007 | alpha1[k][1] = 0; | |
170 | } else { | ||
171 | float temp_real, temp_im; | ||
172 | 120317 | temp_real = phi[0][0][0] * phi[1][1][0] - | |
173 | 120317 | phi[0][0][1] * phi[1][1][1] - | |
174 | 120317 | phi[0][1][0] * phi[1][0][0]; | |
175 | 120317 | temp_im = phi[0][0][0] * phi[1][1][1] + | |
176 | 120317 | phi[0][0][1] * phi[1][1][0] - | |
177 | 120317 | phi[0][1][1] * phi[1][0][0]; | |
178 | |||
179 | 120317 | alpha1[k][0] = temp_real / dk; | |
180 | 120317 | alpha1[k][1] = temp_im / dk; | |
181 | } | ||
182 | |||
183 |
2/2✓ Branch 0 taken 3622 times.
✓ Branch 1 taken 120702 times.
|
124324 | if (!phi[1][0][0]) { |
184 | 3622 | alpha0[k][0] = 0; | |
185 | 3622 | alpha0[k][1] = 0; | |
186 | } else { | ||
187 | float temp_real, temp_im; | ||
188 | 120702 | temp_real = phi[0][0][0] + alpha1[k][0] * phi[1][1][0] + | |
189 | 120702 | alpha1[k][1] * phi[1][1][1]; | |
190 | 120702 | temp_im = phi[0][0][1] + alpha1[k][1] * phi[1][1][0] - | |
191 | 120702 | alpha1[k][0] * phi[1][1][1]; | |
192 | |||
193 | 120702 | alpha0[k][0] = -temp_real / phi[1][0][0]; | |
194 | 120702 | alpha0[k][1] = -temp_im / phi[1][0][0]; | |
195 | } | ||
196 | |||
197 |
2/2✓ Branch 0 taken 123938 times.
✓ Branch 1 taken 386 times.
|
124324 | if (alpha1[k][0] * alpha1[k][0] + alpha1[k][1] * alpha1[k][1] >= 16.0f || |
198 |
2/2✓ Branch 0 taken 218 times.
✓ Branch 1 taken 123720 times.
|
123938 | alpha0[k][0] * alpha0[k][0] + alpha0[k][1] * alpha0[k][1] >= 16.0f) { |
199 | 604 | alpha1[k][0] = 0; | |
200 | 604 | alpha1[k][1] = 0; | |
201 | 604 | alpha0[k][0] = 0; | |
202 | 604 | alpha0[k][1] = 0; | |
203 | } | ||
204 | } | ||
205 | 6631 | } | |
206 | |||
207 | /// Chirp Factors (14496-3 sp04 p214) | ||
208 | 6631 | static void sbr_chirp(SpectralBandReplication *sbr, SBRData *ch_data) | |
209 | { | ||
210 | int i; | ||
211 | float new_bw; | ||
212 | static const float bw_tab[] = { 0.0f, 0.75f, 0.9f, 0.98f }; | ||
213 | |||
214 |
2/2✓ Branch 0 taken 20559 times.
✓ Branch 1 taken 6631 times.
|
27190 | for (i = 0; i < sbr->n_q; i++) { |
215 |
2/2✓ Branch 0 taken 1293 times.
✓ Branch 1 taken 19266 times.
|
20559 | if (ch_data->bs_invf_mode[0][i] + ch_data->bs_invf_mode[1][i] == 1) { |
216 | 1293 | new_bw = 0.6f; | |
217 | } else | ||
218 | 19266 | new_bw = bw_tab[ch_data->bs_invf_mode[0][i]]; | |
219 | |||
220 |
2/2✓ Branch 0 taken 3582 times.
✓ Branch 1 taken 16977 times.
|
20559 | if (new_bw < ch_data->bw_array[i]) { |
221 | 3582 | new_bw = 0.75f * new_bw + 0.25f * ch_data->bw_array[i]; | |
222 | } else | ||
223 | 16977 | new_bw = 0.90625f * new_bw + 0.09375f * ch_data->bw_array[i]; | |
224 |
2/2✓ Branch 0 taken 3343 times.
✓ Branch 1 taken 17216 times.
|
20559 | ch_data->bw_array[i] = new_bw < 0.015625f ? 0.0f : new_bw; |
225 | } | ||
226 | 6631 | } | |
227 | |||
228 | /** | ||
229 | * Calculation of levels of additional HF signal components (14496-3 sp04 p219) | ||
230 | * and Calculation of gain (14496-3 sp04 p219) | ||
231 | */ | ||
232 | 6631 | static void sbr_gain_calc(SpectralBandReplication *sbr, | |
233 | SBRData *ch_data, const int e_a[2]) | ||
234 | { | ||
235 | int e, k, m; | ||
236 | // max gain limits : -3dB, 0dB, 3dB, inf dB (limiter off) | ||
237 | static const float limgain[4] = { 0.70795, 1.0, 1.41254, 10000000000 }; | ||
238 | |||
239 |
2/2✓ Branch 0 taken 9572 times.
✓ Branch 1 taken 6631 times.
|
16203 | for (e = 0; e < ch_data->bs_num_env; e++) { |
240 |
4/4✓ Branch 0 taken 9173 times.
✓ Branch 1 taken 399 times.
✓ Branch 2 taken 9032 times.
✓ Branch 3 taken 141 times.
|
9572 | int delta = !((e == e_a[1]) || (e == e_a[0])); |
241 |
2/2✓ Branch 0 taken 34468 times.
✓ Branch 1 taken 9572 times.
|
44040 | for (k = 0; k < sbr->n_lim; k++) { |
242 | float gain_boost, gain_max; | ||
243 | 34468 | float sum[2] = { 0.0f, 0.0f }; | |
244 |
2/2✓ Branch 0 taken 251185 times.
✓ Branch 1 taken 34468 times.
|
285653 | for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { |
245 | 251185 | const float temp = sbr->e_origmapped[e][m] / (1.0f + sbr->q_mapped[e][m]); | |
246 | 251185 | sbr->q_m[e][m] = sqrtf(temp * sbr->q_mapped[e][m]); | |
247 | 251185 | sbr->s_m[e][m] = sqrtf(temp * ch_data->s_indexmapped[e + 1][m]); | |
248 |
2/2✓ Branch 0 taken 245902 times.
✓ Branch 1 taken 5283 times.
|
251185 | if (!sbr->s_mapped[e][m]) { |
249 | 245902 | sbr->gain[e][m] = sqrtf(sbr->e_origmapped[e][m] / | |
250 | 245902 | ((1.0f + sbr->e_curr[e][m]) * | |
251 | 245902 | (1.0f + sbr->q_mapped[e][m] * delta))); | |
252 | } else { | ||
253 | 5283 | sbr->gain[e][m] = sqrtf(sbr->e_origmapped[e][m] * sbr->q_mapped[e][m] / | |
254 | 5283 | ((1.0f + sbr->e_curr[e][m]) * | |
255 | 5283 | (1.0f + sbr->q_mapped[e][m]))); | |
256 | } | ||
257 | 251185 | sbr->gain[e][m] += FLT_MIN; | |
258 | } | ||
259 |
2/2✓ Branch 0 taken 251185 times.
✓ Branch 1 taken 34468 times.
|
285653 | for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { |
260 | 251185 | sum[0] += sbr->e_origmapped[e][m]; | |
261 | 251185 | sum[1] += sbr->e_curr[e][m]; | |
262 | } | ||
263 | 34468 | gain_max = limgain[sbr->bs_limiter_gains] * sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1])); | |
264 |
2/2✓ Branch 0 taken 30554 times.
✓ Branch 1 taken 3914 times.
|
34468 | gain_max = FFMIN(100000.f, gain_max); |
265 |
2/2✓ Branch 0 taken 251185 times.
✓ Branch 1 taken 34468 times.
|
285653 | for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { |
266 | 251185 | float q_m_max = sbr->q_m[e][m] * gain_max / sbr->gain[e][m]; | |
267 |
2/2✓ Branch 0 taken 60467 times.
✓ Branch 1 taken 190718 times.
|
251185 | sbr->q_m[e][m] = FFMIN(sbr->q_m[e][m], q_m_max); |
268 |
2/2✓ Branch 0 taken 60467 times.
✓ Branch 1 taken 190718 times.
|
251185 | sbr->gain[e][m] = FFMIN(sbr->gain[e][m], gain_max); |
269 | } | ||
270 | 34468 | sum[0] = sum[1] = 0.0f; | |
271 |
2/2✓ Branch 0 taken 251185 times.
✓ Branch 1 taken 34468 times.
|
285653 | for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { |
272 | 251185 | sum[0] += sbr->e_origmapped[e][m]; | |
273 | 502370 | sum[1] += sbr->e_curr[e][m] * sbr->gain[e][m] * sbr->gain[e][m] | |
274 | 251185 | + sbr->s_m[e][m] * sbr->s_m[e][m] | |
275 |
4/4✓ Branch 0 taken 237234 times.
✓ Branch 1 taken 13951 times.
✓ Branch 2 taken 235344 times.
✓ Branch 3 taken 1890 times.
|
251185 | + (delta && !sbr->s_m[e][m]) * sbr->q_m[e][m] * sbr->q_m[e][m]; |
276 | } | ||
277 | 34468 | gain_boost = sqrtf((FLT_EPSILON + sum[0]) / (FLT_EPSILON + sum[1])); | |
278 |
2/2✓ Branch 0 taken 29421 times.
✓ Branch 1 taken 5047 times.
|
34468 | gain_boost = FFMIN(1.584893192f, gain_boost); |
279 |
2/2✓ Branch 0 taken 251185 times.
✓ Branch 1 taken 34468 times.
|
285653 | for (m = sbr->f_tablelim[k] - sbr->kx[1]; m < sbr->f_tablelim[k + 1] - sbr->kx[1]; m++) { |
280 | 251185 | sbr->gain[e][m] *= gain_boost; | |
281 | 251185 | sbr->q_m[e][m] *= gain_boost; | |
282 | 251185 | sbr->s_m[e][m] *= gain_boost; | |
283 | } | ||
284 | } | ||
285 | } | ||
286 | 6631 | } | |
287 | |||
288 | /// Assembling HF Signals (14496-3 sp04 p220) | ||
289 | 6631 | static void sbr_hf_assemble(float Y1[38][64][2], | |
290 | const float X_high[64][40][2], | ||
291 | SpectralBandReplication *sbr, SBRData *ch_data, | ||
292 | const int e_a[2]) | ||
293 | { | ||
294 | int e, i, j, m; | ||
295 |
2/2✓ Branch 0 taken 1148 times.
✓ Branch 1 taken 5483 times.
|
6631 | const int h_SL = 4 * !sbr->bs_smoothing_mode; |
296 | 6631 | const int kx = sbr->kx[1]; | |
297 | 6631 | const int m_max = sbr->m[1]; | |
298 | static const float h_smooth[5] = { | ||
299 | 0.33333333333333, | ||
300 | 0.30150283239582, | ||
301 | 0.21816949906249, | ||
302 | 0.11516383427084, | ||
303 | 0.03183050093751, | ||
304 | }; | ||
305 | 6631 | float (*g_temp)[48] = ch_data->g_temp, (*q_temp)[48] = ch_data->q_temp; | |
306 | 6631 | int indexnoise = ch_data->f_indexnoise; | |
307 | 6631 | int indexsine = ch_data->f_indexsine; | |
308 | |||
309 |
2/2✓ Branch 0 taken 79 times.
✓ Branch 1 taken 6552 times.
|
6631 | if (sbr->reset) { |
310 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 79 times.
|
87 | for (i = 0; i < h_SL; i++) { |
311 | 8 | memcpy(g_temp[i + 2*ch_data->t_env[0]], sbr->gain[0], m_max * sizeof(sbr->gain[0][0])); | |
312 | 8 | memcpy(q_temp[i + 2*ch_data->t_env[0]], sbr->q_m[0], m_max * sizeof(sbr->q_m[0][0])); | |
313 | } | ||
314 |
2/2✓ Branch 0 taken 1146 times.
✓ Branch 1 taken 5406 times.
|
6552 | } else if (h_SL) { |
315 |
2/2✓ Branch 0 taken 4584 times.
✓ Branch 1 taken 1146 times.
|
5730 | for (i = 0; i < 4; i++) { |
316 | 4584 | memcpy(g_temp[i + 2 * ch_data->t_env[0]], | |
317 | 4584 | g_temp[i + 2 * ch_data->t_env_num_env_old], | |
318 | sizeof(g_temp[0])); | ||
319 | 4584 | memcpy(q_temp[i + 2 * ch_data->t_env[0]], | |
320 | 4584 | q_temp[i + 2 * ch_data->t_env_num_env_old], | |
321 | sizeof(q_temp[0])); | ||
322 | } | ||
323 | } | ||
324 | |||
325 |
2/2✓ Branch 0 taken 9572 times.
✓ Branch 1 taken 6631 times.
|
16203 | for (e = 0; e < ch_data->bs_num_env; e++) { |
326 |
2/2✓ Branch 0 taken 212192 times.
✓ Branch 1 taken 9572 times.
|
221764 | for (i = 2 * ch_data->t_env[e]; i < 2 * ch_data->t_env[e + 1]; i++) { |
327 | 212192 | memcpy(g_temp[h_SL + i], sbr->gain[e], m_max * sizeof(sbr->gain[0][0])); | |
328 | 212192 | memcpy(q_temp[h_SL + i], sbr->q_m[e], m_max * sizeof(sbr->q_m[0][0])); | |
329 | } | ||
330 | } | ||
331 | |||
332 |
2/2✓ Branch 0 taken 9572 times.
✓ Branch 1 taken 6631 times.
|
16203 | for (e = 0; e < ch_data->bs_num_env; e++) { |
333 |
2/2✓ Branch 0 taken 212192 times.
✓ Branch 1 taken 9572 times.
|
221764 | for (i = 2 * ch_data->t_env[e]; i < 2 * ch_data->t_env[e + 1]; i++) { |
334 | 212192 | LOCAL_ALIGNED_16(float, g_filt_tab, [48]); | |
335 | 212192 | LOCAL_ALIGNED_16(float, q_filt_tab, [48]); | |
336 | float *g_filt, *q_filt; | ||
337 | |||
338 |
6/6✓ Branch 0 taken 36736 times.
✓ Branch 1 taken 175456 times.
✓ Branch 2 taken 36694 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 36634 times.
✓ Branch 5 taken 60 times.
|
212192 | if (h_SL && e != e_a[0] && e != e_a[1]) { |
339 | 36634 | g_filt = g_filt_tab; | |
340 | 36634 | q_filt = q_filt_tab; | |
341 |
2/2✓ Branch 0 taken 622778 times.
✓ Branch 1 taken 36634 times.
|
659412 | for (m = 0; m < m_max; m++) { |
342 | 622778 | const int idx1 = i + h_SL; | |
343 | 622778 | g_filt[m] = 0.0f; | |
344 | 622778 | q_filt[m] = 0.0f; | |
345 |
2/2✓ Branch 0 taken 3113890 times.
✓ Branch 1 taken 622778 times.
|
3736668 | for (j = 0; j <= h_SL; j++) { |
346 | 3113890 | g_filt[m] += g_temp[idx1 - j][m] * h_smooth[j]; | |
347 | 3113890 | q_filt[m] += q_temp[idx1 - j][m] * h_smooth[j]; | |
348 | } | ||
349 | } | ||
350 | } else { | ||
351 | 175558 | g_filt = g_temp[i + h_SL]; | |
352 | 175558 | q_filt = q_temp[i]; | |
353 | } | ||
354 | |||
355 | 212192 | sbr->dsp.hf_g_filt(Y1[i] + kx, X_high + kx, g_filt, m_max, | |
356 | 212192 | i + ENVELOPE_ADJUSTMENT_OFFSET); | |
357 | |||
358 |
4/4✓ Branch 0 taken 211598 times.
✓ Branch 1 taken 594 times.
✓ Branch 2 taken 209970 times.
✓ Branch 3 taken 1628 times.
|
212192 | if (e != e_a[0] && e != e_a[1]) { |
359 | 209970 | sbr->dsp.hf_apply_noise[indexsine](Y1[i] + kx, sbr->s_m[e], | |
360 | q_filt, indexnoise, | ||
361 | kx, m_max); | ||
362 | } else { | ||
363 | 2222 | int idx = indexsine&1; | |
364 | 2222 | int A = (1-((indexsine+(kx & 1))&2)); | |
365 | 2222 | int B = (A^(-idx)) + idx; | |
366 | 2222 | float *out = &Y1[i][kx][idx]; | |
367 | 2222 | float *in = sbr->s_m[e]; | |
368 |
2/2✓ Branch 0 taken 28028 times.
✓ Branch 1 taken 2222 times.
|
30250 | for (m = 0; m+1 < m_max; m+=2) { |
369 | 28028 | out[2*m ] += in[m ] * A; | |
370 | 28028 | out[2*m+2] += in[m+1] * B; | |
371 | } | ||
372 |
2/2✓ Branch 0 taken 1288 times.
✓ Branch 1 taken 934 times.
|
2222 | if(m_max&1) |
373 | 1288 | out[2*m ] += in[m ] * A; | |
374 | } | ||
375 | 212192 | indexnoise = (indexnoise + m_max) & 0x1ff; | |
376 | 212192 | indexsine = (indexsine + 1) & 3; | |
377 | } | ||
378 | } | ||
379 | 6631 | ch_data->f_indexnoise = indexnoise; | |
380 | 6631 | ch_data->f_indexsine = indexsine; | |
381 | 6631 | } | |
382 | |||
383 | #include "aacsbr_template.c" | ||
384 |