yading@10
|
1 /*
|
yading@10
|
2 * Copyright (c) 2001, 2002 Fabrice Bellard
|
yading@10
|
3 *
|
yading@10
|
4 * This file is part of FFmpeg.
|
yading@10
|
5 *
|
yading@10
|
6 * FFmpeg is free software; you can redistribute it and/or
|
yading@10
|
7 * modify it under the terms of the GNU Lesser General Public
|
yading@10
|
8 * License as published by the Free Software Foundation; either
|
yading@10
|
9 * version 2.1 of the License, or (at your option) any later version.
|
yading@10
|
10 *
|
yading@10
|
11 * FFmpeg is distributed in the hope that it will be useful,
|
yading@10
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
yading@10
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
yading@10
|
14 * Lesser General Public License for more details.
|
yading@10
|
15 *
|
yading@10
|
16 * You should have received a copy of the GNU Lesser General Public
|
yading@10
|
17 * License along with FFmpeg; if not, write to the Free Software
|
yading@10
|
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
yading@10
|
19 */
|
yading@10
|
20
|
yading@10
|
21 #include <stdint.h>
|
yading@10
|
22
|
yading@10
|
23 #include "libavutil/mem.h"
|
yading@10
|
24 #include "dct32.h"
|
yading@10
|
25 #include "mathops.h"
|
yading@10
|
26 #include "mpegaudiodsp.h"
|
yading@10
|
27 #include "mpegaudio.h"
|
yading@10
|
28
|
yading@10
|
29 #if CONFIG_FLOAT
|
yading@10
|
30 #define RENAME(n) n##_float
|
yading@10
|
31
|
yading@10
|
32 static inline float round_sample(float *sum)
|
yading@10
|
33 {
|
yading@10
|
34 float sum1=*sum;
|
yading@10
|
35 *sum = 0;
|
yading@10
|
36 return sum1;
|
yading@10
|
37 }
|
yading@10
|
38
|
yading@10
|
39 #define MACS(rt, ra, rb) rt+=(ra)*(rb)
|
yading@10
|
40 #define MULS(ra, rb) ((ra)*(rb))
|
yading@10
|
41 #define MULH3(x, y, s) ((s)*(y)*(x))
|
yading@10
|
42 #define MLSS(rt, ra, rb) rt-=(ra)*(rb)
|
yading@10
|
43 #define MULLx(x, y, s) ((y)*(x))
|
yading@10
|
44 #define FIXHR(x) ((float)(x))
|
yading@10
|
45 #define FIXR(x) ((float)(x))
|
yading@10
|
46 #define SHR(a,b) ((a)*(1.0f/(1<<(b))))
|
yading@10
|
47
|
yading@10
|
48 #else
|
yading@10
|
49
|
yading@10
|
50 #define RENAME(n) n##_fixed
|
yading@10
|
51 #define OUT_SHIFT (WFRAC_BITS + FRAC_BITS - 15)
|
yading@10
|
52
|
yading@10
|
53 static inline int round_sample(int64_t *sum)
|
yading@10
|
54 {
|
yading@10
|
55 int sum1;
|
yading@10
|
56 sum1 = (int)((*sum) >> OUT_SHIFT);
|
yading@10
|
57 *sum &= (1<<OUT_SHIFT)-1;
|
yading@10
|
58 return av_clip_int16(sum1);
|
yading@10
|
59 }
|
yading@10
|
60
|
yading@10
|
61 # define MULS(ra, rb) MUL64(ra, rb)
|
yading@10
|
62 # define MACS(rt, ra, rb) MAC64(rt, ra, rb)
|
yading@10
|
63 # define MLSS(rt, ra, rb) MLS64(rt, ra, rb)
|
yading@10
|
64 # define MULH3(x, y, s) MULH((s)*(x), y)
|
yading@10
|
65 # define MULLx(x, y, s) MULL(x,y,s)
|
yading@10
|
66 # define SHR(a,b) ((a)>>(b))
|
yading@10
|
67 # define FIXR(a) ((int)((a) * FRAC_ONE + 0.5))
|
yading@10
|
68 # define FIXHR(a) ((int)((a) * (1LL<<32) + 0.5))
|
yading@10
|
69 #endif
|
yading@10
|
70
|
yading@10
|
71 /** Window for MDCT. Actually only the elements in [0,17] and
|
yading@10
|
72 [MDCT_BUF_SIZE/2, MDCT_BUF_SIZE/2 + 17] are actually used. The rest
|
yading@10
|
73 is just to preserve alignment for SIMD implementations.
|
yading@10
|
74 */
|
yading@10
|
75 DECLARE_ALIGNED(16, INTFLOAT, RENAME(ff_mdct_win))[8][MDCT_BUF_SIZE];
|
yading@10
|
76
|
yading@10
|
77 DECLARE_ALIGNED(16, MPA_INT, RENAME(ff_mpa_synth_window))[512+256];
|
yading@10
|
78
|
yading@10
|
79 #define SUM8(op, sum, w, p) \
|
yading@10
|
80 { \
|
yading@10
|
81 op(sum, (w)[0 * 64], (p)[0 * 64]); \
|
yading@10
|
82 op(sum, (w)[1 * 64], (p)[1 * 64]); \
|
yading@10
|
83 op(sum, (w)[2 * 64], (p)[2 * 64]); \
|
yading@10
|
84 op(sum, (w)[3 * 64], (p)[3 * 64]); \
|
yading@10
|
85 op(sum, (w)[4 * 64], (p)[4 * 64]); \
|
yading@10
|
86 op(sum, (w)[5 * 64], (p)[5 * 64]); \
|
yading@10
|
87 op(sum, (w)[6 * 64], (p)[6 * 64]); \
|
yading@10
|
88 op(sum, (w)[7 * 64], (p)[7 * 64]); \
|
yading@10
|
89 }
|
yading@10
|
90
|
yading@10
|
91 #define SUM8P2(sum1, op1, sum2, op2, w1, w2, p) \
|
yading@10
|
92 { \
|
yading@10
|
93 INTFLOAT tmp;\
|
yading@10
|
94 tmp = p[0 * 64];\
|
yading@10
|
95 op1(sum1, (w1)[0 * 64], tmp);\
|
yading@10
|
96 op2(sum2, (w2)[0 * 64], tmp);\
|
yading@10
|
97 tmp = p[1 * 64];\
|
yading@10
|
98 op1(sum1, (w1)[1 * 64], tmp);\
|
yading@10
|
99 op2(sum2, (w2)[1 * 64], tmp);\
|
yading@10
|
100 tmp = p[2 * 64];\
|
yading@10
|
101 op1(sum1, (w1)[2 * 64], tmp);\
|
yading@10
|
102 op2(sum2, (w2)[2 * 64], tmp);\
|
yading@10
|
103 tmp = p[3 * 64];\
|
yading@10
|
104 op1(sum1, (w1)[3 * 64], tmp);\
|
yading@10
|
105 op2(sum2, (w2)[3 * 64], tmp);\
|
yading@10
|
106 tmp = p[4 * 64];\
|
yading@10
|
107 op1(sum1, (w1)[4 * 64], tmp);\
|
yading@10
|
108 op2(sum2, (w2)[4 * 64], tmp);\
|
yading@10
|
109 tmp = p[5 * 64];\
|
yading@10
|
110 op1(sum1, (w1)[5 * 64], tmp);\
|
yading@10
|
111 op2(sum2, (w2)[5 * 64], tmp);\
|
yading@10
|
112 tmp = p[6 * 64];\
|
yading@10
|
113 op1(sum1, (w1)[6 * 64], tmp);\
|
yading@10
|
114 op2(sum2, (w2)[6 * 64], tmp);\
|
yading@10
|
115 tmp = p[7 * 64];\
|
yading@10
|
116 op1(sum1, (w1)[7 * 64], tmp);\
|
yading@10
|
117 op2(sum2, (w2)[7 * 64], tmp);\
|
yading@10
|
118 }
|
yading@10
|
119
|
yading@10
|
120 void RENAME(ff_mpadsp_apply_window)(MPA_INT *synth_buf, MPA_INT *window,
|
yading@10
|
121 int *dither_state, OUT_INT *samples,
|
yading@10
|
122 int incr)
|
yading@10
|
123 {
|
yading@10
|
124 register const MPA_INT *w, *w2, *p;
|
yading@10
|
125 int j;
|
yading@10
|
126 OUT_INT *samples2;
|
yading@10
|
127 #if CONFIG_FLOAT
|
yading@10
|
128 float sum, sum2;
|
yading@10
|
129 #else
|
yading@10
|
130 int64_t sum, sum2;
|
yading@10
|
131 #endif
|
yading@10
|
132
|
yading@10
|
133 /* copy to avoid wrap */
|
yading@10
|
134 memcpy(synth_buf + 512, synth_buf, 32 * sizeof(*synth_buf));
|
yading@10
|
135
|
yading@10
|
136 samples2 = samples + 31 * incr;
|
yading@10
|
137 w = window;
|
yading@10
|
138 w2 = window + 31;
|
yading@10
|
139
|
yading@10
|
140 sum = *dither_state;
|
yading@10
|
141 p = synth_buf + 16;
|
yading@10
|
142 SUM8(MACS, sum, w, p);
|
yading@10
|
143 p = synth_buf + 48;
|
yading@10
|
144 SUM8(MLSS, sum, w + 32, p);
|
yading@10
|
145 *samples = round_sample(&sum);
|
yading@10
|
146 samples += incr;
|
yading@10
|
147 w++;
|
yading@10
|
148
|
yading@10
|
149 /* we calculate two samples at the same time to avoid one memory
|
yading@10
|
150 access per two sample */
|
yading@10
|
151 for(j=1;j<16;j++) {
|
yading@10
|
152 sum2 = 0;
|
yading@10
|
153 p = synth_buf + 16 + j;
|
yading@10
|
154 SUM8P2(sum, MACS, sum2, MLSS, w, w2, p);
|
yading@10
|
155 p = synth_buf + 48 - j;
|
yading@10
|
156 SUM8P2(sum, MLSS, sum2, MLSS, w + 32, w2 + 32, p);
|
yading@10
|
157
|
yading@10
|
158 *samples = round_sample(&sum);
|
yading@10
|
159 samples += incr;
|
yading@10
|
160 sum += sum2;
|
yading@10
|
161 *samples2 = round_sample(&sum);
|
yading@10
|
162 samples2 -= incr;
|
yading@10
|
163 w++;
|
yading@10
|
164 w2--;
|
yading@10
|
165 }
|
yading@10
|
166
|
yading@10
|
167 p = synth_buf + 32;
|
yading@10
|
168 SUM8(MLSS, sum, w + 32, p);
|
yading@10
|
169 *samples = round_sample(&sum);
|
yading@10
|
170 *dither_state= sum;
|
yading@10
|
171 }
|
yading@10
|
172
|
yading@10
|
173 /* 32 sub band synthesis filter. Input: 32 sub band samples, Output:
|
yading@10
|
174 32 samples. */
|
yading@10
|
175 void RENAME(ff_mpa_synth_filter)(MPADSPContext *s, MPA_INT *synth_buf_ptr,
|
yading@10
|
176 int *synth_buf_offset,
|
yading@10
|
177 MPA_INT *window, int *dither_state,
|
yading@10
|
178 OUT_INT *samples, int incr,
|
yading@10
|
179 MPA_INT *sb_samples)
|
yading@10
|
180 {
|
yading@10
|
181 MPA_INT *synth_buf;
|
yading@10
|
182 int offset;
|
yading@10
|
183
|
yading@10
|
184 offset = *synth_buf_offset;
|
yading@10
|
185 synth_buf = synth_buf_ptr + offset;
|
yading@10
|
186
|
yading@10
|
187 s->RENAME(dct32)(synth_buf, sb_samples);
|
yading@10
|
188 s->RENAME(apply_window)(synth_buf, window, dither_state, samples, incr);
|
yading@10
|
189
|
yading@10
|
190 offset = (offset - 32) & 511;
|
yading@10
|
191 *synth_buf_offset = offset;
|
yading@10
|
192 }
|
yading@10
|
193
|
yading@10
|
194 av_cold void RENAME(ff_mpa_synth_init)(MPA_INT *window)
|
yading@10
|
195 {
|
yading@10
|
196 int i, j;
|
yading@10
|
197
|
yading@10
|
198 /* max = 18760, max sum over all 16 coefs : 44736 */
|
yading@10
|
199 for(i=0;i<257;i++) {
|
yading@10
|
200 INTFLOAT v;
|
yading@10
|
201 v = ff_mpa_enwindow[i];
|
yading@10
|
202 #if CONFIG_FLOAT
|
yading@10
|
203 v *= 1.0 / (1LL<<(16 + FRAC_BITS));
|
yading@10
|
204 #endif
|
yading@10
|
205 window[i] = v;
|
yading@10
|
206 if ((i & 63) != 0)
|
yading@10
|
207 v = -v;
|
yading@10
|
208 if (i != 0)
|
yading@10
|
209 window[512 - i] = v;
|
yading@10
|
210 }
|
yading@10
|
211
|
yading@10
|
212
|
yading@10
|
213 // Needed for avoiding shuffles in ASM implementations
|
yading@10
|
214 for(i=0; i < 8; i++)
|
yading@10
|
215 for(j=0; j < 16; j++)
|
yading@10
|
216 window[512+16*i+j] = window[64*i+32-j];
|
yading@10
|
217
|
yading@10
|
218 for(i=0; i < 8; i++)
|
yading@10
|
219 for(j=0; j < 16; j++)
|
yading@10
|
220 window[512+128+16*i+j] = window[64*i+48-j];
|
yading@10
|
221 }
|
yading@10
|
222
|
yading@10
|
223 void RENAME(ff_init_mpadsp_tabs)(void)
|
yading@10
|
224 {
|
yading@10
|
225 int i, j;
|
yading@10
|
226 /* compute mdct windows */
|
yading@10
|
227 for (i = 0; i < 36; i++) {
|
yading@10
|
228 for (j = 0; j < 4; j++) {
|
yading@10
|
229 double d;
|
yading@10
|
230
|
yading@10
|
231 if (j == 2 && i % 3 != 1)
|
yading@10
|
232 continue;
|
yading@10
|
233
|
yading@10
|
234 d = sin(M_PI * (i + 0.5) / 36.0);
|
yading@10
|
235 if (j == 1) {
|
yading@10
|
236 if (i >= 30) d = 0;
|
yading@10
|
237 else if (i >= 24) d = sin(M_PI * (i - 18 + 0.5) / 12.0);
|
yading@10
|
238 else if (i >= 18) d = 1;
|
yading@10
|
239 } else if (j == 3) {
|
yading@10
|
240 if (i < 6) d = 0;
|
yading@10
|
241 else if (i < 12) d = sin(M_PI * (i - 6 + 0.5) / 12.0);
|
yading@10
|
242 else if (i < 18) d = 1;
|
yading@10
|
243 }
|
yading@10
|
244 //merge last stage of imdct into the window coefficients
|
yading@10
|
245 d *= 0.5 * IMDCT_SCALAR / cos(M_PI * (2 * i + 19) / 72);
|
yading@10
|
246
|
yading@10
|
247 if (j == 2)
|
yading@10
|
248 RENAME(ff_mdct_win)[j][i/3] = FIXHR((d / (1<<5)));
|
yading@10
|
249 else {
|
yading@10
|
250 int idx = i < 18 ? i : i + (MDCT_BUF_SIZE/2 - 18);
|
yading@10
|
251 RENAME(ff_mdct_win)[j][idx] = FIXHR((d / (1<<5)));
|
yading@10
|
252 }
|
yading@10
|
253 }
|
yading@10
|
254 }
|
yading@10
|
255
|
yading@10
|
256 /* NOTE: we do frequency inversion adter the MDCT by changing
|
yading@10
|
257 the sign of the right window coefs */
|
yading@10
|
258 for (j = 0; j < 4; j++) {
|
yading@10
|
259 for (i = 0; i < MDCT_BUF_SIZE; i += 2) {
|
yading@10
|
260 RENAME(ff_mdct_win)[j + 4][i ] = RENAME(ff_mdct_win)[j][i ];
|
yading@10
|
261 RENAME(ff_mdct_win)[j + 4][i + 1] = -RENAME(ff_mdct_win)[j][i + 1];
|
yading@10
|
262 }
|
yading@10
|
263 }
|
yading@10
|
264 }
|
yading@10
|
265 /* cos(pi*i/18) */
|
yading@10
|
266 #define C1 FIXHR(0.98480775301220805936/2)
|
yading@10
|
267 #define C2 FIXHR(0.93969262078590838405/2)
|
yading@10
|
268 #define C3 FIXHR(0.86602540378443864676/2)
|
yading@10
|
269 #define C4 FIXHR(0.76604444311897803520/2)
|
yading@10
|
270 #define C5 FIXHR(0.64278760968653932632/2)
|
yading@10
|
271 #define C6 FIXHR(0.5/2)
|
yading@10
|
272 #define C7 FIXHR(0.34202014332566873304/2)
|
yading@10
|
273 #define C8 FIXHR(0.17364817766693034885/2)
|
yading@10
|
274
|
yading@10
|
275 /* 0.5 / cos(pi*(2*i+1)/36) */
|
yading@10
|
276 static const INTFLOAT icos36[9] = {
|
yading@10
|
277 FIXR(0.50190991877167369479),
|
yading@10
|
278 FIXR(0.51763809020504152469), //0
|
yading@10
|
279 FIXR(0.55168895948124587824),
|
yading@10
|
280 FIXR(0.61038729438072803416),
|
yading@10
|
281 FIXR(0.70710678118654752439), //1
|
yading@10
|
282 FIXR(0.87172339781054900991),
|
yading@10
|
283 FIXR(1.18310079157624925896),
|
yading@10
|
284 FIXR(1.93185165257813657349), //2
|
yading@10
|
285 FIXR(5.73685662283492756461),
|
yading@10
|
286 };
|
yading@10
|
287
|
yading@10
|
288 /* 0.5 / cos(pi*(2*i+1)/36) */
|
yading@10
|
289 static const INTFLOAT icos36h[9] = {
|
yading@10
|
290 FIXHR(0.50190991877167369479/2),
|
yading@10
|
291 FIXHR(0.51763809020504152469/2), //0
|
yading@10
|
292 FIXHR(0.55168895948124587824/2),
|
yading@10
|
293 FIXHR(0.61038729438072803416/2),
|
yading@10
|
294 FIXHR(0.70710678118654752439/2), //1
|
yading@10
|
295 FIXHR(0.87172339781054900991/2),
|
yading@10
|
296 FIXHR(1.18310079157624925896/4),
|
yading@10
|
297 FIXHR(1.93185165257813657349/4), //2
|
yading@10
|
298 // FIXHR(5.73685662283492756461),
|
yading@10
|
299 };
|
yading@10
|
300
|
yading@10
|
301 /* using Lee like decomposition followed by hand coded 9 points DCT */
|
yading@10
|
302 static void imdct36(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in, INTFLOAT *win)
|
yading@10
|
303 {
|
yading@10
|
304 int i, j;
|
yading@10
|
305 INTFLOAT t0, t1, t2, t3, s0, s1, s2, s3;
|
yading@10
|
306 INTFLOAT tmp[18], *tmp1, *in1;
|
yading@10
|
307
|
yading@10
|
308 for (i = 17; i >= 1; i--)
|
yading@10
|
309 in[i] += in[i-1];
|
yading@10
|
310 for (i = 17; i >= 3; i -= 2)
|
yading@10
|
311 in[i] += in[i-2];
|
yading@10
|
312
|
yading@10
|
313 for (j = 0; j < 2; j++) {
|
yading@10
|
314 tmp1 = tmp + j;
|
yading@10
|
315 in1 = in + j;
|
yading@10
|
316
|
yading@10
|
317 t2 = in1[2*4] + in1[2*8] - in1[2*2];
|
yading@10
|
318
|
yading@10
|
319 t3 = in1[2*0] + SHR(in1[2*6],1);
|
yading@10
|
320 t1 = in1[2*0] - in1[2*6];
|
yading@10
|
321 tmp1[ 6] = t1 - SHR(t2,1);
|
yading@10
|
322 tmp1[16] = t1 + t2;
|
yading@10
|
323
|
yading@10
|
324 t0 = MULH3(in1[2*2] + in1[2*4] , C2, 2);
|
yading@10
|
325 t1 = MULH3(in1[2*4] - in1[2*8] , -2*C8, 1);
|
yading@10
|
326 t2 = MULH3(in1[2*2] + in1[2*8] , -C4, 2);
|
yading@10
|
327
|
yading@10
|
328 tmp1[10] = t3 - t0 - t2;
|
yading@10
|
329 tmp1[ 2] = t3 + t0 + t1;
|
yading@10
|
330 tmp1[14] = t3 + t2 - t1;
|
yading@10
|
331
|
yading@10
|
332 tmp1[ 4] = MULH3(in1[2*5] + in1[2*7] - in1[2*1], -C3, 2);
|
yading@10
|
333 t2 = MULH3(in1[2*1] + in1[2*5], C1, 2);
|
yading@10
|
334 t3 = MULH3(in1[2*5] - in1[2*7], -2*C7, 1);
|
yading@10
|
335 t0 = MULH3(in1[2*3], C3, 2);
|
yading@10
|
336
|
yading@10
|
337 t1 = MULH3(in1[2*1] + in1[2*7], -C5, 2);
|
yading@10
|
338
|
yading@10
|
339 tmp1[ 0] = t2 + t3 + t0;
|
yading@10
|
340 tmp1[12] = t2 + t1 - t0;
|
yading@10
|
341 tmp1[ 8] = t3 - t1 - t0;
|
yading@10
|
342 }
|
yading@10
|
343
|
yading@10
|
344 i = 0;
|
yading@10
|
345 for (j = 0; j < 4; j++) {
|
yading@10
|
346 t0 = tmp[i];
|
yading@10
|
347 t1 = tmp[i + 2];
|
yading@10
|
348 s0 = t1 + t0;
|
yading@10
|
349 s2 = t1 - t0;
|
yading@10
|
350
|
yading@10
|
351 t2 = tmp[i + 1];
|
yading@10
|
352 t3 = tmp[i + 3];
|
yading@10
|
353 s1 = MULH3(t3 + t2, icos36h[ j], 2);
|
yading@10
|
354 s3 = MULLx(t3 - t2, icos36 [8 - j], FRAC_BITS);
|
yading@10
|
355
|
yading@10
|
356 t0 = s0 + s1;
|
yading@10
|
357 t1 = s0 - s1;
|
yading@10
|
358 out[(9 + j) * SBLIMIT] = MULH3(t1, win[ 9 + j], 1) + buf[4*(9 + j)];
|
yading@10
|
359 out[(8 - j) * SBLIMIT] = MULH3(t1, win[ 8 - j], 1) + buf[4*(8 - j)];
|
yading@10
|
360 buf[4 * ( 9 + j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + j], 1);
|
yading@10
|
361 buf[4 * ( 8 - j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 8 - j], 1);
|
yading@10
|
362
|
yading@10
|
363 t0 = s2 + s3;
|
yading@10
|
364 t1 = s2 - s3;
|
yading@10
|
365 out[(9 + 8 - j) * SBLIMIT] = MULH3(t1, win[ 9 + 8 - j], 1) + buf[4*(9 + 8 - j)];
|
yading@10
|
366 out[ j * SBLIMIT] = MULH3(t1, win[ j], 1) + buf[4*( j)];
|
yading@10
|
367 buf[4 * ( 9 + 8 - j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + 8 - j], 1);
|
yading@10
|
368 buf[4 * ( j )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + j], 1);
|
yading@10
|
369 i += 4;
|
yading@10
|
370 }
|
yading@10
|
371
|
yading@10
|
372 s0 = tmp[16];
|
yading@10
|
373 s1 = MULH3(tmp[17], icos36h[4], 2);
|
yading@10
|
374 t0 = s0 + s1;
|
yading@10
|
375 t1 = s0 - s1;
|
yading@10
|
376 out[(9 + 4) * SBLIMIT] = MULH3(t1, win[ 9 + 4], 1) + buf[4*(9 + 4)];
|
yading@10
|
377 out[(8 - 4) * SBLIMIT] = MULH3(t1, win[ 8 - 4], 1) + buf[4*(8 - 4)];
|
yading@10
|
378 buf[4 * ( 9 + 4 )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 9 + 4], 1);
|
yading@10
|
379 buf[4 * ( 8 - 4 )] = MULH3(t0, win[MDCT_BUF_SIZE/2 + 8 - 4], 1);
|
yading@10
|
380 }
|
yading@10
|
381
|
yading@10
|
382 void RENAME(ff_imdct36_blocks)(INTFLOAT *out, INTFLOAT *buf, INTFLOAT *in,
|
yading@10
|
383 int count, int switch_point, int block_type)
|
yading@10
|
384 {
|
yading@10
|
385 int j;
|
yading@10
|
386 for (j=0 ; j < count; j++) {
|
yading@10
|
387 /* apply window & overlap with previous buffer */
|
yading@10
|
388
|
yading@10
|
389 /* select window */
|
yading@10
|
390 int win_idx = (switch_point && j < 2) ? 0 : block_type;
|
yading@10
|
391 INTFLOAT *win = RENAME(ff_mdct_win)[win_idx + (4 & -(j & 1))];
|
yading@10
|
392
|
yading@10
|
393 imdct36(out, buf, in, win);
|
yading@10
|
394
|
yading@10
|
395 in += 18;
|
yading@10
|
396 buf += ((j&3) != 3 ? 1 : (72-3));
|
yading@10
|
397 out++;
|
yading@10
|
398 }
|
yading@10
|
399 }
|
yading@10
|
400
|