求助:MP3解码程序出错
小弟最近在做音频方面的编程,有用到网上比较常用的MP3解码的c代码,就是这个
。。。。。。
while(!end_bs(&bs)) {
//尝试帧同步
sync = seek_sync(&bs, SYNC_WORD, SYNC_WORD_LENGTH);
if (!sync)
{
done = TRUE;
printf("\nFrame cannot be located\n");
out_fifo(*pcm_sample, 3, &fr_ps, done, musicout, &sample_frames);
break;
}
//解码帧头
decode_info(&bs, &fr_ps);
//将fr_ps.header中的信息解读到fr_ps的相关域中
hdr_to_frps(&fr_ps);
//输出相关信息
// if(frameNum == 0)
// WriteHdr(&fr_ps);
// printf("\r%05lu", frameNum++);
if (info.error_protection)
buffer_CRC(&bs, &old_crc);
switch (info.lay) {
case 3:
{
int nSlots, main_data_end, flush_main;
int bytes_to_discard, gr, ch, ss, sb;
static int frame_start = 0;
bitsPerSlot = 8;
//取Side信息
III_get_side_info(&bs, &III_side_info, &fr_ps);
nSlots = main_data_slots(fr_ps);
//读主数据(Audio Data)
for (; nSlots > 0; nSlots--) /* read main data. */
hputbuf((unsigned int) getbits(&bs,8), 8);
main_data_end = hsstell() / 8; /*of privious frame*/
if ( flush_main=(hsstell() % bitsPerSlot) ) {
hgetbits((int)(bitsPerSlot - flush_main));
main_data_end ++;
}
bytes_to_discard = frame_start - main_data_end - III_side_info.main_data_begin ;
if( main_data_end > 4096) { frame_start -= 4096;
rewindNbytes( 4096 );
}
frame_start += main_data_slots(fr_ps);
if (bytes_to_discard < 0) {
printf("Not enough main data to decode frame %d. Frame discarded.\n",
frameNum - 1); break;
}
for (; bytes_to_discard > 0; bytes_to_discard--) hgetbits(8);
clip = 0;
for (gr=0;gr<2;gr++) {
double lr[2][SBLIMIT][SSLIMIT],ro[2][SBLIMIT][SSLIMIT];
//主解码
for (ch=0; ch<fr_ps.stereo; ch++) {
long int is[SBLIMIT][SSLIMIT]; /*保存量化数据*/
int part2_start;
part2_start = hsstell();
//获取比例因子
III_get_scale_factors(&III_scalefac,&III_side_info, gr, ch, &fr_ps);
//Huffman解码
III_hufman_decode(is, &III_side_info, ch, gr, part2_start, &fr_ps);
//反量化采样
III_dequantize_sample(is, ro[ch], &III_scalefac,&(III_side_info.ch[ch].gr[gr]), ch, &fr_ps);
}
。。。。。
使用时发现在解某些MP3文件时,会出问题,原因在于III_hufman_decode()中的
/* Dismiss stuffing Bits */
if ( hsstell() < part2_start + (*si).ch[ch].gr[gr].part2_3_length )
hgetbits( part2_start + (*si).ch[ch].gr[gr].part2_3_length - hsstell());
这部分会出现buffer overflow的情况,即buf_byte_idx > offset不知道应该怎么办
希望有用过这代码的高手指点一下