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