annotate mp3lib/sr1.c @ 7743:a280cc3087ea

All right: The patch adresses two issues which I found, when I analyzed the input from some DVDs with known subtitle-dropouts: 1. The packet-size at the beginning of the packet, which is used to check, whether we got all fragments, is sometimes one byte too long. It seems to be always padded to an even number, while the actual size can be odd. 2. The original algorythm used to assemble the fragments relies on the timestamps to check, whether a new packet begins. This has proven to be unrelieable on some disks. So instead, I use the timestamp only to check, whether it's been too long (defined as 0,01sec) since the last fragment, which is probably indicating a broken packet, and normaly starting a new packet when the last one has been finished. patch by Christof Buergi <christof@buergi.lugs.ch>
author arpi
date Tue, 15 Oct 2002 00:47:17 +0000
parents 8d21936b31d6
children b22b29178258
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 // #define NEWBUFFERING
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2 //#define DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
3
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
4 /* 1 frame = 4608 byte PCM */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
5
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
6 #ifdef __GNUC__
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
7 #define LOCAL static inline
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
8 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
9 #define LOCAL static _inline
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
10 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
11
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
12 //#undef LOCAL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
13 //#define LOCAL
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
14
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
15 #include <stdlib.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
16 #include <stdio.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
17 #include <string.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
18 #include <signal.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
19 #include <math.h>
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
20
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
21 #define real float
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
22 // #define int long
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
23
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
24 #include "mpg123.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
25 #include "huffman.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
26 #include "mp3.h"
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
27 #include "bswap.h"
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
28 #include "../cpudetect.h"
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31
1045
2ee9a18ed6f3 Minor improvements
nickols_k
parents: 1040
diff changeset
32 #include "fastmemcpy.h"
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
33
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
34 #ifdef ARCH_X86
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
35 #define CAN_COMPILE_X86_ASM
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
36 #endif
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
37
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 //static FILE* mp3_file=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 int MP3_frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 int MP3_eof=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 int MP3_pause=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 int MP3_filesize=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 int MP3_fpos=0; // current file position
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 int MP3_framesize=0; // current framesize
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 int MP3_bitrate=0; // current bitrate
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47 int MP3_samplerate=0; // current samplerate
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 int MP3_resync=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49 int MP3_channels=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 int MP3_bps=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 #include "tabinit.c"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 extern int mplayer_audio_read(char *buf,int size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 LOCAL int mp3_read(char *buf,int size){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 // int len=fread(buf,1,size,mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 int len=mplayer_audio_read(buf,size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61 if(len>0) MP3_fpos+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 // if(len!=size) MP3_eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 return len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66 extern int mp3_read(char *buf,int size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 //void mp3_seek(int pos){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 // fseek(mp3_file,pos,SEEK_SET);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 // return (MP3_fpos=ftell(mp3_file));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 //}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 /* Frame reader */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 #define MAXFRAMESIZE 1280
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 #define MAXFRAMESIZE2 (512+MAXFRAMESIZE)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 static int fsizeold=0,ssize=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 static unsigned char *bsbufold=bsspace[0]+512;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 static unsigned char *bsbuf=bsspace[1]+512;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 static int bsnum=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 static int bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 static unsigned char *wordpointer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 static int bitsleft;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 static struct frame fr;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 static int tabsel_123[2][3][16] = {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 LOCAL unsigned int getbits(short number_of_bits)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 unsigned long rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 // if(MP3_frames>=7741) printf("getbits: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 if((bitsleft-=number_of_bits)<0) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 if(!number_of_bits) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 rval = wordpointer[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 rval <<= 8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 rval |= wordpointer[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 rval <<= 8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 rval |= wordpointer[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 rval <<= bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 rval &= 0xffffff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 bitindex += number_of_bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 rval >>= (24-number_of_bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 wordpointer += (bitindex>>3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 bitindex &= 7;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 return rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 LOCAL unsigned int getbits_fast(short number_of_bits)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 unsigned long rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 // if(MP3_frames>=7741) printf("getbits_fast: bits=%d bitsleft=%d wordptr=%x\n",number_of_bits,bitsleft,wordpointer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 if((bitsleft-=number_of_bits)<0) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 if(!number_of_bits) return 0;
4321
63fb32311b3b Fixing compilation on non-MMX but x86 systems
nick
parents: 4262
diff changeset
133 #if defined(CAN_COMPILE_X86_ASM)
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 rval <<= bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 rval &= 0xffff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 bitindex += number_of_bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 rval >>= (16-number_of_bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 wordpointer += (bitindex>>3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 bitindex &= 7;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 return rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 LOCAL unsigned int get1bit(void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 unsigned char rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 // if(MP3_frames>=7741) printf("get1bit: bitsleft=%d wordptr=%x\n",bitsleft,wordpointer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 if((--bitsleft)<0) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 rval = *wordpointer << bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 bitindex++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 wordpointer += (bitindex>>3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 bitindex &= 7;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 return ((rval>>7)&1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 LOCAL void set_pointer(long backstep)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 // if(backstep!=512 && backstep>fsizeold)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 // printf("\rWarning! backstep (%d>%d) \n",backstep,fsizeold);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 wordpointer = bsbuf + ssize - backstep;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if (backstep) memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 bitindex = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 bitsleft+=8*backstep;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 // printf("Backstep %d (bitsleft=%d)\n",backstep,bitsleft);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 LOCAL int stream_head_read(unsigned char *hbuf,unsigned long *newhead){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 if(mp3_read(hbuf,4) != 4) return FALSE;
4321
63fb32311b3b Fixing compilation on non-MMX but x86 systems
nick
parents: 4262
diff changeset
176 #if defined(CAN_COMPILE_X86_ASM)
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
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
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
189 return TRUE;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192 LOCAL int stream_head_shift(unsigned char *hbuf,unsigned long *head){
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
193 *((unsigned long *)hbuf) >>= 8;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 if(mp3_read(hbuf+3,1) != 1) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 *head <<= 8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 *head |= hbuf[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 * decode a header and write the information
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 * into the frame structure
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 LOCAL int decode_header(struct frame *fr,unsigned long newhead){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 // head_check:
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
207 if( (newhead & 0xffe00000) != 0xffe00000 ||
1045
2ee9a18ed6f3 Minor improvements
nickols_k
parents: 1040
diff changeset
208 (newhead & 0x0000fc00) == 0x0000fc00) return FALSE;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 fr->lay = 4-((newhead>>17)&3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 // if(fr->lay!=3) return FALSE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 if( newhead & ((long)1<<20) ) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 fr->lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 fr->mpeg25 = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 fr->lsf = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 fr->mpeg25 = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 if(fr->mpeg25)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 fr->error_protection = ((newhead>>16)&0x1)^0x1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 fr->bitrate_index = ((newhead>>12)&0xf);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 fr->padding = ((newhead>>9)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 fr->extension = ((newhead>>8)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 fr->mode = ((newhead>>6)&0x3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 fr->mode_ext = ((newhead>>4)&0x3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 fr->copyright = ((newhead>>3)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 fr->original = ((newhead>>2)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 fr->emphasis = newhead & 0x3;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 MP3_channels = fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 if(!fr->bitrate_index){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 // fprintf(stderr,"Free format not supported.\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 return FALSE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 switch(fr->lay){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 case 2:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 MP3_samplerate=freqs[fr->sampling_frequency];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 fr->framesize = (long) MP3_bitrate * 144000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 fr->framesize /= MP3_samplerate;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 MP3_framesize=fr->framesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 fr->framesize += fr->padding - 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 case 3:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 if(fr->lsf)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 ssize = (fr->stereo == 1) ? 9 : 17;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 ssize = (fr->stereo == 1) ? 17 : 32;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 if(fr->error_protection) ssize += 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 MP3_samplerate=freqs[fr->sampling_frequency];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 fr->framesize = (long) MP3_bitrate * 144000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 fr->framesize /= MP3_samplerate<<(fr->lsf);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 MP3_framesize=fr->framesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 fr->framesize += fr->padding - 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 break;
7520
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
268 case 1:
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
269 // fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
270 MP3_bitrate=tabsel_123[fr->lsf][0][fr->bitrate_index];
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
271 MP3_samplerate=freqs[fr->sampling_frequency];
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
272 fr->framesize = (long) MP3_bitrate * 12000;
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
273 fr->framesize /= MP3_samplerate;
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
274 MP3_framesize = fr->framesize;
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
275 fr->framesize = ((fr->framesize+fr->padding)<<2)-4;
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
276 break;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 default:
7520
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
278 MP3_framesize=fr->framesize=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 // fprintf(stderr,"Sorry, unsupported layer type.\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 LOCAL int stream_read_frame_body(int size){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 /* flip/init buffer for Layer 3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 bsbufold = bsbuf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 bsbuf = bsspace[bsnum]+512;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 bsnum = (bsnum + 1) & 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 if( mp3_read(bsbuf,size) != size) return 0; // broken frame
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 bitindex = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 wordpointer = (unsigned char *) bsbuf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 bitsleft=8*size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 /*****************************************************************
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 * read next frame return number of frames read.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308 LOCAL int read_frame(struct frame *fr){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 unsigned long newhead;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 unsigned char hbuf[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 int skipped,resyncpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 int frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314 resync:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 skipped=MP3_fpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 resyncpos=MP3_fpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 set_pointer(512);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 fsizeold=fr->framesize; /* for Layer3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 if(!stream_head_read(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 if(!decode_header(fr,newhead)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 // invalid header! try to resync stream!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 printf("ReSync: searching for a valid header... (pos=%X)\n",MP3_fpos);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 retry1:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 while(!decode_header(fr,newhead)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 if(!stream_head_shift(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 resyncpos=MP3_fpos-4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 // found valid header
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 printf("ReSync: found valid hdr at %X fsize=%ld ",resyncpos,fr->framesize);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 if(!stream_read_frame_body(fr->framesize)) return 0; // read body
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 set_pointer(512);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 fsizeold=fr->framesize; /* for Layer3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 if(!stream_head_read(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339 if(!decode_header(fr,newhead)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 // invalid hdr! go back...
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
341 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 printf("INVALID\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344 // mp3_seek(resyncpos+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 if(!stream_head_read(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 goto retry1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 printf("OK!\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350 ++frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 skipped=resyncpos-skipped;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355 // if(skipped && !MP3_resync) printf("\r%d bad bytes skipped (resync at 0x%X) \n",skipped,resyncpos);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
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":"");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 /* read main data into memory */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 if(!stream_read_frame_body(fr->framesize)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 printf("\nBroken frame at 0x%X \n",resyncpos);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 ++frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366 if(MP3_resync){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 MP3_resync=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 if(frames==1) goto resync;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
371 return frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
374 int _has_mmx = 0;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
375
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 #include "layer2.c"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 #include "layer3.c"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 /******************************************************************************/
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380 /* PUBLIC FUNCTIONS */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381 /******************************************************************************/
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
382
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383 static int tables_done_flag=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
384
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
385 /* It's hidden from gcc in assembler */
6177
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
386 extern void __attribute__((__stdcall__)) dct64_MMX(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
387 extern void __attribute__((__stdcall__)) dct64_MMX_3dnow(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
388 extern void __attribute__((__stdcall__)) dct64_MMX_3dnowex(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
389 extern void __attribute__((__stdcall__)) dct64_MMX_sse(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
390 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
391
3088
73c2e9304d08 changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents: 1393
diff changeset
392 #include "../cpudetect.h"
73c2e9304d08 changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents: 1393
diff changeset
393
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
394 // Init decoder tables. Call first, once!
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
395 #ifdef USE_FAKE_MONO
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
396 void MP3_Init(int fakemono){
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
397 #else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398 void MP3_Init(){
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
399 #endif
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
400 int accel=0;
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
401
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
402 #ifdef CAN_COMPILE_X86_ASM
5888
90730a179d18 don't re-detect cpu
arpi
parents: 4321
diff changeset
403 // GetCpuCaps(&gCpuCaps);
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
404 if(gCpuCaps.hasMMX) accel |= MM_ACCEL_X86_MMX;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
405 if(gCpuCaps.hasMMX2) accel |= MM_ACCEL_X86_MMXEXT;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
406 if(gCpuCaps.hasSSE) accel |= MM_ACCEL_X86_SSE;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
407 if(gCpuCaps.has3DNow) accel |= MM_ACCEL_X86_3DNOW;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
408 if(gCpuCaps.has3DNowExt) accel |= MM_ACCEL_X86_3DNOWEXT;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
409
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
410 if (accel & MM_ACCEL_X86_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
411 {
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
412 _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
413 make_decode_tables_MMX(outscale);
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
414 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: made decode tables with MMX optimization\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
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 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
417 make_decode_tables(outscale);
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 #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
419 make_decode_tables(outscale);
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 #endif
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 #ifdef USE_FAKE_MONO
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 if (fakemono == 1)
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 fr.synth = synth_1to1_l;
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 else if (fakemono == 2)
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 fr.synth = synth_1to1_r;
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
427 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
428 fr.synth = synth_1to1;
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
429 #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
430 fr.synth = synth_1to1;
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 #endif
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
432 fr.synth_mono = synth_1to1_mono2stereo;
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 fr.down_sample = 0;
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 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample);
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 init_layer2();
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
436 init_layer3(fr.down_sample_sblimit);
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 tables_done_flag = 1;
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
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
439 dct36_func = dct36;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
440 mp_msg(MSGT_DECAUDIO,MSGL_V,"init layer2&3 finished, tables done\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
441
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
442 #ifdef CAN_COMPILE_X86_ASM
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 #if 0
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
444 if(accel & MM_ACCEL_X86_SSE)
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
445 {
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 /* 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
447 synth_func = synth_1to1_MMX;
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 dct64_MMX_func = dct64_MMX_sse;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
449 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
450 }
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 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
452 #endif
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
453 if (accel & MM_ACCEL_X86_3DNOWEXT)
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 {
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
455 synth_func=synth_1to1_MMX;
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
456 dct36_func=dct36_3dnowex;
7461
855ca896de24 pshufw is a mmx2 instruction, so don't use dct64_MMX_3dnowex on k6-3 which
arpi
parents: 6177
diff changeset
457 dct64_MMX_func= (accel & MM_ACCEL_X86_MMXEXT) ? dct64_MMX_3dnowex : dct64_MMX_3dnow;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
458 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
459 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
460 else
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
461 if (accel & MM_ACCEL_X86_3DNOW)
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
462 {
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 synth_func = synth_1to1_MMX;
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 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
465 dct64_MMX_func = dct64_MMX_3dnow;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
466 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow! optimized decore!\n");
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
467 }
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
468 else
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
469 if (accel & MM_ACCEL_X86_MMX)
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
470 {
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
471 synth_func = synth_1to1_MMX;
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
472 dct64_MMX_func = dct64_MMX;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
473 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
474 }
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
475 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
476 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
477 {
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
478 synth_func = synth_1to1_pent;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
479 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 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
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 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
482 {
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 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
484 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
485 }
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
486 #else /* CAN_COMPILE_X86_ASM */
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
487 synth_func = NULL;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
488 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
489 #endif
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
490
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
491 #ifdef USE_FAKE_MONO
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
492 if (fakemono == 1)
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
493 fr.synth=synth_1to1_l;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
494 else if (fakemono == 2)
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
495 fr.synth=synth_1to1_r;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
496 else
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
497 fr.synth=synth_1to1;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
498 #else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 fr.synth=synth_1to1;
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
500 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 fr.synth_mono=synth_1to1_mono2stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 fr.down_sample=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504 init_layer2();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 init_layer3(fr.down_sample_sblimit);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 tables_done_flag=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
509 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 void MP3_Close(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
512 MP3_eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513 if(mp3_file) fclose(mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514 mp3_file=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 // Open a file, init buffers. Call once per file!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518 int MP3_Open(char *filename,int buffsize){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
519 MP3_eof=1; // lock decoding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
520 MP3_pause=1; // lock playing
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
521 if(mp3_file) MP3_Close(); // close prev. file
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
522 MP3_frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
523
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524 mp3_file=fopen(filename,"rb");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525 // printf("MP3_Open: file='%s'",filename);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
526 // if(!mp3_file){ printf(" not found!\n"); return 0;} else printf("Ok!\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
527 if(!mp3_file) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 MP3_filesize=MP3_PrintTAG();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530 fseek(mp3_file,0,SEEK_SET);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
531
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
532 MP3_InitBuffers(buffsize);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
533 if(!tables_done_flag) MP3_Init();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
534 MP3_eof=0; // allow decoding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535 MP3_pause=0; // allow playing
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
536 return MP3_filesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
538
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
539 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 // Read & decode a single frame. Called by sound driver.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 int MP3_DecodeFrame(unsigned char *hova,short single){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 pcm_sample = hova;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544 pcm_point = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
545 if(!read_frame(&fr))return(0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546 if(single==-2){ set_pointer(512); return(1); }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547 if(fr.error_protection) getbits(16); /* skip crc */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 fr.single=single;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549 switch(fr.lay){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550 case 2: do_layer2(&fr,single);break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 case 3: do_layer3(&fr,single);break;
7520
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
552 case 1:
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
553 printf("mp3lib: layer-1 audio not yet supported!\n");
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
554 return 4608;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
555 default:
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
556 return 0; // unsupported
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
557 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
558 // ++MP3_frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
559 return(pcm_point?pcm_point:2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
560 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
561
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 // Prints last frame header in ascii.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 void MP3_PrintHeader(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
564 static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 static char *layers[4] = { "???" , "I", "II", "III" };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
566
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
567 mp_msg(MSGT_DECAUDIO,MSGL_V,"\rMPEG %s, Layer %s, %ld Hz %d kbit %s, BPF: %ld\n",
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
568 fr.mpeg25 ? "2.5" : (fr.lsf ? "2.0" : "1.0"),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
569 layers[fr.lay],freqs[fr.sampling_frequency],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 tabsel_123[fr.lsf][fr.lay-1][fr.bitrate_index],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
571 modes[fr.mode],fr.framesize+4);
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
572 mp_msg(MSGT_DECAUDIO,MSGL_V,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d\n",
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
573 fr.stereo,fr.copyright?"Yes":"No",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
574 fr.original?"Yes":"No",fr.error_protection?"Yes":"No",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
575 fr.emphasis);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
576 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
577
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
578 #if 0
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
579 #include "genre.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
580
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
581 // Read & print ID3 TAG. Do not call when playing!!! returns filesize.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
582 int MP3_PrintTAG(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
583 struct id3tag {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
584 char tag[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
585 char title[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
586 char artist[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
587 char album[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
588 char year[4];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
589 char comment[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
590 unsigned char genre;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
591 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
592 struct id3tag tag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
593 char title[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
594 char artist[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
595 char album[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
596 char year[5]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
597 char comment[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
598 char genre[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
599 int fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
600 int ret;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
601
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
602 fseek(mp3_file,0,SEEK_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
603 fsize=ftell(mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
604 if(fseek(mp3_file,-128,SEEK_END)) return fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
605 ret=fread(&tag,128,1,mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
606 if(ret!=1 || tag.tag[0]!='T' || tag.tag[1]!='A' || tag.tag[2]!='G') return fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
607
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
608 strncpy(title,tag.title,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
609 strncpy(artist,tag.artist,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
610 strncpy(album,tag.album,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
611 strncpy(year,tag.year,4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
612 strncpy(comment,tag.comment,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
613
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
614 if ( tag.genre <= sizeof(genre_table)/sizeof(*genre_table) ) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
615 strncpy(genre, genre_table[tag.genre], 30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
616 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
617 strncpy(genre,"Unknown",30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
618 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
619
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
620 // printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
621 printf("Title : %30s Artist: %s\n",title,artist);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
622 printf("Album : %30s Year : %4s\n",album,year);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
623 printf("Comment: %30s Genre : %s\n",comment,genre);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
624 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
625 return fsize-128;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
626 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
627
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
628 #endif