Mercurial > mplayer.hg
annotate mp3lib/sr1.c @ 2316:bcb229557e9b
fixed alignment (static variables where sometimes not 8-byte aligned)
added half uv interpolation support
added prefetch
BGR15 support in MMX (untested) (so BGR15,16,24,32 are supported)
special unscaled height version (not much faster but it doesnt interpolate uv vertically)
author | michael |
---|---|
date | Sat, 20 Oct 2001 21:12:09 +0000 |
parents | 5eef9e69b145 |
children | 73c2e9304d08 |
rev | line source |
---|---|
1 | 1 // #define NEWBUFFERING |
2 //#define DEBUG_RESYNC | |
3 | |
4 /* 1 frame = 4608 byte PCM */ | |
5 | |
6 #ifdef __GNUC__ | |
7 #define LOCAL static inline | |
8 #else | |
9 #define LOCAL static _inline | |
10 #endif | |
11 | |
12 //#undef LOCAL | |
13 //#define LOCAL | |
14 | |
15 #include <stdlib.h> | |
16 #include <stdio.h> | |
17 #include <string.h> | |
18 #include <signal.h> | |
19 #include <math.h> | |
20 | |
21 #define real float | |
22 // #define int long | |
23 | |
24 #include "mpg123.h" | |
25 #include "huffman.h" | |
26 #include "mp3.h" | |
1040 | 27 #include "bswap.h" |
1 | 28 #include "d_cpu.h" |
29 | |
1045 | 30 #include "fastmemcpy.h" |
1 | 31 //static FILE* mp3_file=NULL; |
32 | |
33 int MP3_frames=0; | |
34 int MP3_eof=0; | |
35 int MP3_pause=0; | |
36 int MP3_filesize=0; | |
37 int MP3_fpos=0; // current file position | |
38 int MP3_framesize=0; // current framesize | |
39 int MP3_bitrate=0; // current bitrate | |
40 int MP3_samplerate=0; // current samplerate | |
41 int MP3_resync=0; | |
42 int MP3_channels=0; | |
43 int MP3_bps=2; | |
44 | |
45 static long outscale = 32768; | |
46 #include "tabinit.c" | |
47 | |
48 extern int mplayer_audio_read(char *buf,int size); | |
49 | |
50 #if 1 | |
51 LOCAL int mp3_read(char *buf,int size){ | |
52 // int len=fread(buf,1,size,mp3_file); | |
53 int len=mplayer_audio_read(buf,size); | |
54 if(len>0) MP3_fpos+=len; | |
55 // if(len!=size) MP3_eof=1; | |
56 return len; | |
57 } | |
58 #else | |
59 extern int mp3_read(char *buf,int size); | |
60 #endif | |
61 | |
62 //void mp3_seek(int pos){ | |
63 // fseek(mp3_file,pos,SEEK_SET); | |
64 // return (MP3_fpos=ftell(mp3_file)); | |
65 //} | |
66 | |
67 /* Frame reader */ | |
68 | |
69 #define MAXFRAMESIZE 1280 | |
70 #define MAXFRAMESIZE2 (512+MAXFRAMESIZE) | |
71 | |
72 static int fsizeold=0,ssize=0; | |
73 static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */ | |
74 static unsigned char *bsbufold=bsspace[0]+512; | |
75 static unsigned char *bsbuf=bsspace[1]+512; | |
76 static int bsnum=0; | |
77 | |
78 static int bitindex; | |
79 static unsigned char *wordpointer; | |
80 static int bitsleft; | |
81 | |
82 unsigned char *pcm_sample; /* az outbuffer CIME */ | |
83 int pcm_point = 0; /* ez az outbuffer pozicioja */ | |
84 | |
85 static struct frame fr; | |
86 | |
87 static int tabsel_123[2][3][16] = { | |
88 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, | |
89 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, | |
90 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, | |
91 | |
92 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, | |
93 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, | |
94 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } | |
95 }; | |
96 | |
97 static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 }; | |
98 | |
99 LOCAL unsigned int getbits(short number_of_bits) | |
100 { | |
101 unsigned long rval; | |
102 // if(MP3_frames>=7741) printf("getbits: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer); | |
103 if((bitsleft-=number_of_bits)<0) return 0; | |
104 if(!number_of_bits) return 0; | |
105 rval = wordpointer[0]; | |
106 rval <<= 8; | |
107 rval |= wordpointer[1]; | |
108 rval <<= 8; | |
109 rval |= wordpointer[2]; | |
110 rval <<= bitindex; | |
111 rval &= 0xffffff; | |
112 bitindex += number_of_bits; | |
113 rval >>= (24-number_of_bits); | |
114 wordpointer += (bitindex>>3); | |
115 bitindex &= 7; | |
116 return rval; | |
117 } | |
118 | |
119 | |
120 LOCAL unsigned int getbits_fast(short number_of_bits) | |
121 { | |
122 unsigned long rval; | |
123 // if(MP3_frames>=7741) printf("getbits_fast: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer); | |
124 if((bitsleft-=number_of_bits)<0) return 0; | |
125 if(!number_of_bits) return 0; | |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
126 #if ARCH_X86 |
1040 | 127 rval = bswap_16(*((unsigned short *)wordpointer)); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
128 #else |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
129 /* |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
130 * we may not be able to address unaligned 16-bit data on non-x86 cpus. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
131 * Fall back to some portable code. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
132 */ |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
133 rval = wordpointer[0] << 8 | wordpointer[1]; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
134 #endif |
1 | 135 rval <<= bitindex; |
136 rval &= 0xffff; | |
137 bitindex += number_of_bits; | |
138 rval >>= (16-number_of_bits); | |
139 wordpointer += (bitindex>>3); | |
140 bitindex &= 7; | |
141 return rval; | |
142 } | |
143 | |
144 LOCAL unsigned int get1bit(void) | |
145 { | |
146 unsigned char rval; | |
147 // if(MP3_frames>=7741) printf("get1bit: bitsleft=%d wordptr=%x\n",bitsleft,wordpointer); | |
148 if((--bitsleft)<0) return 0; | |
149 rval = *wordpointer << bitindex; | |
150 bitindex++; | |
151 wordpointer += (bitindex>>3); | |
152 bitindex &= 7; | |
153 return ((rval>>7)&1); | |
154 } | |
155 | |
156 LOCAL void set_pointer(long backstep) | |
157 { | |
158 // if(backstep!=512 && backstep>fsizeold) | |
159 // printf("\rWarning! backstep (%d>%d) \n",backstep,fsizeold); | |
160 wordpointer = bsbuf + ssize - backstep; | |
161 if (backstep) memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep); | |
162 bitindex = 0; | |
163 bitsleft+=8*backstep; | |
164 // printf("Backstep %d (bitsleft=%d)\n",backstep,bitsleft); | |
165 } | |
166 | |
167 LOCAL int stream_head_read(unsigned char *hbuf,unsigned long *newhead){ | |
168 if(mp3_read(hbuf,4) != 4) return FALSE; | |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
169 #if ARCH_X86 |
1040 | 170 *newhead = bswap_32(*((unsigned long *)hbuf)); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
171 #else |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
172 /* |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
173 * we may not be able to address unaligned 32-bit data on non-x86 cpus. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
174 * Fall back to some portable code. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
175 */ |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
176 *newhead = |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
177 hbuf[0] << 24 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
178 hbuf[1] << 16 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
179 hbuf[2] << 8 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
180 hbuf[3]; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
181 #endif |
1040 | 182 return TRUE; |
1 | 183 } |
184 | |
185 LOCAL int stream_head_shift(unsigned char *hbuf,unsigned long *head){ | |
1040 | 186 *((unsigned long *)hbuf) >>= 8; |
1 | 187 if(mp3_read(hbuf+3,1) != 1) return 0; |
188 *head <<= 8; | |
189 *head |= hbuf[3]; | |
190 return 1; | |
191 } | |
192 | |
193 /* | |
194 * decode a header and write the information | |
195 * into the frame structure | |
196 */ | |
197 LOCAL int decode_header(struct frame *fr,unsigned long newhead){ | |
198 | |
199 // head_check: | |
1040 | 200 if( (newhead & 0xffe00000) != 0xffe00000 || |
1045 | 201 (newhead & 0x0000fc00) == 0x0000fc00) return FALSE; |
1 | 202 |
203 fr->lay = 4-((newhead>>17)&3); | |
204 // if(fr->lay!=3) return FALSE; | |
205 | |
206 if( newhead & ((long)1<<20) ) { | |
207 fr->lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
208 fr->mpeg25 = 0; | |
209 } else { | |
210 fr->lsf = 1; | |
211 fr->mpeg25 = 1; | |
212 } | |
213 | |
214 if(fr->mpeg25) | |
215 fr->sampling_frequency = 6 + ((newhead>>10)&0x3); | |
216 else | |
217 fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); | |
218 | |
1166
95f6f14176c6
fr->sampling_frequency limitation (thanx to pl <p_l@tfz.net>)
arpi_esp
parents:
1045
diff
changeset
|
219 if(fr->sampling_frequency>8) return FALSE; // valid: 0..8 |
95f6f14176c6
fr->sampling_frequency limitation (thanx to pl <p_l@tfz.net>)
arpi_esp
parents:
1045
diff
changeset
|
220 |
1 | 221 fr->error_protection = ((newhead>>16)&0x1)^0x1; |
222 fr->bitrate_index = ((newhead>>12)&0xf); | |
223 fr->padding = ((newhead>>9)&0x1); | |
224 fr->extension = ((newhead>>8)&0x1); | |
225 fr->mode = ((newhead>>6)&0x3); | |
226 fr->mode_ext = ((newhead>>4)&0x3); | |
227 fr->copyright = ((newhead>>3)&0x1); | |
228 fr->original = ((newhead>>2)&0x1); | |
229 fr->emphasis = newhead & 0x3; | |
230 | |
231 MP3_channels = fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; | |
232 | |
233 if(!fr->bitrate_index){ | |
234 // fprintf(stderr,"Free format not supported.\n"); | |
235 return FALSE; | |
236 } | |
237 | |
238 switch(fr->lay){ | |
239 case 2: | |
240 MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index]; | |
241 MP3_samplerate=freqs[fr->sampling_frequency]; | |
242 fr->framesize = (long) MP3_bitrate * 144000; | |
243 fr->framesize /= MP3_samplerate; | |
244 MP3_framesize=fr->framesize; | |
245 fr->framesize += fr->padding - 4; | |
246 break; | |
247 case 3: | |
248 if(fr->lsf) | |
249 ssize = (fr->stereo == 1) ? 9 : 17; | |
250 else | |
251 ssize = (fr->stereo == 1) ? 17 : 32; | |
252 if(fr->error_protection) ssize += 2; | |
253 | |
254 MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index]; | |
255 MP3_samplerate=freqs[fr->sampling_frequency]; | |
256 fr->framesize = (long) MP3_bitrate * 144000; | |
257 fr->framesize /= MP3_samplerate<<(fr->lsf); | |
258 MP3_framesize=fr->framesize; | |
259 fr->framesize += fr->padding - 4; | |
260 break; | |
261 default: | |
262 // fprintf(stderr,"Sorry, unsupported layer type.\n"); | |
263 return 0; | |
264 } | |
265 if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE; | |
266 | |
267 return 1; | |
268 } | |
269 | |
270 | |
271 LOCAL int stream_read_frame_body(int size){ | |
272 | |
273 /* flip/init buffer for Layer 3 */ | |
274 bsbufold = bsbuf; | |
275 bsbuf = bsspace[bsnum]+512; | |
276 bsnum = (bsnum + 1) & 1; | |
277 | |
278 if( mp3_read(bsbuf,size) != size) return 0; // broken frame | |
279 | |
280 bitindex = 0; | |
281 wordpointer = (unsigned char *) bsbuf; | |
282 bitsleft=8*size; | |
283 | |
284 return 1; | |
285 } | |
286 | |
287 | |
288 /***************************************************************** | |
289 * read next frame return number of frames read. | |
290 */ | |
291 LOCAL int read_frame(struct frame *fr){ | |
292 unsigned long newhead; | |
293 unsigned char hbuf[8]; | |
294 int skipped,resyncpos; | |
295 int frames=0; | |
296 | |
297 resync: | |
298 skipped=MP3_fpos; | |
299 resyncpos=MP3_fpos; | |
300 | |
301 set_pointer(512); | |
302 fsizeold=fr->framesize; /* for Layer3 */ | |
303 if(!stream_head_read(hbuf,&newhead)) return 0; | |
304 if(!decode_header(fr,newhead)){ | |
305 // invalid header! try to resync stream! | |
306 #ifdef DEBUG_RESYNC | |
307 printf("ReSync: searching for a valid header... (pos=%X)\n",MP3_fpos); | |
308 #endif | |
309 retry1: | |
310 while(!decode_header(fr,newhead)){ | |
311 if(!stream_head_shift(hbuf,&newhead)) return 0; | |
312 } | |
313 resyncpos=MP3_fpos-4; | |
314 // found valid header | |
315 #ifdef DEBUG_RESYNC | |
316 printf("ReSync: found valid hdr at %X fsize=%ld ",resyncpos,fr->framesize); | |
317 #endif | |
318 if(!stream_read_frame_body(fr->framesize)) return 0; // read body | |
319 set_pointer(512); | |
320 fsizeold=fr->framesize; /* for Layer3 */ | |
321 if(!stream_head_read(hbuf,&newhead)) return 0; | |
322 if(!decode_header(fr,newhead)){ | |
323 // invalid hdr! go back... | |
324 #ifdef DEBUG_RESYNC | |
325 printf("INVALID\n"); | |
326 #endif | |
327 // mp3_seek(resyncpos+1); | |
328 if(!stream_head_read(hbuf,&newhead)) return 0; | |
329 goto retry1; | |
330 } | |
331 #ifdef DEBUG_RESYNC | |
332 printf("OK!\n"); | |
333 ++frames; | |
334 #endif | |
335 } | |
336 | |
337 skipped=resyncpos-skipped; | |
338 // if(skipped && !MP3_resync) printf("\r%d bad bytes skipped (resync at 0x%X) \n",skipped,resyncpos); | |
339 | |
340 // printf("%8X [%08X] %d %d (%d)%s%s\n",MP3_fpos-4,newhead,fr->framesize,fr->mode,fr->mode_ext,fr->error_protection?" CRC":"",fr->padding?" PAD":""); | |
341 | |
342 /* read main data into memory */ | |
343 if(!stream_read_frame_body(fr->framesize)){ | |
344 printf("\nBroken frame at 0x%X \n",resyncpos); | |
345 return 0; | |
346 } | |
347 ++frames; | |
348 | |
349 if(MP3_resync){ | |
350 MP3_resync=0; | |
351 if(frames==1) goto resync; | |
352 } | |
353 | |
354 return frames; | |
355 } | |
356 | |
357 #include "layer2.c" | |
358 #include "layer3.c" | |
359 | |
360 /******************************************************************************/ | |
361 /* PUBLIC FUNCTIONS */ | |
362 /******************************************************************************/ | |
363 | |
364 static int tables_done_flag=0; | |
365 | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
366 /* It's hidden from gcc in assembler */ |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
367 extern void dct64_MMX( void ); |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
368 extern void dct64_MMX_3dnow( void ); |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
369 extern void dct64_MMX_3dnowex( void ); |
1393 | 370 extern void dct64_MMX_sse( void ); |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
371 void (*dct64_MMX_func)( void ); |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
372 |
1 | 373 // Init decoder tables. Call first, once! |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
374 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
375 void MP3_Init(int fakemono){ |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
376 #else |
1 | 377 void MP3_Init(){ |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
378 #endif |
1253 | 379 #ifdef ARCH_X86 |
1 | 380 _CpuID=CpuDetect(); |
381 _i586=ipentium(); | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
382 #ifndef HAVE_MMX |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
383 _i586 &= 1; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
384 #endif |
1 | 385 _3dnow=a3dnow(); |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
386 #ifndef HAVE_3DNOW |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
387 _3dnow = 0; |
1 | 388 #endif |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
389 #ifndef HAVE_3DNOWEX |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
390 _3dnow &= 1; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
391 #endif |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
392 _isse=isse(); |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
393 #ifndef HAVE_SSE |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
394 _isse = 0; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
395 #endif |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
396 #ifndef HAVE_SSE2 |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
397 _isse &= 1; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
398 #endif |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
399 _has_mmx=_i586>1||_3dnow||_isse; |
1 | 400 printf( "mp3lib: Processor ID: %x\n",_CpuID ); |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
401 if(_i586&&!_3dnow&&!_isse) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
402 printf( "mp3lib: Using Pentium%s optimized decore.\n",(_i586>1?"-MMX":"")); |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
403 else |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
404 if(_isse) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
405 /* |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
406 Note: It's ok, Since K8 will have SSE2 support and will much faster |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
407 of P4 ;) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
408 */ |
1393 | 409 printf( "mp3lib: Using SSE%s! optimized decore.\n",(_isse>1?"2":"")); |
410 // printf( "mp3lib: Using Pentium%s optimized decore.\n",(_i586>1?"-MMX":"")); | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
411 else |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
412 if(_3dnow) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
413 printf( "mp3lib: Using AMD 3dnow%s! optimized decore.\n",(_3dnow>1?"-dsp(k7)":"")); |
1253 | 414 #else |
415 _CpuID = _i586 = _3dnow = _isse = _has_mmx = 0; | |
416 printf( "mp3lib: Using generic decore.\n"); | |
417 #endif | |
1276 | 418 #ifdef HAVE_MMX |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
419 /* Use it for any MMX cpu */ |
1276 | 420 if(_has_mmx) |
421 make_decode_tables_MMX(outscale); | |
422 else | |
423 #endif | |
424 make_decode_tables(outscale); | |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
425 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
426 if (fakemono == 1) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
427 fr.synth=synth_1to1_l; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
428 else if (fakemono == 2) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
429 fr.synth=synth_1to1_r; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
430 else |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
431 fr.synth=synth_1to1; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
432 #else |
1 | 433 fr.synth=synth_1to1; |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
434 #endif |
1 | 435 fr.synth_mono=synth_1to1_mono2stereo; |
436 fr.down_sample=0; | |
437 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample); | |
438 init_layer2(); | |
439 init_layer3(fr.down_sample_sblimit); | |
440 tables_done_flag=1; | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
441 |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
442 dct36_func=dct36; |
1258 | 443 #ifdef HAVE_SSE |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
444 if(_isse) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
445 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
446 synth_func=synth_1to1_MMX; |
1393 | 447 dct64_MMX_func=dct64_MMX_sse; |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
448 } |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
449 else |
1258 | 450 #endif |
451 #ifdef HAVE_3DNOWEX | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
452 if ( _3dnow > 1 ) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
453 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
454 synth_func=synth_1to1_MMX; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
455 dct36_func=dct36_3dnowex; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
456 dct64_MMX_func=dct64_MMX_3dnowex; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
457 } |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
458 else |
1258 | 459 #endif |
460 #ifdef HAVE_3DNOW | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
461 if ( _3dnow ) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
462 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
463 synth_func=synth_1to1_MMX; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
464 dct36_func=dct36_3dnow; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
465 dct64_MMX_func=dct64_MMX_3dnow; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
466 } |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
467 else |
1258 | 468 #endif |
469 #ifdef HAVE_MMX | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
470 if ( _i586 > 1) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
471 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
472 synth_func=synth_1to1_MMX; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
473 dct64_MMX_func=dct64_MMX; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
474 } |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
475 else |
1258 | 476 #endif |
477 #ifdef ARCH_X86 | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
478 if ( _i586 ) |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
479 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
480 synth_func=synth_1to1_pent; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
481 } |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
482 else |
1258 | 483 #endif |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
484 { |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
485 synth_func = NULL; |
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
486 } |
1 | 487 } |
488 | |
489 #if 0 | |
490 | |
491 void MP3_Close(){ | |
492 MP3_eof=1; | |
493 if(mp3_file) fclose(mp3_file); | |
494 mp3_file=NULL; | |
495 } | |
496 | |
497 // Open a file, init buffers. Call once per file! | |
498 int MP3_Open(char *filename,int buffsize){ | |
499 MP3_eof=1; // lock decoding | |
500 MP3_pause=1; // lock playing | |
501 if(mp3_file) MP3_Close(); // close prev. file | |
502 MP3_frames=0; | |
503 | |
504 mp3_file=fopen(filename,"rb"); | |
505 // printf("MP3_Open: file='%s'",filename); | |
506 // if(!mp3_file){ printf(" not found!\n"); return 0;} else printf("Ok!\n"); | |
507 if(!mp3_file) return 0; | |
508 | |
509 MP3_filesize=MP3_PrintTAG(); | |
510 fseek(mp3_file,0,SEEK_SET); | |
511 | |
512 MP3_InitBuffers(buffsize); | |
513 if(!tables_done_flag) MP3_Init(); | |
514 MP3_eof=0; // allow decoding | |
515 MP3_pause=0; // allow playing | |
516 return MP3_filesize; | |
517 } | |
518 | |
519 #endif | |
520 | |
521 // Read & decode a single frame. Called by sound driver. | |
522 int MP3_DecodeFrame(unsigned char *hova,short single){ | |
523 pcm_sample = hova; | |
524 pcm_point = 0; | |
525 if(!read_frame(&fr))return(0); | |
526 if(single==-2){ set_pointer(512); return(1); } | |
527 if(fr.error_protection) getbits(16); /* skip crc */ | |
528 fr.single=single; | |
529 switch(fr.lay){ | |
530 case 2: do_layer2(&fr,single);break; | |
531 case 3: do_layer3(&fr,single);break; | |
532 } | |
533 // ++MP3_frames; | |
534 return(pcm_point?pcm_point:2); | |
535 } | |
536 | |
537 #if 0 | |
538 | |
539 // Prints last frame header in ascii. | |
540 void MP3_PrintHeader(){ | |
541 static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; | |
542 static char *layers[4] = { "???" , "I", "II", "III" }; | |
543 | |
544 printf("\rMPEG %s, Layer %s, %ld Hz %d kbit %s, BPF : %ld\n", | |
545 fr.mpeg25 ? "2.5" : (fr.lsf ? "2.0" : "1.0"), | |
546 layers[fr.lay],freqs[fr.sampling_frequency], | |
547 tabsel_123[fr.lsf][fr.lay-1][fr.bitrate_index], | |
548 modes[fr.mode],fr.framesize+4); | |
549 printf("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n\n", | |
550 fr.stereo,fr.copyright?"Yes":"No", | |
551 fr.original?"Yes":"No",fr.error_protection?"Yes":"No", | |
552 fr.emphasis); | |
553 } | |
554 | |
555 #include "genre.h" | |
556 | |
557 // Read & print ID3 TAG. Do not call when playing!!! returns filesize. | |
558 int MP3_PrintTAG(){ | |
559 struct id3tag { | |
560 char tag[3]; | |
561 char title[30]; | |
562 char artist[30]; | |
563 char album[30]; | |
564 char year[4]; | |
565 char comment[30]; | |
566 unsigned char genre; | |
567 }; | |
568 struct id3tag tag; | |
569 char title[31]={0,}; | |
570 char artist[31]={0,}; | |
571 char album[31]={0,}; | |
572 char year[5]={0,}; | |
573 char comment[31]={0,}; | |
574 char genre[31]={0,}; | |
575 int fsize; | |
576 int ret; | |
577 | |
578 fseek(mp3_file,0,SEEK_END); | |
579 fsize=ftell(mp3_file); | |
580 if(fseek(mp3_file,-128,SEEK_END)) return fsize; | |
581 ret=fread(&tag,128,1,mp3_file); | |
582 if(ret!=1 || tag.tag[0]!='T' || tag.tag[1]!='A' || tag.tag[2]!='G') return fsize; | |
583 | |
584 strncpy(title,tag.title,30); | |
585 strncpy(artist,tag.artist,30); | |
586 strncpy(album,tag.album,30); | |
587 strncpy(year,tag.year,4); | |
588 strncpy(comment,tag.comment,30); | |
589 | |
590 if ( tag.genre <= sizeof(genre_table)/sizeof(*genre_table) ) { | |
591 strncpy(genre, genre_table[tag.genre], 30); | |
592 } else { | |
593 strncpy(genre,"Unknown",30); | |
594 } | |
595 | |
596 // printf("\n"); | |
597 printf("Title : %30s Artist: %s\n",title,artist); | |
598 printf("Album : %30s Year : %4s\n",album,year); | |
599 printf("Comment: %30s Genre : %s\n",comment,genre); | |
600 printf("\n"); | |
601 return fsize-128; | |
602 } | |
603 | |
604 #endif |