Coverage Report

Created: 2026-02-06 07:12

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