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