Coverage Report

Created: 2025-12-31 07:57

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