MP3_Layer3.c
上传用户:kingbiz
上传日期:2022-06-24
资源大小:2524k
文件大小:9k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. #include "Include.h"
  2. #include "mp3_common.h"
  3. #include "mp3_decode.h"
  4. /*============================================================================*/
  5. /*============================================================================*/
  6. U32   totpos=0;
  7. U8    *mp3_src;
  8. U32   mp3_dat_size;
  9. U32   frameNum=0;
  10. S8  bs_buf[BITSTREAM_BUFSIZE];
  11. float  s_freq[4] = {44.1, 48, 32, 0};
  12. struct Granule grle[2][2];
  13. Bit_stream_struc  bs;
  14. frame_params fr_ps; 
  15. /*============================================================================*/
  16. static S16 *pcm_dat;
  17. static U16 *mp3_dat;
  18. static S16 pcm_sample[2][SSLIMIT][SBLIMIT];
  19. static S16 pcm_buf0[0x100000];
  20. static S16 pcm_buf1[0x100000];
  21. static int pcm_size0;
  22. static int pcm_size1;
  23. static int pcm_state0=0;
  24. static int pcm_state1=0;
  25. /*============================================================================*/
  26. #define IN_PLAY 1
  27. #define IN_DECODE 2
  28. /*============================================================================*/
  29. /*============================================================================*/
  30. /*============================================================================*/
  31. /*============================================================================*/
  32. /*============================================================================*/
  33. int MP3Decode(void *pPCM,void *pMp3,U32 size)
  34. {
  35. III_side_info_t III_side_info;
  36. III_scalefac_t III_scalefac;
  37. layer info;
  38. int i,j,k;
  39. ////
  40. U32 pcm_size;
  41. ////
  42.     mp3_dat =pMp3;
  43.     mp3_src =pMp3;
  44.   //  mp3_dat_size =0x40000;
  45.     mp3_dat_size =size;
  46.     
  47.   //  pcm_dat=(short *)pPCM;
  48.    pcm_dat=pPCM;
  49.     
  50. fr_ps.header = &info; 
  51.     open_bit_stream_r();
  52.     frameNum =0;
  53.     totpos =0;
  54.     buf_byte_idx=0;
  55.     pcm_size =0;
  56.    ////
  57.    DbgUart_Printf("MP3 Decode Startn");
  58.    DbgUart_Printf("MP3 Decode FileSize =%dn",size);
  59. while(!bs.eobs)
  60. {
  61. //Sleep(1);
  62. if(frameNum&0x03)
  63. {
  64. Sleep(1);
  65. }
  66. ////
  67. //尝试帧同步 
  68. if (!seek_sync(SYNC_WORD))
  69. {
  70. DbgUart_Printf("Frame cannot be locatedn");
  71. break;
  72. }
  73. //解码帧头
  74. decode_info();
  75. //将fr_ps.header中的信息解读到fr_ps的相关域中 fr_ps.header
  76. hdr_to_frps();
  77. //输出相关信息
  78.         frameNum++;
  79. if((frameNum&0x0f)==0x0f)
  80. {
  81. Sleep(1);
  82. DbgUart_Putch('>');
  83. }
  84. if(frameNum>0xfffffff)
  85. {
  86.   DbgUart_Printf("frm ovf:%dn", frameNum);
  87.   break;
  88. }
  89. ////
  90. if (info.error_protection)
  91. {
  92. //DbgUart_Printf("crcn");
  93. buffer_CRC();
  94. }
  95. ////
  96. switch (info.lay)
  97. {
  98. case 3:
  99. {
  100. int nSlots, main_data_end, flush_main;
  101. int bytes_to_discard, gr, ch;
  102. static int frame_start = 0;    
  103. ////
  104. //取Side信息
  105. III_get_side_info(&III_side_info);
  106. nSlots = main_data_slots();
  107.  //读主数据(Audio Data)
  108. for (; nSlots > 0; nSlots--)  /* read main data. */
  109. {
  110. hputbuf((unsigned char) getbit(8));
  111. }
  112. main_data_end = totpos / 8; /*of privious frame*/
  113. if ( flush_main=(totpos % bitsPerSlot) )
  114. {
  115. hgetbits((int)(bitsPerSlot - flush_main));
  116. main_data_end ++;
  117. }
  118. bytes_to_discard = frame_start - main_data_end - III_side_info.main_data_begin ;
  119. /*    最多=1  */
  120. if( main_data_end > BITSTREAM_BUFSIZE )
  121. {
  122. frame_start -= BITSTREAM_BUFSIZE;
  123. rewindNbytes( BITSTREAM_BUFSIZE);               //  totpos-=4096*8
  124. }
  125. frame_start += main_data_slots();
  126. if (bytes_to_discard < 0)
  127. {
  128. DbgUart_Printf("Not enough main data to decode frame %d.  Frame discarded.n",frameNum - 1); 
  129. break;
  130. }
  131. for (; bytes_to_discard > 0; bytes_to_discard--)
  132. {
  133. hgetbits(8);
  134. }
  135. for (gr=0;gr<2;gr++)
  136. {
  137. SS  hybridIn[2];
  138.        //主解码
  139.        
  140. for (ch=0; ch<fr_ps.stereo; ch++)
  141. {
  142.     int is[SBLIMIT][SSLIMIT];   /*保存量化数据 频率线*/
  143.     int part2_start;
  144.       part2_start=totpos;
  145.       ////
  146.       
  147. //获取比例因子
  148. III_get_scale_factors(&III_scalefac,&III_side_info, gr, ch);
  149. //Huffman解码 
  150. III_hufman_decode(&grle[ch][gr],part2_start,is);
  151.                     //逆量化采样
  152. III_dequantize_sample(is, hybridIn[ch], &III_scalefac, &grle[ch][gr], ch);
  153. }
  154. //两个声道处理完,进行立体声处理
  155. III_stereo(hybridIn, &III_scalefac, &grle[0][gr]);
  156. for (ch=0; ch<fr_ps.stereo; ch++) 
  157. //重新排序
  158. III_reorder(hybridIn[ch], &grle[ch][gr]);
  159. //反混叠处理
  160. III_antialias(hybridIn[ch],&grle[ch][gr]);
  161. //IMDCT 加窗 叠加 
  162.                     Granule_imdct(&grle[ch][gr], ch, hybridIn[ch]);
  163. //多相频率倒置  X(-1)
  164.                     Granule_freqinverse(hybridIn[ch]);
  165. }
  166. //多相合成
  167.                 if(fr_ps.stereo == 2) 
  168.                 { 
  169.                   Granule_subband_synthesis2(hybridIn[0],hybridIn[1],pcm_sample);
  170.                 }
  171.                 else
  172.                 {   // 单声道处理
  173.                 //  Granule_subband_synthesis( 0,hybridIn[0],pcm_sample);
  174.                  Granule_subband_synthesis( 1,hybridIn[1],pcm_sample);
  175. }
  176. /* Output PCM sample points for one granule(颗粒). */
  177.                //  fwrite(pcm_sample,2,SBLIMIT*SSLIMIT*2,musicout);
  178.                
  179.                
  180.               //  pcm_dat =pcm_buf;
  181.                 
  182.                
  183.                 
  184.                 for(i=0;i<2;i++)
  185.                 {
  186.                   for(j=0;j<SSLIMIT;j++)
  187.                   {
  188.                     for(k=0;k<SBLIMIT;k++)
  189.                     {
  190.                        *pcm_dat++=pcm_sample[i][j][k];
  191.                       
  192.                       
  193.                     }
  194.                   }
  195.                 }
  196.              
  197.               
  198.                 ////
  199.                 
  200.                 LabelPrintf(HDC_SCREEN,8,GUI_YSIZE-80,64,24,RGB565(0,0,24),RGB565(24,48,24),RGB565(0,0,0),CENTER,"%02d:%02d",(frameNum*261)/10000/60,(frameNum*261)/10000%60);
  201.             //   DbgUart_Printf("pcm_size=%dn",pcm_size);
  202.                  
  203.                 if(1)
  204.                 {
  205.                  char key;
  206.                  ////
  207.                 
  208.                  key=0;
  209.                  DbgUart_Getch(&key);
  210.                  if(key=='q')
  211.                  {
  212.                  DbgUart_Printf("MP3 Decode Abort!n");
  213.                  goto end;
  214.                  }
  215.                 
  216.                 }        
  217.                /////////////
  218.               
  219.               
  220.                pcm_size +=2*SSLIMIT*SBLIMIT*sizeof(U16);
  221.                if(frameNum>50)
  222.                {
  223.                static int i=0;
  224.                ////
  225.                if(i==0)
  226.                {
  227.                PCM_Output(pPCM,pcm_size);
  228.                i=1;
  229.                }
  230.                else
  231.                {
  232.                PCM_SetSize(pcm_size);
  233.                
  234.                }
  235.               
  236.               
  237.                }
  238.                //////////////
  239.               
  240.               
  241.     }
  242. break; 
  243. ////////
  244.  
  245. default:
  246. DbgUart_Printf("Only layer III supported!n");
  247. goto end;
  248. break;
  249. ////////
  250. }
  251. }
  252.    //*(unsigned int *)0x1d20044=0xff;    //LED is Off
  253.     //while(1);
  254. end:
  255.     DbgUart_Printf("n");
  256.     DbgUart_Printf("MP3 Decode FrameNum=%dn",frameNum);
  257.     DbgUart_Printf("MP3 Decode PCM Size=%dn",pcm_size);
  258.     DbgUart_Printf("MP3 Decode Endn");
  259.     Sleep(100);
  260. return 1;
  261. }
  262. /*============================================================================*/
  263. /*============================================================================*/
  264. void MP3_Test(void)
  265. {
  266. char key;
  267. U32 fsize,i,hFile;
  268. U8 *pcm_buf,*mp3_buffer;
  269. ////
  270.   
  271.    hFile=FileOpen("a:\test.mp3","rw");
  272.    if(hFile==-1)
  273.    {
  274.    DbgUart_Printf("Nof Find Filen");
  275.    return;
  276.    }
  277.    mp3_buffer=MemMalloc(GetFileSize(hFile));
  278.    i=FileRead(mp3_buffer,0,GetFileSize(hFile),hFile);
  279.    DbgUart_Printf("Read:hFile=%d;size=%dn",hFile,i);
  280.   
  281.   
  282.    fsize =GetFileSize(hFile);
  283.    pcm_buf =(U8*)0x30008000;
  284.    FileClose(hFile);
  285. ////
  286. DbgUart_Printf("MP3 Test Startn");
  287. PCM_DrvInit();
  288. PCM_SetVolume(0xc0);
  289. PCM_SetSampleRate(16,44100);
  290. TimerSet(0);
  291. MP3Decode(pcm_buf,mp3_buffer,fsize);
  292. i=TimerGet();
  293. DbgUart_Printf("MP3DecodeTime =%d ( %02d:%02d )n",i,(i>>6)/60,(i>>6)%60);
  294. PCM_DrvClose();
  295. ////
  296. DbgUart_Printf("MP3 Test End,Press 'q' Exitn");
  297. ////
  298. while(1)
  299. {
  300. key=0;
  301. DbgUart_Getch(&key);
  302. if(key=='q') break;
  303. Sleep(5);
  304. }
  305. MemFree(mp3_buffer);
  306. }
  307. /*============================================================================*/
  308. /*============================================================================*/