Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vorbis/lib/mdct.c
Line
Count
Source
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.97k
void mdct_init(mdct_lookup *lookup,int n){
52
1.97k
  int   *bitrev=_ogg_malloc(sizeof(*bitrev)*(n/4));
53
1.97k
  DATA_TYPE *T=_ogg_malloc(sizeof(*T)*(n+n/4));
54
55
1.97k
  int i;
56
1.97k
  int n2=n>>1;
57
1.97k
  int log2n=lookup->log2n=rint(log((float)n)/log(2.f));
58
1.97k
  lookup->n=n;
59
1.97k
  lookup->trig=T;
60
1.97k
  lookup->bitrev=bitrev;
61
62
/* trig lookups... */
63
64
1.96M
  for(i=0;i<n/4;i++){
65
1.96M
    T[i*2]=FLOAT_CONV(cos((M_PI/n)*(4*i)));
66
1.96M
    T[i*2+1]=FLOAT_CONV(-sin((M_PI/n)*(4*i)));
67
1.96M
    T[n2+i*2]=FLOAT_CONV(cos((M_PI/(2*n))*(2*i+1)));
68
1.96M
    T[n2+i*2+1]=FLOAT_CONV(sin((M_PI/(2*n))*(2*i+1)));
69
1.96M
  }
70
985k
  for(i=0;i<n/8;i++){
71
983k
    T[n+i*2]=FLOAT_CONV(cos((M_PI/n)*(4*i+2))*.5);
72
983k
    T[n+i*2+1]=FLOAT_CONV(-sin((M_PI/n)*(4*i+2))*.5);
73
983k
  }
74
75
  /* bitreverse lookup... */
76
77
1.97k
  {
78
1.97k
    int mask=(1<<(log2n-1))-1,i,j;
79
1.97k
    int msb=1<<(log2n-2);
80
985k
    for(i=0;i<n/8;i++){
81
983k
      int acc=0;
82
12.6M
      for(j=0;msb>>j;j++)
83
11.6M
        if((msb>>j)&i)acc|=1<<j;
84
983k
      bitrev[i*2]=((~acc)&mask)-1;
85
983k
      bitrev[i*2+1]=acc;
86
87
983k
    }
88
1.97k
  }
89
1.97k
  lookup->scale=FLOAT_CONV(4.f/n);
90
1.97k
}
91
92
/* 8 point butterfly (in place, 4 register) */
93
67.9M
STIN void mdct_butterfly_8(DATA_TYPE *x){
94
67.9M
  REG_TYPE r0   = x[6] + x[2];
95
67.9M
  REG_TYPE r1   = x[6] - x[2];
96
67.9M
  REG_TYPE r2   = x[4] + x[0];
97
67.9M
  REG_TYPE r3   = x[4] - x[0];
98
99
67.9M
           x[6] = r0   + r2;
100
67.9M
           x[4] = r0   - r2;
101
102
67.9M
           r0   = x[5] - x[1];
103
67.9M
           r2   = x[7] - x[3];
104
67.9M
           x[0] = r1   + r0;
105
67.9M
           x[2] = r1   - r0;
106
107
67.9M
           r0   = x[5] + x[1];
108
67.9M
           r1   = x[7] + x[3];
109
67.9M
           x[3] = r2   + r3;
110
67.9M
           x[1] = r2   - r3;
111
67.9M
           x[7] = r1   + r0;
112
67.9M
           x[5] = r1   - r0;
113
114
67.9M
}
115
116
/* 16 point butterfly (in place, 4 register) */
117
33.9M
STIN void mdct_butterfly_16(DATA_TYPE *x){
118
33.9M
  REG_TYPE r0     = x[1]  - x[9];
119
33.9M
  REG_TYPE r1     = x[0]  - x[8];
120
121
33.9M
           x[8]  += x[0];
122
33.9M
           x[9]  += x[1];
123
33.9M
           x[0]   = MULT_NORM((r0   + r1) * cPI2_8);
124
33.9M
           x[1]   = MULT_NORM((r0   - r1) * cPI2_8);
125
126
33.9M
           r0     = x[3]  - x[11];
127
33.9M
           r1     = x[10] - x[2];
128
33.9M
           x[10] += x[2];
129
33.9M
           x[11] += x[3];
130
33.9M
           x[2]   = r0;
131
33.9M
           x[3]   = r1;
132
133
33.9M
           r0     = x[12] - x[4];
134
33.9M
           r1     = x[13] - x[5];
135
33.9M
           x[12] += x[4];
136
33.9M
           x[13] += x[5];
137
33.9M
           x[4]   = MULT_NORM((r0   - r1) * cPI2_8);
138
33.9M
           x[5]   = MULT_NORM((r0   + r1) * cPI2_8);
139
140
33.9M
           r0     = x[14] - x[6];
141
33.9M
           r1     = x[15] - x[7];
142
33.9M
           x[14] += x[6];
143
33.9M
           x[15] += x[7];
144
33.9M
           x[6]  = r0;
145
33.9M
           x[7]  = r1;
146
147
33.9M
           mdct_butterfly_8(x);
148
33.9M
           mdct_butterfly_8(x+8);
149
33.9M
}
150
151
/* 32 point butterfly (in place, 4 register) */
152
16.9M
STIN void mdct_butterfly_32(DATA_TYPE *x){
153
16.9M
  REG_TYPE r0     = x[30] - x[14];
154
16.9M
  REG_TYPE r1     = x[31] - x[15];
155
156
16.9M
           x[30] +=         x[14];
157
16.9M
           x[31] +=         x[15];
158
16.9M
           x[14]  =         r0;
159
16.9M
           x[15]  =         r1;
160
161
16.9M
           r0     = x[28] - x[12];
162
16.9M
           r1     = x[29] - x[13];
163
16.9M
           x[28] +=         x[12];
164
16.9M
           x[29] +=         x[13];
165
16.9M
           x[12]  = MULT_NORM( r0 * cPI1_8  -  r1 * cPI3_8 );
166
16.9M
           x[13]  = MULT_NORM( r0 * cPI3_8  +  r1 * cPI1_8 );
167
168
16.9M
           r0     = x[26] - x[10];
169
16.9M
           r1     = x[27] - x[11];
170
16.9M
           x[26] +=         x[10];
171
16.9M
           x[27] +=         x[11];
172
16.9M
           x[10]  = MULT_NORM(( r0  - r1 ) * cPI2_8);
173
16.9M
           x[11]  = MULT_NORM(( r0  + r1 ) * cPI2_8);
174
175
16.9M
           r0     = x[24] - x[8];
176
16.9M
           r1     = x[25] - x[9];
177
16.9M
           x[24] += x[8];
178
16.9M
           x[25] += x[9];
179
16.9M
           x[8]   = MULT_NORM( r0 * cPI3_8  -  r1 * cPI1_8 );
180
16.9M
           x[9]   = MULT_NORM( r1 * cPI3_8  +  r0 * cPI1_8 );
181
182
16.9M
           r0     = x[22] - x[6];
183
16.9M
           r1     = x[7]  - x[23];
184
16.9M
           x[22] += x[6];
185
16.9M
           x[23] += x[7];
186
16.9M
           x[6]   = r1;
187
16.9M
           x[7]   = r0;
188
189
16.9M
           r0     = x[4]  - x[20];
190
16.9M
           r1     = x[5]  - x[21];
191
16.9M
           x[20] += x[4];
192
16.9M
           x[21] += x[5];
193
16.9M
           x[4]   = MULT_NORM( r1 * cPI1_8  +  r0 * cPI3_8 );
194
16.9M
           x[5]   = MULT_NORM( r1 * cPI3_8  -  r0 * cPI1_8 );
195
196
16.9M
           r0     = x[2]  - x[18];
197
16.9M
           r1     = x[3]  - x[19];
198
16.9M
           x[18] += x[2];
199
16.9M
           x[19] += x[3];
200
16.9M
           x[2]   = MULT_NORM(( r1  + r0 ) * cPI2_8);
201
16.9M
           x[3]   = MULT_NORM(( r1  - r0 ) * cPI2_8);
202
203
16.9M
           r0     = x[0]  - x[16];
204
16.9M
           r1     = x[1]  - x[17];
205
16.9M
           x[16] += x[0];
206
16.9M
           x[17] += x[1];
207
16.9M
           x[0]   = MULT_NORM( r1 * cPI3_8  +  r0 * cPI1_8 );
208
16.9M
           x[1]   = MULT_NORM( r1 * cPI1_8  -  r0 * cPI3_8 );
209
210
16.9M
           mdct_butterfly_16(x);
211
16.9M
           mdct_butterfly_16(x+16);
212
213
16.9M
}
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
2.56M
                                        int points){
219
220
2.56M
  DATA_TYPE *x1        = x          + points      - 8;
221
2.56M
  DATA_TYPE *x2        = x          + (points>>1) - 8;
222
2.56M
  REG_TYPE   r0;
223
2.56M
  REG_TYPE   r1;
224
225
33.8M
  do{
226
227
33.8M
               r0      = x1[6]      -  x2[6];
228
33.8M
               r1      = x1[7]      -  x2[7];
229
33.8M
               x1[6]  += x2[6];
230
33.8M
               x1[7]  += x2[7];
231
33.8M
               x2[6]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
232
33.8M
               x2[7]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
233
234
33.8M
               r0      = x1[4]      -  x2[4];
235
33.8M
               r1      = x1[5]      -  x2[5];
236
33.8M
               x1[4]  += x2[4];
237
33.8M
               x1[5]  += x2[5];
238
33.8M
               x2[4]   = MULT_NORM(r1 * T[5]  +  r0 * T[4]);
239
33.8M
               x2[5]   = MULT_NORM(r1 * T[4]  -  r0 * T[5]);
240
241
33.8M
               r0      = x1[2]      -  x2[2];
242
33.8M
               r1      = x1[3]      -  x2[3];
243
33.8M
               x1[2]  += x2[2];
244
33.8M
               x1[3]  += x2[3];
245
33.8M
               x2[2]   = MULT_NORM(r1 * T[9]  +  r0 * T[8]);
246
33.8M
               x2[3]   = MULT_NORM(r1 * T[8]  -  r0 * T[9]);
247
248
33.8M
               r0      = x1[0]      -  x2[0];
249
33.8M
               r1      = x1[1]      -  x2[1];
250
33.8M
               x1[0]  += x2[0];
251
33.8M
               x1[1]  += x2[1];
252
33.8M
               x2[0]   = MULT_NORM(r1 * T[13] +  r0 * T[12]);
253
33.8M
               x2[1]   = MULT_NORM(r1 * T[12] -  r0 * T[13]);
254
255
33.8M
    x1-=8;
256
33.8M
    x2-=8;
257
33.8M
    T+=16;
258
259
33.8M
  }while(x2>=x);
260
2.56M
}
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
11.7M
                                          int trigint){
267
268
11.7M
  DATA_TYPE *x1        = x          + points      - 8;
269
11.7M
  DATA_TYPE *x2        = x          + (points>>1) - 8;
270
11.7M
  REG_TYPE   r0;
271
11.7M
  REG_TYPE   r1;
272
273
123M
  do{
274
275
123M
               r0      = x1[6]      -  x2[6];
276
123M
               r1      = x1[7]      -  x2[7];
277
123M
               x1[6]  += x2[6];
278
123M
               x1[7]  += x2[7];
279
123M
               x2[6]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
280
123M
               x2[7]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
281
282
123M
               T+=trigint;
283
284
123M
               r0      = x1[4]      -  x2[4];
285
123M
               r1      = x1[5]      -  x2[5];
286
123M
               x1[4]  += x2[4];
287
123M
               x1[5]  += x2[5];
288
123M
               x2[4]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
289
123M
               x2[5]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
290
291
123M
               T+=trigint;
292
293
123M
               r0      = x1[2]      -  x2[2];
294
123M
               r1      = x1[3]      -  x2[3];
295
123M
               x1[2]  += x2[2];
296
123M
               x1[3]  += x2[3];
297
123M
               x2[2]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
298
123M
               x2[3]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
299
300
123M
               T+=trigint;
301
302
123M
               r0      = x1[0]      -  x2[0];
303
123M
               r1      = x1[1]      -  x2[1];
304
123M
               x1[0]  += x2[0];
305
123M
               x1[1]  += x2[1];
306
123M
               x2[0]   = MULT_NORM(r1 * T[1]  +  r0 * T[0]);
307
123M
               x2[1]   = MULT_NORM(r1 * T[0]  -  r0 * T[1]);
308
309
123M
               T+=trigint;
310
123M
    x1-=8;
311
123M
    x2-=8;
312
313
123M
  }while(x2>=x);
314
11.7M
}
315
316
STIN void mdct_butterflies(mdct_lookup *init,
317
                             DATA_TYPE *x,
318
2.64M
                             int points){
319
320
2.64M
  DATA_TYPE *T=init->trig;
321
2.64M
  int stages=init->log2n-5;
322
2.64M
  int i,j;
323
324
2.64M
  if(--stages>0){
325
2.56M
    mdct_butterfly_first(T,x,points);
326
2.56M
  }
327
328
3.77M
  for(i=1;--stages>0;i++){
329
12.9M
    for(j=0;j<(1<<i);j++)
330
11.7M
      mdct_butterfly_generic(T,x+(points>>i)*j,points>>i,4<<i);
331
1.12M
  }
332
333
19.6M
  for(j=0;j<points;j+=32)
334
16.9M
    mdct_butterfly_32(x+j);
335
336
2.64M
}
337
338
1.97k
void mdct_clear(mdct_lookup *l){
339
1.97k
  if(l){
340
1.97k
    if(l->trig)_ogg_free(l->trig);
341
1.97k
    if(l->bitrev)_ogg_free(l->bitrev);
342
1.97k
    memset(l,0,sizeof(*l));
343
1.97k
  }
344
1.97k
}
345
346
STIN void mdct_bitreverse(mdct_lookup *init,
347
2.64M
                            DATA_TYPE *x){
348
2.64M
  int        n       = init->n;
349
2.64M
  int       *bit     = init->bitrev;
350
2.64M
  DATA_TYPE *w0      = x;
351
2.64M
  DATA_TYPE *w1      = x = w0+(n>>1);
352
2.64M
  DATA_TYPE *T       = init->trig+n;
353
354
67.9M
  do{
355
67.9M
    DATA_TYPE *x0    = x+bit[0];
356
67.9M
    DATA_TYPE *x1    = x+bit[1];
357
358
67.9M
    REG_TYPE  r0     = x0[1]  - x1[1];
359
67.9M
    REG_TYPE  r1     = x0[0]  + x1[0];
360
67.9M
    REG_TYPE  r2     = MULT_NORM(r1     * T[0]   + r0 * T[1]);
361
67.9M
    REG_TYPE  r3     = MULT_NORM(r1     * T[1]   - r0 * T[0]);
362
363
67.9M
              w1    -= 4;
364
365
67.9M
              r0     = HALVE(x0[1] + x1[1]);
366
67.9M
              r1     = HALVE(x0[0] - x1[0]);
367
368
67.9M
              w0[0]  = r0     + r2;
369
67.9M
              w1[2]  = r0     - r2;
370
67.9M
              w0[1]  = r1     + r3;
371
67.9M
              w1[3]  = r3     - r1;
372
373
67.9M
              x0     = x+bit[2];
374
67.9M
              x1     = x+bit[3];
375
376
67.9M
              r0     = x0[1]  - x1[1];
377
67.9M
              r1     = x0[0]  + x1[0];
378
67.9M
              r2     = MULT_NORM(r1     * T[2]   + r0 * T[3]);
379
67.9M
              r3     = MULT_NORM(r1     * T[3]   - r0 * T[2]);
380
381
67.9M
              r0     = HALVE(x0[1] + x1[1]);
382
67.9M
              r1     = HALVE(x0[0] - x1[0]);
383
384
67.9M
              w0[2]  = r0     + r2;
385
67.9M
              w1[0]  = r0     - r2;
386
67.9M
              w0[3]  = r1     + r3;
387
67.9M
              w1[1]  = r3     - r1;
388
389
67.9M
              T     += 4;
390
67.9M
              bit   += 4;
391
67.9M
              w0    += 4;
392
393
67.9M
  }while(w0<w1);
394
2.64M
}
395
396
2.64M
void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){
397
2.64M
  int n=init->n;
398
2.64M
  int n2=n>>1;
399
2.64M
  int n4=n>>2;
400
401
  /* rotate */
402
403
2.64M
  DATA_TYPE *iX = in+n2-7;
404
2.64M
  DATA_TYPE *oX = out+n2+n4;
405
2.64M
  DATA_TYPE *T  = init->trig+n4;
406
407
67.9M
  do{
408
67.9M
    oX         -= 4;
409
67.9M
    oX[0]       = MULT_NORM(-iX[2] * T[3] - iX[0]  * T[2]);
410
67.9M
    oX[1]       = MULT_NORM (iX[0] * T[3] - iX[2]  * T[2]);
411
67.9M
    oX[2]       = MULT_NORM(-iX[6] * T[1] - iX[4]  * T[0]);
412
67.9M
    oX[3]       = MULT_NORM (iX[4] * T[1] - iX[6]  * T[0]);
413
67.9M
    iX         -= 8;
414
67.9M
    T          += 4;
415
67.9M
  }while(iX>=in);
416
417
2.64M
  iX            = in+n2-8;
418
2.64M
  oX            = out+n2+n4;
419
2.64M
  T             = init->trig+n4;
420
421
67.9M
  do{
422
67.9M
    T          -= 4;
423
67.9M
    oX[0]       =  MULT_NORM (iX[4] * T[3] + iX[6] * T[2]);
424
67.9M
    oX[1]       =  MULT_NORM (iX[4] * T[2] - iX[6] * T[3]);
425
67.9M
    oX[2]       =  MULT_NORM (iX[0] * T[1] + iX[2] * T[0]);
426
67.9M
    oX[3]       =  MULT_NORM (iX[0] * T[0] - iX[2] * T[1]);
427
67.9M
    iX         -= 8;
428
67.9M
    oX         += 4;
429
67.9M
  }while(iX>=in);
430
431
2.64M
  mdct_butterflies(init,out+n2,n2);
432
2.64M
  mdct_bitreverse(init,out);
433
434
  /* roatate + window */
435
436
2.64M
  {
437
2.64M
    DATA_TYPE *oX1=out+n2+n4;
438
2.64M
    DATA_TYPE *oX2=out+n2+n4;
439
2.64M
    DATA_TYPE *iX =out;
440
2.64M
    T             =init->trig+n2;
441
442
67.9M
    do{
443
67.9M
      oX1-=4;
444
445
67.9M
      oX1[3]  =  MULT_NORM (iX[0] * T[1] - iX[1] * T[0]);
446
67.9M
      oX2[0]  = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]);
447
448
67.9M
      oX1[2]  =  MULT_NORM (iX[2] * T[3] - iX[3] * T[2]);
449
67.9M
      oX2[1]  = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]);
450
451
67.9M
      oX1[1]  =  MULT_NORM (iX[4] * T[5] - iX[5] * T[4]);
452
67.9M
      oX2[2]  = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]);
453
454
67.9M
      oX1[0]  =  MULT_NORM (iX[6] * T[7] - iX[7] * T[6]);
455
67.9M
      oX2[3]  = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]);
456
457
67.9M
      oX2+=4;
458
67.9M
      iX    +=   8;
459
67.9M
      T     +=   8;
460
67.9M
    }while(iX<oX1);
461
462
2.64M
    iX=out+n2+n4;
463
2.64M
    oX1=out+n4;
464
2.64M
    oX2=oX1;
465
466
67.9M
    do{
467
67.9M
      oX1-=4;
468
67.9M
      iX-=4;
469
470
67.9M
      oX2[0] = -(oX1[3] = iX[3]);
471
67.9M
      oX2[1] = -(oX1[2] = iX[2]);
472
67.9M
      oX2[2] = -(oX1[1] = iX[1]);
473
67.9M
      oX2[3] = -(oX1[0] = iX[0]);
474
475
67.9M
      oX2+=4;
476
67.9M
    }while(oX2<iX);
477
478
2.64M
    iX=out+n2+n4;
479
2.64M
    oX1=out+n2+n4;
480
2.64M
    oX2=out+n2;
481
67.9M
    do{
482
67.9M
      oX1-=4;
483
67.9M
      oX1[0]= iX[3];
484
67.9M
      oX1[1]= iX[2];
485
67.9M
      oX1[2]= iX[1];
486
67.9M
      oX1[3]= iX[0];
487
67.9M
      iX+=4;
488
67.9M
    }while(oX1>oX2);
489
2.64M
  }
490
2.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
}