228 _mp3_header_internal *_tmpheader;
230 const size_t HEADERSIZE = 4;
231 char buf[HEADERSIZE+1];
246 _mp3_header_output->
frames = 0;
247 _mp3_header_output->
time = 0;
251 buf[HEADERSIZE]=
'\0';
254 if (((buf[0] & 0xFF) != 0xFF) || ((buf[1] & 0xE0) != 0xE0))
260 _tmpheader =
reinterpret_cast<_mp3_header_internal *
>(buf);
263 switch (_tmpheader->id)
287 switch (_tmpheader->layer)
309 _mp3_header_output->
bitrate = _mp3_bitrates[bitrate_index][3-_tmpheader->layer][_tmpheader->bitrate_index];
315 _mp3_header_output->
frequency = _mp3_frequencies[_tmpheader->id][_tmpheader->frequency];
322 _mp3_header_output->
privatebit = (bool)_tmpheader->private_bit;
323 _mp3_header_output->
copyrighted = (bool)_tmpheader->copyright;
324 _mp3_header_output->
original = (bool)_tmpheader->original;
325 _mp3_header_output->
crc = (
Mp3_Crc)!(
bool)_tmpheader->protection_bit;
327 switch (_tmpheader->mode)
350 switch (_tmpheader->mode_ext)
373 switch (_tmpheader->emphasis)
397 switch(_mp3_header_output->
layer)
400 _mp3_header_output->
framesize = 4 * (12 * _mp3_header_output->
bitrate / _mp3_header_output->
frequency + (_tmpheader->padding_bit ? 1 : 0));
403 _mp3_header_output->
framesize = 144 * _mp3_header_output->
bitrate / _mp3_header_output->
frequency + (_tmpheader->padding_bit ? 1 : 0);
407 _mp3_header_output->
framesize = 144 * _mp3_header_output->
bitrate / _mp3_header_output->
frequency + (_tmpheader->padding_bit ? 1 : 0);
409 _mp3_header_output->
framesize = 72000 * _mp3_header_output->
bitrate / _mp3_header_output->
frequency + (_tmpheader->padding_bit ? 1 : 0);
422 const size_t CRCSIZE = 2;
430 int vbr_header_offest = beg + sideinfo_len;
435 if ((_mp3_header_output->
crc ==
MP3CRC_OK) && mp3size < sideinfo_len)
440 char audiodata[38 + 1];
448 reader.
readChars(audiodata, sideinfo_len);
449 audiodata[sideinfo_len] =
'\0';
451 crc16 =
calcCRC(audiodata, sideinfo_len);
457 crcstored = (uint16)io::readBENumber(reader, CRCSIZE);
461 if (crcstored == crc16)
469 const size_t VBR_HEADER_MIN_SIZE = 8;
470 const size_t VBR_HEADER_MAX_SIZE = 120;
472 if (mp3size >= vbr_header_offest + VBR_HEADER_MIN_SIZE)
474 char vbrheaderdata[VBR_HEADER_MAX_SIZE+1];
475 unsigned char *pvbrdata = (
unsigned char *)vbrheaderdata;
476 int vbr_filesize = 0;
483 beg = vbr_header_offest;
485 reader.
readChars(vbrheaderdata, VBR_HEADER_MIN_SIZE);
486 vbrheaderdata[VBR_HEADER_MIN_SIZE] =
'\0';
488 if (pvbrdata[0] ==
'X' &&
489 pvbrdata[1] ==
'i' &&
490 pvbrdata[2] ==
'n' &&
495 vbr_flags = ExtractI4(pvbrdata);
499 unsigned int vbr_header_size = VBR_HEADER_MIN_SIZE
505 if (mp3size >= vbr_header_offest + vbr_header_size)
507 reader.
readChars(&vbrheaderdata[VBR_HEADER_MIN_SIZE], vbr_header_size - VBR_HEADER_MIN_SIZE);
508 vbrheaderdata[vbr_header_size] =
'\0';
514 vbr_frames = ExtractI4(pvbrdata);
520 vbr_filesize = ExtractI4(pvbrdata);
535 vbr_scale = ExtractI4(pvbrdata);
541 _mp3_header_output->
vbr_bitrate = (((vbr_filesize!=0) ? vbr_filesize : mp3size) / vbr_frames) * _mp3_header_output->
frequency / 144;
553 _mp3_header_output->
frames = vbr_frames;
563 _mp3_header_output->
frames = 0;
564 _mp3_header_output->
time = 0;