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 }