Mercurial > mplayer.hg
annotate mp3lib/sr1.c @ 23011:365eef1fc4f0
Disable caching of rotated glyphs.
The following commits will add perspective distortion to the glyphs rotated
with \frx and \fry. Somewhere along the way correct caching of such glyphs
will become impossible, but in the end everything will be fine.
author | eugeni |
---|---|
date | Fri, 20 Apr 2007 22:49:48 +0000 |
parents | 0cd17afe1d4b |
children | 84eaacdc380d |
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" | |
21372 | 27 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21372
diff
changeset
|
28 #include "mpbswap.h" |
16989 | 29 #include "cpudetect.h" |
30 //#include "liba52/mm_accel.h" | |
31 #include "mp_msg.h" | |
1 | 32 |
19431
ac69ba536915
Explicitly include libmpcodecs/img_format.h and libvo/fastmemcpy.h.
diego
parents:
19133
diff
changeset
|
33 #include "libvo/fastmemcpy.h" |
4262 | 34 |
20575 | 35 #ifdef ARCH_X86_32 |
4262 | 36 #define CAN_COMPILE_X86_ASM |
37 #endif | |
38 | |
1 | 39 //static FILE* mp3_file=NULL; |
40 | |
41 int MP3_frames=0; | |
42 int MP3_eof=0; | |
43 int MP3_pause=0; | |
44 int MP3_filesize=0; | |
45 int MP3_fpos=0; // current file position | |
46 int MP3_framesize=0; // current framesize | |
47 int MP3_bitrate=0; // current bitrate | |
48 int MP3_samplerate=0; // current samplerate | |
17300 | 49 int MP3_resync=0; |
1 | 50 int MP3_channels=0; |
51 int MP3_bps=2; | |
52 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
53 static long outscale = 32768; |
1 | 54 #include "tabinit.c" |
55 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
56 #if 1 |
1 | 57 extern int mplayer_audio_read(char *buf,int size); |
58 | |
59 LOCAL int mp3_read(char *buf,int size){ | |
60 // int len=fread(buf,1,size,mp3_file); | |
61 int len=mplayer_audio_read(buf,size); | |
62 if(len>0) MP3_fpos+=len; | |
63 // if(len!=size) MP3_eof=1; | |
64 return len; | |
65 } | |
66 #else | |
67 extern int mp3_read(char *buf,int size); | |
68 #endif | |
15167
07e7a572bd84
Mark modified imported files as such to comply with (L)GPL ¡ø2a.
diego
parents:
13946
diff
changeset
|
69 /* |
18783 | 70 * Modified for use with MPlayer, for details see the changelog at |
71 * http://svn.mplayerhq.hu/mplayer/trunk/ | |
15167
07e7a572bd84
Mark modified imported files as such to comply with (L)GPL ¡ø2a.
diego
parents:
13946
diff
changeset
|
72 * $Id$ |
07e7a572bd84
Mark modified imported files as such to comply with (L)GPL ¡ø2a.
diego
parents:
13946
diff
changeset
|
73 */ |
07e7a572bd84
Mark modified imported files as such to comply with (L)GPL ¡ø2a.
diego
parents:
13946
diff
changeset
|
74 |
1 | 75 |
76 //void mp3_seek(int pos){ | |
77 // fseek(mp3_file,pos,SEEK_SET); | |
78 // return (MP3_fpos=ftell(mp3_file)); | |
79 //} | |
80 | |
81 /* Frame reader */ | |
82 | |
83 #define MAXFRAMESIZE 1280 | |
84 #define MAXFRAMESIZE2 (512+MAXFRAMESIZE) | |
85 | |
86 static int fsizeold=0,ssize=0; | |
87 static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */ | |
88 static unsigned char *bsbufold=bsspace[0]+512; | |
89 static unsigned char *bsbuf=bsspace[1]+512; | |
90 static int bsnum=0; | |
91 | |
92 static int bitindex; | |
93 static unsigned char *wordpointer; | |
94 static int bitsleft; | |
95 | |
12131
d155623271e3
fix symbol clashes when linking with libmp3lame including mp3 decoder, man, mp3lib is so much bloated
alex
parents:
11241
diff
changeset
|
96 static unsigned char *pcm_sample; /* outbuffer address */ |
d155623271e3
fix symbol clashes when linking with libmp3lame including mp3 decoder, man, mp3lib is so much bloated
alex
parents:
11241
diff
changeset
|
97 static int pcm_point = 0; /* outbuffer offset */ |
1 | 98 |
99 static struct frame fr; | |
100 | |
101 static int tabsel_123[2][3][16] = { | |
102 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,}, | |
103 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,}, | |
104 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} }, | |
105 | |
106 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,}, | |
107 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,}, | |
108 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} } | |
109 }; | |
110 | |
111 static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 }; | |
112 | |
113 LOCAL unsigned int getbits(short number_of_bits) | |
114 { | |
115 unsigned long rval; | |
116 // if(MP3_frames>=7741) printf("getbits: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer); | |
117 if((bitsleft-=number_of_bits)<0) return 0; | |
118 if(!number_of_bits) return 0; | |
119 rval = wordpointer[0]; | |
120 rval <<= 8; | |
121 rval |= wordpointer[1]; | |
122 rval <<= 8; | |
123 rval |= wordpointer[2]; | |
124 rval <<= bitindex; | |
125 rval &= 0xffffff; | |
126 bitindex += number_of_bits; | |
127 rval >>= (24-number_of_bits); | |
128 wordpointer += (bitindex>>3); | |
129 bitindex &= 7; | |
130 return rval; | |
131 } | |
132 | |
133 | |
134 LOCAL unsigned int getbits_fast(short number_of_bits) | |
135 { | |
136 unsigned long rval; | |
137 // if(MP3_frames>=7741) printf("getbits_fast: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer); | |
138 if((bitsleft-=number_of_bits)<0) return 0; | |
139 if(!number_of_bits) return 0; | |
4321 | 140 #if defined(CAN_COMPILE_X86_ASM) |
1040 | 141 rval = bswap_16(*((unsigned short *)wordpointer)); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
142 #else |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
143 /* |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
144 * 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
|
145 * Fall back to some portable code. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
146 */ |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
147 rval = wordpointer[0] << 8 | wordpointer[1]; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
148 #endif |
1 | 149 rval <<= bitindex; |
150 rval &= 0xffff; | |
151 bitindex += number_of_bits; | |
152 rval >>= (16-number_of_bits); | |
153 wordpointer += (bitindex>>3); | |
154 bitindex &= 7; | |
155 return rval; | |
156 } | |
157 | |
158 LOCAL unsigned int get1bit(void) | |
159 { | |
160 unsigned char rval; | |
161 // if(MP3_frames>=7741) printf("get1bit: bitsleft=%d wordptr=%x\n",bitsleft,wordpointer); | |
162 if((--bitsleft)<0) return 0; | |
163 rval = *wordpointer << bitindex; | |
164 bitindex++; | |
165 wordpointer += (bitindex>>3); | |
166 bitindex &= 7; | |
167 return ((rval>>7)&1); | |
168 } | |
169 | |
170 LOCAL void set_pointer(long backstep) | |
171 { | |
172 // if(backstep!=512 && backstep>fsizeold) | |
173 // printf("\rWarning! backstep (%d>%d) \n",backstep,fsizeold); | |
174 wordpointer = bsbuf + ssize - backstep; | |
175 if (backstep) memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep); | |
176 bitindex = 0; | |
177 bitsleft+=8*backstep; | |
178 // printf("Backstep %d (bitsleft=%d)\n",backstep,bitsleft); | |
179 } | |
180 | |
181 LOCAL int stream_head_read(unsigned char *hbuf,unsigned long *newhead){ | |
182 if(mp3_read(hbuf,4) != 4) return FALSE; | |
4321 | 183 #if defined(CAN_COMPILE_X86_ASM) |
1040 | 184 *newhead = bswap_32(*((unsigned long *)hbuf)); |
1309
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
185 #else |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
186 /* |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
187 * 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
|
188 * Fall back to some portable code. |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
189 */ |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
190 *newhead = |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
191 hbuf[0] << 24 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
192 hbuf[1] << 16 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
193 hbuf[2] << 8 | |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
194 hbuf[3]; |
598e3047ce13
Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents:
1276
diff
changeset
|
195 #endif |
1040 | 196 return TRUE; |
1 | 197 } |
198 | |
199 LOCAL int stream_head_shift(unsigned char *hbuf,unsigned long *head){ | |
1040 | 200 *((unsigned long *)hbuf) >>= 8; |
1 | 201 if(mp3_read(hbuf+3,1) != 1) return 0; |
202 *head <<= 8; | |
203 *head |= hbuf[3]; | |
204 return 1; | |
205 } | |
206 | |
207 /* | |
208 * decode a header and write the information | |
209 * into the frame structure | |
210 */ | |
211 LOCAL int decode_header(struct frame *fr,unsigned long newhead){ | |
212 | |
213 // head_check: | |
1040 | 214 if( (newhead & 0xffe00000) != 0xffe00000 || |
1045 | 215 (newhead & 0x0000fc00) == 0x0000fc00) return FALSE; |
1 | 216 |
217 fr->lay = 4-((newhead>>17)&3); | |
218 // if(fr->lay!=3) return FALSE; | |
219 | |
220 if( newhead & ((long)1<<20) ) { | |
221 fr->lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1; | |
222 fr->mpeg25 = 0; | |
223 } else { | |
224 fr->lsf = 1; | |
225 fr->mpeg25 = 1; | |
226 } | |
227 | |
228 if(fr->mpeg25) | |
229 fr->sampling_frequency = 6 + ((newhead>>10)&0x3); | |
230 else | |
231 fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3); | |
232 | |
1166
95f6f14176c6
fr->sampling_frequency limitation (thanx to pl <p_l@tfz.net>)
arpi_esp
parents:
1045
diff
changeset
|
233 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
|
234 |
1 | 235 fr->error_protection = ((newhead>>16)&0x1)^0x1; |
236 fr->bitrate_index = ((newhead>>12)&0xf); | |
237 fr->padding = ((newhead>>9)&0x1); | |
238 fr->extension = ((newhead>>8)&0x1); | |
239 fr->mode = ((newhead>>6)&0x3); | |
240 fr->mode_ext = ((newhead>>4)&0x3); | |
241 fr->copyright = ((newhead>>3)&0x1); | |
242 fr->original = ((newhead>>2)&0x1); | |
243 fr->emphasis = newhead & 0x3; | |
244 | |
245 MP3_channels = fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; | |
246 | |
247 if(!fr->bitrate_index){ | |
248 // fprintf(stderr,"Free format not supported.\n"); | |
249 return FALSE; | |
250 } | |
251 | |
252 switch(fr->lay){ | |
253 case 2: | |
254 MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index]; | |
255 MP3_samplerate=freqs[fr->sampling_frequency]; | |
256 fr->framesize = (long) MP3_bitrate * 144000; | |
257 fr->framesize /= MP3_samplerate; | |
258 MP3_framesize=fr->framesize; | |
259 fr->framesize += fr->padding - 4; | |
260 break; | |
261 case 3: | |
262 if(fr->lsf) | |
263 ssize = (fr->stereo == 1) ? 9 : 17; | |
264 else | |
265 ssize = (fr->stereo == 1) ? 17 : 32; | |
266 if(fr->error_protection) ssize += 2; | |
267 | |
268 MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index]; | |
269 MP3_samplerate=freqs[fr->sampling_frequency]; | |
270 fr->framesize = (long) MP3_bitrate * 144000; | |
271 fr->framesize /= MP3_samplerate<<(fr->lsf); | |
272 MP3_framesize=fr->framesize; | |
273 fr->framesize += fr->padding - 4; | |
274 break; | |
7520 | 275 case 1: |
276 // fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32; | |
277 MP3_bitrate=tabsel_123[fr->lsf][0][fr->bitrate_index]; | |
278 MP3_samplerate=freqs[fr->sampling_frequency]; | |
279 fr->framesize = (long) MP3_bitrate * 12000; | |
280 fr->framesize /= MP3_samplerate; | |
10468 | 281 MP3_framesize = ((fr->framesize+fr->padding)<<2); |
282 fr->framesize = MP3_framesize-4; | |
10552 | 283 // printf("framesize=%d\n",fr->framesize); |
7520 | 284 break; |
1 | 285 default: |
7520 | 286 MP3_framesize=fr->framesize=0; |
1 | 287 // fprintf(stderr,"Sorry, unsupported layer type.\n"); |
288 return 0; | |
289 } | |
290 if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE; | |
291 | |
292 return 1; | |
293 } | |
294 | |
295 | |
296 LOCAL int stream_read_frame_body(int size){ | |
297 | |
298 /* flip/init buffer for Layer 3 */ | |
299 bsbufold = bsbuf; | |
300 bsbuf = bsspace[bsnum]+512; | |
301 bsnum = (bsnum + 1) & 1; | |
302 | |
303 if( mp3_read(bsbuf,size) != size) return 0; // broken frame | |
304 | |
305 bitindex = 0; | |
306 wordpointer = (unsigned char *) bsbuf; | |
307 bitsleft=8*size; | |
308 | |
309 return 1; | |
310 } | |
311 | |
312 | |
313 /***************************************************************** | |
314 * read next frame return number of frames read. | |
315 */ | |
316 LOCAL int read_frame(struct frame *fr){ | |
317 unsigned long newhead; | |
22140
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
318 union { |
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
319 unsigned char buf[8]; |
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
320 unsigned long dummy; // for alignment |
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
321 } hbuf; |
1 | 322 int skipped,resyncpos; |
323 int frames=0; | |
324 | |
325 resync: | |
326 skipped=MP3_fpos; | |
327 resyncpos=MP3_fpos; | |
328 | |
329 set_pointer(512); | |
330 fsizeold=fr->framesize; /* for Layer3 */ | |
22140
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
331 if(!stream_head_read(hbuf.buf,&newhead)) return 0; |
1 | 332 if(!decode_header(fr,newhead)){ |
333 // invalid header! try to resync stream! | |
334 #ifdef DEBUG_RESYNC | |
335 printf("ReSync: searching for a valid header... (pos=%X)\n",MP3_fpos); | |
336 #endif | |
337 retry1: | |
338 while(!decode_header(fr,newhead)){ | |
22140
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
339 if(!stream_head_shift(hbuf.buf,&newhead)) return 0; |
1 | 340 } |
341 resyncpos=MP3_fpos-4; | |
342 // found valid header | |
343 #ifdef DEBUG_RESYNC | |
344 printf("ReSync: found valid hdr at %X fsize=%ld ",resyncpos,fr->framesize); | |
345 #endif | |
346 if(!stream_read_frame_body(fr->framesize)) return 0; // read body | |
347 set_pointer(512); | |
348 fsizeold=fr->framesize; /* for Layer3 */ | |
22140
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
349 if(!stream_head_read(hbuf.buf,&newhead)) return 0; |
1 | 350 if(!decode_header(fr,newhead)){ |
351 // invalid hdr! go back... | |
352 #ifdef DEBUG_RESYNC | |
353 printf("INVALID\n"); | |
354 #endif | |
355 // mp3_seek(resyncpos+1); | |
22140
0cd17afe1d4b
Make sure buffer is aligned so no unaligned access happens.
reimar
parents:
21507
diff
changeset
|
356 if(!stream_head_read(hbuf.buf,&newhead)) return 0; |
1 | 357 goto retry1; |
358 } | |
359 #ifdef DEBUG_RESYNC | |
360 printf("OK!\n"); | |
361 ++frames; | |
362 #endif | |
363 } | |
364 | |
365 skipped=resyncpos-skipped; | |
366 // if(skipped && !MP3_resync) printf("\r%d bad bytes skipped (resync at 0x%X) \n",skipped,resyncpos); | |
367 | |
368 // 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":""); | |
369 | |
370 /* read main data into memory */ | |
371 if(!stream_read_frame_body(fr->framesize)){ | |
372 printf("\nBroken frame at 0x%X \n",resyncpos); | |
373 return 0; | |
374 } | |
375 ++frames; | |
376 | |
377 if(MP3_resync){ | |
378 MP3_resync=0; | |
379 if(frames==1) goto resync; | |
380 } | |
381 | |
382 return frames; | |
383 } | |
384 | |
12131
d155623271e3
fix symbol clashes when linking with libmp3lame including mp3 decoder, man, mp3lib is so much bloated
alex
parents:
11241
diff
changeset
|
385 static int _has_mmx = 0; // used by layer2.c, layer3.c to pre-scale coeffs |
4262 | 386 |
1 | 387 #include "layer2.c" |
388 #include "layer3.c" | |
10468 | 389 #include "layer1.c" |
1 | 390 |
391 /******************************************************************************/ | |
392 /* PUBLIC FUNCTIONS */ | |
393 /******************************************************************************/ | |
394 | |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
395 /* It's hidden from gcc in assembler */ |
11240 | 396 extern void dct64_MMX(real *, real *, real *); |
397 extern void dct64_MMX_3dnow(real *, real *, real *); | |
398 extern void dct64_MMX_3dnowex(real *, real *, real *); | |
18932
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
399 extern void dct64_sse(real *, real *, real *); |
11240 | 400 void (*dct64_MMX_func)(real *, real *, real *); |
1245
03b7e2955a20
Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents:
1166
diff
changeset
|
401 |
16989 | 402 #include "cpudetect.h" |
3088
73c2e9304d08
changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents:
1393
diff
changeset
|
403 |
1 | 404 // Init decoder tables. Call first, once! |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
405 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
406 void MP3_Init(int fakemono){ |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
407 #else |
1 | 408 void MP3_Init(){ |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
409 #endif |
8545 | 410 |
411 //gCpuCaps.hasMMX=gCpuCaps.hasMMX2=gCpuCaps.hasSSE=0; // for testing! | |
412 | |
413 _has_mmx = 0; | |
414 dct36_func = dct36; | |
415 | |
416 make_decode_tables(outscale); | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
417 |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
418 #ifdef CAN_COMPILE_X86_ASM |
4262 | 419 |
19133 | 420 #ifdef HAVE_MMX |
8545 | 421 if (gCpuCaps.hasMMX) |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
422 { |
4262 | 423 _has_mmx = 1; |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
424 make_decode_tables_MMX(outscale); |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
425 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: made decode tables with MMX optimization\n"); |
8545 | 426 synth_func = synth_1to1_MMX; |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
427 } |
19133 | 428 #endif |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
429 |
19133 | 430 #ifdef HAVE_3DNOWEX |
8545 | 431 if (gCpuCaps.has3DNowExt) |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
432 { |
4262 | 433 dct36_func=dct36_3dnowex; |
19500
2c458473fc5d
always use 3dnowext version of dct64 when supported by the CPU (K6-3+ and up).
gpoirier
parents:
19431
diff
changeset
|
434 dct64_MMX_func= dct64_MMX_3dnowex; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
435 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow!Ex optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
436 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
437 else |
19133 | 438 #endif |
439 #ifdef HAVE_3DNOW | |
8545 | 440 if (gCpuCaps.has3DNow) |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
441 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
442 dct36_func = dct36_3dnow; |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
443 dct64_MMX_func = dct64_MMX_3dnow; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
444 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow! optimized decore!\n"); |
4262 | 445 } |
446 else | |
19133 | 447 #endif |
448 #ifdef HAVE_SSE | |
18932
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
449 if (gCpuCaps.hasSSE) |
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
450 { |
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
451 dct64_MMX_func = dct64_sse; |
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
452 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using SSE optimized decore!\n"); |
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
453 } |
69c665e91946
Add dct64_sse, a replacement for dct64_MMX. About 60% faster on its author's Pentium III
gpoirier
parents:
18783
diff
changeset
|
454 else |
19133 | 455 #endif |
456 #ifdef HAVE_MMX | |
8545 | 457 if (gCpuCaps.hasMMX) |
4262 | 458 { |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
459 dct64_MMX_func = dct64_MMX; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
460 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using MMX optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
461 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
462 else |
19133 | 463 #endif |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
464 if (gCpuCaps.cpuType >= CPUTYPE_I586) |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
465 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
466 synth_func = synth_1to1_pent; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
467 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using Pentium optimized decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
468 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
469 else |
8545 | 470 #endif |
18101
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
471 #ifdef HAVE_ALTIVEC |
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
472 if (gCpuCaps.hasAltiVec) |
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
473 { |
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
474 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using AltiVec optimized decore!\n"); |
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
475 } |
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
476 else |
a3d76e5ea6c2
Make mp3lib say that it's using Altivec to decode instead of generic C
diego
parents:
17566
diff
changeset
|
477 #endif |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
478 { |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
479 synth_func = NULL; /* use default c version */ |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
480 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using generic C decore!\n"); |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
481 } |
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
482 |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
483 #ifdef USE_FAKE_MONO |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
484 if (fakemono == 1) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
485 fr.synth=synth_1to1_l; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
486 else if (fakemono == 2) |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
487 fr.synth=synth_1to1_r; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
488 else |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
489 fr.synth=synth_1to1; |
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
490 #else |
1 | 491 fr.synth=synth_1to1; |
732
e14114170e01
applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents:
73
diff
changeset
|
492 #endif |
1 | 493 fr.synth_mono=synth_1to1_mono2stereo; |
494 fr.down_sample=0; | |
495 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample); | |
8545 | 496 |
1 | 497 init_layer2(); |
498 init_layer3(fr.down_sample_sblimit); | |
13946 | 499 mp_msg(MSGT_DECAUDIO,MSGL_V,"MP3lib: init layer2&3 finished, tables done\n"); |
1 | 500 } |
501 | |
502 #if 0 | |
503 | |
504 void MP3_Close(){ | |
505 MP3_eof=1; | |
506 if(mp3_file) fclose(mp3_file); | |
507 mp3_file=NULL; | |
508 } | |
509 | |
510 // Open a file, init buffers. Call once per file! | |
511 int MP3_Open(char *filename,int buffsize){ | |
512 MP3_eof=1; // lock decoding | |
513 MP3_pause=1; // lock playing | |
514 if(mp3_file) MP3_Close(); // close prev. file | |
515 MP3_frames=0; | |
516 | |
517 mp3_file=fopen(filename,"rb"); | |
518 // printf("MP3_Open: file='%s'",filename); | |
519 // if(!mp3_file){ printf(" not found!\n"); return 0;} else printf("Ok!\n"); | |
520 if(!mp3_file) return 0; | |
521 | |
522 MP3_filesize=MP3_PrintTAG(); | |
523 fseek(mp3_file,0,SEEK_SET); | |
524 | |
525 MP3_InitBuffers(buffsize); | |
526 if(!tables_done_flag) MP3_Init(); | |
527 MP3_eof=0; // allow decoding | |
528 MP3_pause=0; // allow playing | |
529 return MP3_filesize; | |
530 } | |
531 | |
532 #endif | |
533 | |
534 // Read & decode a single frame. Called by sound driver. | |
535 int MP3_DecodeFrame(unsigned char *hova,short single){ | |
536 pcm_sample = hova; | |
537 pcm_point = 0; | |
538 if(!read_frame(&fr))return(0); | |
539 if(single==-2){ set_pointer(512); return(1); } | |
540 if(fr.error_protection) getbits(16); /* skip crc */ | |
541 fr.single=single; | |
542 switch(fr.lay){ | |
543 case 2: do_layer2(&fr,single);break; | |
544 case 3: do_layer3(&fr,single);break; | |
10468 | 545 case 1: do_layer1(&fr,single);break; |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
546 default: |
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
547 return 0; // unsupported |
1 | 548 } |
549 // ++MP3_frames; | |
550 return(pcm_point?pcm_point:2); | |
551 } | |
552 | |
553 // Prints last frame header in ascii. | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
17300
diff
changeset
|
554 void MP3_PrintHeader(void){ |
1 | 555 static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" }; |
556 static char *layers[4] = { "???" , "I", "II", "III" }; | |
557 | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
558 mp_msg(MSGT_DECAUDIO,MSGL_V,"\rMPEG %s, Layer %s, %ld Hz %d kbit %s, BPF: %ld\n", |
1 | 559 fr.mpeg25 ? "2.5" : (fr.lsf ? "2.0" : "1.0"), |
560 layers[fr.lay],freqs[fr.sampling_frequency], | |
561 tabsel_123[fr.lsf][fr.lay-1][fr.bitrate_index], | |
562 modes[fr.mode],fr.framesize+4); | |
6138
523014df7d32
big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents:
5888
diff
changeset
|
563 mp_msg(MSGT_DECAUDIO,MSGL_V,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d\n", |
1 | 564 fr.stereo,fr.copyright?"Yes":"No", |
565 fr.original?"Yes":"No",fr.error_protection?"Yes":"No", | |
566 fr.emphasis); | |
567 } | |
568 | |
4150
01d0a5fabf65
runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents:
3219
diff
changeset
|
569 #if 0 |
1 | 570 #include "genre.h" |
571 | |
572 // Read & print ID3 TAG. Do not call when playing!!! returns filesize. | |
573 int MP3_PrintTAG(){ | |
574 struct id3tag { | |
575 char tag[3]; | |
576 char title[30]; | |
577 char artist[30]; | |
578 char album[30]; | |
579 char year[4]; | |
580 char comment[30]; | |
581 unsigned char genre; | |
582 }; | |
583 struct id3tag tag; | |
584 char title[31]={0,}; | |
585 char artist[31]={0,}; | |
586 char album[31]={0,}; | |
587 char year[5]={0,}; | |
588 char comment[31]={0,}; | |
589 char genre[31]={0,}; | |
590 int fsize; | |
591 int ret; | |
592 | |
593 fseek(mp3_file,0,SEEK_END); | |
594 fsize=ftell(mp3_file); | |
595 if(fseek(mp3_file,-128,SEEK_END)) return fsize; | |
596 ret=fread(&tag,128,1,mp3_file); | |
597 if(ret!=1 || tag.tag[0]!='T' || tag.tag[1]!='A' || tag.tag[2]!='G') return fsize; | |
598 | |
599 strncpy(title,tag.title,30); | |
600 strncpy(artist,tag.artist,30); | |
601 strncpy(album,tag.album,30); | |
602 strncpy(year,tag.year,4); | |
603 strncpy(comment,tag.comment,30); | |
604 | |
605 if ( tag.genre <= sizeof(genre_table)/sizeof(*genre_table) ) { | |
606 strncpy(genre, genre_table[tag.genre], 30); | |
607 } else { | |
608 strncpy(genre,"Unknown",30); | |
609 } | |
610 | |
611 // printf("\n"); | |
612 printf("Title : %30s Artist: %s\n",title,artist); | |
613 printf("Album : %30s Year : %4s\n",album,year); | |
614 printf("Comment: %30s Genre : %s\n",comment,genre); | |
615 printf("\n"); | |
616 return fsize-128; | |
617 } | |
618 | |
619 #endif |