comparison decoders/libmpg123/dct64.c @ 562:7e08477b0fc1

MP3 decoder upgrade work. Ripped out SMPEG and mpglib support, replaced it with "mpg123.c" and libmpg123. libmpg123 is a much better version of mpglib, so it should solve all the problems about MP3's not seeking, or most modern MP3's not playing at all, etc. Since you no longer have to make a tradeoff with SMPEG for features, and SMPEG is basically rotting, I removed it from the project. There is still work to be done with libmpg123...there are MMX, 3DNow, SSE, Altivec, etc decoders which we don't have enabled at the moment, and the build system could use some work to make this compile more cleanly, etc. Still: huge win.
author Ryan C. Gordon <icculus@icculus.org>
date Fri, 30 Jan 2009 02:44:47 -0500
parents
children
comparison
equal deleted inserted replaced
561:f2985e08589c 562:7e08477b0fc1
1 /*
2 dct64.c: DCT64, the plain C version
3
4 copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
5 see COPYING and AUTHORS files in distribution or http://mpg123.org
6 initially written by Michael Hipp
7 */
8
9 /*
10 * Discrete Cosine Tansform (DCT) for subband synthesis
11 *
12 * -funroll-loops (for gcc) will remove the loops for better performance
13 * using loops in the source-code enhances readabillity
14 *
15 *
16 * TODO: write an optimized version for the down-sampling modes
17 * (in these modes the bands 16-31 (2:1) or 8-31 (4:1) are zero
18 */
19
20 #include "mpg123lib_intern.h"
21
22 void dct64(real *out0,real *out1,real *samples)
23 {
24 real bufs[64];
25
26 {
27 register int i,j;
28 register real *b1,*b2,*bs,*costab;
29
30 b1 = samples;
31 bs = bufs;
32 costab = pnts[0]+16;
33 b2 = b1 + 32;
34
35 for(i=15;i>=0;i--)
36 *bs++ = (*b1++ + *--b2);
37 for(i=15;i>=0;i--)
38 *bs++ = REAL_MUL((*--b2 - *b1++), *--costab);
39
40 b1 = bufs;
41 costab = pnts[1]+8;
42 b2 = b1 + 16;
43
44 {
45 for(i=7;i>=0;i--)
46 *bs++ = (*b1++ + *--b2);
47 for(i=7;i>=0;i--)
48 *bs++ = REAL_MUL((*--b2 - *b1++), *--costab);
49 b2 += 32;
50 costab += 8;
51 for(i=7;i>=0;i--)
52 *bs++ = (*b1++ + *--b2);
53 for(i=7;i>=0;i--)
54 *bs++ = REAL_MUL((*b1++ - *--b2), *--costab);
55 b2 += 32;
56 }
57
58 bs = bufs;
59 costab = pnts[2];
60 b2 = b1 + 8;
61
62 for(j=2;j;j--)
63 {
64 for(i=3;i>=0;i--)
65 *bs++ = (*b1++ + *--b2);
66 for(i=3;i>=0;i--)
67 *bs++ = REAL_MUL((*--b2 - *b1++), costab[i]);
68 b2 += 16;
69 for(i=3;i>=0;i--)
70 *bs++ = (*b1++ + *--b2);
71 for(i=3;i>=0;i--)
72 *bs++ = REAL_MUL((*b1++ - *--b2), costab[i]);
73 b2 += 16;
74 }
75
76 b1 = bufs;
77 costab = pnts[3];
78 b2 = b1 + 4;
79
80 for(j=4;j;j--)
81 {
82 *bs++ = (*b1++ + *--b2);
83 *bs++ = (*b1++ + *--b2);
84 *bs++ = REAL_MUL((*--b2 - *b1++), costab[1]);
85 *bs++ = REAL_MUL((*--b2 - *b1++), costab[0]);
86 b2 += 8;
87 *bs++ = (*b1++ + *--b2);
88 *bs++ = (*b1++ + *--b2);
89 *bs++ = REAL_MUL((*b1++ - *--b2), costab[1]);
90 *bs++ = REAL_MUL((*b1++ - *--b2), costab[0]);
91 b2 += 8;
92 }
93 bs = bufs;
94 costab = pnts[4];
95
96 for(j=8;j;j--)
97 {
98 real v0,v1;
99 v0=*b1++; v1 = *b1++;
100 *bs++ = (v0 + v1);
101 *bs++ = REAL_MUL((v0 - v1), (*costab));
102 v0=*b1++; v1 = *b1++;
103 *bs++ = (v0 + v1);
104 *bs++ = REAL_MUL((v1 - v0), (*costab));
105 }
106
107 }
108
109
110 {
111 register real *b1;
112 register int i;
113
114 for(b1=bufs,i=8;i;i--,b1+=4)
115 b1[2] += b1[3];
116
117 for(b1=bufs,i=4;i;i--,b1+=8)
118 {
119 b1[4] += b1[6];
120 b1[6] += b1[5];
121 b1[5] += b1[7];
122 }
123
124 for(b1=bufs,i=2;i;i--,b1+=16)
125 {
126 b1[8] += b1[12];
127 b1[12] += b1[10];
128 b1[10] += b1[14];
129 b1[14] += b1[9];
130 b1[9] += b1[13];
131 b1[13] += b1[11];
132 b1[11] += b1[15];
133 }
134 }
135
136
137 out0[0x10*16] = bufs[0];
138 out0[0x10*15] = bufs[16+0] + bufs[16+8];
139 out0[0x10*14] = bufs[8];
140 out0[0x10*13] = bufs[16+8] + bufs[16+4];
141 out0[0x10*12] = bufs[4];
142 out0[0x10*11] = bufs[16+4] + bufs[16+12];
143 out0[0x10*10] = bufs[12];
144 out0[0x10* 9] = bufs[16+12] + bufs[16+2];
145 out0[0x10* 8] = bufs[2];
146 out0[0x10* 7] = bufs[16+2] + bufs[16+10];
147 out0[0x10* 6] = bufs[10];
148 out0[0x10* 5] = bufs[16+10] + bufs[16+6];
149 out0[0x10* 4] = bufs[6];
150 out0[0x10* 3] = bufs[16+6] + bufs[16+14];
151 out0[0x10* 2] = bufs[14];
152 out0[0x10* 1] = bufs[16+14] + bufs[16+1];
153 out0[0x10* 0] = bufs[1];
154
155 out1[0x10* 0] = bufs[1];
156 out1[0x10* 1] = bufs[16+1] + bufs[16+9];
157 out1[0x10* 2] = bufs[9];
158 out1[0x10* 3] = bufs[16+9] + bufs[16+5];
159 out1[0x10* 4] = bufs[5];
160 out1[0x10* 5] = bufs[16+5] + bufs[16+13];
161 out1[0x10* 6] = bufs[13];
162 out1[0x10* 7] = bufs[16+13] + bufs[16+3];
163 out1[0x10* 8] = bufs[3];
164 out1[0x10* 9] = bufs[16+3] + bufs[16+11];
165 out1[0x10*10] = bufs[11];
166 out1[0x10*11] = bufs[16+11] + bufs[16+7];
167 out1[0x10*12] = bufs[7];
168 out1[0x10*13] = bufs[16+7] + bufs[16+15];
169 out1[0x10*14] = bufs[15];
170 out1[0x10*15] = bufs[16+15];
171
172 }
173
174