37 {22050,24000,16000,50000},
38 {44100,48000,32000,50000},
39 {11025,12000,8000,50000}
44 {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256},
45 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160},
46 {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160}
51 {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448},
52 {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384},
53 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320}
61 "stereo",
"joint stereo",
"dual channel",
"mono" 65 "none",
"50/15 microsecs",
"reserved",
"CCITT J 17" 72 int frame_type[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
73 float seconds=0,total_rate=0;
74 int frames=0,frame_types=0,frames_so_far=0;
76 int bitrate_val,lastrate;
80 off_t sample_pos,data_start=0;
89 data_start=ftell(mp3->
file);
100 if(bitrate_val != lastrate) {
107 lastrate=bitrate_val;
115 (
float)(bitrate_tmp*125)+0.5);
124 data_start=ftell(mp3->
file);
126 frame_type[15-bitrate_val]++;
130 for(counter=0;counter<15;counter++) {
131 if(frame_type[counter]) {
134 frames_so_far += frame_type[counter];
135 seconds += (float)(
frame_length(&header)*frame_type[counter])/
137 total_rate += (float)((
header_bitrate(&header))*frame_type[counter]);
138 if((vbr_median == -1) && (frames_so_far >= frames/2))
142 mp3->
seconds=(int)(seconds+0.5);
146 if(frame_types > 1) {
161 fseek(mp3->
file,startpos,SEEK_SET);
163 while((c=fgetc(mp3->
file)) != 255 && (c != EOF));
166 valid_start=ftell(mp3->
file);
175 fseek(mp3->
file,valid_start,SEEK_SET);
194 int l=0,c,skip_bytes=0;
198 while((c=fgetc(mp3->
file)) != 255 && (ftell(mp3->
file) < mp3->
datasize)) skip_bytes++;
232 header->
sync=(((int)buffer[0]<<4) | ((int)(buffer[1]&0xE0)>>4));
233 if(buffer[1] & 0x10) header->
version=(buffer[1] >> 3) & 1;
235 header->
layer=(buffer[1] >> 1) & 3;
236 header->
bitrate=(buffer[2] >> 4) & 0x0F;
237 if((header->
sync != 0xFFE) || (header->
layer != 1) || (header->
bitrate == 0xF)) {
241 header->
crc=buffer[1] & 1;
242 header->
freq=(buffer[2] >> 2) & 0x3;
243 header->
padding=(buffer[2] >>1) & 0x1;
245 header->
mode=(buffer[3] >> 6) & 0x3;
247 header->
copyright=(buffer[3] >> 3) & 0x1;
248 header->
original=(buffer[3] >> 2) & 0x1;
252 if (header->
bitrate == 0x0F || header->
freq == 0x3) {
260 return header->
sync == 0xFFE ?
285 if((*(uint*)h1) == (*(uint*)h2))
return 1;
287 if((h1->version == h2->version ) &&
288 (h1->layer == h2->layer ) &&
289 (h1->crc == h2->crc ) &&
290 (h1->freq == h2->freq ) &&
291 (h1->mode == h2->mode ) &&
292 (h1->copyright == h2->copyright ) &&
293 (h1->original == h2->original ) &&
294 (h1->emphasis == h2->emphasis ))
305 if(fseek(mp3->
file, -128, SEEK_END )) {
306 fprintf(stderr,
"ERROR: Couldn't read last 128 bytes of %s!!\n",mp3->
filename);
309 fread(fbuf,1,3,mp3->
file); fbuf[3] =
'\0';
313 if (!strcmp((
const char *)
"TAG",(
const char *)fbuf)) {
318 fseek(mp3->
file, -125, SEEK_END);
340 char *
pad(
char *
string,
int length) {
356 char *pos=
string+strlen(
string)-1;
357 while(isspace(pos[0])) (pos--)[0]=0;
381 strncat(buf,(
char *)&(mp3->
id3.
genre),1);
387 return (
int)fwrite(buf,1,128,mp3->
file);
int get_id3(mp3info *mp3)
char * pad(char *string, int length)
int get_header(FILE *file, mp3header *header)
char * header_emphasis(mp3header *h)
int write_tag(mp3info *mp3)
int header_bitrate(mp3header *h)
#define MIN_CONSEC_GOOD_FRAMES
int header_layer(mp3header *h)
int get_first_header(mp3info *mp3, long startpos)
char * header_mode(mp3header *h)
int get_mp3_info(mp3info *mp3, int scantype, int fullscan_vbr)
int get_next_header(mp3info *mp3)
char * unpad(char *string)
int frame_length(mp3header *header)
int header_frequency(mp3header *h)
int sameConstant(mp3header *h1, mp3header *h2)
#define FRAME_HEADER_SIZE