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