1 #ifndef DISABLE_MPEG_AUDIO
2 
3 /* GPL clean */
4 
5 #include <ctype.h>
6 #include <stdlib.h>
7 #include <signal.h>
8 #include <errno.h>
9 
10 #include <sys/types.h>
11 #include <sys/stat.h>
12 #ifdef _WIN32
13 #include <time.h>
14 #else
15 #include <sys/time.h>
16 #endif
17 
18 #include <fcntl.h>
19 
20 #include "mpg123.h"
21 #include "common.h"
22 
23 int tabsel_123[2][3][16] = {
24    { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
25      {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
26      {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
27 
28    { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
29      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
30      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
31 };
32 
33 long freqs[10] = { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0 };
34 
35 static int decode_header(struct frame *fr,unsigned long newhead);
36 
read_frame_init(struct frame * fr)37 void read_frame_init (struct frame *fr)
38 {
39     fr->firsthead = 0;
40     fr->thishead = 0;
41     fr->freeformatsize = 0;
42 }
43 
head_check(unsigned long head)44 static int head_check(unsigned long head)
45 {
46 	if((head & 0xffe00000) != 0xffe00000)
47 		return FALSE;
48 	if(!((head>>17)&3))
49 		return FALSE;
50 	if( ((head>>12)&0xf) == 0xf)
51 		return FALSE;
52 	if( ((head>>10)&0x3) == 0x3 )
53 		return FALSE;
54 
55 	return TRUE;
56 }
57 
almpa_head_backcheck(unsigned long head)58 int almpa_head_backcheck(unsigned long head)
59 {
60 	head = (((head&0xFF)<<24) | ((head&0xFF00)<<8) | ((head&0xFF0000)>>8) |
61 	        (head>>24));
62 
63 	if((head & 0xffe00000) != 0xffe00000)
64 		return FALSE;
65 	if(!((head>>17)&3))
66 		return FALSE;
67 	if( ((head>>12)&0xf) == 0xf)
68 		return FALSE;
69 	if( ((head>>10)&0x3) == 0x3 )
70 		return FALSE;
71 
72 	return TRUE;
73 }
74 
75 
76 /*****************************************************************
77  * read next frame
78  */
read_frame(APEG_LAYER * layer,struct frame * fr)79 int read_frame(APEG_LAYER *layer, struct frame *fr)
80 {
81 	struct mpstr *mp = &(layer->audio.mp);
82     unsigned long newhead, oldhead;
83 	int ret;
84 
85     oldhead = fr->thishead;
86 
87 	almpa_head_read(layer, &newhead);
88 	while(!decode_header(fr,newhead))
89 	{
90 		if(newhead == ISO_END_CODE)
91 			return ALMPA_EOF;
92 
93 		almpa_head_shift(layer, &newhead);
94 	}
95 
96 	layer->audio.inited = FALSE;
97     if(oldhead)
98 	{
99         if((oldhead & 0xc00) == (fr->thishead & 0xc00))
100 		{
101 			if( (oldhead & 0xc0) == 0 && (fr->thishead & 0xc0) == 0)
102 				layer->audio.inited = TRUE;
103 			else if( (oldhead & 0xc0) > 0 && (fr->thishead & 0xc0) > 0)
104 				layer->audio.inited = TRUE;
105 		}
106 	}
107 
108     if(!fr->bitrate_index)
109        fr->framesize = fr->freeformatsize + fr->padsize;
110 
111 //	fprintf(stderr,"Reading %d\n",fr->framesize);
112 
113     /* flip/init buffer for Layer 3 */
114     /* FIXME for reentrance */
115     mp->bsbufold = mp->bsbuf;
116     mp->bsbufold_end = mp->bsbufend[mp->bsnum];
117     mp->bsbuf = mp->bsspace[mp->bsnum]+512;
118     mp->bsnum ^= 1;//(bsnum + 1) & 1;
119     mp->bsbufend[mp->bsnum] = fr->framesize;
120 
121     /* read main data into memory */
122 	ret = almpa_read_bytes(layer, mp->bsbuf, fr->framesize);
123 	if(ret < fr->framesize)
124 		memset(mp->bsbuf+ret, 0, fr->framesize-ret);
125 
126     /* Test */
127     if(!fr->vbr) {
128         fr->vbr = getVBRHeader(&(fr->vbr_header), mp->bsbuf, fr);
129     }
130 
131     mp->bsi.bitindex = 0;
132     mp->bsi.wordpointer = (unsigned char*)mp->bsbuf;
133 
134 	/* skip crc, we are byte aligned here */
135 	if(fr->error_protection)
136 		mp->bsi.wordpointer += 2;
137 
138 	return ALMPA_OK;
139 }
140 
141 /*
142  * decode a header and write the information
143  * into the frame structure
144  */
decode_header(struct frame * fr,unsigned long newhead)145 static int decode_header(struct frame *fr,unsigned long newhead)
146 {
147     if(!head_check(newhead)) {
148 //        fprintf(stderr,"Oops header is wrong %08lx\n",newhead);
149 		return 0;
150     }
151 
152     if( newhead & (1<<20) ) {
153 		fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
154 		fr->mpeg25 = 0;
155     }
156     else {
157 		fr->lsf = 1;
158 		fr->mpeg25 = 1;
159     }
160 
161     /*
162      * CHECKME: should be add more consistency checks here ?
163      * changed layer, changed CRC bit, changed sampling frequency
164      */
165     {
166 	fr->lay = 4-((newhead>>17)&3);
167 	if( ((newhead>>10)&0x3) == 0x3) {
168 	    fprintf(stderr,"Stream error\n");
169 	    return 0;
170 	}
171 	if(fr->mpeg25) {
172 	    fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
173 	}
174 	else
175 	    fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
176 		fr->error_protection = ((newhead>>16)&0x1)^0x1;
177     }
178 
179     fr->bitrate_index = ((newhead>>12)&0xf);
180     fr->padding   = ((newhead>>9)&0x1);
181     fr->extension = ((newhead>>8)&0x1);
182     fr->mode      = ((newhead>>6)&0x3);
183     fr->mode_ext  = ((newhead>>4)&0x3);
184     fr->copyright = ((newhead>>3)&0x1);
185     fr->original  = ((newhead>>2)&0x1);
186     fr->emphasis  = newhead & 0x3;
187 
188     fr->stereo    = (fr->mode == MPG_MD_MONO) ? 1 : 2;
189 
190     switch(fr->lay) {
191     case 1:
192         fr->framesize  = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000;
193         fr->framesize /= freqs[fr->sampling_frequency];
194         fr->framesize  = ((fr->framesize+fr->padding)<<2)-4;
195         fr->sideInfoSize = 0;
196         fr->padsize = fr->padding << 2;
197         break;
198     case 2:
199         fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000;
200         fr->framesize /= freqs[fr->sampling_frequency];
201         fr->framesize += fr->padding - 4;
202         fr->sideInfoSize = 0;
203         fr->padsize = fr->padding;
204         break;
205     case 3:
206         if(fr->lsf)
207 	    fr->sideInfoSize = (fr->stereo == 1) ? 9 : 17;
208         else
209 	    fr->sideInfoSize = (fr->stereo == 1) ? 17 : 32;
210         if(fr->error_protection)
211 			fr->sideInfoSize += 2;
212         fr->framesize  = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000;
213         fr->framesize /= freqs[fr->sampling_frequency]<<(fr->lsf);
214         fr->framesize = fr->framesize + fr->padding - 4;
215         fr->padsize = fr->padding;
216         break;
217     default:
218         fprintf(stderr,"Sorry, unknown layer type.\n");
219         return (0);
220     }
221 
222     if(!fr->bitrate_index) {
223         /* fprintf(stderr,"Warning, Free format not heavily tested: (head %08lx)\n",newhead); */
224         fr->framesize = 0;
225     }
226     fr->thishead = newhead;
227 
228     return 1;
229 }
230 
231 #if 0
232 void print_rheader(struct frame *fr)
233 {
234     static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
235     static char *layers[4] = { "Unknown" , "I", "II", "III" };
236     static char *mpeg_type[2] = { "1.0" , "2.0" };
237 
238     /* version, layer, freq, mode, channels, bitrate, BPF */
239     fprintf(stderr,"@I %s %s %ld %s %d %d %d\n",
240 	    mpeg_type[fr->lsf],layers[fr->lay],freqs[fr->sampling_frequency],
241 	    modes[fr->mode],fr->stereo,
242 	    tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
243 	    fr->framesize+4);
244 }
245 
246 void print_header(struct frame *fr)
247 {
248     static char *modes[4] = { "Stereo", "Joint-Stereo", "Dual-Channel", "Single-Channel" };
249     static char *layers[4] = { "Unknown" , "I", "II", "III" };
250 
251     fprintf(stderr,"MPEG %s, Layer: %s, Freq: %ld, mode: %s, modext: %d, BPF : %d\n",
252 	    fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
253 	    layers[fr->lay],freqs[fr->sampling_frequency],
254 	    modes[fr->mode],fr->mode_ext,fr->framesize+4);
255     fprintf(stderr,"Channels: %d, copyright: %s, original: %s, CRC: %s, emphasis: %d.\n",
256 	    fr->stereo,fr->copyright?"Yes":"No",
257 	    fr->original?"Yes":"No",fr->error_protection?"Yes":"No",
258 	    fr->emphasis);
259     fprintf(stderr,"%sBitrate: %d Kbits/s, Extension value: %d\n",
260 	    fr->vbr ? "Average " : "",
261 	    fr->vbr ?
262 	    (int) (fr->vbr_header.bytes * 8 / (compute_tpf(fr) * fr->vbr_header.frames * 1000)):
263 	    (tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index]),
264 	    fr->extension);
265 }
266 
267 void print_header_compact(struct frame *fr)
268 {
269     static char *modes[4] = { "stereo", "joint-stereo", "dual-channel", "mono" };
270     static char *layers[4] = { "Unknown" , "I", "II", "III" };
271 
272     fprintf(stderr,"MPEG %s layer %s, %d kbit/s, %ld Hz %s\n",
273 	    fr->mpeg25 ? "2.5" : (fr->lsf ? "2.0" : "1.0"),
274 	    layers[fr->lay],
275 	    tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index],
276 	    freqs[fr->sampling_frequency], modes[fr->mode]);
277 }
278 
279 void print_id3_tag(unsigned char *buf)
280 {
281     struct id3tag {
282 	char tag[3];
283 	char title[30];
284 	char artist[30];
285 	char album[30];
286 	char year[4];
287 	char comment[30];
288 	unsigned char genre;
289     };
290     struct id3tag *tag = (struct id3tag *) buf;
291     char title[31]={0,};
292     char artist[31]={0,};
293     char album[31]={0,};
294     char year[5]={0,};
295     char comment[31]={0,};
296     char genre[31]={0,};
297 
298     if(1)
299 	return;
300 
301     strncpy(title,tag->title,30);
302     strncpy(artist,tag->artist,30);
303     strncpy(album,tag->album,30);
304     strncpy(year,tag->year,4);
305     strncpy(comment,tag->comment,30);
306 
307     if ( tag->genre < sizeof(genre_table)/sizeof(*genre_table) ) {
308 	strncpy(genre, genre_table[tag->genre], 30);
309     } else {
310 	strncpy(genre,"Unknown",30);
311     }
312 
313     fprintf(stderr,"Title  : %-30s  Artist: %s\n",title,artist);
314     fprintf(stderr,"Album  : %-30s  Year  : %4s\n",album,year);
315     fprintf(stderr,"Comment: %-30s  Genre : %s\n",comment,genre);
316 }
317 #endif
318 
set_pointer(struct mpstr * mp,int ssize,long backstep)319 void set_pointer(struct mpstr *mp, int ssize, long backstep)
320 {
321     mp->bsi.wordpointer = mp->bsbuf + ssize - backstep;
322     if(backstep)
323 		memcpy(mp->bsi.wordpointer, mp->bsbufold+mp->bsbufold_end-backstep, backstep);
324     mp->bsi.bitindex = 0;
325 }
326 
327 /********************************/
328 
compute_bpf(struct frame * fr)329 double compute_bpf(struct frame *fr)
330 {
331     double bpf;
332 
333     if(!fr->bitrate_index) {
334 		return fr->freeformatsize + 4;
335     }
336 
337     switch(fr->lay) {
338     case 1:
339 	bpf = tabsel_123[fr->lsf][0][fr->bitrate_index];
340 	bpf *= 12000.0 * 4.0;
341 	bpf /= freqs[fr->sampling_frequency] <<(fr->lsf);
342 	break;
343     case 2:
344     case 3:
345 	bpf = tabsel_123[fr->lsf][fr->lay-1][fr->bitrate_index];
346         bpf *= 144000;
347 	bpf /= freqs[fr->sampling_frequency] << (fr->lsf);
348 	break;
349     default:
350 	bpf = 1.0;
351     }
352 
353     return bpf;
354 }
355 
compute_tpf(struct frame * fr)356 double compute_tpf(struct frame *fr)
357 {
358     static int bs[4] = { 0,384,1152,1152 };
359     double tpf;
360 
361     tpf = (double) bs[fr->lay];
362     tpf /= freqs[fr->sampling_frequency] << (fr->lsf);
363     return tpf;
364 }
365 
366 /*int get_songlen(st ruct reader *rds, struct frame *fr, int no)
367 {
368 	double tpf;
369 
370 	if(!fr)
371 		return 0;
372 
373 	if(no < 0)
374 	{
375 		if(!rds || rds->filelen < 0)
376 			return 0;
377 		no = (double) rds->filelen / compute_bpf(fr);
378 	}
379 
380 	tpf = compute_tpf(fr);
381 	return no*tpf;
382 }*/
383 #endif
384