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

📄 jpeg.lst

📁 用51单片机解码JPEG文件
💻 LST
📖 第 1 页 / 共 4 页
字号:
 220   3                                      else
 221   3                                      {
 222   4                                              hf_table_index=*(lp+2);
 223   4                                              lp+=2;
 224   4                                              while (hf_table_index!=0xff)
 225   4                                              {
 226   5                                                      huftab1=(long)hf_table_index>>4;     //huftab1=0,1
 227   5                                                      huftab2=(long)hf_table_index&0x0f;   //huftab2=0,1
 228   5                                                      huftabindex=huftab1*2+huftab2;
 229   5                                                      lptemp=lp+1;
 230   5                                                      colorount=0;
 231   5                                                      for (i=0; i<16; i++)
 232   5                                                      {
 233   6                                                              code_len_table[huftabindex][i]=(long)(*(lptemp++));
 234   6                                                              colorount+=code_len_table[huftabindex][i];
 235   6                                                      }
 236   5                                                      colorount+=17;  
 237   5                                                      j=0;
 238   5                                                      for (i=0; i<16; i++)
 239   5                                                      {
 240   6                                                              if(code_len_table[huftabindex][i]!=0) 
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 5   

 241   6                                                              {
 242   7                                                                      k=0;
 243   7                                                                      while(k<code_len_table[huftabindex][i])
 244   7                                                                      {
 245   8                                                                              code_value_table[huftabindex][k+j]=(long)(*(lptemp++));
 246   8                                                                              k++;
 247   8                                                                      }
 248   7                                                                      j+=k;
 249   7                                                              }
 250   6                                                      }
 251   5                                                      i=0;
 252   5                                                      while (code_len_table[huftabindex][i]==0)i++;
 253   5                                                      for (j=0;j<i;j++)
 254   5                                                      {
 255   6                                                              huf_min_value[huftabindex][j]=0;
 256   6                                                              huf_max_value[huftabindex][j]=0;
 257   6                                                      }
 258   5                                                      huf_min_value[huftabindex][i]=0;
 259   5                                                      huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;
 260   5                                                      for (j=i+1;j<16;j++)
 261   5                                                      {
 262   6                                                              huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;
 263   6                                                              huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;
 264   6                                                      }
 265   5                                                      code_pos_table[huftabindex][0]=0;
 266   5                                                      for (j=1;j<16;j++)
 267   5                                                              code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];
 268   5                                                      lp+=colorount;
 269   5                                                      hf_table_index=*lp;
 270   5                                              }  //while
 271   4                                      }  //else
 272   3                                      break;
 273   3                              case M_DRI:
 274   3                                      llength=MAKEWORD(*(lp+1),*lp);
 275   3                                      restart=MAKEWORD(*(lp+3),*(lp+2));
 276   3                                      lp+=llength;
 277   3                                      break;
 278   3                              case M_SOS:
 279   3                                      llength=MAKEWORD(*(lp+1),*lp);
 280   3                                      comnum=*(lp+2);
 281   3                                      if(comnum!=comp_num)
 282   3                                              return FUNC_FORMAT_ERROR;
 283   3                                      lptemp=lp+3;
 284   3                                      for (i=0;i<comp_num;i++)//每组件的信息 
 285   3                                      {
 286   4                                              if(*lptemp==comp_index[0])
 287   4                                              {
 288   5                                                      YDcIndex=(*(lptemp+1))>>4;   //Y 使用的 Huffman 表 
 289   5                                                      YAcIndex=((*(lptemp+1))&0x0f)+2;
 290   5                                              }
 291   4                                              else
 292   4                                              {
 293   5                                                      UVDcIndex=(*(lptemp+1))>>4;   //U,V
 294   5                                                      UVAcIndex=((*(lptemp+1))&0x0f)+2;
 295   5                                              }
 296   4                                              lptemp+=2;
 297   4                                      }
 298   3                                      lp+=llength;
 299   3                                      finish=TRUE;
 300   3                                      break;
 301   3                              case M_EOI://图片结束     
 302   3                                      return FUNC_FORMAT_ERROR;
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 6   

 303   3                                      break;
 304   3                              default:
 305   3                                      if ((id&0xf0)!=0xd0)
 306   3                                      {
 307   4                                              llength=MAKEWORD(*(lp+1),*lp);
 308   4                                              lp+=llength;
 309   4                                      }
 310   3                                      else lp+=2;
 311   3                                      break;
 312   3                      }  //switch
 313   2              } //while
 314   1              return FUNC_OK;
 315   1      }
 316          //初始化量化表,全部清零
 317          void InitTable()
 318          {
 319   1              long xdata i,j;
 320   1              sizei=sizej=0;
 321   1              ImgWidth=ImgHeight=0;
 322   1              rrun=vvalue=0;
 323   1              BitPos=0;
 324   1              CurByte=0;
 325   1              longervalFlag=FALSE;
 326   1              restart=0;
 327   1              for(i=0;i<3;i++) //量化表
 328   1                      for(j=0;j<64;j++)
 329   1                              qt_table[i][j]=0;
 330   1              comp_num=0;
 331   1              HufTabIndex=0;
 332   1              for(i=0;i<3;i++)
 333   1                      comp_index[i]=0;
 334   1              for(i=0;i<4;i++)
 335   1                      for(j=0;j<16;j++){
 336   2                              code_len_table[i][j]=0;
 337   2                              code_pos_table[i][j]=0;
 338   2                              huf_max_value[i][j]=0;
 339   2                              huf_min_value[i][j]=0;
 340   2                      }
 341   1              for(i=0;i<4;i++)
 342   1                      for(j=0;j<256;j++)
 343   1                              code_value_table[i][j]=0;
 344   1              
 345   1              for(i=0;i<10*64;i++){
 346   2                      MCUBuffer[i]=0;
 347   2                      QtZzMCUBuffer[i]=0;
 348   2              }
 349   1              for(i=0;i<64;i++){
 350   2                      Y[i]=0;
 351   2                      U[i]=0;
 352   2                      V[i]=0;
 353   2                      BlockBuffer[i]=0;
 354   2              }
 355   1              ycoef=ucoef=vcoef=0;
 356   1      }
 357          //调用顺序: Initialize_Fast_IDCT() :初始化 
 358          //          DecodeMCUBlock()       Huffman Decode 
 359          //          IQtIZzMCUComponent()   反量化、反DCT 
 360          //          GetYUV()               Get Y U V 
 361          //          StoreBuffer()          YUV to RGB 
 362          long Decode()
 363          {
 364   1              long xdata  funcret;
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 7   

 365   1      
 366   1              Y_in_MCU=SampRate_Y_H*SampRate_Y_V;//YDU YDU YDU YDU
 367   1              U_in_MCU=SampRate_U_H*SampRate_U_V;//cRDU 
 368   1              V_in_MCU=SampRate_V_H*SampRate_V_V;//cBDU
 369   1              H_YtoU=SampRate_Y_H/SampRate_U_H;
 370   1              V_YtoU=SampRate_Y_V/SampRate_U_V;
 371   1              H_YtoV=SampRate_Y_H/SampRate_V_H;
 372   1              V_YtoV=SampRate_Y_V/SampRate_V_V;
 373   1              Initialize_Fast_IDCT();
 374   1              while((funcret=DecodeMCUBlock())==FUNC_OK) //After Call DecodeMCUBUBlock()
 375   1              {
 376   2                      longerval++;                                                  //The Digital has been Huffman Decoded and 
 377   2                      if((restart)&&(longerval % restart==0))//be stored in MCUBuffer(YDU,YDU,YDU,YDU                 
 378   2                               longervalFlag=TRUE;                              // UDU,VDU) Every DU := 8*8 
 379   2                      else
 380   2                              longervalFlag=FALSE;
 381   2                      IQtIZzMCUComponent(0); //反量化 and IDCT The Data in QtZzMCUBuffer 
 382   2                      IQtIZzMCUComponent(1);
 383   2                      IQtIZzMCUComponent(2);
 384   2                      GetYUV(0);                         //得到Y cR cB 
 385   2                      GetYUV(1);
 386   2                      GetYUV(2);
 387   2                      StoreBuffer();             //To RGB
 388   2                      sizej+=SampRate_Y_H*8;
 389   2                      if(sizej>=ImgWidth)
 390   2                      {
 391   3                              sizej=0;
 392   3                              sizei+=SampRate_Y_V*8;
 393   3                      }
 394   2                      if ((sizej==0)&&(sizei>=ImgHeight))break;         
 395   2              }
 396   1              return funcret;
 397   1      }
 398          // 入口 QtZzMCUBuffer 出口 Y[] U[] V[] 
 399          //得到YUV色彩空间   
 400          void  GetYUV(long flag)
 401          {
 402   1              long    xdata H,VV;
 403   1              long    xdata i,j,k,h;
 404   1              long            *buf;
 405   1              long            *pQtZzMCU;
 406   1      
 407   1              switch(flag)
 408   1              {
 409   2                      case 0://亮度分量
 410   2                              H=SampRate_Y_H;
 411   2                              VV=SampRate_Y_V;
 412   2                              buf=Y;
 413   2                              pQtZzMCU=QtZzMCUBuffer;
 414   2                              break;
 415   2                      case 1://红色分量
 416   2                              H=SampRate_U_H;
 417   2                              VV=SampRate_U_V;
 418   2                              buf=U;
 419   2                              pQtZzMCU=QtZzMCUBuffer+Y_in_MCU*64;
 420   2                              break;
 421   2                      case 2://蓝色分量
 422   2                              H=SampRate_V_H;
 423   2                              VV=SampRate_V_V;
 424   2                              buf=V;
 425   2                              pQtZzMCU=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;
 426   2                              break;
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 8   

 427   2              }
 428   1              for (i=0;i<VV;i++)
 429   1                      for(j=0;j<H;j++)
 430   1                              for(k=0;k<8;k++)
 431   1                                      for(h=0;h<8;h++)
 432   1                                              buf[(i*8+k)*SampRate_Y_H*8+j*8+h]=*pQtZzMCU++;
 433   1      }
 434          
 435          
 436          //将解出的字按RGB形式存储 lpbmp (BGR),(BGR) ......入口Y[] U[] V[] 出口lpPtr              
 437          void StoreBuffer()
 438          {
 439   1              long xdata i,j; 
 440   1              unsigned int color;                 
 441   1              unsigned char xdata R,G,B;
 442   1              long xdata y,u,v,rr,gg,bb;
 443   1              int data counter=0;
 444   1              for(i=0;i<SampRate_Y_V*8;i++)
 445   1              {
 446   2                      if((sizei+i)<ImgHeight)// sizei表示行 sizej 表示列 

⌨️ 快捷键说明

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