annotate mp3lib/sr1.c @ 10252:d275152390ee

I've found some time to implement the encoding support for the new DivX API. Now it's possible to play and encode movies with the latest DivX release. One thing that doesn't work is the new Video Buffer Verifier (VBV) multipass encoding. The encoder segfaults. Maybe it just isn't supported with the standard profile of the released binary encoder. Andreas Hess <jaska@gmx.net>
author arpi
date Fri, 06 Jun 2003 19:57:37 +0000
parents b22b29178258
children e2979f202bb2
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"
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
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
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
374 int _has_mmx = 0; // used by layer2.c, layer3.c to pre-scale coeffs
4262
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
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
383 /* It's hidden from gcc in assembler */
6177
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
384 extern void __attribute__((__stdcall__)) dct64_MMX(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
385 extern void __attribute__((__stdcall__)) dct64_MMX_3dnow(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
386 extern void __attribute__((__stdcall__)) dct64_MMX_3dnowex(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
387 extern void __attribute__((__stdcall__)) dct64_MMX_sse(real *, real *, real *);
82a03c17f314 Cygwin stdcall mismatch fix.
atmos4
parents: 6138
diff changeset
388 void __attribute__((__stdcall__)) (*dct64_MMX_func)(real *, real *, real *);
1245
03b7e2955a20 Added newest MMX-optimized decore which speedups decoding at least on 13% for any cpu.
nick
parents: 1166
diff changeset
389
3088
73c2e9304d08 changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents: 1393
diff changeset
390 #include "../cpudetect.h"
73c2e9304d08 changed to use cpudetect.c (to use change te #if 1 -> #if 0 :)
alex
parents: 1393
diff changeset
391
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
392 // Init decoder tables. Call first, once!
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
393 #ifdef USE_FAKE_MONO
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
394 void MP3_Init(int fakemono){
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
395 #else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 void MP3_Init(){
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
397 #endif
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
398
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
399 //gCpuCaps.hasMMX=gCpuCaps.hasMMX2=gCpuCaps.hasSSE=0; // for testing!
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
400
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
401 _has_mmx = 0;
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
402 dct36_func = dct36;
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
403
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
404 make_decode_tables(outscale);
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
405
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
406 #ifdef CAN_COMPILE_X86_ASM
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
407
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
408 if (gCpuCaps.hasMMX)
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
409 {
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
410 _has_mmx = 1;
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
411 make_decode_tables_MMX(outscale);
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
412 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: made decode tables with MMX optimization\n");
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
413 synth_func = synth_1to1_MMX;
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
414 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
415
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
416 #if 0
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
417 if(gCpuCaps.hasSSE)
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
418 {
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
419 /* SSE version is buggy */
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
420 dct64_MMX_func = dct64_MMX_sse;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
421 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using SSE optimized decore!\n");
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
422 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
423 else
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
424 #endif
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
425 if (gCpuCaps.has3DNowExt)
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
426 {
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
427 dct36_func=dct36_3dnowex;
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
428 dct64_MMX_func= (gCpuCaps.hasMMX2) ? dct64_MMX_3dnowex : dct64_MMX_3dnow;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
429 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow!Ex optimized decore!\n");
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
430 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
431 else
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
432 if (gCpuCaps.has3DNow)
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
433 {
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
434 dct36_func = dct36_3dnow;
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
435 dct64_MMX_func = dct64_MMX_3dnow;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
436 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow! optimized decore!\n");
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
437 }
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
438 else
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
439 if (gCpuCaps.hasMMX)
4262
ae847143d1d7 Using cpudetect code instead of d_cpu.s
nick
parents: 4150
diff changeset
440 {
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
441 dct64_MMX_func = dct64_MMX;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
442 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using MMX optimized decore!\n");
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
443 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
444 else
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
445 if (gCpuCaps.cpuType >= CPUTYPE_I586)
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
446 {
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
447 synth_func = synth_1to1_pent;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
448 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using Pentium optimized decore!\n");
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
449 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
450 else
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
451 #endif
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
452 {
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
453 synth_func = NULL; /* use default c version */
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
454 mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using generic C decore!\n");
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
455 }
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
456
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
457 #ifdef USE_FAKE_MONO
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
458 if (fakemono == 1)
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
459 fr.synth=synth_1to1_l;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
460 else if (fakemono == 2)
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
461 fr.synth=synth_1to1_r;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
462 else
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
463 fr.synth=synth_1to1;
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
464 #else
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
465 fr.synth=synth_1to1;
732
e14114170e01 applied 'fakemono' patch by Bryan Chan scorpio@acm.org
arpi_esp
parents: 73
diff changeset
466 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
467 fr.synth_mono=synth_1to1_mono2stereo;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
468 fr.down_sample=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
469 fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample);
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
470
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
471 init_layer2();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
472 init_layer3(fr.down_sample_sblimit);
8545
b22b29178258 cleanup & fix cpu detection & init stuff
arpi
parents: 7520
diff changeset
473 mp_msg(MSGT_DECAUDIO,MSGL_INFO,"MP3lib: init layer2&3 finished, tables done\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
474 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
475
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
476 #if 0
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
477
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
478 void MP3_Close(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
479 MP3_eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
480 if(mp3_file) fclose(mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
481 mp3_file=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
482 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
483
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
484 // Open a file, init buffers. Call once per file!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
485 int MP3_Open(char *filename,int buffsize){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
486 MP3_eof=1; // lock decoding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
487 MP3_pause=1; // lock playing
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
488 if(mp3_file) MP3_Close(); // close prev. file
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
489 MP3_frames=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
490
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
491 mp3_file=fopen(filename,"rb");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492 // printf("MP3_Open: file='%s'",filename);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
493 // if(!mp3_file){ printf(" not found!\n"); return 0;} else printf("Ok!\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
494 if(!mp3_file) return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
496 MP3_filesize=MP3_PrintTAG();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497 fseek(mp3_file,0,SEEK_SET);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 MP3_InitBuffers(buffsize);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 if(!tables_done_flag) MP3_Init();
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 MP3_eof=0; // allow decoding
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 MP3_pause=0; // allow playing
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503 return MP3_filesize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 #endif
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508 // Read & decode a single frame. Called by sound driver.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
509 int MP3_DecodeFrame(unsigned char *hova,short single){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510 pcm_sample = hova;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 pcm_point = 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
512 if(!read_frame(&fr))return(0);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513 if(single==-2){ set_pointer(512); return(1); }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514 if(fr.error_protection) getbits(16); /* skip crc */
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515 fr.single=single;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 switch(fr.lay){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 case 2: do_layer2(&fr,single);break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518 case 3: do_layer3(&fr,single);break;
7520
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
519 case 1:
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
520 printf("mp3lib: layer-1 audio not yet supported!\n");
8d21936b31d6 layer-1 stream parsing (NOT decoding) support
arpi
parents: 7461
diff changeset
521 return 4608;
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
522 default:
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
523 return 0; // unsupported
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525 // ++MP3_frames;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
526 return(pcm_point?pcm_point:2);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
527 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 // Prints last frame header in ascii.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530 void MP3_PrintHeader(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
531 static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
532 static char *layers[4] = { "???" , "I", "II", "III" };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
533
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
534 mp_msg(MSGT_DECAUDIO,MSGL_V,"\rMPEG %s, Layer %s, %ld Hz %d kbit %s, BPF: %ld\n",
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
535 fr.mpeg25 ? "2.5" : (fr.lsf ? "2.0" : "1.0"),
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
536 layers[fr.lay],freqs[fr.sampling_frequency],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 tabsel_123[fr.lsf][fr.lay-1][fr.bitrate_index],
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
538 modes[fr.mode],fr.framesize+4);
6138
523014df7d32 big cosmetics patch, cleanup of messages printed by mplayer and libs.
arpi
parents: 5888
diff changeset
539 mp_msg(MSGT_DECAUDIO,MSGL_V,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d\n",
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540 fr.stereo,fr.copyright?"Yes":"No",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 fr.original?"Yes":"No",fr.error_protection?"Yes":"No",
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 fr.emphasis);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544
4150
01d0a5fabf65 runtime cpudetect support #2 - still not working (i can't identify the problems ground, also it produces no sound (no noises), but the init seems to be ok (also i didn't changed anything)...very annoying :( snipp
alex
parents: 3219
diff changeset
545 #if 0
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
546 #include "genre.h"
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
548 // Read & print ID3 TAG. Do not call when playing!!! returns filesize.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
549 int MP3_PrintTAG(){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
550 struct id3tag {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
551 char tag[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
552 char title[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
553 char artist[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
554 char album[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
555 char year[4];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
556 char comment[30];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
557 unsigned char genre;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
558 };
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
559 struct id3tag tag;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
560 char title[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
561 char artist[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
562 char album[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
563 char year[5]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
564 char comment[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
565 char genre[31]={0,};
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
566 int fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
567 int ret;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
568
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
569 fseek(mp3_file,0,SEEK_END);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
570 fsize=ftell(mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
571 if(fseek(mp3_file,-128,SEEK_END)) return fsize;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
572 ret=fread(&tag,128,1,mp3_file);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
573 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
574
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
575 strncpy(title,tag.title,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
576 strncpy(artist,tag.artist,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
577 strncpy(album,tag.album,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
578 strncpy(year,tag.year,4);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
579 strncpy(comment,tag.comment,30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
580
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
581 if ( tag.genre <= sizeof(genre_table)/sizeof(*genre_table) ) {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
582 strncpy(genre, genre_table[tag.genre], 30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
583 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
584 strncpy(genre,"Unknown",30);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
585 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
586
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
587 // printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
588 printf("Title : %30s Artist: %s\n",title,artist);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
589 printf("Album : %30s Year : %4s\n",album,year);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
590 printf("Comment: %30s Genre : %s\n",comment,genre);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
591 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
592 return fsize-128;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
593 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
594
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
595 #endif