Coverage Report

Created: 2025-08-28 07:12

/src/vorbis/lib/mdct.c
Line
Count
Source (jump to first uncovered line)
1
/********************************************************************
2
 *                                                                  *
3
 * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5
 * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6
 * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7
 *                                                                  *
8
 * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009             *
9
 * by the Xiph.Org Foundation https://xiph.org/                     *
10
 *                                                                  *
11
 ********************************************************************
12
13
 function: normalized modified discrete cosine transform
14
           power of two length transform only [64 <= n ]
15
16
 Original algorithm adapted long ago from _The use of multirate filter
17
 banks for coding of high quality digital audio_, by T. Sporer,
18
 K. Brandenburg and B. Edler, collection of the European Signal
19
 Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp
20
 211-214
21
22
 The below code implements an algorithm that no longer looks much like
23
 that presented in the paper, but the basic structure remains if you
24
 dig deep enough to see it.
25
26
 This module DOES NOT INCLUDE code to generate/apply the window
27
 function.  Everybody has their own weird favorite including me... I
28
 happen to like the properties of y=sin(.5PI*sin^2(x)), but others may
29
 vehemently disagree.
30
31
 ********************************************************************/
32
33
/* this can also be run as an integer transform by uncommenting a
34
   define in mdct.h; the integerization is a first pass and although
35
   it's likely stable for Vorbis, the dynamic range is constrained and
36
   roundoff isn't done (so it's noisy).  Consider it functional, but
37
   only a starting point.  There's no point on a machine with an FPU */
38
39
#include <stdio.h>
40
#include <stdlib.h>
41
#include <string.h>
42
#include <math.h>
43
#include "vorbis/codec.h"
44
#include "mdct.h"
45
#include "os.h"
46
#include "misc.h"
47
48
/* build lookups for trig functions; also pre-figure scaling and
49
   some window function algebra. */
50
51
1.46k
void mdct_init(mdct_lookup *lookup,int n){
52
1.46k
  int   *bitrev=_ogg_malloc(sizeof(*bitrev)*(n/4));
53
1.46k
  DATA_TYPE *T=_ogg_malloc(sizeof(*T)*(n+n/4));
54
55
1.46k
  int i;
56
1.46k
  int n2=n>>1;
57
1.46k
  int log2n=lookup->log2n=rint(log((float)n)/log(2.f));
58
1.46k
  lookup->n=n;
59
1.46k
  lookup->trig=T;
60
1.46k
  lookup->bitrev=bitrev;
61
62
/* trig lookups... */
63
64
1.62M
  for(i=0;i<n/4;i++){
65
1.62M
    T[i*2]=FLOAT_CONV(cos((M_PI/n)*(4*i)));
66
1.62M
    T[i*2+1]=FLOAT_CONV(-sin((M_PI/n)*(4*i)));
67
1.62M
    T[n2+i*2]=FLOAT_CONV(cos((M_PI/(2*n))*(2*i+1)));
68
1.62M
    T[n2+i*2+1]=FLOAT_CONV(sin((M_PI/(2*n))*(2*i+1)));
69
1.62M
  }
70
812k
  for(i=0;i<n/8;i++){
71
811k
    T[n+i*2]=FLOAT_CONV(cos((M_PI/n)*(4*i+2))*.5);
72
811k
    T[n+i*2+1]=FLOAT_CONV(-sin((M_PI/n)*(4*i+2))*.5);
73
811k
  }
74
75
  /* bitreverse lookup... */
76
77
1.46k
  {
78
1.46k
    int mask=(1<<(log2n-1))-1,i,j;
79
1.46k
    int msb=1<<(log2n-2);
80
812k
    for(i=0;i<n/8;i++){
81
811k
      int acc=0;
82
10.3M
      for(j=0;msb>>j;j++)
83
9.58M
        if((msb>>j)&i)acc|=1<<j;
84
811k
      bitrev[i*2]=((~acc)&mask)-1;
85
811k
      bitrev[i*2+1]=acc;
86
87
811k
    }
88
1.46k
  }
89
1.46k
  lookup->scale=FLOAT_CONV(4.f/n);
90
1.46k
}
91
92
/* 8 point butterfly (in place, 4 register) */
93
45.9M
STIN void mdct_butterfly_8(DATA_TYPE *x){
94
45.9M
  REG_TYPE r0   = x[6] + x[2];
95
45.9M
  REG_TYPE r1   = x[6] - x[2];
96
45.9M
  REG_TYPE r2   = x[4] + x[0];
97
45.9M
  REG_TYPE r3   = x[4] - x[0];
98
99
45.9M
           x[6] = r0   + r2;
100
45.9M
           x[4] = r0   - r2;
101
102
45.9M
           r0   = x[5] - x[1];
103
45.9M
           r2   = x[7] - x[3];
104
45.9M
           x[0] = r1   + r0;
105
45.9M
           x[2] = r1   - r0;
106
107
45.9M
           r0   = x[5] + x[1];
108
45.9M
           r1   = x[7] + x[3];
109
45.9M
           x[3] = r2   + r3;
110
45.9M
           x[1] = r2   - r3;
111
45.9M
           x[7] = r1   + r0;
112
45.9M
           x[5] = r1   - r0;
113
114
45.9M
}
115
116
/* 16 point butterfly (in place, 4 register) */
117
22.9M
STIN void mdct_butterfly_16(DATA_TYPE *x){
118
22.9M
  REG_TYPE r0     = x[1]  - x[9];
119
22.9M
  REG_TYPE r1     = x[0]  - x[8];
120
121
22.9M
           x[8]  += x[0];
122
22.9M
           x[9]  += x[1];
123
22.9M
           x[0]   = MULT_NORM((r0   + r1) * cPI2_8);
124
22.9M
           x[1]   = MULT_NORM((r0   - r1) * cPI2_8);
125
126
22.9M
           r0     = x[3]  - x[11];
127
22.9M
           r1     = x[10] - x[2];
128
22.9M
           x[10] += x[2];
129
22.9M
           x[11] += x[3];
130
22.9M
           x[2]   = r0;
131
22.9M
           x[3]   = r1;
132
133
22.9M
           r0     = x[12] - x[4];
134
22.9M
           r1     = x[13] - x[5];
135
22.9M
           x[12] += x[4];
136
22.9M
           x[13] += x[5];
137
22.9M
           x[4]   = MULT_NORM((r0   - r1) * cPI2_8);
138
22.9M
           x[5]   = MULT_NORM((r0   + r1) * cPI2_8);
139
140
22.9M
           r0     = x[14] - x[6];
141
22.9M
           r1     = x[15] - x[7];
142
22.9M
           x[14] += x[6];
143
22.9M
           x[15] += x[7];
144
22.9M
           x[6]  = r0;
145
22.9M
           x[7]  = r1;
146
147
22.9M
           mdct_butterfly_8(x);
148
22.9M
           mdct_butterfly_8(x+8);
149
22.9M
}
150
151
/* 32 point butterfly (in place, 4 register) */
152
11.4M
STIN void mdct_butterfly_32(DATA_TYPE *x){
153
11.4M
  REG_TYPE r0     = x[30] - x[14];
154
11.4M
  REG_TYPE r1     = x[31] - x[15];
155
156
11.4M
           x[30] +=         x[14];
157
11.4M
           x[31] +=         x[15];
158
11.4M
           x[14]  =         r0;
159
11.4M
           x[15]  =         r1;
160
161
11.4M
           r0     = x[28] - x[12];
162
11.4M
           r1     = x[29] - x[13];
163
11.4M
           x[28] +=         x[12];
164
11.4M
           x[29] +=         x[13];
165
11.4M
           x[12]  = MULT_NORM( r0 * cPI1_8  -  r1 * cPI3_8 );
166
11.4M
           x[13]  = MULT_NORM( r0 * cPI3_8  +  r1 * cPI1_8 );
167
168
11.4M
           r0     = x[26] - x[10];
169
11.4M
           r1     = x[27] - x[11];
170
11.4M
           x[26] +=         x[10];
171
11.4M
           x[27] +=         x[11];
172
11.4M
           x[10]  = MULT_NORM(( r0  - r1 ) * cPI2_8);
173
11.4M
           x[11]  = MULT_NORM(( r0  + r1 ) * cPI2_8);
174
175
11.4M
           r0     = x[24] - x[8];
176
11.4M
           r1     = x[25] - x[9];
177
11.4M
           x[24] += x[8];
178
11.4M
           x[25] += x[9];
179
11.4M
           x[8]   = MULT_NORM( r0 * cPI3_8  -  r1 * cPI1_8 );
180
11.4M
           x[9]   = MULT_NORM( r1 * cPI3_8  +  r0 * cPI1_8 );
181
182
11.4M
           r0     = x[22] - x[6];
183
11.4M
           r1     = x[7]  - x[23];
184
11.4M
           x[22] += x[6];
185
11.4M
           x[23] += x[7];
186
11.4M
           x[6]   = r1;
187
11.4M
           x[7]   = r0;
188
189
11.4M
           r0     = x[4]  - x[20];
190
11.4M
           r1     = x[5]  - x[21];
191
11.4M
           x[20] += x[4];
192
11.4M
           x[21] += x[5];
193
11.4M
           x[4]   = MULT_NORM( r1 * cPI1_8  +  r0 * cPI3_8 );
194
11.4M
           x[5]   = MULT_NORM( r1 * cPI3_8  -  r0 * cPI1_8 );
195
196
11.4M
           r0     = x[2]  - x[18];
197
11.4M
           r1     = x[3]  - x[19];
198
11.4M
           x[18] += x[2];
199
11.4M
           x[19] += x[3];
200
11.4M
           x[2]   = MULT_NORM(( r1  + r0 ) * cPI2_8);
201
11.4M
           x[3]   = MULT_NORM(( r1  - r0 ) * cPI2_8);
202
203
11.4M
           r0     = x[0]  - x[16];
204
11.4M
           r1     = x[1]  - x[17];
205
11.4M
           x[16] += x[0];
206
11.4M
           x[17] += x[1];
207
11.4M
           x[0]   = MULT_NORM( r1 * cPI3_8  +  r0 * cPI1_8 );
208
11.4M
           x[1]   = MULT_NORM( r1 * cPI1_8  -  r0 * cPI3_8 );
209
210
11.4M
           mdct_butterfly_16(x);
211
11.4M
           mdct_butterfly_16(x+16);
212
213
11.4M
}
214
215
/* N point first stage butterfly (in place, 2 register) */
216
STIN void mdct_butterfly_first(DATA_TYPE *T,
217
                                        DATA_TYPE *x,
218
3.63M
                                        int points){
219
220
3.63M
  DATA_TYPE *x1        = x          + points      - 8;
221
3.63M
  DATA_TYPE *x2        = x          + (points>>1) - 8;
222
3.63M
  REG_TYPE   r0;
223
3.63M
  REG_TYPE   r1;
224
225
22.9M
  do{
226
227
22.9M
               r0      = x1[6]      -  x2[6];
228
22.9M
               r1      = x1[7]      -  x2[7];
229
22.9M
               x1[6]  += x2[6];
230
22.9M
               x1[7]  += x2[7];
231
22.9M
               x2[6]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
232
22.9M
               x2[7]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
233
234
22.9M
               r0      = x1[4]      -  x2[4];
235
22.9M
               r1      = x1[5]      -  x2[5];
236
22.9M
               x1[4]  += x2[4];
237
22.9M
               x1[5]  += x2[5];
238
22.9M
               x2[4]   = MULT_NORM(r1 * T[5]  +  r0 * T[4]);
239
22.9M
               x2[5]   = MULT_NORM(r1 * T[4]  -  r0 * T[5]);
240
241
22.9M
               r0      = x1[2]      -  x2[2];
242
22.9M
               r1      = x1[3]      -  x2[3];
243
22.9M
               x1[2]  += x2[2];
244
22.9M
               x1[3]  += x2[3];
245
22.9M
               x2[2]   = MULT_NORM(r1 * T[9]  +  r0 * T[8]);
246
22.9M
               x2[3]   = MULT_NORM(r1 * T[8]  -  r0 * T[9]);
247
248
22.9M
               r0      = x1[0]      -  x2[0];
249
22.9M
               r1      = x1[1]      -  x2[1];
250
22.9M
               x1[0]  += x2[0];
251
22.9M
               x1[1]  += x2[1];
252
22.9M
               x2[0]   = MULT_NORM(r1 * T[13] +  r0 * T[12]);
253
22.9M
               x2[1]   = MULT_NORM(r1 * T[12] -  r0 * T[13]);
254
255
22.9M
    x1-=8;
256
22.9M
    x2-=8;
257
22.9M
    T+=16;
258
259
22.9M
  }while(x2>=x);
260
3.63M
}
261
262
/* N/stage point generic N stage butterfly (in place, 2 register) */
263
STIN void mdct_butterfly_generic(DATA_TYPE *T,
264
                                          DATA_TYPE *x,
265
                                          int points,
266
4.21M
                                          int trigint){
267
268
4.21M
  DATA_TYPE *x1        = x          + points      - 8;
269
4.21M
  DATA_TYPE *x2        = x          + (points>>1) - 8;
270
4.21M
  REG_TYPE   r0;
271
4.21M
  REG_TYPE   r1;
272
273
49.7M
  do{
274
275
49.7M
               r0      = x1[6]      -  x2[6];
276
49.7M
               r1      = x1[7]      -  x2[7];
277
49.7M
               x1[6]  += x2[6];
278
49.7M
               x1[7]  += x2[7];
279
49.7M
               x2[6]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
280
49.7M
               x2[7]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
281
282
49.7M
               T+=trigint;
283
284
49.7M
               r0      = x1[4]      -  x2[4];
285
49.7M
               r1      = x1[5]      -  x2[5];
286
49.7M
               x1[4]  += x2[4];
287
49.7M
               x1[5]  += x2[5];
288
49.7M
               x2[4]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
289
49.7M
               x2[5]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
290
291
49.7M
               T+=trigint;
292
293
49.7M
               r0      = x1[2]      -  x2[2];
294
49.7M
               r1      = x1[3]      -  x2[3];
295
49.7M
               x1[2]  += x2[2];
296
49.7M
               x1[3]  += x2[3];
297
49.7M
               x2[2]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
298
49.7M
               x2[3]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
299
300
49.7M
               T+=trigint;
301
302
49.7M
               r0      = x1[0]      -  x2[0];
303
49.7M
               r1      = x1[1]      -  x2[1];
304
49.7M
               x1[0]  += x2[0];
305
49.7M
               x1[1]  += x2[1];
306
49.7M
               x2[0]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
307
49.7M
               x2[1]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
308
309
49.7M
               T+=trigint;
310
49.7M
    x1-=8;
311
49.7M
    x2-=8;
312
313
49.7M
  }while(x2>=x);
314
4.21M
}
315
316
STIN void mdct_butterflies(mdct_lookup *init,
317
                             DATA_TYPE *x,
318
3.64M
                             int points){
319
320
3.64M
  DATA_TYPE *T=init->trig;
321
3.64M
  int stages=init->log2n-5;
322
3.64M
  int i,j;
323
324
3.64M
  if(--stages>0){
325
3.63M
    mdct_butterfly_first(T,x,points);
326
3.63M
  }
327
328
3.88M
  for(i=1;--stages>0;i++){
329
4.45M
    for(j=0;j<(1<<i);j++)
330
4.21M
      mdct_butterfly_generic(T,x+(points>>i)*j,points>>i,4<<i);
331
237k
  }
332
333
15.1M
  for(j=0;j<points;j+=32)
334
11.4M
    mdct_butterfly_32(x+j);
335
336
3.64M
}
337
338
1.46k
void mdct_clear(mdct_lookup *l){
339
1.46k
  if(l){
340
1.46k
    if(l->trig)_ogg_free(l->trig);
341
1.46k
    if(l->bitrev)_ogg_free(l->bitrev);
342
1.46k
    memset(l,0,sizeof(*l));
343
1.46k
  }
344
1.46k
}
345
346
STIN void mdct_bitreverse(mdct_lookup *init,
347
3.64M
                            DATA_TYPE *x){
348
3.64M
  int        n       = init->n;
349
3.64M
  int       *bit     = init->bitrev;
350
3.64M
  DATA_TYPE *w0      = x;
351
3.64M
  DATA_TYPE *w1      = x = w0+(n>>1);
352
3.64M
  DATA_TYPE *T       = init->trig+n;
353
354
45.9M
  do{
355
45.9M
    DATA_TYPE *x0    = x+bit[0];
356
45.9M
    DATA_TYPE *x1    = x+bit[1];
357
358
45.9M
    REG_TYPE  r0     = x0[1]  - x1[1];
359
45.9M
    REG_TYPE  r1     = x0[0]  + x1[0];
360
45.9M
    REG_TYPE  r2     = MULT_NORM(r1     * T[0]   + r0 * T[1]);
361
45.9M
    REG_TYPE  r3     = MULT_NORM(r1     * T[1]   - r0 * T[0]);
362
363
45.9M
              w1    -= 4;
364
365
45.9M
              r0     = HALVE(x0[1] + x1[1]);
366
45.9M
              r1     = HALVE(x0[0] - x1[0]);
367
368
45.9M
              w0[0]  = r0     + r2;
369
45.9M
              w1[2]  = r0     - r2;
370
45.9M
              w0[1]  = r1     + r3;
371
45.9M
              w1[3]  = r3     - r1;
372
373
45.9M
              x0     = x+bit[2];
374
45.9M
              x1     = x+bit[3];
375
376
45.9M
              r0     = x0[1]  - x1[1];
377
45.9M
              r1     = x0[0]  + x1[0];
378
45.9M
              r2     = MULT_NORM(r1     * T[2]   + r0 * T[3]);
379
45.9M
              r3     = MULT_NORM(r1     * T[3]   - r0 * T[2]);
380
381
45.9M
              r0     = HALVE(x0[1] + x1[1]);
382
45.9M
              r1     = HALVE(x0[0] - x1[0]);
383
384
45.9M
              w0[2]  = r0     + r2;
385
45.9M
              w1[0]  = r0     - r2;
386
45.9M
              w0[3]  = r1     + r3;
387
45.9M
              w1[1]  = r3     - r1;
388
389
45.9M
              T     += 4;
390
45.9M
              bit   += 4;
391
45.9M
              w0    += 4;
392
393
45.9M
  }while(w0<w1);
394
3.64M
}
395
396
3.64M
void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){
397
3.64M
  int n=init->n;
398
3.64M
  int n2=n>>1;
399
3.64M
  int n4=n>>2;
400
401
  /* rotate */
402
403
3.64M
  DATA_TYPE *iX = in+n2-7;
404
3.64M
  DATA_TYPE *oX = out+n2+n4;
405
3.64M
  DATA_TYPE *T  = init->trig+n4;
406
407
45.9M
  do{
408
45.9M
    oX         -= 4;
409
45.9M
    oX[0]       = MULT_NORM(-iX[2] * T[3] - iX[0]  * T[2]);
410
45.9M
    oX[1]       = MULT_NORM (iX[0] * T[3] - iX[2]  * T[2]);
411
45.9M
    oX[2]       = MULT_NORM(-iX[6] * T[1] - iX[4]  * T[0]);
412
45.9M
    oX[3]       = MULT_NORM (iX[4] * T[1] - iX[6]  * T[0]);
413
45.9M
    iX         -= 8;
414
45.9M
    T          += 4;
415
45.9M
  }while(iX>=in);
416
417
3.64M
  iX            = in+n2-8;
418
3.64M
  oX            = out+n2+n4;
419
3.64M
  T             = init->trig+n4;
420
421
45.9M
  do{
422
45.9M
    T          -= 4;
423
45.9M
    oX[0]       =  MULT_NORM (iX[4] * T[3] + iX[6] * T[2]);
424
45.9M
    oX[1]       =  MULT_NORM (iX[4] * T[2] - iX[6] * T[3]);
425
45.9M
    oX[2]       =  MULT_NORM (iX[0] * T[1] + iX[2] * T[0]);
426
45.9M
    oX[3]       =  MULT_NORM (iX[0] * T[0] - iX[2] * T[1]);
427
45.9M
    iX         -= 8;
428
45.9M
    oX         += 4;
429
45.9M
  }while(iX>=in);
430
431
3.64M
  mdct_butterflies(init,out+n2,n2);
432
3.64M
  mdct_bitreverse(init,out);
433
434
  /* roatate + window */
435
436
3.64M
  {
437
3.64M
    DATA_TYPE *oX1=out+n2+n4;
438
3.64M
    DATA_TYPE *oX2=out+n2+n4;
439
3.64M
    DATA_TYPE *iX =out;
440
3.64M
    T             =init->trig+n2;
441
442
45.9M
    do{
443
45.9M
      oX1-=4;
444
445
45.9M
      oX1[3]  =  MULT_NORM (iX[0] * T[1] - iX[1] * T[0]);
446
45.9M
      oX2[0]  = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]);
447
448
45.9M
      oX1[2]  =  MULT_NORM (iX[2] * T[3] - iX[3] * T[2]);
449
45.9M
      oX2[1]  = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]);
450
451
45.9M
      oX1[1]  =  MULT_NORM (iX[4] * T[5] - iX[5] * T[4]);
452
45.9M
      oX2[2]  = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]);
453
454
45.9M
      oX1[0]  =  MULT_NORM (iX[6] * T[7] - iX[7] * T[6]);
455
45.9M
      oX2[3]  = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]);
456
457
45.9M
      oX2+=4;
458
45.9M
      iX    +=   8;
459
45.9M
      T     +=   8;
460
45.9M
    }while(iX<oX1);
461
462
3.64M
    iX=out+n2+n4;
463
3.64M
    oX1=out+n4;
464
3.64M
    oX2=oX1;
465
466
45.9M
    do{
467
45.9M
      oX1-=4;
468
45.9M
      iX-=4;
469
470
45.9M
      oX2[0] = -(oX1[3] = iX[3]);
471
45.9M
      oX2[1] = -(oX1[2] = iX[2]);
472
45.9M
      oX2[2] = -(oX1[1] = iX[1]);
473
45.9M
      oX2[3] = -(oX1[0] = iX[0]);
474
475
45.9M
      oX2+=4;
476
45.9M
    }while(oX2<iX);
477
478
3.64M
    iX=out+n2+n4;
479
3.64M
    oX1=out+n2+n4;
480
3.64M
    oX2=out+n2;
481
45.9M
    do{
482
45.9M
      oX1-=4;
483
45.9M
      oX1[0]= iX[3];
484
45.9M
      oX1[1]= iX[2];
485
45.9M
      oX1[2]= iX[1];
486
45.9M
      oX1[3]= iX[0];
487
45.9M
      iX+=4;
488
45.9M
    }while(oX1>oX2);
489
3.64M
  }
490
3.64M
}
491
492
0
void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){
493
0
  int n=init->n;
494
0
  int n2=n>>1;
495
0
  int n4=n>>2;
496
0
  int n8=n>>3;
497
0
  DATA_TYPE *w=alloca(n*sizeof(*w)); /* forward needs working space */
498
0
  DATA_TYPE *w2=w+n2;
499
500
  /* rotate */
501
502
  /* window + rotate + step 1 */
503
504
0
  REG_TYPE r0;
505
0
  REG_TYPE r1;
506
0
  DATA_TYPE *x0=in+n2+n4;
507
0
  DATA_TYPE *x1=x0+1;
508
0
  DATA_TYPE *T=init->trig+n2;
509
510
0
  int i=0;
511
512
0
  for(i=0;i<n8;i+=2){
513
0
    x0 -=4;
514
0
    T-=2;
515
0
    r0= x0[2] + x1[0];
516
0
    r1= x0[0] + x1[2];
517
0
    w2[i]=   MULT_NORM(r1*T[1] + r0*T[0]);
518
0
    w2[i+1]= MULT_NORM(r1*T[0] - r0*T[1]);
519
0
    x1 +=4;
520
0
  }
521
522
0
  x1=in+1;
523
524
0
  for(;i<n2-n8;i+=2){
525
0
    T-=2;
526
0
    x0 -=4;
527
0
    r0= x0[2] - x1[0];
528
0
    r1= x0[0] - x1[2];
529
0
    w2[i]=   MULT_NORM(r1*T[1] + r0*T[0]);
530
0
    w2[i+1]= MULT_NORM(r1*T[0] - r0*T[1]);
531
0
    x1 +=4;
532
0
  }
533
534
0
  x0=in+n;
535
536
0
  for(;i<n2;i+=2){
537
0
    T-=2;
538
0
    x0 -=4;
539
0
    r0= -x0[2] - x1[0];
540
0
    r1= -x0[0] - x1[2];
541
0
    w2[i]=   MULT_NORM(r1*T[1] + r0*T[0]);
542
0
    w2[i+1]= MULT_NORM(r1*T[0] - r0*T[1]);
543
0
    x1 +=4;
544
0
  }
545
546
547
0
  mdct_butterflies(init,w+n2,n2);
548
0
  mdct_bitreverse(init,w);
549
550
  /* roatate + window */
551
552
0
  T=init->trig+n2;
553
0
  x0=out+n2;
554
555
0
  for(i=0;i<n4;i++){
556
0
    x0--;
557
0
    out[i] =MULT_NORM((w[0]*T[0]+w[1]*T[1])*init->scale);
558
0
    x0[0]  =MULT_NORM((w[0]*T[1]-w[1]*T[0])*init->scale);
559
0
    w+=2;
560
0
    T+=2;
561
0
  }
562
0
}