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