Mercurial > audlegacy
comparison Plugins/Input/mpg123/decode_4to1.c @ 127:05d824e30afd trunk
[svn] Synchronize mpg123 code with mpg123-0.59s.mc3. This brings us superior accuracy to libMAD, apparently.
author | nenolod |
---|---|
date | Wed, 09 Nov 2005 16:40:03 -0800 |
parents | fa848bd484d8 |
children | 0f294f2b0a9b |
comparison
equal
deleted
inserted
replaced
126:2d3d921a44e2 | 127:05d824e30afd |
---|---|
1 | |
2 /* | 1 /* |
3 * Mpeg Layer-1,2,3 audio decoder | 2 * Mpeg Layer-1,2,3 audio decoder |
4 * ------------------------------ | 3 * ------------------------------ |
5 * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. | 4 * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. |
6 * See also 'README' | 5 * See also 'README' |
18 #define WRITE_SAMPLE(samples,sum,clip) \ | 17 #define WRITE_SAMPLE(samples,sum,clip) \ |
19 if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ | 18 if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \ |
20 else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ | 19 else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \ |
21 else { *(samples) = sum; } | 20 else { *(samples) = sum; } |
22 | 21 |
23 int | 22 int mpg123_synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt) |
24 mpg123_synth_4to1_8bit(real * bandPtr, int channel, | 23 { |
25 unsigned char *samples, int *pnt) | 24 short samples_tmp[16]; |
26 { | 25 short *tmp1 = samples_tmp + channel; |
27 short samples_tmp[16]; | 26 int i,ret; |
28 short *tmp1 = samples_tmp + channel; | 27 int pnt1 = 0; |
29 int i, ret; | 28 |
30 int pnt1 = 0; | 29 ret = mpg123_synth_4to1(bandPtr,channel,(unsigned char *) samples_tmp,&pnt1); |
31 | 30 samples += channel + *pnt; |
32 ret = | 31 |
33 mpg123_synth_4to1(bandPtr, channel, (unsigned char *) samples_tmp, | 32 for(i=0;i<8;i++) { |
34 &pnt1); | 33 *samples = mpg123_conv16to8[*tmp1>>AUSHIFT]; |
35 samples += channel + *pnt; | 34 samples += 2; |
36 | 35 tmp1 += 2; |
37 for (i = 0; i < 8; i++) { | 36 } |
38 *samples = (*tmp1 >> 8) ^ 128; | 37 *pnt += 16; |
39 samples += 2; | 38 |
40 tmp1 += 2; | 39 return ret; |
40 } | |
41 | |
42 int mpg123_synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt) | |
43 { | |
44 short samples_tmp[16]; | |
45 short *tmp1 = samples_tmp; | |
46 int i,ret; | |
47 int pnt1 = 0; | |
48 | |
49 ret = mpg123_synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1); | |
50 samples += *pnt; | |
51 | |
52 for(i=0;i<8;i++) { | |
53 *samples++ = mpg123_conv16to8[*tmp1>>AUSHIFT]; | |
54 tmp1 += 2; | |
55 } | |
56 *pnt += 8; | |
57 | |
58 return ret; | |
59 } | |
60 | |
61 | |
62 int mpg123_synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt) | |
63 { | |
64 short samples_tmp[16]; | |
65 short *tmp1 = samples_tmp; | |
66 int i,ret; | |
67 int pnt1 = 0; | |
68 | |
69 ret = mpg123_synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1); | |
70 samples += *pnt; | |
71 | |
72 for(i=0;i<8;i++) { | |
73 *samples++ = mpg123_conv16to8[*tmp1>>AUSHIFT]; | |
74 *samples++ = mpg123_conv16to8[*tmp1>>AUSHIFT]; | |
75 tmp1 += 2; | |
76 } | |
77 *pnt += 16; | |
78 | |
79 return ret; | |
80 } | |
81 | |
82 int mpg123_synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt) | |
83 { | |
84 short samples_tmp[16]; | |
85 short *tmp1 = samples_tmp; | |
86 int i,ret; | |
87 int pnt1 = 0; | |
88 | |
89 ret = mpg123_synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1); | |
90 samples += *pnt; | |
91 | |
92 for(i=0;i<8;i++) { | |
93 *( (short *)samples) = *tmp1; | |
94 samples += 2; | |
95 tmp1 += 2; | |
96 } | |
97 *pnt += 16; | |
98 | |
99 return ret; | |
100 } | |
101 | |
102 int mpg123_synth_4to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt) | |
103 { | |
104 int i,ret; | |
105 | |
106 ret = mpg123_synth_4to1(bandPtr,0,samples,pnt); | |
107 samples = samples + *pnt - 32; | |
108 | |
109 for(i=0;i<8;i++) { | |
110 ((short *)samples)[1] = ((short *)samples)[0]; | |
111 samples+=4; | |
112 } | |
113 | |
114 return ret; | |
115 } | |
116 | |
117 int mpg123_synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt) | |
118 { | |
119 static real buffs[2][2][0x110]; | |
120 static const int step = 2; | |
121 static int bo = 1; | |
122 short *samples = (short *) (out + *pnt); | |
123 | |
124 real *b0,(*buf)[0x110]; | |
125 int clip = 0; | |
126 int bo1; | |
127 | |
128 if(!channel) { | |
129 bo--; | |
130 bo &= 0xf; | |
131 buf = buffs[0]; | |
132 } | |
133 else { | |
134 samples++; | |
135 buf = buffs[1]; | |
136 } | |
137 | |
138 if(bo & 0x1) { | |
139 b0 = buf[0]; | |
140 bo1 = bo; | |
141 mpg123_dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); | |
142 } | |
143 else { | |
144 b0 = buf[1]; | |
145 bo1 = bo+1; | |
146 mpg123_dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); | |
147 } | |
148 | |
149 { | |
150 register int j; | |
151 real *window = mpg123_decwin + 16 - bo1; | |
152 | |
153 for (j=4;j;j--,b0+=0x30,window+=0x70) | |
154 { | |
155 real sum; | |
156 sum = *window++ * *b0++; | |
157 sum -= *window++ * *b0++; | |
158 sum += *window++ * *b0++; | |
159 sum -= *window++ * *b0++; | |
160 sum += *window++ * *b0++; | |
161 sum -= *window++ * *b0++; | |
162 sum += *window++ * *b0++; | |
163 sum -= *window++ * *b0++; | |
164 sum += *window++ * *b0++; | |
165 sum -= *window++ * *b0++; | |
166 sum += *window++ * *b0++; | |
167 sum -= *window++ * *b0++; | |
168 sum += *window++ * *b0++; | |
169 sum -= *window++ * *b0++; | |
170 sum += *window++ * *b0++; | |
171 sum -= *window++ * *b0++; | |
172 | |
173 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
174 #if 0 | |
175 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
176 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
177 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
178 #endif | |
41 } | 179 } |
42 *pnt += 16; | 180 |
43 | 181 { |
44 return ret; | 182 real sum; |
45 } | 183 sum = window[0x0] * b0[0x0]; |
46 | 184 sum += window[0x2] * b0[0x2]; |
47 int | 185 sum += window[0x4] * b0[0x4]; |
48 mpg123_synth_4to1_8bit_mono(real * bandPtr, unsigned char *samples, int *pnt) | 186 sum += window[0x6] * b0[0x6]; |
49 { | 187 sum += window[0x8] * b0[0x8]; |
50 short samples_tmp[16]; | 188 sum += window[0xA] * b0[0xA]; |
51 short *tmp1 = samples_tmp; | 189 sum += window[0xC] * b0[0xC]; |
52 int i, ret; | 190 sum += window[0xE] * b0[0xE]; |
53 int pnt1 = 0; | 191 WRITE_SAMPLE(samples,sum,clip); samples += step; |
54 | 192 #if 0 |
55 ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); | 193 WRITE_SAMPLE(samples,sum,clip); samples += step; |
56 samples += *pnt; | 194 WRITE_SAMPLE(samples,sum,clip); samples += step; |
57 | 195 WRITE_SAMPLE(samples,sum,clip); samples += step; |
58 for (i = 0; i < 8; i++) { | 196 #endif |
59 *samples++ = (*tmp1 >> 8) ^ 128; | 197 b0-=0x40,window-=0x80; |
60 tmp1 += 2; | |
61 } | 198 } |
62 *pnt += 8; | 199 window += bo1<<1; |
63 | 200 |
64 return ret; | 201 for (j=3;j;j--,b0-=0x50,window-=0x70) |
65 } | 202 { |
66 | 203 real sum; |
204 sum = -*(--window) * *b0++; | |
205 sum -= *(--window) * *b0++; | |
206 sum -= *(--window) * *b0++; | |
207 sum -= *(--window) * *b0++; | |
208 sum -= *(--window) * *b0++; | |
209 sum -= *(--window) * *b0++; | |
210 sum -= *(--window) * *b0++; | |
211 sum -= *(--window) * *b0++; | |
212 sum -= *(--window) * *b0++; | |
213 sum -= *(--window) * *b0++; | |
214 sum -= *(--window) * *b0++; | |
215 sum -= *(--window) * *b0++; | |
216 sum -= *(--window) * *b0++; | |
217 sum -= *(--window) * *b0++; | |
218 sum -= *(--window) * *b0++; | |
219 sum -= *(--window) * *b0++; | |
220 | |
221 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
67 #if 0 | 222 #if 0 |
68 int | 223 WRITE_SAMPLE(samples,sum,clip); samples += step; |
69 mpg123_synth_4to1_8bit_mono2stereo(real * bandPtr, | 224 WRITE_SAMPLE(samples,sum,clip); samples += step; |
70 unsigned char *samples, int *pnt) | 225 WRITE_SAMPLE(samples,sum,clip); samples += step; |
71 { | 226 #endif |
72 short samples_tmp[16]; | |
73 short *tmp1 = samples_tmp; | |
74 int i, ret; | |
75 int pnt1 = 0; | |
76 | |
77 ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); | |
78 samples += *pnt; | |
79 | |
80 for (i = 0; i < 8; i++) { | |
81 *samples++ = (*tmp1 >> 8) ^ 128; | |
82 *samples++ = (*tmp1 >> 8) ^ 128; | |
83 tmp1 += 2; | |
84 } | 227 } |
85 *pnt += 16; | 228 } |
86 | 229 |
87 return ret; | 230 *pnt += 32; |
88 } | 231 |
89 #endif | 232 return clip; |
90 | 233 } |
91 int | 234 |
92 mpg123_synth_4to1_mono(real * bandPtr, unsigned char *samples, int *pnt) | 235 |
93 { | |
94 short samples_tmp[16]; | |
95 short *tmp1 = samples_tmp; | |
96 int i, ret; | |
97 int pnt1 = 0; | |
98 | |
99 ret = mpg123_synth_4to1(bandPtr, 0, (unsigned char *) samples_tmp, &pnt1); | |
100 samples += *pnt; | |
101 | |
102 for (i = 0; i < 8; i++) { | |
103 *((short *) samples) = *tmp1; | |
104 samples += 2; | |
105 tmp1 += 2; | |
106 } | |
107 *pnt += 16; | |
108 | |
109 return ret; | |
110 } | |
111 | |
112 #if 0 | |
113 int | |
114 mpg123_synth_4to1_mono2stereo(real * bandPtr, unsigned char *samples, | |
115 int *pnt) | |
116 { | |
117 int i, ret; | |
118 | |
119 ret = mpg123_synth_4to1(bandPtr, 0, samples, pnt); | |
120 samples = samples + *pnt - 32; | |
121 | |
122 for (i = 0; i < 8; i++) { | |
123 ((short *) samples)[1] = ((short *) samples)[0]; | |
124 samples += 4; | |
125 } | |
126 | |
127 return ret; | |
128 } | |
129 #endif | |
130 | |
131 int | |
132 mpg123_synth_4to1(real * bandPtr, int channel, unsigned char *out, int *pnt) | |
133 { | |
134 static real buffs[2][2][0x110]; | |
135 static const int step = 2; | |
136 static int bo = 1; | |
137 short *samples = (short *) (out + *pnt); | |
138 | |
139 real *b0, (*buf)[0x110]; | |
140 int clip = 0; | |
141 int bo1; | |
142 | |
143 /* if(param.equalizer) | |
144 do_equalizer(bandPtr,channel); */ | |
145 | |
146 if (!channel) { | |
147 bo--; | |
148 bo &= 0xf; | |
149 buf = buffs[0]; | |
150 } | |
151 else { | |
152 samples++; | |
153 buf = buffs[1]; | |
154 } | |
155 | |
156 if (bo & 0x1) { | |
157 b0 = buf[0]; | |
158 bo1 = bo; | |
159 mpg123_dct64(buf[1] + ((bo + 1) & 0xf), buf[0] + bo, bandPtr); | |
160 } | |
161 else { | |
162 b0 = buf[1]; | |
163 bo1 = bo + 1; | |
164 mpg123_dct64(buf[0] + bo, buf[1] + bo + 1, bandPtr); | |
165 } | |
166 | |
167 { | |
168 register int j; | |
169 real *window = mpg123_decwin + 16 - bo1; | |
170 | |
171 for (j = 4; j; j--, b0 += 0x30, window += 0x70) { | |
172 real sum; | |
173 | |
174 sum = *window++ * *b0++; | |
175 sum -= *window++ * *b0++; | |
176 sum += *window++ * *b0++; | |
177 sum -= *window++ * *b0++; | |
178 sum += *window++ * *b0++; | |
179 sum -= *window++ * *b0++; | |
180 sum += *window++ * *b0++; | |
181 sum -= *window++ * *b0++; | |
182 sum += *window++ * *b0++; | |
183 sum -= *window++ * *b0++; | |
184 sum += *window++ * *b0++; | |
185 sum -= *window++ * *b0++; | |
186 sum += *window++ * *b0++; | |
187 sum -= *window++ * *b0++; | |
188 sum += *window++ * *b0++; | |
189 sum -= *window++ * *b0++; | |
190 | |
191 WRITE_SAMPLE(samples, sum, clip); | |
192 samples += step; | |
193 #if 0 | |
194 WRITE_SAMPLE(samples, sum, clip); | |
195 samples += step; | |
196 WRITE_SAMPLE(samples, sum, clip); | |
197 samples += step; | |
198 WRITE_SAMPLE(samples, sum, clip); | |
199 samples += step; | |
200 #endif | |
201 } | |
202 | |
203 { | |
204 real sum; | |
205 | |
206 sum = window[0x0] * b0[0x0]; | |
207 sum += window[0x2] * b0[0x2]; | |
208 sum += window[0x4] * b0[0x4]; | |
209 sum += window[0x6] * b0[0x6]; | |
210 sum += window[0x8] * b0[0x8]; | |
211 sum += window[0xA] * b0[0xA]; | |
212 sum += window[0xC] * b0[0xC]; | |
213 sum += window[0xE] * b0[0xE]; | |
214 WRITE_SAMPLE(samples, sum, clip); | |
215 samples += step; | |
216 #if 0 | |
217 WRITE_SAMPLE(samples, sum, clip); | |
218 samples += step; | |
219 WRITE_SAMPLE(samples, sum, clip); | |
220 samples += step; | |
221 WRITE_SAMPLE(samples, sum, clip); | |
222 samples += step; | |
223 #endif | |
224 b0 -= 0x40, window -= 0x80; | |
225 } | |
226 window += bo1 << 1; | |
227 | |
228 for (j = 3; j; j--, b0 -= 0x50, window -= 0x70) { | |
229 real sum; | |
230 | |
231 sum = -*(--window) * *b0++; | |
232 sum -= *(--window) * *b0++; | |
233 sum -= *(--window) * *b0++; | |
234 sum -= *(--window) * *b0++; | |
235 sum -= *(--window) * *b0++; | |
236 sum -= *(--window) * *b0++; | |
237 sum -= *(--window) * *b0++; | |
238 sum -= *(--window) * *b0++; | |
239 sum -= *(--window) * *b0++; | |
240 sum -= *(--window) * *b0++; | |
241 sum -= *(--window) * *b0++; | |
242 sum -= *(--window) * *b0++; | |
243 sum -= *(--window) * *b0++; | |
244 sum -= *(--window) * *b0++; | |
245 sum -= *(--window) * *b0++; | |
246 sum -= *(--window) * *b0++; | |
247 | |
248 WRITE_SAMPLE(samples, sum, clip); | |
249 samples += step; | |
250 #if 0 | |
251 WRITE_SAMPLE(samples, sum, clip); | |
252 samples += step; | |
253 WRITE_SAMPLE(samples, sum, clip); | |
254 samples += step; | |
255 WRITE_SAMPLE(samples, sum, clip); | |
256 samples += step; | |
257 #endif | |
258 } | |
259 } | |
260 | |
261 *pnt += 32; | |
262 | |
263 return clip; | |
264 } |