1 /* OpenCP Module Player
2  * copyright (c) '94-'10 Niklas Beisert <nbeisert@physik.tu-muenchen.de>
3  * copyright (c) '07-'20 Stian Skjelstad <stian.skjelstad@gmail.com>
4  *
5  * MPPlay file type detection routines for fileselector
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  * revision history: (please note changes here)
22  *  -nb980510   Niklas Beisert <nbeisert@physik.tu-muenchen.de>
23  *    -first release
24  *  -ryg990615  Fabian Giesen  <fabian@jdcs.su.nw.schule.de>
25  *    -99% faked VBR detection.. and I still don't really know why it
26  *     works, but... who cares?
27  */
28 
29 #include "config.h"
30 #include <ctype.h>
31 #include <errno.h>
32 #include <stdio.h>
33 #include <string.h>
34 #include <stdlib.h>
35 #include <sys/types.h>
36 #include "types.h"
37 #include "filesel/filesystem.h"
38 #include "filesel/mdb.h"
39 #include "id3.h"
40 #include "stuff/cp437.h"
41 #include "stuff/imsrtns.h"
42 #include "stuff/utf-8.h"
43 
44 #define VBRFRAMES      15
45 
46 static void apply_ID3(struct moduleinfostruct *m, struct ID3_t *dest)
47 {
48 	m->modname[0] = 0;
49 	m->composer[0] = 0;
50 	m->comment[0] = 0;
51 	m->date = 0;
52 
53 	if (dest->TIT2) utf8_to_cp437((char *)dest->TIT2, strlen ((char *)dest->TIT2), m->modname, sizeof (m->modname));
54 	if (dest->TPE1) utf8_to_cp437((char *)dest->TPE1, strlen ((char *)dest->TPE1), m->composer, sizeof (m->composer));
55 	if (dest->TALB) utf8_to_cp437((char *)dest->TALB, strlen ((char *)dest->TALB), m->comment, sizeof (m->comment));
56 	if (dest->COMM)
geqo_eval(PlannerInfo * root,Gene * tour,int num_gene)57 	{
58 		int len;
59 		for (len = 0; len < sizeof (m->comment); len++)
60 		{
61 			if (!m->comment[len])
62 			{
63 				break;
64 			}
65 		}
66 		if ((len + 4) <= sizeof (m->comment))
67 		{
68 			if (len)
69 			{
70 				m->comment[len++] = ' ';
71 				m->comment[len++] = '/';
72 				m->comment[len++] = ' ';
73 				m->comment[len] = 0;
74 			}
75 			utf8_to_cp437((char *)dest->COMM, strlen ((char *)dest->COMM), m->comment, sizeof (m->comment));
76 		}
77 	}
78 	if (dest->TYER) m->date=atoi((char *)dest->TYER) << 16;
79 	if (dest->TDAT) m->date=atoi((char *)dest->TDAT);
80 }
81 
82 static void parseid3v1(struct moduleinfostruct *m, const uint8_t *tag)
83 {
84 	struct ID3v1data_t data;
85 	struct ID3_t dest = {0};
86 
87 	if (parse_ID3v1x (&data, tag, 128)) return;
88 	if (finalize_ID3v1 (&dest, &data)) return;
89 
90 	apply_ID3(m, &dest);
91 
92 	ID3_clear(&dest);
93 }
94 
95 static void parseid3v12(struct moduleinfostruct *m, const unsigned char *tag)
96 {
97 	struct ID3v1data_t data;
98 	struct ID3_t dest = {0};
99 
100 	if (parse_ID3v1x (&data, tag+128, 128)) return;
101 	if (parse_ID3v12 (&data, tag    , 128)) return;
102 	if (finalize_ID3v1 (&dest, &data)) return;
103 
104 	apply_ID3(m, &dest);
105 
106 	ID3_clear(&dest);
107 }
108 
109 static int parseid3v2(struct moduleinfostruct *m, uint8_t *tag, uint32_t len)
110 {
111 	struct ID3_t dest = {0};
112 
113 	if (parse_ID3v2x (&dest, tag, len) < 0) return -1;
114 
115 	apply_ID3(m, &dest);
116 
117 	ID3_clear(&dest);
118 
119 	return 0;
120 }
121 
122 static int freqtab[3][3]=
123 {
124 	{44100, 48000, 32000}, {22050, 24000, 16000}, {11025, 12000, 8000}
125 };
126 
127 static uint16_t fetch16(const uint8_t *buf)
128 {
129 	return buf[0]|(buf[1]<<8);
130 }
131 
132 static uint32_t fetch32(const uint8_t *buf)
133 {
134 	return buf[0]|(buf[1]<<8)|(buf[2]<<16)|(buf[3]<<24);
135 }
136 
137 static int ampegpReadMemInfo(struct moduleinfostruct *m, const char *_buf, size_t len)
138 {
139 	const uint8_t *buf = (const uint8_t *)_buf;
140 	const uint8_t *bufend = buf+len;
141 	uint32_t hdr;
142 	int layer;
143 	int ver;
144 	int rateidx;
145 	int frqidx;
146 	int padding;
147 	int stereo;
148 	int rate;
149 	int br, lastbr;
150 	int temp;
151 
152 	if ((toupper(m->name[9])!='M')||(toupper(m->name[10])!='P'))
153 		return 0;
154 
155 	/* first, try to detect if we have an mpeg stream embedded into a riff/wave container. Often used on layer II files */
156 	                   /* RIFF */                    /* WAVE */                     /* fmt  */
157 	if ((fetch32(buf)==0x46464952)&&(fetch32(buf+8)==0x45564157)&&(fetch32(buf+12)==0x20746D66)&&(fetch16(buf+20)==0x0055))
158 	{
159 		int i;
160 		i=20;
161 		while (i<800)
162 		{
gimme_tree(PlannerInfo * root,Gene * tour,int num_gene)163 			/* avoid buffer overflow */
164 			if ((buf+i)>=bufend)
165 				return 0;
166 		                              /* data */
167 			if (fetch32(buf+i-8)==0x61746164)
168 				break;
169 			i+=8+uint32_little(*(uint32_t*)(buf+i-4));
170 		}
171 		if (i>=800) /* nothing found */
172 			return 0;
173 		buf+=i;
174 	}
175 
176 	if ((buf+3)<bufend)
177 	{
178 		if ((buf[0]=='I')&&(buf[1]=='D')&&(buf[2]=='3'))
179 		{
180 			uint_fast32_t size;
181 			m->modtype=mtMPx; /* force this to be a mp3.. even though id3 tag can be bigger than our buffer */
182 			if ((buf+10)>=bufend)
183 				return 0;
184 			if ((buf[6] & 0x80) ||
185 			    (buf[7] & 0x80) ||
186 			    (buf[8] & 0x80) ||
187 			    (buf[9] & 0x80))
188 			{
189 				return 0;
190 			}
191 
192 			size=(buf[6]<<21)|(buf[7]<<14)|(buf[8]<<7)|(buf[9]);
193 			if ((buf + 10 + size) <= bufend)
194 			{
195 				uint8_t *buffer = malloc (size + 10);
196 				memcpy (buffer, buf, size + 10);
197 				parseid3v2(m, buffer, size + 10);
198 				free (buffer);
199 			}
200 			buf+=(size+10);
201 			return 0;
202 		}
203 
204 		if ((buf[0]=='T')&&(buf[1]=='A')&&(buf[2]=='G'))
205 		{
206 			m->modtype=mtMPx; /* force this to be a mp3.. even though id3 tag can be bigger than our buffer */
207 			if ((buf+128)>bufend)
208 			{
209 				parseid3v1(m, buf);
210 			}
211 			buf+=128;
212 			return 0;
213 		}
214 	}
215 
216 	if ((buf+sizeof(uint32_t))>=bufend)
217 		return 0;
218 	while ((fetch16(buf)&0xE0FF)!=0xE0FF)
219 	{
220 		buf+=1;
221 		if ((buf+sizeof(uint32_t))>=bufend)
222 			return 0;
223 	}
224 
225 	hdr=fetch32(buf);
226 	layer=4-((hdr>>9)&3);
227 	if (layer>=4)
228 		return 0;
229 	ver=((hdr>>11)&1)?0:1;
230 	if (!((hdr>>12)&1))
231 	{
232 		if (ver)
233 			ver=2;
234 		else
235 			return 0;
236 	}
237 	if ((ver==2)&&(layer!=3))
merge_clump(PlannerInfo * root,List * clumps,Clump * new_clump,int num_gene,bool force)238 		return 0;
239 	rateidx=(hdr>>20)&15;
240 	frqidx=(hdr>>18)&3;
241 	padding=(hdr>>17)&1;
242 	stereo="\x01\x01\x02\x00"[(hdr>>30)&3];
243 	if (frqidx==3)
244 		return 0;
245 	if (!ver)
246 	{
247 		switch (layer)
248 		{
249 			case 1:
250 				rate="\x00\x04\x08\x0C\x10\x14\x18\x1C\x20\x24\x28\x2C\x30\x34\x38\x00"[rateidx]*8;
251 				break;
252 			case 2:
253 				rate="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x30\x00"[rateidx]*8;
254 				break;
255 			case 3:
256 				rate="\x00\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x00"[rateidx]*8;
257 				break;
258 			default:
259 				return 0;
260 		}
261 	} else {
262 		switch (layer)
263 		{
264 			case 1:
265 				rate="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x16\x18\x1C\x20\x00"[rateidx]*8;
266 				break;
267 			case 2:
268 				rate="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[rateidx]*8;
269 				break;
270 			case 3:
271 				rate="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[rateidx]*8;
272 				break;
273 			default:
274 				return 0;
275 		}
276 	}
277 	if (!rate)
278 		return 0;
279 
280 	m->modname[0]=0;
281 	switch (layer)
282 	{
283 		case 1:
284 			strcat(m->modname, "Layer   I, ");
285 			break;
286 		case 2:
287 			strcat(m->modname, "Layer  II, ");
288 			break;
289 		case 3:
290 			strcat(m->modname, "Layer III, ");
291 			break;
292 	}
293 	switch (ver)
294 	{
295 		case 0:
296 			switch (frqidx)
297 			{
298 				case 0:
299 					strcat(m->modname, "44100 Hz, ");
300 					break;
301 				case 1:
302 					strcat(m->modname, "48000 Hz, ");
303 					break;
304 				case 2:
305 					strcat(m->modname, "32000 Hz, ");
306 					break;
307 			}
308 			break;
309 		case 1:
310 			switch (frqidx)
311 			{
312 				case 0:
313 					strcat(m->modname, "22050 Hz, ");
314 					break;
315 				case 1:
316 					strcat(m->modname, "24000 Hz, ");
317 					break;
318 				case 2:
319 					strcat(m->modname, "16000 Hz, ");
320 					break;
321 			}
322 			break;
323 		case 2:
324 			switch (frqidx)
325 			{
326 				case 0:
327 					strcat(m->modname, "11025 Hz, ");
328 					break;
329 				case 1:
330 					strcat(m->modname, "12000 Hz, ");
331 					break;
332 				case 2:
desirable_join(PlannerInfo * root,RelOptInfo * outer_rel,RelOptInfo * inner_rel)333 					strcat(m->modname, " 8000 Hz, ");
334 					break;
335 			}
336 			break;
337 	}
338 
339 	br=rate;
340 	lastbr=rate;
341 
342 	for (temp=0; temp<VBRFRAMES; temp++)
343 	{
344 		int skip;
345 		uint32_t hdr;
346 
347 		switch (layer)
348 		{
349 			case 1:
350 				skip=umuldiv(br, 12000, freqtab[ver][frqidx])+(padding<<2);
351 			case 2:
352 				skip=umuldiv(br, 144000, freqtab[ver][frqidx])+padding;
353 			default:
354 			case 3:
355 				skip=umuldiv(br, 144000, freqtab[ver][frqidx])+padding;
356 		}
357 		buf+=skip;
358 
359 		if ((buf+sizeof(uint32_t))>=bufend)
360 			break;
361 
362 		while ((fetch16(buf)&0xE0FF)!=0xE0FF)
363 		{
364 			buf+=1;
365 			if ((buf+sizeof(uint32_t))>=bufend)
366 				goto outofframes; /* we can't break two levels */
367 		}
368 
369 		hdr=fetch32(buf);
370 		layer=4-((hdr>>9)&3);
371 		if (layer==4)
372 			break;
373 		ver=((hdr>>11)&1)?0:1;
374 		if (!((hdr>>12)&1))
375 		{
376 			if (ver)
377 				ver=2;
378 			else
379 				break;
380 		}
381 		if ((ver==2)&&(layer!=3))
382 			break;
383 		frqidx=(hdr>>18)&3;
384 		padding=(hdr>>17)&1;
385 		stereo="\x01\x01\x02\x00"[(hdr>>30)&3];
386 		if (frqidx==3)
387 			break;
388 
389 		lastbr=br;
390 		br=(hdr>>20)&15;
391 
392 		if (!ver)
393 			switch (layer)
394 			{
395 				case 1:
396 					br="\x00\x04\x08\x0C\x10\x14\x18\x1C\x20\x24\x28\x2C\x30\x34\x38\x00"[br]*8;
397 					break;
398 				case 2:
399 					br="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x30\x00"[br]*8;
400 					break;
401 				case 3:
402 					br="\x00\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x00"[br]*8;
403 					break;
404 			} else switch (layer)
405 			{
406 				case 1:
407 					br="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x16\x18\x1C\x20\x00"[br]*8;
408 					break;
409 				case 2:
410 					br="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[br]*8;
411 					break;
412 				case 3:
413 					br="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[br]*8;
414 					break;
415 			}
416 
417 		if ((lastbr!=br) && temp) /* first frame might be TAG */
418 			break;
419 	}
420 outofframes:
421 
422 	if (lastbr==br)
423 	{
424 		if (rate<100)
425 			strcat(m->modname, " ");
426 		if (rate<10)
427 			strcat(m->modname, " ");
428 
429 		sprintf(m->modname+strlen(m->modname), "%d", rate);
430 
431 		strcat(m->modname, " kbps");
432 		m->playtime=m->size/(rate*125);
433 	} else {
434 		strcat(m->modname, "VBR");
435 		m->playtime=0; /* unknown */
436 	}
437 
438 	m->channels=stereo?2:1;
439 	m->modtype=mtMPx;
440 	return 0;
441 }
442 
443 static int ampegpReadInfo(struct moduleinfostruct *m, struct ocpfilehandle_t *f, const char *_buf, size_t len)
444 {
445 	int64_t relstart = 0; /* offset */
446 	const uint8_t *buf = (const uint8_t *)_buf;
447 	const uint8_t *bufend=buf+len;
448 	uint32_t hdr;
449 	int layer;
450 	int ver;
451 	int rateidx;
452 	int frqidx;
453 	int padding;
454 	int stereo;
455 	int rate;
456 	int br, lastbr;
457 	int temp;
458 
459 	if ((toupper(m->name[9])!='M')||(toupper(m->name[10])!='P'))
460 		return 0;
461 
462 	/* First, try to detect if we have an mpeg stream embedded into a riff/wave container. Often used on layer II files.
463 	 * This should fit inside the provided buf/len data
464 	 * */
465 	                               /* RIFF */                    /* WAVE */                     /* fmt  */
466 	if ((len > 22)&&(fetch32(buf)==0x46464952)&&(fetch32(buf+8)==0x45564157)&&(fetch32(buf+12)==0x20746D66)&&(fetch16(buf+20)==0x0055))
467 	{
468 		int i;
469 		i=20;
470 		while (i<800)
471 		{
472 			/* avoid buffer overflow */
473 			if ((buf+i)>=bufend)
474 				return 0;
475 			                      /* data */
476 			if (fetch32(buf+i-8)==0x61746164)
477 				break;
478 			i+=8+uint32_little(*(uint32_t*)(buf+i-4));
479 		}
480 		if (i>=800) /* nothing found */
481 			return 0;
482 		buf+=i;
483 		relstart=i;
484 	}
485 
486 	while ((buf+3)<bufend)
487 	{
488 		/* most common is ID3v2 tag at the start of the file, and ID3v1 at the end - we want the ID3v2 tag */
489 		if ((buf[0]=='I')&&(buf[1]=='D')&&(buf[2]=='3'))
490 		{
491 			uint_fast32_t realsize;
492 			uint8_t tagv2header[10];
493 			uint8_t *buffer = 0;
494 			uint8_t *tagv2data;
495 			m->modtype=mtMPx;
496 			if ((buf+10)>=bufend)
497 			{
498 				if (f->seek_set (f, relstart) < 0)
499 				{
500 					break;
501 				}
502 				if (f->read (f, tagv2header, 10) != 10)
503 				{
504 					break;
505 				}
506 			} else {
507 				memcpy(tagv2header, buf, 10);
508 			}
509 			if ((tagv2header[6] & 0x80) ||
510 			    (tagv2header[7] & 0x80) ||
511 			    (tagv2header[8] & 0x80) ||
512 			    (tagv2header[9] & 0x80))
513 			{
514 				break;
515 			}
516 			realsize = (tagv2header[6]<<21)|(tagv2header[7]<<14)|(tagv2header[8]<<7)|(tagv2header[9]);
517 			if (realsize > 32*1024*1024)
518 			{
519 				f->seek_set (f, 0);
520 				return 1;
521 			}
522 			if ((buf+10+realsize)>bufend)
523 			{
524 				tagv2data = buffer = malloc(realsize+10);
525 				if (!buffer)
526 					break;
527 				if (f->seek_set (f, relstart) < 0)
528 				{
529 					break;
530 				}
531 				if (f->read (f, buffer, realsize + 10) != (realsize + 10))
532 				{
533 					break;
534 				}
535 			} else {
536 					tagv2data = (uint8_t *)buf;
537 			}
538 			parseid3v2(m, tagv2data, realsize + 10);
539 			if (buffer)
540 				free(buffer);
541 			/*
542 			buf+=10+realsize;
543 			relstart+=10+realsize;
544 			continue;
545 			*/
546 			f->seek_set (f, 0);
547 			return 1;
548 		/* ID3v1 tag at the start of the file is bit uncommon */
549 		} else if ((buf[0]=='T')&&(buf[1]=='A')&&(buf[2]=='G'))
550 		{
551 			uint8_t id3v1[128];
552 			m->modtype=mtMPx;
553 
554 			if ((buf+128)>bufend)
555 			{
556 				if (f->seek_set (f, relstart) < 0)
557 				{
558 					break;
559 				}
560 				if (f->read (f, id3v1, 128) != 128)
561 				{
562 					break;
563 				}
564 			} else {
565 				memcpy(id3v1, buf, 128);
566 			}
567 			parseid3v1(m, id3v1);
568 			/*
569 			buf+=128;
570 			relstart+=128;
571 			continue;
572 			*/
573 			f->seek_set (f, 0);
574 			return 1;
575 		} else
576 			break;
577 	}
578 
579 	f->seek_end (f, 0);
580 	m->modname[0] = 0;
581 	while (1)
582 	{
583 		/* test for ID3v1.0/ID3v1.1 and ID3v1.2 */
584 		{
585 			uint8_t id3v1[256];
586 			f->seek_cur (f, -256);
587 			if (f->read (f, id3v1, 256) != 256)
588 			{
589 				f->seek_set (f, 0);
590 				return 0;
591 			}
592 			if ((id3v1[128]=='T')&&(id3v1[129]=='A')&&(id3v1[130]=='G'))
593 			{
594 				m->modtype=mtMPx;
595 				if ((id3v1[0]=='E')&&(id3v1[1]=='X')&&(id3v1[2]=='T'))
596 				{
597 					f->seek_cur (f, -256);
598 					parseid3v12(m, id3v1);
599 				} else {
600 					f->seek_cur (f, -128);
601 					parseid3v1(m, id3v1+128);
602 				}
603 				/*gottag++;*/
604 				continue;
605 			}
606 		}
607 		/* test for ID3v2.x */
608 		{
609 			uint8_t id3v2header[10];
610 			f->seek_cur (f, -10);
611 			if (f->read (f, id3v2header, 10) != 10)
612 			{
613 				f->seek_set (f, 0);
614 				return 0;
615 			}
616 			/* test for ID3v2.4 footer first */
617 			if ((id3v2header[0]=='3')&&(id3v2header[1]=='D')&&(id3v2header[2]=='I')&&(id3v2header[3]!=0xff)&&(id3v2header[4]!=0xff))
618 			{
619 				uint8_t *id3v2data;
620 				uint_fast32_t size = (id3v2header[6]<<21)|(id3v2header[7]<<14)|(id3v2header[8]<<7)|(id3v2header[9]);
621 
622 				m->modtype=mtMPx;
623 
624 				f->seek_cur (f, -(size+20));
625 
626 				id3v2data = malloc(size+10);
627 				if (f->read (f, id3v2data, size+10) == (size + 10))
628 				{
629 					parseid3v2(m, id3v2data, size+10);
630 				}
631 				free(id3v2data);
632 
633 				/*fseeko(f, -(size+20), SEEK_CUR);*/
634 				/*continue;*/
635 
636 				f->seek_set (f, 0);
637 				return 1;
638 			}
639 			/* search for ID3v2.x */
640 			{
641 				uint8_t *buffer = calloc(65536+4096, 1); /* 4k for for miss-designed tag paddings */
642 				f->seek_cur (f, -65536);
643 				if (f->read (f, buffer, 65536) == 65536)
644 				{
645 					uint8_t *curr = buffer;
646 					uint8_t *next;
647 					while ((next = memmem (curr, 65536 - (curr - buffer), "ID3", 3)))
648 					{
649 						curr = next + 1;
650 						if ((next[3] != 0xff) &&
651 						    (next[4] != 0xff) &&
652 						    (next[5] != 0xff) &&
653 						  (!(next[6] & 0x80)) &&
654 						  (!(next[7] & 0x80)) &&
655 						  (!(next[8] & 0x80)) &&
656 						  (!(next[9] & 0x80)))
657 						{
658 							uint32_t size = (next[6] << 21) |
659 							                (next[7] << 14) |
660 							                (next[8] <<  7) |
661 							                 next[9];
662 							if (size < 65536 + 4096 - (next - buffer))
663 							{
664 								if (!parseid3v2(m, next, size + 10))
665 								{
666 									free (buffer);
667 									f->seek_set (f, 0);
668 									return 1;
669 								}
670 							}
671 						}
672 					}
673 				}
674 				free (buffer);
675 			}
676 		}
677 		break;
678 	}
679 	if (m->modname[0])
680 	{
681 		f->seek_set (f, 0);
682 		return 0;
683 	}
684 	/*fseeko(f, relstart, SEEK_SET);*/
685 
686 	/* no meta-data, so make up some */
687 
688 	if ((buf+sizeof(uint32_t))>=bufend)
689 	{
690 		f->seek_set (f, 0);
691 		return 0;
692 	}
693 	while ((fetch16(buf)&0xE0FF)!=0xE0FF)
694 	{
695 		buf+=1;
696 		if ((buf+sizeof(uint32_t))>=bufend)
697 		{
698 			f->seek_set (f, 0);
699 			return 0;
700 		}
701 	}
702 
703 	hdr=fetch32(buf);
704 	layer=4-((hdr>>9)&3);
705 	if (layer>=4)
706 	{
707 		f->seek_set (f, 0);
708 		return 0;
709 	}
710 	ver=((hdr>>11)&1)?0:1;
711 	if (!((hdr>>12)&1))
712 	{
713 		if (ver)
714 		{
715 			ver=2;
716 		} else {
717 			f->seek_set (f, 0);
718 			return 0;
719 		}
720 	}
721 	if ((ver==2)&&(layer!=3))
722 	{
723 		f->seek_set (f, 0);
724 		return 0;
725 	}
726 	rateidx=(hdr>>20)&15;
727 	frqidx=(hdr>>18)&3;
728 	padding=(hdr>>17)&1;
729 	stereo="\x01\x01\x02\x00"[(hdr>>30)&3];
730 	if (frqidx==3)
731 	{
732 		f->seek_set (f, 0);
733 		return 0;
734 	}
735 	if (!ver)
736 	{
737 		switch (layer)
738 		{
739 			case 1:
740 				rate="\x00\x04\x08\x0C\x10\x14\x18\x1C\x20\x24\x28\x2C\x30\x34\x38\x00"[rateidx]*8;
741 				break;
742 			case 2:
743 				rate="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x30\x00"[rateidx]*8;
744 				break;
745 			case 3:
746 				rate="\x00\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x00"[rateidx]*8;
747 				break;
748 			default:
749 				f->seek_set (f, 0);
750 				return 0;
751 		}
752 	} else {
753 		switch (layer)
754 		{
755 			case 1:
756 				rate="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x16\x18\x1C\x20\x00"[rateidx]*8;
757 				break;
758 			case 2:
759 				rate="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[rateidx]*8;
760 				break;
761 			case 3:
762 				rate="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[rateidx]*8;
763 				break;
764 			default:
765 				f->seek_set (f, 0);
766 				return 0;
767 		}
768 	}
769 
770 	if (!rate)
771 	{
772 		f->seek_set (f, 0);
773 		return 0;
774 	}
775 
776 	m->modname[0]=0;
777 	switch (layer)
778 	{
779 		case 1:
780 			strcat(m->modname, "Layer   I, ");
781 			break;
782 		case 2:
783 			strcat(m->modname, "Layer  II, ");
784 			break;
785 		case 3:
786 			strcat(m->modname, "Layer III, ");
787 			break;
788 	}
789 	switch (ver)
790 	{
791 		case 0:
792 			switch (frqidx)
793 			{
794 				case 0:
795 					strcat(m->modname, "44100 Hz, ");
796 					break;
797 				case 1:
798 					strcat(m->modname, "48000 Hz, ");
799 					break;
800 				case 2:
801 					strcat(m->modname, "32000 Hz, ");
802 					break;
803 			}
804 			break;
805 		case 1:
806 			switch (frqidx)
807 			{
808 				case 0:
809 					strcat(m->modname, "22050 Hz, ");
810 					break;
811 				case 1:
812 					strcat(m->modname, "24000 Hz, ");
813 					break;
814 				case 2:
815 					strcat(m->modname, "16000 Hz, ");
816 					break;
817 			}
818 			break;
819 		case 2:
820 			switch (frqidx)
821 			{
822 				case 0:
823 					strcat(m->modname, "11025 Hz, ");
824 					break;
825 				case 1:
826 					strcat(m->modname, "12000 Hz, ");
827 					break;
828 				case 2:
829 					strcat(m->modname, " 8000 Hz, ");
830 					break;
831 			}
832 			break;
833 	}
834 
835 	br=rate;
836 	lastbr=rate;
837 
838 	for (temp=0; temp<VBRFRAMES; temp++)
839 	{
840 		int skip;
841 		uint32_t hdr;
842 
843 		switch (layer)
844 		{
845 			case 1:
846 				skip=umuldiv(br, 12000, freqtab[ver][frqidx])+(padding<<2);
847 			case 2:
848 				skip=umuldiv(br, 144000, freqtab[ver][frqidx])+padding;
849 			default:
850 			case 3:
851 				skip=umuldiv(br, 144000, freqtab[ver][frqidx])+padding;
852 		}
853 		buf+=skip;
854 
855 		if ((buf+sizeof(uint32_t))>=bufend)
856 			break;
857 
858 		while ((fetch16(buf)&0xE0FF)!=0xE0FF)
859 		{
860 			buf+=1;
861 			if ((buf+sizeof(uint32_t))>=bufend)
862 				goto outofframes; /* we can't break two levels */
863 		}
864 
865 		hdr=fetch32(buf);
866 		layer=4-((hdr>>9)&3);
867 		if (layer==4)
868 			break;
869 		ver=((hdr>>11)&1)?0:1;
870 		if (!((hdr>>12)&1))
871 		{
872 			if (ver)
873 				ver=2;
874 			else
875 				break;
876 		}
877 		if ((ver==2)&&(layer!=3))
878 			break;
879 		frqidx=(hdr>>18)&3;
880 		padding=(hdr>>17)&1;
881 		stereo="\x01\x01\x02\x00"[(hdr>>30)&3];
882 		if (frqidx==3)
883 			break;
884 
885 		lastbr=br;
886 		br=(hdr>>20)&15;
887 
888 		if (!ver)
889 			switch (layer)
890 			{
891 				case 1:
892 					br="\x00\x04\x08\x0C\x10\x14\x18\x1C\x20\x24\x28\x2C\x30\x34\x38\x00"[br]*8;
893 					break;
894 				case 2:
895 					br="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x30\x00"[br]*8;
896 					break;
897 				case 3:
898 					br="\x00\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x14\x18\x1C\x20\x28\x00"[br]*8;
899 					break;
900 			} else switch (layer)
901 			{
902 				case 1:
903 					br="\x00\x04\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x16\x18\x1C\x20\x00"[br]*8;
904 					break;
905 				case 2:
906 					br="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[br]*8;
907 					break;
908 				case 3:
909 					br="\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0A\x0C\x0E\x10\x12\x14\x00"[br]*8;
910 					break;
911 			}
912 
913 		if ((lastbr!=br) && temp) /* first frame might be TAG */
914 			break;
915 	}
916 outofframes:
917 
918 	if (lastbr==br)
919 	{
920 		if (rate<100)
921 			strcat(m->modname, " ");
922 		if (rate<10)
923 			strcat(m->modname, " ");
924 
925 		sprintf(m->modname+strlen(m->modname), "%d", rate);
926 
927 		strcat(m->modname, " kbps");
928 		m->playtime=m->size/(rate*125);
929 	} else {
930 		strcat(m->modname, "VBR");
931 		m->playtime=0; /* unknown */
932 	}
933 
934 	m->channels=stereo?2:1;
935 	m->modtype=mtMPx;
936 	f->seek_set (f, 0);
937 	return 0;
938 }
939 
940 struct mdbreadinforegstruct ampegpReadInfoReg = {ampegpReadMemInfo, ampegpReadInfo, 0 MDBREADINFOREGSTRUCT_TAIL};
941