Coverage Report

Created: 2026-05-23 07:06

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