]> 4ch.mooo.com Git - 16.git/blob - src/lib/doslib/ext/faad/sbr_qmf.c
wwww
[16.git] / src / lib / doslib / ext / faad / sbr_qmf.c
1 /*
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3 ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4 **  
5 ** This program is free software; you can redistribute it and/or modify
6 ** it under the terms of the GNU General Public License as published by
7 ** the Free Software Foundation; either version 2 of the License, or
8 ** (at your option) any later version.
9 ** 
10 ** This program is distributed in the hope that it will be useful,
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ** GNU General Public License for more details.
14 ** 
15 ** You should have received a copy of the GNU General Public License
16 ** along with this program; if not, write to the Free Software 
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 **
19 ** Any non-GPL usage of this software or parts of this software is strictly
20 ** forbidden.
21 **
22 ** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24 **
25 ** Commercial non-GPL licensing of this software is possible.
26 ** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27 **
28 ** $Id: sbr_qmf.c,v 1.32 2007/11/01 12:33:36 menno Exp $
29 **/
30
31 #include "common.h"
32 #include "structs.h"
33
34 #ifdef SBR_DEC
35
36
37 #include <stdlib.h>
38 #include <string.h>
39 #include "sbr_dct.h"
40 #include "sbr_qmf.h"
41 #include "sbr_qmfc.h"
42 #include "sbr_synt.h"
43
44 qmfa_info *qmfa_init(uint8_t channels)
45 {
46     qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info));
47
48         /* x is implemented as double ringbuffer */
49     qmfa->x = (real_t*)faad_malloc(2 * channels * 10 * sizeof(real_t));
50     memset(qmfa->x, 0, 2 * channels * 10 * sizeof(real_t));
51
52         /* ringbuffer index */
53         qmfa->x_index = 0;
54
55     qmfa->channels = channels;
56
57     return qmfa;
58 }
59
60 void qmfa_end(qmfa_info *qmfa)
61 {
62     if (qmfa)
63     {
64         if (qmfa->x) faad_free(qmfa->x);
65         faad_free(qmfa);
66     }
67 }
68
69 void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input,
70                          qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx)
71 {
72     ALIGN real_t u[64];
73 #ifndef SBR_LOW_POWER
74     ALIGN real_t in_real[32], in_imag[32], out_real[32], out_imag[32];
75 #else
76     ALIGN real_t y[32];
77 #endif
78     uint32_t in = 0;
79     uint8_t l;
80
81     /* qmf subsample l */
82     for (l = 0; l < sbr->numTimeSlotsRate; l++)
83     {
84         int16_t n;
85
86         /* shift input buffer x */
87                 /* input buffer is not shifted anymore, x is implemented as double ringbuffer */
88         //memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t));
89
90         /* add new samples to input buffer x */
91         for (n = 32 - 1; n >= 0; n--)
92         {
93 #ifdef FIXED_POINT
94             qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = (input[in++]) >> 4;
95 #else
96             qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = input[in++];
97 #endif
98         }
99
100         /* window and summation to create array u */
101         for (n = 0; n < 64; n++)
102         {
103             u[n] = MUL_F(qmfa->x[qmfa->x_index + n], qmf_c[2*n]) +
104                 MUL_F(qmfa->x[qmfa->x_index + n + 64], qmf_c[2*(n + 64)]) +
105                 MUL_F(qmfa->x[qmfa->x_index + n + 128], qmf_c[2*(n + 128)]) +
106                 MUL_F(qmfa->x[qmfa->x_index + n + 192], qmf_c[2*(n + 192)]) +
107                 MUL_F(qmfa->x[qmfa->x_index + n + 256], qmf_c[2*(n + 256)]);
108         }
109
110                 /* update ringbuffer index */
111                 qmfa->x_index -= 32;
112                 if (qmfa->x_index < 0)
113                         qmfa->x_index = (320-32);
114
115         /* calculate 32 subband samples by introducing X */
116 #ifdef SBR_LOW_POWER
117         y[0] = u[48];
118         for (n = 1; n < 16; n++)
119             y[n] = u[n+48] + u[48-n];
120         for (n = 16; n < 32; n++)
121             y[n] = -u[n-16] + u[48-n];
122
123         DCT3_32_unscaled(u, y);
124
125         for (n = 0; n < 32; n++)
126         {
127             if (n < kx)
128             {
129 #ifdef FIXED_POINT
130                 QMF_RE(X[l + offset][n]) = u[n] /*<< 1*/;
131 #else
132                 QMF_RE(X[l + offset][n]) = 2. * u[n];
133 #endif
134             } else {
135                 QMF_RE(X[l + offset][n]) = 0;
136             }
137         }
138 #else
139
140         // Reordering of data moved from DCT_IV to here
141         in_imag[31] = u[1];
142         in_real[0] = u[0];
143         for (n = 1; n < 31; n++)
144         {
145             in_imag[31 - n] = u[n+1];
146             in_real[n] = -u[64-n];
147         }
148         in_imag[0] = u[32];
149         in_real[31] = -u[33];
150
151         // dct4_kernel is DCT_IV without reordering which is done before and after FFT
152         dct4_kernel(in_real, in_imag, out_real, out_imag);
153
154         // Reordering of data moved from DCT_IV to here
155         for (n = 0; n < 16; n++) {
156             if (2*n+1 < kx) {
157 #ifdef FIXED_POINT
158                 QMF_RE(X[l + offset][2*n])   = out_real[n];
159                 QMF_IM(X[l + offset][2*n])   = out_imag[n];
160                 QMF_RE(X[l + offset][2*n+1]) = -out_imag[31-n];
161                 QMF_IM(X[l + offset][2*n+1]) = -out_real[31-n];
162 #else
163                 QMF_RE(X[l + offset][2*n])   = 2. * out_real[n];
164                 QMF_IM(X[l + offset][2*n])   = 2. * out_imag[n];
165                 QMF_RE(X[l + offset][2*n+1]) = -2. * out_imag[31-n];
166                 QMF_IM(X[l + offset][2*n+1]) = -2. * out_real[31-n];
167 #endif
168             } else {
169                 if (2*n < kx) {
170 #ifdef FIXED_POINT
171                     QMF_RE(X[l + offset][2*n])   = out_real[n];
172                     QMF_IM(X[l + offset][2*n])   = out_imag[n];
173 #else
174                     QMF_RE(X[l + offset][2*n])   = 2. * out_real[n];
175                     QMF_IM(X[l + offset][2*n])   = 2. * out_imag[n];
176 #endif
177                 }
178                 else {
179                     QMF_RE(X[l + offset][2*n]) = 0;
180                     QMF_IM(X[l + offset][2*n]) = 0;
181                 }
182                 QMF_RE(X[l + offset][2*n+1]) = 0;
183                 QMF_IM(X[l + offset][2*n+1]) = 0;
184             }
185         }
186 #endif
187     }
188 }
189
190 static const complex_t qmf32_pre_twiddle[] =
191 {
192     { FRAC_CONST(0.999924701839145), FRAC_CONST(-0.012271538285720) },
193     { FRAC_CONST(0.999322384588350), FRAC_CONST(-0.036807222941359) },
194     { FRAC_CONST(0.998118112900149), FRAC_CONST(-0.061320736302209) },
195     { FRAC_CONST(0.996312612182778), FRAC_CONST(-0.085797312344440) },
196     { FRAC_CONST(0.993906970002356), FRAC_CONST(-0.110222207293883) },
197     { FRAC_CONST(0.990902635427780), FRAC_CONST(-0.134580708507126) },
198     { FRAC_CONST(0.987301418157858), FRAC_CONST(-0.158858143333861) },
199     { FRAC_CONST(0.983105487431216), FRAC_CONST(-0.183039887955141) },
200     { FRAC_CONST(0.978317370719628), FRAC_CONST(-0.207111376192219) },
201     { FRAC_CONST(0.972939952205560), FRAC_CONST(-0.231058108280671) },
202     { FRAC_CONST(0.966976471044852), FRAC_CONST(-0.254865659604515) },
203     { FRAC_CONST(0.960430519415566), FRAC_CONST(-0.278519689385053) },
204     { FRAC_CONST(0.953306040354194), FRAC_CONST(-0.302005949319228) },
205     { FRAC_CONST(0.945607325380521), FRAC_CONST(-0.325310292162263) },
206     { FRAC_CONST(0.937339011912575), FRAC_CONST(-0.348418680249435) },
207     { FRAC_CONST(0.928506080473216), FRAC_CONST(-0.371317193951838) },
208     { FRAC_CONST(0.919113851690058), FRAC_CONST(-0.393992040061048) },
209     { FRAC_CONST(0.909167983090522), FRAC_CONST(-0.416429560097637) },
210     { FRAC_CONST(0.898674465693954), FRAC_CONST(-0.438616238538528) },
211     { FRAC_CONST(0.887639620402854), FRAC_CONST(-0.460538710958240) },
212     { FRAC_CONST(0.876070094195407), FRAC_CONST(-0.482183772079123) },
213     { FRAC_CONST(0.863972856121587), FRAC_CONST(-0.503538383725718) },
214     { FRAC_CONST(0.851355193105265), FRAC_CONST(-0.524589682678469) },
215     { FRAC_CONST(0.838224705554838), FRAC_CONST(-0.545324988422046) },
216     { FRAC_CONST(0.824589302785025), FRAC_CONST(-0.565731810783613) },
217     { FRAC_CONST(0.810457198252595), FRAC_CONST(-0.585797857456439) },
218     { FRAC_CONST(0.795836904608884), FRAC_CONST(-0.605511041404326) },
219     { FRAC_CONST(0.780737228572094), FRAC_CONST(-0.624859488142386) },
220     { FRAC_CONST(0.765167265622459), FRAC_CONST(-0.643831542889791) },
221     { FRAC_CONST(0.749136394523459), FRAC_CONST(-0.662415777590172) },
222     { FRAC_CONST(0.732654271672413), FRAC_CONST(-0.680600997795453) },
223     { FRAC_CONST(0.715730825283819), FRAC_CONST(-0.698376249408973) }
224 };
225
226 qmfs_info *qmfs_init(uint8_t channels)
227 {
228     qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info));
229
230         /* v is a double ringbuffer */
231     qmfs->v = (real_t*)faad_malloc(2 * channels * 20 * sizeof(real_t));
232     memset(qmfs->v, 0, 2 * channels * 20 * sizeof(real_t));
233
234     qmfs->v_index = 0;
235
236     qmfs->channels = channels;
237
238     return qmfs;
239 }
240
241 void qmfs_end(qmfs_info *qmfs)
242 {
243     if (qmfs)
244     {
245         if (qmfs->v) faad_free(qmfs->v);
246         faad_free(qmfs);
247     }
248 }
249
250 #ifdef SBR_LOW_POWER
251
252 void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
253                           real_t *output)
254 {
255     ALIGN real_t x[16];
256     ALIGN real_t y[16];
257     int32_t n, k, out = 0;
258     uint8_t l;
259
260     /* qmf subsample l */
261     for (l = 0; l < sbr->numTimeSlotsRate; l++)
262     {
263         /* shift buffers */
264         /* we are not shifting v, it is a double ringbuffer */
265         //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t));
266
267         /* calculate 64 samples */
268         for (k = 0; k < 16; k++)
269         {
270 #ifdef FIXED_POINT
271             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k]));
272             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k]));
273 #else
274             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])) / 32.0;
275             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])) / 32.0;
276 #endif
277         }
278
279         /* even n samples */
280         DCT2_16_unscaled(x, x);
281         /* odd n samples */
282         DCT4_16(y, y);
283
284         for (n = 8; n < 24; n++)
285         {
286             qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 640 + n*2] = x[n-8];
287             qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 640 + n*2+1] = y[n-8];
288         }
289         for (n = 0; n < 16; n++)
290         {
291             qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = qmfs->v[qmfs->v_index + 32-n];
292         }
293         qmfs->v[qmfs->v_index + 48] = qmfs->v[qmfs->v_index + 640 + 48] = 0;
294         for (n = 1; n < 16; n++)
295         {
296             qmfs->v[qmfs->v_index + 48+n] = qmfs->v[qmfs->v_index + 640 + 48+n] = -qmfs->v[qmfs->v_index + 48-n];
297         }
298
299         /* calculate 32 output samples and window */
300         for (k = 0; k < 32; k++)
301         {
302             output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) +
303                 MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) +
304                 MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) +
305                 MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) +
306                 MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) +
307                 MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) +
308                 MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) +
309                 MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) +
310                 MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) +
311                 MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]);
312         }
313
314         /* update the ringbuffer index */
315         qmfs->v_index -= 64;
316         if (qmfs->v_index < 0)
317             qmfs->v_index = (640-64);
318     }
319 }
320
321 void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
322                           real_t *output)
323 {
324     ALIGN real_t x[64];
325     ALIGN real_t y[64];
326     int32_t n, k, out = 0;
327     uint8_t l;
328
329
330     /* qmf subsample l */
331     for (l = 0; l < sbr->numTimeSlotsRate; l++)
332     {
333         /* shift buffers */
334         /* we are not shifting v, it is a double ringbuffer */
335         //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t));
336
337         /* calculate 128 samples */
338         for (k = 0; k < 32; k++)
339         {
340 #ifdef FIXED_POINT
341             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k]));
342             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k]));
343 #else
344             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])) / 32.0;
345             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])) / 32.0;
346 #endif
347         }
348
349         /* even n samples */
350         DCT2_32_unscaled(x, x);
351         /* odd n samples */
352         DCT4_32(y, y);
353
354         for (n = 16; n < 48; n++)
355         {
356             qmfs->v[qmfs->v_index + n*2]   = qmfs->v[qmfs->v_index + 1280 + n*2]   = x[n-16];
357             qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 1280 + n*2+1] = y[n-16];
358         }
359         for (n = 0; n < 32; n++)
360         {
361             qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 1280 + n] = qmfs->v[qmfs->v_index + 64-n];
362         }
363         qmfs->v[qmfs->v_index + 96] = qmfs->v[qmfs->v_index + 1280 + 96] = 0;
364         for (n = 1; n < 32; n++)
365         {
366             qmfs->v[qmfs->v_index + 96+n] = qmfs->v[qmfs->v_index + 1280 + 96+n] = -qmfs->v[qmfs->v_index + 96-n];
367         }
368
369         /* calculate 64 output samples and window */
370         for (k = 0; k < 64; k++)
371         {
372             output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[k]) +
373                 MUL_F(qmfs->v[qmfs->v_index + 192 + k], qmf_c[64 + k]) +
374                 MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[128 + k]) +
375                 MUL_F(qmfs->v[qmfs->v_index + 256 + 192 + k], qmf_c[128 + 64 + k]) +
376                 MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[256 + k]) +
377                 MUL_F(qmfs->v[qmfs->v_index + 512 + 192 + k], qmf_c[256 + 64 + k]) +
378                 MUL_F(qmfs->v[qmfs->v_index + 768 + k], qmf_c[384 + k]) +
379                 MUL_F(qmfs->v[qmfs->v_index + 768 + 192 + k], qmf_c[384 + 64 + k]) +
380                 MUL_F(qmfs->v[qmfs->v_index + 1024 + k], qmf_c[512 + k]) +
381                 MUL_F(qmfs->v[qmfs->v_index + 1024 + 192 + k], qmf_c[512 + 64 + k]);
382         }
383
384         /* update the ringbuffer index */
385         qmfs->v_index -= 128;
386         if (qmfs->v_index < 0)
387             qmfs->v_index = (1280-128);
388     }
389 }
390 #else
391 void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
392                           real_t *output)
393 {
394     ALIGN real_t x1[32], x2[32];
395 #ifndef FIXED_POINT
396     real_t scale = 1.f/64.f;
397 #endif
398     int32_t n, k, out = 0;
399     uint8_t l;
400
401
402     /* qmf subsample l */
403     for (l = 0; l < sbr->numTimeSlotsRate; l++)
404     {
405         /* shift buffer v */
406         /* buffer is not shifted, we are using a ringbuffer */
407         //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t));
408
409         /* calculate 64 samples */
410         /* complex pre-twiddle */
411         for (k = 0; k < 32; k++)
412         {
413             x1[k] = MUL_F(QMF_RE(X[l][k]), RE(qmf32_pre_twiddle[k])) - MUL_F(QMF_IM(X[l][k]), IM(qmf32_pre_twiddle[k]));
414             x2[k] = MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k]));
415
416 #ifndef FIXED_POINT
417             x1[k] *= scale;
418             x2[k] *= scale;
419 #else
420             x1[k] >>= 1;
421             x2[k] >>= 1;
422 #endif
423         }
424
425         /* transform */
426         DCT4_32(x1, x1);
427         DST4_32(x2, x2);
428
429         for (n = 0; n < 32; n++)
430         {
431             qmfs->v[qmfs->v_index + n]      = qmfs->v[qmfs->v_index + 640 + n]      = -x1[n] + x2[n];
432             qmfs->v[qmfs->v_index + 63 - n] = qmfs->v[qmfs->v_index + 640 + 63 - n] =  x1[n] + x2[n];
433         }
434
435         /* calculate 32 output samples and window */
436         for (k = 0; k < 32; k++)
437         {
438             output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) +
439                 MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) +
440                 MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) +
441                 MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) +
442                 MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) +
443                 MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) +
444                 MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) +
445                 MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) +
446                 MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) +
447                 MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]);
448         }
449
450         /* update ringbuffer index */
451         qmfs->v_index -= 64;
452         if (qmfs->v_index < 0)
453             qmfs->v_index = (640 - 64);
454     }
455 }
456
457 void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
458                           real_t *output)
459 {
460 //    ALIGN real_t x1[64], x2[64];
461 #ifndef SBR_LOW_POWER
462     ALIGN real_t in_real1[32], in_imag1[32], out_real1[32], out_imag1[32];
463     ALIGN real_t in_real2[32], in_imag2[32], out_real2[32], out_imag2[32];
464 #endif
465     qmf_t * pX;
466     real_t * pring_buffer_1, * pring_buffer_3;
467 //    real_t * ptemp_1, * ptemp_2;
468 #ifdef PREFER_POINTERS
469     // These pointers are used if target platform has autoinc address generators
470     real_t * pring_buffer_2, * pring_buffer_4;
471     real_t * pring_buffer_5, * pring_buffer_6;
472     real_t * pring_buffer_7, * pring_buffer_8;
473     real_t * pring_buffer_9, * pring_buffer_10;
474     const real_t * pqmf_c_1, * pqmf_c_2, * pqmf_c_3, * pqmf_c_4;
475     const real_t * pqmf_c_5, * pqmf_c_6, * pqmf_c_7, * pqmf_c_8;
476     const real_t * pqmf_c_9, * pqmf_c_10;
477 #endif // #ifdef PREFER_POINTERS
478 #ifndef FIXED_POINT
479     real_t scale = 1.f/64.f;
480 #endif
481     int32_t n, k, out = 0;
482     uint8_t l;
483
484
485     /* qmf subsample l */
486     for (l = 0; l < sbr->numTimeSlotsRate; l++)
487     {
488         /* shift buffer v */
489                 /* buffer is not shifted, we use double ringbuffer */
490                 //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t));
491
492         /* calculate 128 samples */
493 #ifndef FIXED_POINT
494
495         pX = X[l];
496
497         in_imag1[31] = scale*QMF_RE(pX[1]);
498         in_real1[0]  = scale*QMF_RE(pX[0]);
499         in_imag2[31] = scale*QMF_IM(pX[63-1]);
500         in_real2[0]  = scale*QMF_IM(pX[63-0]);
501         for (k = 1; k < 31; k++)
502         {
503             in_imag1[31 - k] = scale*QMF_RE(pX[2*k + 1]);
504             in_real1[     k] = scale*QMF_RE(pX[2*k    ]);
505             in_imag2[31 - k] = scale*QMF_IM(pX[63 - (2*k + 1)]);
506             in_real2[     k] = scale*QMF_IM(pX[63 - (2*k    )]);
507         }
508         in_imag1[0]  = scale*QMF_RE(pX[63]);
509         in_real1[31] = scale*QMF_RE(pX[62]);
510         in_imag2[0]  = scale*QMF_IM(pX[63-63]);
511         in_real2[31] = scale*QMF_IM(pX[63-62]);
512
513 #else
514
515         pX = X[l];
516
517         in_imag1[31] = QMF_RE(pX[1]) >> 1;
518         in_real1[0]  = QMF_RE(pX[0]) >> 1;
519         in_imag2[31] = QMF_IM(pX[62]) >> 1;
520         in_real2[0]  = QMF_IM(pX[63]) >> 1;
521         for (k = 1; k < 31; k++)
522         {
523             in_imag1[31 - k] = QMF_RE(pX[2*k + 1]) >> 1;
524             in_real1[     k] = QMF_RE(pX[2*k    ]) >> 1;
525             in_imag2[31 - k] = QMF_IM(pX[63 - (2*k + 1)]) >> 1;
526             in_real2[     k] = QMF_IM(pX[63 - (2*k    )]) >> 1;
527         }
528         in_imag1[0]  = QMF_RE(pX[63]) >> 1;
529         in_real1[31] = QMF_RE(pX[62]) >> 1;
530         in_imag2[0]  = QMF_IM(pX[0]) >> 1;
531         in_real2[31] = QMF_IM(pX[1]) >> 1;
532
533 #endif
534
535
536         // dct4_kernel is DCT_IV without reordering which is done before and after FFT
537         dct4_kernel(in_real1, in_imag1, out_real1, out_imag1);
538         dct4_kernel(in_real2, in_imag2, out_real2, out_imag2);
539
540
541         pring_buffer_1 = qmfs->v + qmfs->v_index;
542         pring_buffer_3 = pring_buffer_1 + 1280;
543 #ifdef PREFER_POINTERS
544         pring_buffer_2 = pring_buffer_1 + 127;
545         pring_buffer_4 = pring_buffer_1 + (1280 + 127);
546 #endif // #ifdef PREFER_POINTERS
547 //        ptemp_1 = x1;
548 //        ptemp_2 = x2;
549 #ifdef PREFER_POINTERS
550         for (n = 0; n < 32; n ++)
551         {
552             //real_t x1 = *ptemp_1++;
553             //real_t x2 = *ptemp_2++;
554             // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer
555             *pring_buffer_1++ = *pring_buffer_3++ = out_real2[n] - out_real1[n];
556             *pring_buffer_2-- = *pring_buffer_4-- = out_real2[n] + out_real1[n];
557             //x1 = *ptemp_1++;
558             //x2 = *ptemp_2++;
559             *pring_buffer_1++ = *pring_buffer_3++ = out_imag2[31-n] + out_imag1[31-n];
560             *pring_buffer_2-- = *pring_buffer_4-- = out_imag2[31-n] - out_imag1[31-n];
561         }
562 #else // #ifdef PREFER_POINTERS
563
564         for (n = 0; n < 32; n++)
565         {
566             // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer
567             pring_buffer_1[2*n]         = pring_buffer_3[2*n]         = out_real2[n] - out_real1[n];
568             pring_buffer_1[127-2*n]     = pring_buffer_3[127-2*n]     = out_real2[n] + out_real1[n];
569             pring_buffer_1[2*n+1]       = pring_buffer_3[2*n+1]       = out_imag2[31-n] + out_imag1[31-n];
570             pring_buffer_1[127-(2*n+1)] = pring_buffer_3[127-(2*n+1)] = out_imag2[31-n] - out_imag1[31-n];
571         }
572
573 #endif // #ifdef PREFER_POINTERS
574
575         pring_buffer_1 = qmfs->v + qmfs->v_index;
576 #ifdef PREFER_POINTERS
577         pring_buffer_2 = pring_buffer_1 + 192;
578         pring_buffer_3 = pring_buffer_1 + 256;
579         pring_buffer_4 = pring_buffer_1 + (256 + 192);
580         pring_buffer_5 = pring_buffer_1 + 512;
581         pring_buffer_6 = pring_buffer_1 + (512 + 192);
582         pring_buffer_7 = pring_buffer_1 + 768;
583         pring_buffer_8 = pring_buffer_1 + (768 + 192);
584         pring_buffer_9 = pring_buffer_1 + 1024;
585         pring_buffer_10 = pring_buffer_1 + (1024 + 192);
586         pqmf_c_1 = qmf_c;
587         pqmf_c_2 = qmf_c + 64;
588         pqmf_c_3 = qmf_c + 128;
589         pqmf_c_4 = qmf_c + 192;
590         pqmf_c_5 = qmf_c + 256;
591         pqmf_c_6 = qmf_c + 320;
592         pqmf_c_7 = qmf_c + 384;
593         pqmf_c_8 = qmf_c + 448;
594         pqmf_c_9 = qmf_c + 512;
595         pqmf_c_10 = qmf_c + 576;
596 #endif // #ifdef PREFER_POINTERS
597
598         /* calculate 64 output samples and window */
599         for (k = 0; k < 64; k++)
600         {
601 #ifdef PREFER_POINTERS
602             output[out++] =
603                 MUL_F(*pring_buffer_1++,  *pqmf_c_1++) +
604                 MUL_F(*pring_buffer_2++,  *pqmf_c_2++) +
605                 MUL_F(*pring_buffer_3++,  *pqmf_c_3++) +
606                 MUL_F(*pring_buffer_4++,  *pqmf_c_4++) +
607                 MUL_F(*pring_buffer_5++,  *pqmf_c_5++) +
608                 MUL_F(*pring_buffer_6++,  *pqmf_c_6++) +
609                 MUL_F(*pring_buffer_7++,  *pqmf_c_7++) +
610                 MUL_F(*pring_buffer_8++,  *pqmf_c_8++) +
611                 MUL_F(*pring_buffer_9++,  *pqmf_c_9++) +
612                 MUL_F(*pring_buffer_10++, *pqmf_c_10++);
613 #else // #ifdef PREFER_POINTERS
614             output[out++] =
615                 MUL_F(pring_buffer_1[k+0],          qmf_c[k+0])   +
616                 MUL_F(pring_buffer_1[k+192],        qmf_c[k+64])  +
617                 MUL_F(pring_buffer_1[k+256],        qmf_c[k+128]) +
618                 MUL_F(pring_buffer_1[k+(256+192)],  qmf_c[k+192]) +
619                 MUL_F(pring_buffer_1[k+512],        qmf_c[k+256]) +
620                 MUL_F(pring_buffer_1[k+(512+192)],  qmf_c[k+320]) +
621                 MUL_F(pring_buffer_1[k+768],        qmf_c[k+384]) +
622                 MUL_F(pring_buffer_1[k+(768+192)],  qmf_c[k+448]) +
623                 MUL_F(pring_buffer_1[k+1024],       qmf_c[k+512]) +
624                 MUL_F(pring_buffer_1[k+(1024+192)], qmf_c[k+576]);
625 #endif // #ifdef PREFER_POINTERS
626         }
627
628         /* update ringbuffer index */
629         qmfs->v_index -= 128;
630         if (qmfs->v_index < 0)
631             qmfs->v_index = (1280 - 128);
632     }
633 }
634 #endif
635
636 #endif