Mercurial > SDL_sound_CoreAudio
comparison decoders/libmpg123/decode_2to1.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 decode_2to1.c: ...with 2to1 downsampling | |
3 | |
4 copyright 1995-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 #include "mpg123lib_intern.h" | |
10 | |
11 int synth_2to1_8bit(real *bandPtr, int channel, mpg123_handle *fr, int final) | |
12 { | |
13 sample_t samples_tmp[32]; | |
14 sample_t *tmp1 = samples_tmp + channel; | |
15 int i,ret; | |
16 | |
17 unsigned char *samples = fr->buffer.data; | |
18 int pnt = fr->buffer.fill; | |
19 fr->buffer.data = (unsigned char*) samples_tmp; | |
20 fr->buffer.fill = 0; | |
21 ret = synth_2to1(bandPtr,channel, fr, 0); | |
22 fr->buffer.data = samples; | |
23 | |
24 samples += channel + pnt; | |
25 for(i=0;i<16;i++) { | |
26 #ifdef FLOATOUT | |
27 *samples = 0; | |
28 #else | |
29 *samples = fr->conv16to8[*tmp1>>AUSHIFT]; | |
30 #endif | |
31 samples += 2; | |
32 tmp1 += 2; | |
33 } | |
34 fr->buffer.fill = pnt + (final ? 32 : 0); | |
35 | |
36 return ret; | |
37 } | |
38 | |
39 int synth_2to1_8bit_mono(real *bandPtr, mpg123_handle *fr) | |
40 { | |
41 sample_t samples_tmp[32]; | |
42 sample_t *tmp1 = samples_tmp; | |
43 int i,ret; | |
44 | |
45 unsigned char *samples = fr->buffer.data; | |
46 int pnt = fr->buffer.fill; | |
47 fr->buffer.data = (unsigned char*) samples_tmp; | |
48 fr->buffer.fill = 0; | |
49 ret = synth_2to1(bandPtr, 0, fr, 0); | |
50 fr->buffer.data = samples; | |
51 | |
52 samples += pnt; | |
53 for(i=0;i<16;i++) { | |
54 #ifdef FLOATOUT | |
55 *samples++ = 0; | |
56 #else | |
57 *samples++ = fr->conv16to8[*tmp1>>AUSHIFT]; | |
58 #endif | |
59 tmp1 += 2; | |
60 } | |
61 fr->buffer.fill = pnt + 16; | |
62 | |
63 return ret; | |
64 } | |
65 | |
66 | |
67 int synth_2to1_8bit_mono2stereo(real *bandPtr, mpg123_handle *fr) | |
68 { | |
69 sample_t samples_tmp[32]; | |
70 sample_t *tmp1 = samples_tmp; | |
71 int i,ret; | |
72 | |
73 unsigned char *samples = fr->buffer.data; | |
74 int pnt = fr->buffer.fill; | |
75 fr->buffer.data = (unsigned char*) samples_tmp; | |
76 fr->buffer.fill = 0; | |
77 ret = synth_2to1(bandPtr,0, fr, 0); | |
78 fr->buffer.data = samples; | |
79 | |
80 samples += pnt; | |
81 for(i=0;i<16;i++) { | |
82 #ifdef FLOATOUT | |
83 *samples++ = 0; | |
84 *samples++ = 0; | |
85 #else | |
86 *samples++ = fr->conv16to8[*tmp1>>AUSHIFT]; | |
87 *samples++ = fr->conv16to8[*tmp1>>AUSHIFT]; | |
88 #endif | |
89 tmp1 += 2; | |
90 } | |
91 fr->buffer.fill = pnt + 32; | |
92 | |
93 return ret; | |
94 } | |
95 | |
96 int synth_2to1_mono(real *bandPtr, mpg123_handle *fr) | |
97 { | |
98 sample_t samples_tmp[32]; | |
99 sample_t *tmp1 = samples_tmp; | |
100 int i,ret; | |
101 | |
102 unsigned char *samples = fr->buffer.data; | |
103 int pnt = fr->buffer.fill; | |
104 fr->buffer.data = (unsigned char*) samples_tmp; | |
105 fr->buffer.fill = 0; | |
106 ret = synth_2to1(bandPtr, 0, fr, 0); | |
107 fr->buffer.data = samples; | |
108 | |
109 samples += pnt; | |
110 for(i=0;i<16;i++) { | |
111 *( (sample_t *) samples) = *tmp1; | |
112 samples += sizeof(sample_t); | |
113 tmp1 += 2; | |
114 } | |
115 fr->buffer.fill = pnt + 16*sizeof(sample_t); | |
116 | |
117 return ret; | |
118 } | |
119 | |
120 int synth_2to1_mono2stereo(real *bandPtr, mpg123_handle *fr) | |
121 { | |
122 int i,ret; | |
123 unsigned char *samples = fr->buffer.data; | |
124 | |
125 ret = synth_2to1(bandPtr,0, fr, 1); | |
126 samples += fr->buffer.fill - 32*sizeof(sample_t); | |
127 | |
128 for(i=0;i<16;i++) { | |
129 ((sample_t *)samples)[1] = ((sample_t *)samples)[0]; | |
130 samples+=2*sizeof(sample_t); | |
131 } | |
132 | |
133 return ret; | |
134 } | |
135 | |
136 int synth_2to1(real *bandPtr,int channel, mpg123_handle *fr, int final) | |
137 { | |
138 static const int step = 2; | |
139 sample_t *samples = (sample_t *) (fr->buffer.data + fr->buffer.fill); | |
140 | |
141 real *b0, **buf; /* (*buf)[0x110]; */ | |
142 int clip = 0; | |
143 int bo1; | |
144 | |
145 if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer); | |
146 | |
147 if(!channel) { | |
148 fr->bo[0]--; | |
149 fr->bo[0] &= 0xf; | |
150 buf = fr->real_buffs[0]; | |
151 } | |
152 else { | |
153 samples++; | |
154 buf = fr->real_buffs[1]; | |
155 } | |
156 | |
157 if(fr->bo[0] & 0x1) { | |
158 b0 = buf[0]; | |
159 bo1 = fr->bo[0]; | |
160 opt_dct64(fr)(buf[1]+((fr->bo[0]+1)&0xf),buf[0]+fr->bo[0],bandPtr); | |
161 } | |
162 else { | |
163 b0 = buf[1]; | |
164 bo1 = fr->bo[0]+1; | |
165 opt_dct64(fr)(buf[0]+fr->bo[0],buf[1]+fr->bo[0]+1,bandPtr); | |
166 } | |
167 | |
168 { | |
169 register int j; | |
170 real *window = opt_decwin(fr) + 16 - bo1; | |
171 | |
172 for (j=8;j;j--,b0+=0x10,window+=0x30) | |
173 { | |
174 real sum; | |
175 sum = REAL_MUL(*window++, *b0++); | |
176 sum -= REAL_MUL(*window++, *b0++); | |
177 sum += REAL_MUL(*window++, *b0++); | |
178 sum -= REAL_MUL(*window++, *b0++); | |
179 sum += REAL_MUL(*window++, *b0++); | |
180 sum -= REAL_MUL(*window++, *b0++); | |
181 sum += REAL_MUL(*window++, *b0++); | |
182 sum -= REAL_MUL(*window++, *b0++); | |
183 sum += REAL_MUL(*window++, *b0++); | |
184 sum -= REAL_MUL(*window++, *b0++); | |
185 sum += REAL_MUL(*window++, *b0++); | |
186 sum -= REAL_MUL(*window++, *b0++); | |
187 sum += REAL_MUL(*window++, *b0++); | |
188 sum -= REAL_MUL(*window++, *b0++); | |
189 sum += REAL_MUL(*window++, *b0++); | |
190 sum -= REAL_MUL(*window++, *b0++); | |
191 | |
192 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
193 #if 0 | |
194 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
195 #endif | |
196 } | |
197 | |
198 { | |
199 real sum; | |
200 sum = REAL_MUL(window[0x0], b0[0x0]); | |
201 sum += REAL_MUL(window[0x2], b0[0x2]); | |
202 sum += REAL_MUL(window[0x4], b0[0x4]); | |
203 sum += REAL_MUL(window[0x6], b0[0x6]); | |
204 sum += REAL_MUL(window[0x8], b0[0x8]); | |
205 sum += REAL_MUL(window[0xA], b0[0xA]); | |
206 sum += REAL_MUL(window[0xC], b0[0xC]); | |
207 sum += REAL_MUL(window[0xE], b0[0xE]); | |
208 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
209 #if 0 | |
210 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
211 #endif | |
212 b0-=0x20,window-=0x40; | |
213 } | |
214 window += bo1<<1; | |
215 | |
216 for (j=7;j;j--,b0-=0x30,window-=0x30) | |
217 { | |
218 real sum; | |
219 sum = REAL_MUL(-*(--window), *b0++); | |
220 sum -= REAL_MUL(*(--window), *b0++); | |
221 sum -= REAL_MUL(*(--window), *b0++); | |
222 sum -= REAL_MUL(*(--window), *b0++); | |
223 sum -= REAL_MUL(*(--window), *b0++); | |
224 sum -= REAL_MUL(*(--window), *b0++); | |
225 sum -= REAL_MUL(*(--window), *b0++); | |
226 sum -= REAL_MUL(*(--window), *b0++); | |
227 sum -= REAL_MUL(*(--window), *b0++); | |
228 sum -= REAL_MUL(*(--window), *b0++); | |
229 sum -= REAL_MUL(*(--window), *b0++); | |
230 sum -= REAL_MUL(*(--window), *b0++); | |
231 sum -= REAL_MUL(*(--window), *b0++); | |
232 sum -= REAL_MUL(*(--window), *b0++); | |
233 sum -= REAL_MUL(*(--window), *b0++); | |
234 sum -= REAL_MUL(*(--window), *b0++); | |
235 | |
236 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
237 #if 0 | |
238 WRITE_SAMPLE(samples,sum,clip); samples += step; | |
239 #endif | |
240 } | |
241 } | |
242 | |
243 if(final) fr->buffer.fill += 32*sizeof(sample_t); | |
244 | |
245 return clip; | |
246 } | |
247 | |
248 |