Coverage Report

Created: 2026-06-07 06:51

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