www.pudn.com > mp3_source.rar > layer3.c
#include#include #include "common.h" #include "decode.h" void main(int argc, char**argv) { FILE *musicout; Bit_stream_struc bs; frame_params fr_ps; III_side_info_t III_side_info; III_scalefac_t III_scalefac; unsigned int old_crc; layer info; int sync, clip; int done = FALSE; unsigned long frameNum=0; unsigned long bitsPerSlot; unsigned long sample_frames; typedef short PCM[2][SSLIMIT][SBLIMIT]; PCM *pcm_sample; pcm_sample = (PCM *) mem_alloc((long) sizeof(PCM), "PCM Samp"); if (argc==1) { printf("Useage:decode file.mp3 output.pcm\n"); return; } fr_ps.header = &info; if ((musicout = fopen(argv[2], "w+b")) == NULL) { printf ("Could not create \"%s\".\n", argv[2]); exit(1); } open_bit_stream_r(&bs, argv[1], BUFFER_SIZE); sample_frames = 0; 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 0) printf("\n%d samples clipped.\n", clip); } break; default: printf("\nOnly layer III supported!\n"); exit(1); break; } } close_bit_stream_r(&bs); fclose(musicout); printf("\nDecoding done.\n"); return; }