⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layer3.c

📁 ARM7平台上的MP3编解码程序
💻 C
字号:
/***********************************************
copyright by Haia Tech
www.haia2004.com
************************************************/


//#include <stdio.h>
//#include <stdlib.h>
#include "common.h"
#include "decode.h"

unsigned int   totpos=0;
unsigned char  buf[BITSTREAM_BUFSIZE];
unsigned int   frameNum=0,x4;
extern Bit_stream_struc  bs;
frame_params fr_ps; 
struct Granule grle[2][2];
short *pcm_dat;
short led;

extern unsigned short *mp3_dat;
extern unsigned int buf_byte_idx;


//FILE *file_p;

void mp3()
{
//	FILE *musicout;
	III_side_info_t III_side_info;
	III_scalefac_t III_scalefac;
	layer info;
	short pcm_sample[2][SSLIMIT][SBLIMIT];
	int i,j,k;

/*
	char *filename1="d:\\arm_app\\encode_mp3\\10.mp3";
	char *filename2="d:\\arm_app\\encode_mp3\\out.pcm" ;

    
	
	if ((musicout = fopen(filename2, "w+b")) == NULL) {
		printf ("Could not create \"%s\".\n", filename2);
		exit(1);
	}

	if ((file_p = fopen(filename1, "rb")) == NULL) {
		printf("Could not find \"%s\".\n", filename1);
		exit(1);
	}
*/

    mp3_dat=(unsigned short *)0x0c030000;
    pcm_dat=(short *)0x0c100000;
	fr_ps.header = &info; 
    open_bit_stream_r();
    frameNum=0;
    totpos=0;
    buf_byte_idx=0;
   
	while(!bs.eobs) {
		//尝试帧同步 
		if (!seek_sync(SYNC_WORD)) {
//			printf("\nFrame cannot be located\n");
			break;
		}
		//解码帧头
		decode_info( );
		//将fr_ps.header中的信息解读到fr_ps的相关域中
		hdr_to_frps();
		//输出相关信息
//		printf("\r%05lu", frameNum);
        frameNum++;
		if(led)
		{
		  led=0;
      	  *(unsigned int *)0x1d20044=0xff;    //LED is Off
      	}
		else
		{
		  led=1;
      	  *(unsigned int *)0x1d20044=0xf7;    //LED is ON
      	}
		
		
		if(frameNum>500) break;
		
		if (info.error_protection)
			buffer_CRC();
		switch (info.lay) {
		case 3:
		{
			int nSlots, main_data_end, flush_main;
			int bytes_to_discard, gr, ch;

			static int frame_start = 0;    


			//取Side信息
			III_get_side_info(&III_side_info);
			nSlots = main_data_slots();

			 //读主数据(Audio Data)
			for (; nSlots > 0; nSlots--)  /* read main data. */
				hputbuf((unsigned char) getbit(8));
			main_data_end = totpos / 8; /*of privious frame*/
			if ( flush_main=(totpos % bitsPerSlot) )
			{
				hgetbits((int)(bitsPerSlot - flush_main));
				main_data_end ++;
			}
			bytes_to_discard = frame_start - main_data_end - III_side_info.main_data_begin ;
			/*    最多=1  */
			if( main_data_end > BITSTREAM_BUFSIZE )
			{
				frame_start -= BITSTREAM_BUFSIZE;
				rewindNbytes( BITSTREAM_BUFSIZE);               //  totpos-=4096*8
			}

			frame_start += main_data_slots();
			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);

			for (gr=0;gr<2;gr++)
			{
//				double hybridIn[2][SBLIMIT][SSLIMIT];/* Hybrid filter input */
				SS  hybridIn[2];
  			    //主解码
				for (ch=0; ch<fr_ps.stereo; ch++)
				{
				    int is[SBLIMIT][SSLIMIT];   /*保存量化数据 频率线*/
				    int part2_start;
	 			    part2_start=totpos;
					//获取比例因子
					III_get_scale_factors(&III_scalefac,&III_side_info, gr, ch);
					//Huffman解码 

					III_hufman_decode(&grle[ch][gr],part2_start,is);

                    //逆量化采样
					III_dequantize_sample(is, hybridIn[ch], &III_scalefac, &grle[ch][gr], ch);
				}
				//两个声道处理完,进行立体声处理
				III_stereo(hybridIn, &III_scalefac, &grle[0][gr]);

				for (ch=0; ch<fr_ps.stereo; ch++) 
				{ 
					III_reorder(hybridIn[ch], &grle[ch][gr]);
					//反混叠处理
					III_antialias(hybridIn[ch],&grle[ch][gr]);
					//IMDCT 加窗 叠加 
                    Granule_imdct(&grle[ch][gr], ch, hybridIn[ch]);
					//多相频率倒置  X(-1)

                    Granule_freqinverse(hybridIn[ch]);
				}
				//多相合成
                if(fr_ps.stereo == 2)  
                  Granule_subband_synthesis2(hybridIn[0],hybridIn[1],pcm_sample);
                else   // 单声道处理
                  Granule_subband_synthesis( 0,hybridIn[0],pcm_sample);
//                  Granule_subband_synthesis( 1,hybridIn[1],pcm_sample);
				/* Output PCM sample points for one granule(颗粒). */
//                fwrite(pcm_sample,2,SBLIMIT*SSLIMIT*2,musicout);
                for(i=0;i<2;i++)
                  for(j=0;j<SSLIMIT;j++)
                    for(k=0;k<SBLIMIT;k++)
                    {
                       *pcm_dat=pcm_sample[i][j][k];
                       pcm_dat++;
                    }

			}
		} 
		break;  
		default:
//			printf("\nOnly layer III supported!\n");
//			exit(1);
			break;
		}
	}
//	fclose(file_p);
//	fclose(musicout);
//	printf("\nDecoding done.\n");

  	*(unsigned int *)0x1d20044=0xff;    //LED is Off
    while(1);
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -