Coverage Report

Created: 2026-02-14 06:59

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