Coverage Report

Created: 2026-01-13 06:14

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