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

📄 jpeg.lst

📁 用51单片机解码JPEG文件
💻 LST
📖 第 1 页 / 共 4 页
字号:
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE JPEG
OBJECT MODULE PLACED IN jpeg.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE jpeg.c LARGE BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "jpeg.h"
   2          #include "uart.h"
   3          #include "tft.h"
   4          
   5          unsigned long xdata ImgWidth=0,ImgHeight=0;
   6          unsigned long xdata counter=0;
   7          
   8          //在JPEG函数里面用到的变量
   9          long xdata                      SampRate_Y_H,SampRate_Y_V;
  10          long xdata                      SampRate_U_H,SampRate_U_V;
  11          long xdata                      SampRate_V_H,SampRate_V_V;
  12          long xdata                      H_YtoU,V_YtoU,H_YtoV,V_YtoV;
  13          long xdata                      Y_in_MCU,U_in_MCU,V_in_MCU;
  14          unsigned char       *lpJpegBuf;
  15          unsigned char       *lp;
  16          long xdata                      qt_table[3][64];
  17          long xdata                      comp_num;
  18          unsigned char xdata comp_index[3];
  19          unsigned char xdata YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;
  20          unsigned char xdata     HufTabIndex;
  21          long                *YQtTable,*UQtTable,*VQtTable;
  22          unsigned char xdata     And[9]={0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff};
  23          long xdata                  code_pos_table[4][16],code_len_table[4][16];
  24          unsigned long xdata     code_value_table[4][256];
  25          unsigned long xdata     huf_max_value[4][16],huf_min_value[4][16];
  26          long xdata                      BitPos,CurByte;
  27          long xdata                      rrun,vvalue;
  28          long xdata                      MCUBuffer[640];
  29          long xdata                      QtZzMCUBuffer[640];
  30          long xdata                      BlockBuffer[64];
  31          long xdata                      ycoef,ucoef,vcoef;
  32          unsigned char xdata     longervalFlag;
  33          long xdata                      longerval;
  34          long xdata                  Y[256],U[256],V[256];
  35          unsigned char data sizei,sizej;
  36          long xdata                      restart;
  37          unsigned long xdata     iclip[1024];
  38          unsigned long xdata     *iclp;
  39          
  40          //开始显示的坐标值        
  41          long xdata  CurX=0;
  42          long xdata  CurY=0;
  43          
  44          long code Zig_Zag[8][8]={{0,1,5,6,14,15,27,28},
  45                                                            {2,4,7,13,16,26,29,42},
  46                                                            {3,8,12,17,25,30,41,43},
  47                                                            {9,11,18,24,37,40,44,53},
  48                                                            {10,19,23,32,39,45,52,54},
  49                                                            {20,22,33,38,46,51,55,60},
  50                                                            {21,34,37,47,50,56,59,61},
  51                                                            {35,36,48,49,57,58,62,63}
  52                                                           };
  53          
  54          
  55          
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 2   

  56          //读取JPEG代码,并解码
  57          unsigned char  LoadJpegFile (unsigned char *JpegFileName)
  58          {                                                                 
  59   1              unsigned char *hJpegBuf;
  60   1              long                      xdata funcret;
  61   1       
  62   1              hJpegBuf=JpegFileName;//JPEG文件头
  63   1              lpJpegBuf=(unsigned char*)hJpegBuf;//转换为变量指针  
  64   1              InitTable();  
  65   1              if((funcret=InitTag())!=FUNC_OK)//初始化表头不成功 
  66   1              {                                        
  67   2                      //showerror(funcret);//错误信息显示
  68   2                      return FALSE;
  69   2              }    
  70   1              if((SampRate_Y_H==0)||(SampRate_Y_V==0))
  71   1              {           
  72   2                      return FALSE ;
  73   2              }          
  74   1              funcret=Decode();
  75   1              if(funcret==FUNC_OK)//解码成功
  76   1              {   
  77   2                      return TRUE;
  78   2              }
  79   1              else
  80   1              { 
  81   2                      return FALSE;
  82   2              }
  83   1      }
  84          
  85          ////////////////////////////////////////////////////////////////////////////////
  86          long InitTag()
  87          {
  88   1              unsigned char xdata  finish=FALSE;
  89   1              unsigned char xdata  id;
  90   1              
  91   1              long  xdata i,j,k;
  92   1              long  xdata huftab1,huftab2;
  93   1              long  xdata huftabindex;
  94   1              unsigned char xdata hf_table_index;
  95   1              unsigned char xdata qt_table_index;
  96   1              unsigned char xdata comnum;
  97   1      
  98   1              unsigned char  *lptemp;
  99   1              long  xdata colorount;
 100   1          
 101   1              unsigned long data temp1,temp2;
 102   1              unsigned long idata llength;
 103   1      
 104   1              lp=lpJpegBuf+2;//跳过两个字节SOI(0xFF,0xD8 Start of Image) 
 105   1      
 106   1              while (!finish)
 107   1              {
 108   2                      id=*(lp+1);//取出低位字节(高位在前,低位在后) 
 109   2                      lp+=2;     //跳过取出的字节
 110   2                      switch (id)
 111   2                      {
 112   3                              case M_APP0: //JFIF APP0 segment marker (0xE0)
 113   3                                  temp1=*(lp+1);temp2=*lp; 
 114   3                                      llength=MAKEWORD(temp1,temp2);
 115   3                                      lp+=llength;
 116   3                                      break;
 117   3                              case M_DQT: //定义量化表(0xFF,0xDB) 
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 3   

 118   3                                      llength=MAKEWORD(*(lp+1),*lp);//(量化表长度) 
 119   3                                      qt_table_index=(*(lp+2))&0x0f;//量化表信息bit 0..3: QT 号(0..3, 否则错误) 
 120   3                                                                                                //bit 4..7: QT 精度, 0 = 8 bit, 否则 16 bit
 121   3                                      lptemp=lp+3;                              //n 字节的 QT, n = 64*(精度+1) 
 122   3                                      if(llength<80)                            //精度为 8 bit 
 123   3                                      {
 124   4                                              for(i=0;i<64;i++)
 125   4                                                      qt_table[qt_table_index][i]=(long)*(lptemp++);
 126   4                                      }
 127   3                                      else                                              //精度为 16 bit 
 128   3                                      {
 129   4                                              for(i=0;i<64;i++)qt_table[qt_table_index][i]=(long)*(lptemp++);   
 130   4                              qt_table_index=(*(lptemp++))&0x0f;
 131   4                                              for(i=0;i<64;i++)qt_table[qt_table_index][i]=(long)*(lptemp++);     
 132   4                                      }
 133   3                                      lp+=llength;                            //跳过量化表            
 134   3                                      break;
 135   3                              case M_SOF0:                                            //帧开始 (baseline JPEG 0xFF,0xC0)
 136   3                                      llength=MAKEWORD(*(lp+1),*lp);          //长度 (高字节, 低字节), 8+components*3 
 137   3                                      ImgHeight=MAKEWORD(*(lp+4),*(lp+3));//图片高度 (高字节, 低字节), 如果不支持 DNL 就必须 >0 
 138   3                                      ImgWidth=MAKEWORD(*(lp+6),*(lp+5));     //图片宽度 (高字节, 低字节), 如果不支持 DNL 就必须 >0 
 139   3                          comp_num=*(lp+7);//components 数量(1 byte), 灰度图是 1, YCbCr/YIQ 彩色图是 3, CMYK 彩色图是 4
             - 
 140   3                                  if((comp_num!=1)&&(comp_num!=3))return FUNC_FORMAT_ERROR;    
 141   3                                      if(comp_num==3)                                         //YCbCr/YIQ 彩色图
 142   3                                      {
 143   4                                              comp_index[0]=*(lp+8);      //component id (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q) 
 144   4                                              SampRate_Y_H=(*(lp+9))>>4;      //水平采样系数 
 145   4                                              SampRate_Y_V=(*(lp+9))&0x0f;//垂直采样系数 
 146   4                                              YQtTable=(long *)qt_table[*(lp+10)];//通过量化表号取得量化表地址 
 147   4              
 148   4                                              comp_index[1]=*(lp+11);                          //component id 
 149   4                                              SampRate_U_H=(*(lp+12))>>4;                      //水平采样系数
 150   4                                              SampRate_U_V=(*(lp+12))&0x0f;            //垂直采样系数 
 151   4                                              UQtTable=(long *)qt_table[*(lp+13)];//通过量化表号取得量化表地址
 152   4              
 153   4                                              comp_index[2]=*(lp+14);                          //component id 
 154   4                                              SampRate_V_H=(*(lp+15))>>4;                      //水平采样系数
 155   4                                              SampRate_V_V=(*(lp+15))&0x0f;            //垂直采样系数 
 156   4                                              VQtTable=(long *)qt_table[*(lp+16)];//通过量化表号取得量化表地址
 157   4                                      }
 158   3                                      else                                                                 //component id 
 159   3                                      {
 160   4                                              comp_index[0]=*(lp+8);
 161   4                                              SampRate_Y_H=(*(lp+9))>>4;
 162   4                                              SampRate_Y_V=(*(lp+9))&0x0f;
 163   4                                              YQtTable=(long *)qt_table[*(lp+10)];//灰度图的量化表都一样
 164   4              
 165   4                                              comp_index[1]=*(lp+8);
 166   4                                              SampRate_U_H=1;
 167   4                                              SampRate_U_V=1;
 168   4                                              UQtTable=(long *)qt_table[*(lp+10)];
 169   4              
 170   4                                              comp_index[2]=*(lp+8);
 171   4                                              SampRate_V_H=1;
 172   4                                              SampRate_V_V=1;
 173   4                                              VQtTable=(long *)qt_table[*(lp+10)];
 174   4                                      }
 175   3                                      lp+=llength;                                                
 176   3                                      break;
 177   3                              case M_DHT: //定义 Huffman Table(0xFF,0xC4)             
 178   3                                      llength=MAKEWORD(*(lp+1),*lp);//长度 (高字节, 低字节)
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 4   

 179   3                                      if (llength<0xd0)                         // Huffman Table信息 (1 byte) 
 180   3                                      {
 181   4                                              huftab1=(long)(*(lp+2))>>4;     //huftab1=0,1(HT 类型,0 = DC 1 = AC)
 182   4                                              huftab2=(long)(*(lp+2))&0x0f;   //huftab2=0,1(HT 号  ,0 = Y  1 = UV)
 183   4                                              huftabindex=huftab1*2+huftab2;   //0 = YDC 1 = UVDC 2 = YAC 3 = UVAC 
 184   4                                              lptemp=lp+3;
 185   4                                              for (i=0; i<16; i++)             //16 bytes: 长度是 1..16 代码的符号数
 186   4                                                      code_len_table[huftabindex][i]=(long)(*(lptemp++));//码长为i的码字个数   
 187   4                                              j=0;
 188   4                                              for (i=0; i<16; i++)                     //得出HT的所有码字的对应值 
 189   4                                              {
 190   5                                                      if(code_len_table[huftabindex][i]!=0)
 191   5                                                      {
 192   6                                                              k=0;
 193   6                                                              while(k<code_len_table[huftabindex][i])
 194   6                                                              {
 195   7                                                                      code_value_table[huftabindex][k+j]=(long)(*(lptemp++));
 196   7                                                                      k++;
 197   7                                                              }
 198   6                                                              j+=k;   
 199   6                                                      }
 200   5                                              }
 201   4                                              i=0;
 202   4                                              while (code_len_table[huftabindex][i]==0)i++;      
 203   4                                              for (j=0;j<i;j++)
 204   4                                              {
 205   5                                                      huf_min_value[huftabindex][j]=0;
 206   5                                                      huf_max_value[huftabindex][j]=0;
 207   5                                              }
 208   4                                              huf_min_value[huftabindex][i]=0;
 209   4                                              huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;
 210   4                                              for (j=i+1;j<16;j++)
 211   4                                              {
 212   5                                                      huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;
 213   5                                                      huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;
 214   5                                              }
 215   4                                              code_pos_table[huftabindex][0]=0;
 216   4                                              for (j=1;j<16;j++)
 217   4                                                      code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];
 218   4                                              lp+=llength;
 219   4                                      }  //if

⌨️ 快捷键说明

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