Mercurial > mplayer.hg
annotate mp3lib/decod386.c @ 1291:36ed1692c0b8
video codec stuff moved to dec_video.c
author | arpi |
---|---|
date | Sun, 08 Jul 2001 00:21:20 +0000 |
parents | 50b8a3a5eeed |
children | 2052e18abd9d |
rev | line source |
---|---|
1 | 1 /* |
2 * Mpeg Layer-1,2,3 audio decoder | |
3 * ------------------------------ | |
4 * copyright (c) 1995,1996,1997 by Michael Hipp, All rights reserved. | |
5 * See also 'README' | |
6 * | |
7 * slighlty optimized for machines without autoincrement/decrement. | |
8 * The performance is highly compiler dependend. Maybe | |
9 * the decode.c version for 'normal' processor may be faster | |
10 * even for Intel processors. | |
11 */ | |
12 | |
13 | |
14 | |
15 /* new WRITE_SAMPLE */ | |
16 /* sizeof(int) == 4 */ | |
17 #define WRITE_SAMPLE(samples,sum,clip) { \ | |
18 double dtemp; long v; \ | |
19 dtemp = ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) + (sum);\ | |
20 v = ((*(int *)&dtemp) - 0x80000000); \ | |
21 if( v > 32767) { *(samples) = 0x7fff; (clip)++; } \ | |
22 else if( v < -32768) { *(samples) = -0x8000; (clip)++; } \ | |
23 else { *(samples) = v; } \ | |
24 } | |
25 | |
26 | |
27 /* | |
28 #define WRITE_SAMPLE(samples,sum,clip) { \ | |
29 double dtemp; int v; \ | |
30 dtemp = ((((65536.0 * 65536.0 * 16)+(65536.0 * 0.5))* 65536.0)) + (sum);\ | |
31 v = ((*(int *)&dtemp) - 0x80000000); \ | |
32 if( v > 32767) { *(samples) = 0x7fff; (clip)++; } \ | |
33 else if( v < -32768) { *(samples) = -0x8000; (clip)++; } \ | |
34 else { *(samples) = v; } \ | |
35 } | |
36 */ | |
37 | |
38 static int synth_1to1_mono(real *bandPtr,unsigned char *samples,int *pnt) | |
39 { | |
40 short samples_tmp[64]; | |
41 short *tmp1 = samples_tmp; | |
42 int i,ret; | |
43 int pnt1 = 0; | |
44 | |
45 ret = synth_1to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1); | |
46 samples += *pnt; | |
47 | |
48 for(i=0;i<32;i++) { | |
49 *( (short *) samples) = *tmp1; | |
50 samples += 2; | |
51 tmp1 += 2; | |
52 } | |
53 *pnt += 64; | |
54 | |
55 return ret; | |
56 } | |
57 | |
58 | |
59 static int synth_1to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt) | |
60 { | |
61 int i,ret; | |
62 | |
63 ret = synth_1to1(bandPtr,0,samples,pnt); | |
64 samples = samples + *pnt - 128; | |
65 | |
66 for(i=0;i<32;i++) { | |
67 ((short *)samples)[1] = ((short *)samples)[0]; | |
68 samples+=4; | |
69 } | |
70 | |
71 return ret; | |
72 } | |
73 | |
74 | |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
75 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
76 static int synth_1to1_l(real *bandPtr,int channel,unsigned char *out,int *pnt) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
77 { |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
78 int i,ret; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
79 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
80 ret = synth_1to1(bandPtr,channel,out,pnt); |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
81 out = out + *pnt - 128; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
82 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
83 for(i=0;i<32;i++) { |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
84 ((short *)out)[1] = ((short *)out)[0]; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
85 out+=4; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
86 } |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
87 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
88 return ret; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
89 } |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
90 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
91 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
92 static int synth_1to1_r(real *bandPtr,int channel,unsigned char *out,int *pnt) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
93 { |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
94 int i,ret; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
95 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
96 ret = synth_1to1(bandPtr,channel,out,pnt); |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
97 out = out + *pnt - 128; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
98 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
99 for(i=0;i<32;i++) { |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
100 ((short *)out)[0] = ((short *)out)[1]; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
101 out+=4; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
102 } |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
103 |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
104 return ret; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
105 } |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
106 #endif |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
1
diff
changeset
|
107 |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
108 synth_func_t synth_func; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
109 |
1258 | 110 #ifdef HAVE_MMX |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
111 int synth_1to1_MMX( real *bandPtr,int channel,short * samples) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
112 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
113 static short buffs[2][2][0x110]; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
114 static int bo = 1; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
115 synth_1to1_MMX_s(bandPtr, channel, samples, (short *) buffs, &bo); |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
116 return 0; |
1258 | 117 } |
118 #endif | |
1 | 119 static int synth_1to1(real *bandPtr,int channel,unsigned char *out,int *pnt) |
120 { | |
121 static real buffs[2][2][0x110]; | |
122 static const int step = 2; | |
123 static int bo = 1; | |
124 short *samples = (short *) (out + *pnt); | |
125 | |
126 real *b0,(*buf)[0x110]; | |
127 int clip = 0; | |
128 int bo1; | |
1258 | 129 #ifdef ARCH_X86 |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
130 if ( synth_func ) |
787 | 131 { |
132 int ret; | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
787
diff
changeset
|
133 ret=(*synth_func)( bandPtr,channel,samples); |
736 | 134 *pnt+=128; |
135 return ret; | |
136 } | |
1258 | 137 #endif |
1 | 138 if(!channel) { /* channel=0 */ |
139 bo--; | |
140 bo &= 0xf; | |
141 buf = buffs[0]; | |
142 } | |
143 else { | |
144 samples++; | |
145 buf = buffs[1]; | |
146 } | |
147 | |
148 if(bo & 0x1) { | |
149 b0 = buf[0]; | |
150 bo1 = bo; | |
151 dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr); | |
152 } | |
153 else { | |
154 b0 = buf[1]; | |
155 bo1 = bo+1; | |
156 dct64(buf[0]+bo,buf[1]+bo+1,bandPtr); | |
157 } | |
158 | |
159 { | |
160 register int j; | |
161 real *window = decwin + 16 - bo1; | |
162 | |
163 for (j=16;j;j--,b0+=0x10,window+=0x20,samples+=step) | |
164 { | |
165 real sum; | |
166 sum = window[0x0] * b0[0x0]; | |
167 sum -= window[0x1] * b0[0x1]; | |
168 sum += window[0x2] * b0[0x2]; | |
169 sum -= window[0x3] * b0[0x3]; | |
170 sum += window[0x4] * b0[0x4]; | |
171 sum -= window[0x5] * b0[0x5]; | |
172 sum += window[0x6] * b0[0x6]; | |
173 sum -= window[0x7] * b0[0x7]; | |
174 sum += window[0x8] * b0[0x8]; | |
175 sum -= window[0x9] * b0[0x9]; | |
176 sum += window[0xA] * b0[0xA]; | |
177 sum -= window[0xB] * b0[0xB]; | |
178 sum += window[0xC] * b0[0xC]; | |
179 sum -= window[0xD] * b0[0xD]; | |
180 sum += window[0xE] * b0[0xE]; | |
181 sum -= window[0xF] * b0[0xF]; | |
182 | |
183 WRITE_SAMPLE(samples,sum,clip); | |
184 } | |
185 | |
186 { | |
187 real sum; | |
188 sum = window[0x0] * b0[0x0]; | |
189 sum += window[0x2] * b0[0x2]; | |
190 sum += window[0x4] * b0[0x4]; | |
191 sum += window[0x6] * b0[0x6]; | |
192 sum += window[0x8] * b0[0x8]; | |
193 sum += window[0xA] * b0[0xA]; | |
194 sum += window[0xC] * b0[0xC]; | |
195 sum += window[0xE] * b0[0xE]; | |
196 WRITE_SAMPLE(samples,sum,clip); | |
197 b0-=0x10,window-=0x20,samples+=step; | |
198 } | |
199 window += bo1<<1; | |
200 | |
201 for (j=15;j;j--,b0-=0x10,window-=0x20,samples+=step) | |
202 { | |
203 real sum; | |
204 sum = -window[-0x1] * b0[0x0]; | |
205 sum -= window[-0x2] * b0[0x1]; | |
206 sum -= window[-0x3] * b0[0x2]; | |
207 sum -= window[-0x4] * b0[0x3]; | |
208 sum -= window[-0x5] * b0[0x4]; | |
209 sum -= window[-0x6] * b0[0x5]; | |
210 sum -= window[-0x7] * b0[0x6]; | |
211 sum -= window[-0x8] * b0[0x7]; | |
212 sum -= window[-0x9] * b0[0x8]; | |
213 sum -= window[-0xA] * b0[0x9]; | |
214 sum -= window[-0xB] * b0[0xA]; | |
215 sum -= window[-0xC] * b0[0xB]; | |
216 sum -= window[-0xD] * b0[0xC]; | |
217 sum -= window[-0xE] * b0[0xD]; | |
218 sum -= window[-0xF] * b0[0xE]; | |
219 sum -= window[-0x0] * b0[0xF]; | |
220 | |
221 WRITE_SAMPLE(samples,sum,clip); | |
222 } | |
223 } | |
224 *pnt += 128; | |
225 | |
226 return clip; | |
227 | |
228 } | |
229 |