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