annotate mp3lib/sr1.c @ 2316:bcb229557e9b

fixed alignment (static variables where sometimes not 8-byte aligned) added half uv interpolation support added prefetch BGR15 support in MMX (untested) (so BGR15,16,24,32 are supported) special unscaled height version (not much faster but it doesnt interpolate uv vertically)
author michael
date Sat, 20 Oct 2001 21:12:09 +0000
parents 5eef9e69b145
children 73c2e9304d08
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"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
28 #include "d_cpu.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
29
1045
2ee9a18ed6f3 Minor improvements
nickols_k
parents: 1040
diff changeset
30 #include "fastmemcpy.h"
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
31 //static FILE* mp3_file=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
32
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
33 int MP3_frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
34 int MP3_eof=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
35 int MP3_pause=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
36 int MP3_filesize=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
37 int MP3_fpos=0; // current file position
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
38 int MP3_framesize=0; // current framesize
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
39 int MP3_bitrate=0; // current bitrate
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 int MP3_samplerate=0; // current samplerate
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41 int MP3_resync=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
42 int MP3_channels=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 int MP3_bps=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45 static long outscale = 32768;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
46 #include "tabinit.c"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
47
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 extern int mplayer_audio_read(char *buf,int size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
50 #if 1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
51 LOCAL int mp3_read(char *buf,int size){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
52 // int len=fread(buf,1,size,mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
53 int len=mplayer_audio_read(buf,size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
54 if(len>0) MP3_fpos+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
55 // if(len!=size) MP3_eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
56 return len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
57 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
58 #else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
59 extern int mp3_read(char *buf,int size);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
60 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
62 //void mp3_seek(int pos){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 // fseek(mp3_file,pos,SEEK_SET);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64 // return (MP3_fpos=ftell(mp3_file));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65 //}
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
67 /* Frame reader */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
69 #define MAXFRAMESIZE 1280
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
70 #define MAXFRAMESIZE2 (512+MAXFRAMESIZE)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
72 static int fsizeold=0,ssize=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
73 static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74 static unsigned char *bsbufold=bsspace[0]+512;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 static unsigned char *bsbuf=bsspace[1]+512;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 static int bsnum=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78 static int bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 static unsigned char *wordpointer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 static int bitsleft;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 unsigned char *pcm_sample; /* az outbuffer CIME */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 int pcm_point = 0; /* ez az outbuffer pozicioja */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 static struct frame fr;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 static int tabsel_123[2][3][16] = {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 LOCAL unsigned int getbits(short number_of_bits)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 unsigned long rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 // 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
103 if((bitsleft-=number_of_bits)<0) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 if(!number_of_bits) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 rval = wordpointer[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 rval <<= 8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 rval |= wordpointer[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 rval <<= 8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 rval |= wordpointer[2];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 rval <<= bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 rval &= 0xffffff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 bitindex += number_of_bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 rval >>= (24-number_of_bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 wordpointer += (bitindex>>3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 bitindex &= 7;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 return rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 LOCAL unsigned int getbits_fast(short number_of_bits)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 unsigned long rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 // 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
124 if((bitsleft-=number_of_bits)<0) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 if(!number_of_bits) return 0;
1309
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
126 #if ARCH_X86
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
127 rval = bswap_16(*((unsigned short *)wordpointer));
1309
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
128 #else
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
129 /*
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
130 * 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
131 * Fall back to some portable code.
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
132 */
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
133 rval = wordpointer[0] << 8 | wordpointer[1];
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
134 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 rval <<= bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 rval &= 0xffff;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 bitindex += number_of_bits;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 rval >>= (16-number_of_bits);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 wordpointer += (bitindex>>3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 bitindex &= 7;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 return rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 LOCAL unsigned int get1bit(void)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 unsigned char rval;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 // if(MP3_frames>=7741) printf("get1bit: bitsleft=%d wordptr=%x\n",bitsleft,wordpointer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 if((--bitsleft)<0) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 rval = *wordpointer << bitindex;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 bitindex++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 wordpointer += (bitindex>>3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 bitindex &= 7;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 return ((rval>>7)&1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 LOCAL void set_pointer(long backstep)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 // if(backstep!=512 && backstep>fsizeold)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 // printf("\rWarning! backstep (%d>%d) \n",backstep,fsizeold);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 wordpointer = bsbuf + ssize - backstep;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 if (backstep) memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 bitindex = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 bitsleft+=8*backstep;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 // printf("Backstep %d (bitsleft=%d)\n",backstep,bitsleft);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 LOCAL int stream_head_read(unsigned char *hbuf,unsigned long *newhead){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if(mp3_read(hbuf,4) != 4) return FALSE;
1309
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
169 #if ARCH_X86
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
170 *newhead = bswap_32(*((unsigned long *)hbuf));
1309
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
171 #else
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
172 /*
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
173 * 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
174 * Fall back to some portable code.
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
175 */
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
176 *newhead =
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
177 hbuf[0] << 24 |
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
178 hbuf[1] << 16 |
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
179 hbuf[2] << 8 |
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
180 hbuf[3];
598e3047ce13 Add some preliminary support for non-x86 architectures to mplayer
jkeil
parents: 1276
diff changeset
181 #endif
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
182 return TRUE;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 LOCAL int stream_head_shift(unsigned char *hbuf,unsigned long *head){
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
186 *((unsigned long *)hbuf) >>= 8;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 if(mp3_read(hbuf+3,1) != 1) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 *head <<= 8;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 *head |= hbuf[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
192
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 /*
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
194 * decode a header and write the information
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 * into the frame structure
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 LOCAL int decode_header(struct frame *fr,unsigned long newhead){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 // head_check:
1040
115ef47ef8c3 Minor optimization
nickols_k
parents: 735
diff changeset
200 if( (newhead & 0xffe00000) != 0xffe00000 ||
1045
2ee9a18ed6f3 Minor improvements
nickols_k
parents: 1040
diff changeset
201 (newhead & 0x0000fc00) == 0x0000fc00) return FALSE;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 fr->lay = 4-((newhead>>17)&3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
204 // if(fr->lay!=3) return FALSE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 if( newhead & ((long)1<<20) ) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 fr->lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 fr->mpeg25 = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 fr->lsf = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 fr->mpeg25 = 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 if(fr->mpeg25)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215 fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
216 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218
1166
95f6f14176c6 fr->sampling_frequency limitation (thanx to pl <p_l@tfz.net>)
arpi_esp
parents: 1045
diff changeset
219 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
220
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 fr->error_protection = ((newhead>>16)&0x1)^0x1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 fr->bitrate_index = ((newhead>>12)&0xf);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 fr->padding = ((newhead>>9)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 fr->extension = ((newhead>>8)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 fr->mode = ((newhead>>6)&0x3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 fr->mode_ext = ((newhead>>4)&0x3);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 fr->copyright = ((newhead>>3)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 fr->original = ((newhead>>2)&0x1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229 fr->emphasis = newhead & 0x3;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 MP3_channels = fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 if(!fr->bitrate_index){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 // fprintf(stderr,"Free format not supported.\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 return FALSE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 switch(fr->lay){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 case 2:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 MP3_samplerate=freqs[fr->sampling_frequency];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 fr->framesize = (long) MP3_bitrate * 144000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 fr->framesize /= MP3_samplerate;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 MP3_framesize=fr->framesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 fr->framesize += fr->padding - 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247 case 3:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 if(fr->lsf)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 ssize = (fr->stereo == 1) ? 9 : 17;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 ssize = (fr->stereo == 1) ? 17 : 32;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 if(fr->error_protection) ssize += 2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 MP3_samplerate=freqs[fr->sampling_frequency];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 fr->framesize = (long) MP3_bitrate * 144000;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 fr->framesize /= MP3_samplerate<<(fr->lsf);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 MP3_framesize=fr->framesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 fr->framesize += fr->padding - 4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 default:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 // fprintf(stderr,"Sorry, unsupported layer type.\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
269
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271 LOCAL int stream_read_frame_body(int size){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 /* flip/init buffer for Layer 3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274 bsbufold = bsbuf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
275 bsbuf = bsspace[bsnum]+512;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
276 bsnum = (bsnum + 1) & 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
278 if( mp3_read(bsbuf,size) != size) return 0; // broken frame
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 bitindex = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 wordpointer = (unsigned char *) bsbuf;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 bitsleft=8*size;
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 /*****************************************************************
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
289 * read next frame return number of frames read.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 LOCAL int read_frame(struct frame *fr){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 unsigned long newhead;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 unsigned char hbuf[8];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 int skipped,resyncpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 int frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 resync:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 skipped=MP3_fpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 resyncpos=MP3_fpos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 set_pointer(512);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 fsizeold=fr->framesize; /* for Layer3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303 if(!stream_head_read(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304 if(!decode_header(fr,newhead)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 // invalid header! try to resync stream!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 printf("ReSync: searching for a valid header... (pos=%X)\n",MP3_fpos);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 retry1:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 while(!decode_header(fr,newhead)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 if(!stream_head_shift(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
312 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
313 resyncpos=MP3_fpos-4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
314 // found valid header
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
315 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
316 printf("ReSync: found valid hdr at %X fsize=%ld ",resyncpos,fr->framesize);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 if(!stream_read_frame_body(fr->framesize)) return 0; // read body
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 set_pointer(512);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 fsizeold=fr->framesize; /* for Layer3 */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 if(!stream_head_read(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 if(!decode_header(fr,newhead)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 // invalid hdr! go back...
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 printf("INVALID\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 // mp3_seek(resyncpos+1);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 if(!stream_head_read(hbuf,&newhead)) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 goto retry1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 #ifdef DEBUG_RESYNC
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 printf("OK!\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 ++frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 skipped=resyncpos-skipped;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 // 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
339
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 // 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
341
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 /* read main data into memory */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 if(!stream_read_frame_body(fr->framesize)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
344 printf("\nBroken frame at 0x%X \n",resyncpos);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 ++frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 if(MP3_resync){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350 MP3_resync=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 if(frames==1) goto resync;
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 return frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 #include "layer2.c"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358 #include "layer3.c"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 /******************************************************************************/
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 /* PUBLIC FUNCTIONS */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362 /******************************************************************************/
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 static int tables_done_flag=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
366 /* It's hidden from gcc in assembler */
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
367 extern void dct64_MMX( void );
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
368 extern void dct64_MMX_3dnow( void );
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
369 extern void dct64_MMX_3dnowex( void );
1393
5eef9e69b145 Beginning sse optimization of dct code.
atmos4
parents: 1309
diff changeset
370 extern void dct64_MMX_sse( void );
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
371 void (*dct64_MMX_func)( void );
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
372
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373 // Init decoder tables. Call first, once!
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
374 #ifdef USE_FAKE_MONO
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
375 void MP3_Init(int fakemono){
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
376 #else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 void MP3_Init(){
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
378 #endif
1253
87a31bbadd9a Minor fixes
nick
parents: 1245
diff changeset
379 #ifdef ARCH_X86
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380 _CpuID=CpuDetect();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381 _i586=ipentium();
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
382 #ifndef HAVE_MMX
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
383 _i586 &= 1;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
384 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
385 _3dnow=a3dnow();
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
386 #ifndef HAVE_3DNOW
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
387 _3dnow = 0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
388 #endif
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
389 #ifndef HAVE_3DNOWEX
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
390 _3dnow &= 1;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
391 #endif
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
392 _isse=isse();
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
393 #ifndef HAVE_SSE
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
394 _isse = 0;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
395 #endif
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
396 #ifndef HAVE_SSE2
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
397 _isse &= 1;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
398 #endif
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
399 _has_mmx=_i586>1||_3dnow||_isse;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 printf( "mp3lib: Processor ID: %x\n",_CpuID );
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
401 if(_i586&&!_3dnow&&!_isse)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
402 printf( "mp3lib: Using Pentium%s optimized decore.\n",(_i586>1?"-MMX":""));
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
403 else
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
404 if(_isse)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
405 /*
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
406 Note: It's ok, Since K8 will have SSE2 support and will much faster
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
407 of P4 ;)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
408 */
1393
5eef9e69b145 Beginning sse optimization of dct code.
atmos4
parents: 1309
diff changeset
409 printf( "mp3lib: Using SSE%s! optimized decore.\n",(_isse>1?"2":""));
5eef9e69b145 Beginning sse optimization of dct code.
atmos4
parents: 1309
diff changeset
410 // printf( "mp3lib: Using Pentium%s optimized decore.\n",(_i586>1?"-MMX":""));
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
411 else
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
412 if(_3dnow)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
413 printf( "mp3lib: Using AMD 3dnow%s! optimized decore.\n",(_3dnow>1?"-dsp(k7)":""));
1253
87a31bbadd9a Minor fixes
nick
parents: 1245
diff changeset
414 #else
87a31bbadd9a Minor fixes
nick
parents: 1245
diff changeset
415 _CpuID = _i586 = _3dnow = _isse = _has_mmx = 0;
87a31bbadd9a Minor fixes
nick
parents: 1245
diff changeset
416 printf( "mp3lib: Using generic decore.\n");
87a31bbadd9a Minor fixes
nick
parents: 1245
diff changeset
417 #endif
1276
ae943748e0d9 One flaw is fixed
nick
parents: 1258
diff changeset
418 #ifdef HAVE_MMX
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
419 /* Use it for any MMX cpu */
1276
ae943748e0d9 One flaw is fixed
nick
parents: 1258
diff changeset
420 if(_has_mmx)
ae943748e0d9 One flaw is fixed
nick
parents: 1258
diff changeset
421 make_decode_tables_MMX(outscale);
ae943748e0d9 One flaw is fixed
nick
parents: 1258
diff changeset
422 else
ae943748e0d9 One flaw is fixed
nick
parents: 1258
diff changeset
423 #endif
ae943748e0d9 One flaw is fixed
nick
parents: 1258
diff changeset
424 make_decode_tables(outscale);
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
425 #ifdef USE_FAKE_MONO
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
426 if (fakemono == 1)
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
427 fr.synth=synth_1to1_l;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
428 else if (fakemono == 2)
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
429 fr.synth=synth_1to1_r;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
430 else
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
431 fr.synth=synth_1to1;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
432 #else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 fr.synth=synth_1to1;
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
434 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435 fr.synth_mono=synth_1to1_mono2stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
436 fr.down_sample=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
437 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438 init_layer2();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
439 init_layer3(fr.down_sample_sblimit);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 tables_done_flag=1;
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
441
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
442 dct36_func=dct36;
1258
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
443 #ifdef HAVE_SSE
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
444 if(_isse)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
445 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
446 synth_func=synth_1to1_MMX;
1393
5eef9e69b145 Beginning sse optimization of dct code.
atmos4
parents: 1309
diff changeset
447 dct64_MMX_func=dct64_MMX_sse;
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
448 }
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
449 else
1258
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
450 #endif
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
451 #ifdef HAVE_3DNOWEX
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
452 if ( _3dnow > 1 )
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
453 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
454 synth_func=synth_1to1_MMX;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
455 dct36_func=dct36_3dnowex;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
456 dct64_MMX_func=dct64_MMX_3dnowex;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
457 }
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
458 else
1258
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
459 #endif
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
460 #ifdef HAVE_3DNOW
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
461 if ( _3dnow )
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
462 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
463 synth_func=synth_1to1_MMX;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
464 dct36_func=dct36_3dnow;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
465 dct64_MMX_func=dct64_MMX_3dnow;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
466 }
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
467 else
1258
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
468 #endif
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
469 #ifdef HAVE_MMX
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
470 if ( _i586 > 1)
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
471 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
472 synth_func=synth_1to1_MMX;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
473 dct64_MMX_func=dct64_MMX;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
474 }
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
475 else
1258
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
476 #endif
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
477 #ifdef ARCH_X86
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
478 if ( _i586 )
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
479 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
480 synth_func=synth_1to1_pent;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
481 }
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
482 else
1258
50b8a3a5eeed Portability and old binutils support
nick
parents: 1253
diff changeset
483 #endif
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
484 {
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
485 synth_func = NULL;
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
486 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
487 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
488
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
489 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
490
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
491 void MP3_Close(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492 MP3_eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
493 if(mp3_file) fclose(mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
494 mp3_file=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
496
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497 // Open a file, init buffers. Call once per file!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498 int MP3_Open(char *filename,int buffsize){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 MP3_eof=1; // lock decoding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 MP3_pause=1; // lock playing
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 if(mp3_file) MP3_Close(); // close prev. file
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 MP3_frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504 mp3_file=fopen(filename,"rb");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 // printf("MP3_Open: file='%s'",filename);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 // if(!mp3_file){ printf(" not found!\n"); return 0;} else printf("Ok!\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 if(!mp3_file) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
509 MP3_filesize=MP3_PrintTAG();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510 fseek(mp3_file,0,SEEK_SET);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
512 MP3_InitBuffers(buffsize);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513 if(!tables_done_flag) MP3_Init();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514 MP3_eof=0; // allow decoding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515 MP3_pause=0; // allow playing
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 return MP3_filesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
519 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
520
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
521 // Read & decode a single frame. Called by sound driver.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
522 int MP3_DecodeFrame(unsigned char *hova,short single){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
523 pcm_sample = hova;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524 pcm_point = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525 if(!read_frame(&fr))return(0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
526 if(single==-2){ set_pointer(512); return(1); }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
527 if(fr.error_protection) getbits(16); /* skip crc */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528 fr.single=single;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 switch(fr.lay){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530 case 2: do_layer2(&fr,single);break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
531 case 3: do_layer3(&fr,single);break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
532 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
533 // ++MP3_frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
534 return(pcm_point?pcm_point:2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
536
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
538
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
539 // Prints last frame header in ascii.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540 void MP3_PrintHeader(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 static char *layers[4] = { "???" , "I", "II", "III" };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544 printf("\rMPEG %s, Layer %s, %ld Hz %d kbit %s, BPF : %ld\n",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
545 fr.mpeg25 ? "2.5" : (fr.lsf ? "2.0" : "1.0"),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546 layers[fr.lay],freqs[fr.sampling_frequency],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547 tabsel_123[fr.lsf][fr.lay-1][fr.bitrate_index],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 modes[fr.mode],fr.framesize+4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549 printf("Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n\n",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550 fr.stereo,fr.copyright?"Yes":"No",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 fr.original?"Yes":"No",fr.error_protection?"Yes":"No",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 fr.emphasis);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
553 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
554
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 #include "genre.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
556
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
557 // Read & print ID3 TAG. Do not call when playing!!! returns filesize.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
558 int MP3_PrintTAG(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
559 struct id3tag {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
560 char tag[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
561 char title[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 char artist[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 char album[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
564 char year[4];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 char comment[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
566 unsigned char genre;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
567 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
568 struct id3tag tag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
569 char title[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 char artist[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
571 char album[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
572 char year[5]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
573 char comment[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
574 char genre[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
575 int fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
576 int ret;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
577
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
578 fseek(mp3_file,0,SEEK_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
579 fsize=ftell(mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
580 if(fseek(mp3_file,-128,SEEK_END)) return fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
581 ret=fread(&tag,128,1,mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
582 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
583
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
584 strncpy(title,tag.title,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
585 strncpy(artist,tag.artist,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
586 strncpy(album,tag.album,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
587 strncpy(year,tag.year,4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
588 strncpy(comment,tag.comment,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
589
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
590 if ( tag.genre <= sizeof(genre_table)/sizeof(*genre_table) ) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
591 strncpy(genre, genre_table[tag.genre], 30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
592 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
593 strncpy(genre,"Unknown",30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
594 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
595
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
596 // printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
597 printf("Title : %30s Artist: %s\n",title,artist);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
598 printf("Album : %30s Year : %4s\n",album,year);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
599 printf("Comment: %30s Genre : %s\n",comment,genre);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
600 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
601 return fsize-128;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
602 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
603
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
604 #endif