~ubuntu-branches/ubuntu/lucid/mpg123/lucid

« back to all changes in this revision

Viewing changes to dct64.c

Tags: upstream-0.60
ImportĀ upstreamĀ versionĀ 0.60

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
 
2
 
/*
3
 
 * Discrete Cosine Tansform (DCT) for subband synthesis
4
 
 *
5
 
 * -funroll-loops (for gcc) will remove the loops for better performance
6
 
 * using loops in the source-code enhances readabillity
7
 
 */
8
 
 
9
 
/*
10
 
 * TODO: write an optimized version for the down-sampling modes
11
 
 *       (in these modes the bands 16-31 (2:1) or 8-31 (4:1) are zero 
12
 
 */
13
 
 
14
 
#include "mpg123.h"
15
 
 
16
 
void dct64(real *out0,real *out1,real *samples)
17
 
{
18
 
  real bufs[64];
19
 
 
20
 
 {
21
 
  register int i,j;
22
 
  register real *b1,*b2,*bs,*costab;
23
 
 
24
 
  b1 = samples;
25
 
  bs = bufs;
26
 
  costab = pnts[0]+16;
27
 
  b2 = b1 + 32;
28
 
 
29
 
  for(i=15;i>=0;i--)
30
 
    *bs++ = (*b1++ + *--b2); 
31
 
  for(i=15;i>=0;i--)
32
 
    *bs++ = (*--b2 - *b1++) * *--costab;
33
 
 
34
 
  b1 = bufs;
35
 
  costab = pnts[1]+8;
36
 
  b2 = b1 + 16;
37
 
 
38
 
  {
39
 
    for(i=7;i>=0;i--)
40
 
      *bs++ = (*b1++ + *--b2); 
41
 
    for(i=7;i>=0;i--)
42
 
      *bs++ = (*--b2 - *b1++) * *--costab; 
43
 
    b2 += 32;
44
 
    costab += 8;
45
 
    for(i=7;i>=0;i--)
46
 
      *bs++ = (*b1++ + *--b2); 
47
 
    for(i=7;i>=0;i--)
48
 
      *bs++ = (*b1++ - *--b2) * *--costab; 
49
 
    b2 += 32;
50
 
  }
51
 
 
52
 
  bs = bufs;
53
 
  costab = pnts[2];
54
 
  b2 = b1 + 8;
55
 
 
56
 
  for(j=2;j;j--)
57
 
  {
58
 
    for(i=3;i>=0;i--)
59
 
      *bs++ = (*b1++ + *--b2); 
60
 
    for(i=3;i>=0;i--)
61
 
      *bs++ = (*--b2 - *b1++) * costab[i]; 
62
 
    b2 += 16;
63
 
    for(i=3;i>=0;i--)
64
 
      *bs++ = (*b1++ + *--b2); 
65
 
    for(i=3;i>=0;i--)
66
 
      *bs++ = (*b1++ - *--b2) * costab[i]; 
67
 
    b2 += 16;
68
 
  }
69
 
 
70
 
  b1 = bufs;
71
 
  costab = pnts[3];
72
 
  b2 = b1 + 4;
73
 
 
74
 
  for(j=4;j;j--)
75
 
  {
76
 
    *bs++ = (*b1++ + *--b2); 
77
 
    *bs++ = (*b1++ + *--b2);
78
 
    *bs++ = (*--b2 - *b1++) * costab[1]; 
79
 
    *bs++ = (*--b2 - *b1++) * costab[0];
80
 
    b2 += 8;
81
 
    *bs++ = (*b1++ + *--b2); 
82
 
    *bs++ = (*b1++ + *--b2);
83
 
    *bs++ = (*b1++ - *--b2) * costab[1]; 
84
 
    *bs++ = (*b1++ - *--b2) * costab[0];
85
 
    b2 += 8;
86
 
  }
87
 
  bs = bufs;
88
 
  costab = pnts[4];
89
 
 
90
 
  for(j=8;j;j--)
91
 
  {
92
 
    real v0,v1;
93
 
    v0=*b1++; v1 = *b1++;
94
 
    *bs++ = (v0 + v1);
95
 
    *bs++ = (v0 - v1) * (*costab);
96
 
    v0=*b1++; v1 = *b1++;
97
 
    *bs++ = (v0 + v1);
98
 
    *bs++ = (v1 - v0) * (*costab);
99
 
  }
100
 
 
101
 
 }
102
 
 
103
 
 
104
 
 {
105
 
  register real *b1;
106
 
  register int i;
107
 
 
108
 
  for(b1=bufs,i=8;i;i--,b1+=4)
109
 
    b1[2] += b1[3];
110
 
 
111
 
  for(b1=bufs,i=4;i;i--,b1+=8)
112
 
  {
113
 
    b1[4] += b1[6];
114
 
    b1[6] += b1[5];
115
 
    b1[5] += b1[7];
116
 
  }
117
 
 
118
 
  for(b1=bufs,i=2;i;i--,b1+=16)
119
 
  {
120
 
    b1[8]  += b1[12];
121
 
    b1[12] += b1[10];
122
 
    b1[10] += b1[14];
123
 
    b1[14] += b1[9];
124
 
    b1[9]  += b1[13];
125
 
    b1[13] += b1[11];
126
 
    b1[11] += b1[15];
127
 
  }
128
 
 }
129
 
 
130
 
 
131
 
  out0[0x10*16] = bufs[0];
132
 
  out0[0x10*15] = bufs[16+0]  + bufs[16+8];
133
 
  out0[0x10*14] = bufs[8];
134
 
  out0[0x10*13] = bufs[16+8]  + bufs[16+4];
135
 
  out0[0x10*12] = bufs[4];
136
 
  out0[0x10*11] = bufs[16+4]  + bufs[16+12];
137
 
  out0[0x10*10] = bufs[12];
138
 
  out0[0x10* 9] = bufs[16+12] + bufs[16+2];
139
 
  out0[0x10* 8] = bufs[2];
140
 
  out0[0x10* 7] = bufs[16+2]  + bufs[16+10];
141
 
  out0[0x10* 6] = bufs[10];
142
 
  out0[0x10* 5] = bufs[16+10] + bufs[16+6];
143
 
  out0[0x10* 4] = bufs[6];
144
 
  out0[0x10* 3] = bufs[16+6]  + bufs[16+14];
145
 
  out0[0x10* 2] = bufs[14];
146
 
  out0[0x10* 1] = bufs[16+14] + bufs[16+1];
147
 
  out0[0x10* 0] = bufs[1];
148
 
 
149
 
  out1[0x10* 0] = bufs[1];
150
 
  out1[0x10* 1] = bufs[16+1]  + bufs[16+9];
151
 
  out1[0x10* 2] = bufs[9];
152
 
  out1[0x10* 3] = bufs[16+9]  + bufs[16+5];
153
 
  out1[0x10* 4] = bufs[5];
154
 
  out1[0x10* 5] = bufs[16+5]  + bufs[16+13];
155
 
  out1[0x10* 6] = bufs[13];
156
 
  out1[0x10* 7] = bufs[16+13] + bufs[16+3];
157
 
  out1[0x10* 8] = bufs[3];
158
 
  out1[0x10* 9] = bufs[16+3]  + bufs[16+11];
159
 
  out1[0x10*10] = bufs[11];
160
 
  out1[0x10*11] = bufs[16+11] + bufs[16+7];
161
 
  out1[0x10*12] = bufs[7];
162
 
  out1[0x10*13] = bufs[16+7]  + bufs[16+15];
163
 
  out1[0x10*14] = bufs[15];
164
 
  out1[0x10*15] = bufs[16+15];
165
 
 
166
 
}
167
 
 
168