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; 
}