changeset 10369:b9fdaecc672f

better checks
author arpi
date Fri, 04 Jul 2003 20:43:32 +0000
parents 6fb8a6a4a071
children 2cfd7ef9cb75
files libmpdemux/mp3_hdr.c
diffstat 1 files changed, 25 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/mp3_hdr.c	Thu Jul 03 20:22:51 2003 +0000
+++ b/libmpdemux/mp3_hdr.c	Fri Jul 04 20:43:32 2003 +0000
@@ -14,7 +14,10 @@
      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0},
      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,0} }
 };
-static long freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };
+
+static long freqs[9] = { 44100, 48000, 32000,	// MPEG 1.0
+			 22050, 24000, 16000,   // MPEG 2.0
+			 11025, 12000 , 8000 }; // MPEG 2.5
 
 int mp_mp3_get_lsf(unsigned char* hbuf){
     unsigned long newhead = 
@@ -32,7 +35,7 @@
  * return frame size or -1 (bad frame)
  */
 int mp_get_mp3_header(unsigned char* hbuf,int* chans, int* srate){
-    int stereo,ssize,crc,lsf,mpeg25,framesize,padding,bitrate_index,sampling_frequency;
+    int stereo,ssize,lsf,framesize,padding,bitrate_index,sampling_frequency;
     unsigned long newhead = 
       hbuf[0] << 24 |
       hbuf[1] << 16 |
@@ -43,8 +46,7 @@
 
 #if 1
     // head_check:
-    if( (newhead & 0xffe00000) != 0xffe00000 ||  
-        (newhead & 0x0000fc00) == 0x0000fc00){
+    if( (newhead & 0xffe00000) != 0xffe00000 ){
 	mp_msg(MSGT_DEMUXER,MSGL_DBG2,"head_check failed\n");
 	return -1;
     }
@@ -55,25 +57,23 @@
       return -1;
     }
 
-    if( newhead & ((long)1<<20) ) {
-      lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
-      mpeg25 = 0;
-    } else {
-      lsf = 1;
-      mpeg25 = 1;
-    }
-
-    if(mpeg25)
-      sampling_frequency = 6 + ((newhead>>10)&0x3);
-    else
-      sampling_frequency = ((newhead>>10)&0x3) + (lsf*3);
-
-    if(sampling_frequency>8){
+    sampling_frequency = ((newhead>>10)&0x3);
+    if(sampling_frequency==3){
 	mp_msg(MSGT_DEMUXER,MSGL_DBG2,"invalid sampling_frequency\n");
 	return -1;  // valid: 0..8
     }
 
-    crc = ((newhead>>16)&0x1)^0x1;
+    if( newhead & ((long)1<<20) ) {
+      // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1)
+      lsf = (newhead & ((long)1<<19)) ? 0x0 : 0x1;
+      sampling_frequency += (lsf*3);
+    } else {
+      // MPEG 2.5
+      lsf = 1;
+      sampling_frequency += 6;
+    }
+
+//    crc = ((newhead>>16)&0x1)^0x1;
     bitrate_index = ((newhead>>12)&0xf);
     padding   = ((newhead>>9)&0x1);
 //    fr->extension = ((newhead>>8)&0x1);
@@ -85,16 +85,17 @@
 
     stereo    = ( (((newhead>>6)&0x3)) == 3) ? 1 : 2;
 
-    if(!bitrate_index){
-      mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
-      return -1;
-    }
+// !checked later through tabsel_123[]!
+//    if(!bitrate_index || bitrate_index==15){
+//      mp_msg(MSGT_DEMUXER,MSGL_DBG2,"Free format not supported.\n");
+//      return -1;
+//    }
 
     if(lsf)
       ssize = (stereo == 1) ? 9 : 17;
     else
       ssize = (stereo == 1) ? 17 : 32;
-    if(crc) ssize += 2;
+    if(!((newhead>>16)&0x1)) ssize += 2; // CRC
 
     framesize = tabsel_123[lsf][2][bitrate_index] * 144000;