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

📄 jpeg.lst

📁 用51单片机解码JPEG文件
💻 LST
📖 第 1 页 / 共 4 页
字号:

 675   2                      {
 676   3                              lastbyte=ReadByte();
 677   3                              valueex=(valueex<<8)+(unsigned char)lastbyte;
 678   3                              tempsize-=8;
 679   3                      }  //while
 680   2                      lastbyte=ReadByte();
 681   2                      BitPos-=tempsize;
 682   2                      valueex=(valueex<<tempsize)+(lastbyte>>BitPos);
 683   2                      CurByte=lastbyte&And[BitPos];
 684   2              }  //else
 685   1              sign=valueex>>(runsize-1);
 686   1              if(sign)vvalue=valueex;//解出的码值 
 687   1              else
 688   1              {
 689   2                      valueex=valueex^0xffff;
 690   2                      temp=0xffff<<runsize;
 691   2                      vvalue=-(long)(valueex^temp);
 692   2              }
 693   1              return FUNC_OK;
 694   1      }
 695          //反量化MCU中的每个组件   入口 MCUBuffer 出口 QtZzMCUBuffer 
 696          void IQtIZzMCUComponent(long flag)
 697          {
 698   1              long xdata H,VV;
 699   1              long xdata i,j;
 700   1              long *pQtZzMCUBuffer;
 701   1              long  *pMCUBuffer;
 702   1      
 703   1              switch(flag){
 704   2              case 0:
 705   2                      H=SampRate_Y_H;
 706   2                      VV=SampRate_Y_V;
 707   2                      pMCUBuffer=MCUBuffer;
 708   2                      pQtZzMCUBuffer=QtZzMCUBuffer;
 709   2                      break;
 710   2              case 1:
 711   2                      H=SampRate_U_H;
 712   2                      VV=SampRate_U_V;
 713   2                      pMCUBuffer=MCUBuffer+Y_in_MCU*64;
 714   2                      pQtZzMCUBuffer=QtZzMCUBuffer+Y_in_MCU*64;
 715   2                      break;
 716   2              case 2:
 717   2                      H=SampRate_V_H;
 718   2                      VV=SampRate_V_V;
 719   2                      pMCUBuffer=MCUBuffer+(Y_in_MCU+U_in_MCU)*64;
 720   2                      pQtZzMCUBuffer=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;
 721   2                      break;
 722   2              }
 723   1              for(i=0;i<VV;i++)
 724   1                      for (j=0;j<H;j++)
 725   1                              IQtIZzBlock(pMCUBuffer+(i*H+j)*64,pQtZzMCUBuffer+(i*H+j)*64,flag);
 726   1      }
 727          //要量化的字 
 728          //反量化 8*8 DU 
 729          void IQtIZzBlock(long  *s ,long * d,long flag)
 730          {
 731   1              long xdata i,j;
 732   1              long xdata tag;
 733   1              long *pQt;
 734   1              long xdata buffer2[8][8];
 735   1              long *buffer1;
 736   1              long xdata offset;
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 13  

 737   1      
 738   1              switch(flag)
 739   1              {
 740   2                      case 0:   //亮度
 741   2                              pQt=YQtTable;
 742   2                              offset=128;
 743   2                              break;
 744   2                      case 1:   //红
 745   2                              pQt=UQtTable;
 746   2                              offset=0;
 747   2                              break;
 748   2                      case 2:   //蓝 
 749   2                              pQt=VQtTable;
 750   2                              offset=0;
 751   2                              break;
 752   2              }
 753   1      
 754   1              for(i=0;i<8;i++)
 755   1                      for(j=0;j<8;j++)
 756   1                      {
 757   2                              tag=Zig_Zag[i][j];
 758   2                              buffer2[i][j]=(long)s[tag]*(long)pQt[tag];
 759   2                      }
 760   1              buffer1=(long *)buffer2;
 761   1              Fast_IDCT(buffer1);//反DCT
 762   1              for(i=0;i<8;i++)
 763   1                      for(j=0;j<8;j++)
 764   1                              d[i*8+j]=buffer2[i][j]+offset;
 765   1      }
 766          
 767          //快速反DCT
 768          void Fast_IDCT(long * block)
 769          {
 770   1              long data i;             
 771   1              for (i=0; i<8; i++)idctrow(block+8*i);      
 772   1              for (i=0; i<8; i++)idctcol(block+i);    
 773   1      }
 774          //从源文件读取一个字节
 775          unsigned char  ReadByte()
 776          {
 777   1              unsigned char  xdata i;
 778   1      
 779   1              i=*(lp++);// lp 为解码的起始位置 
 780   1              if(i==0xff)lp++;   
 781   1              BitPos=8;
 782   1              CurByte=i;
 783   1              return i;
 784   1      }
 785          //初始化快速反DCT
 786          void Initialize_Fast_IDCT()
 787          {
 788   1              long xdata i;
 789   1      
 790   1              iclp = iclip+512;
 791   1              for (i= -512; i<512; i++)
 792   1                      iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
 793   1      }
 794          ////////////////////////////////////////////////////////////////////////
 795          void idctrow(long * blk)
 796          {
 797   1              long data x0, x1, x2, x3, x4, x5, x6, x7, x8;
 798   1              //longcut
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 14  

 799   1              if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
 800   1                      (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
 801   1              {
 802   2                      blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
 803   2                      return;
 804   2              }
 805   1              x0 = (blk[0]<<11) + 128; // for proper rounding in the fourth stage 
 806   1              //first stage
 807   1              x8 = W7*(x4+x5);
 808   1              x4 = x8 + (W1-W7)*x4;
 809   1              x5 = x8 - (W1+W7)*x5;
 810   1              x8 = W3*(x6+x7);
 811   1              x6 = x8 - (W3-W5)*x6;
 812   1              x7 = x8 - (W3+W5)*x7;
 813   1              //second stage
 814   1              x8 = x0 + x1;
 815   1              x0 -= x1;
 816   1              x1 = W6*(x3+x2);
 817   1              x2 = x1 - (W2+W6)*x2;
 818   1              x3 = x1 + (W2-W6)*x3;
 819   1              x1 = x4 + x6;
 820   1              x4 -= x6;
 821   1              x6 = x5 + x7;
 822   1              x5 -= x7;
 823   1              //third stage
 824   1              x7 = x8 + x3;
 825   1              x8 -= x3;
 826   1              x3 = x0 + x2;
 827   1              x0 -= x2;
 828   1              x2 = (181*(x4+x5)+128)>>8;
 829   1              x4 = (181*(x4-x5)+128)>>8;
 830   1              //fourth stage
 831   1              blk[0] = (x7+x1)>>8;
 832   1              blk[1] = (x3+x2)>>8;
 833   1              blk[2] = (x0+x4)>>8;
 834   1              blk[3] = (x8+x6)>>8;
 835   1              blk[4] = (x8-x6)>>8;
 836   1              blk[5] = (x0-x4)>>8;
 837   1              blk[6] = (x3-x2)>>8;
 838   1              blk[7] = (x7-x1)>>8;
 839   1      }
 840          
 841          void idctcol(long * blk)
 842          {
 843   1              long xdata x0, x1, x2, x3, x4, x5, x6, x7, x8;
 844   1              //longcut
 845   1              if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
 846   1                      (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
 847   1              {
 848   2                      blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]
 849   2                              =blk[8*6]=blk[8*7]=iclp[(blk[8*0]+32)>>6];
 850   2                      return;
 851   2              }
 852   1              x0 = (blk[8*0]<<8) + 8192;
 853   1              //first stage
 854   1              x8 = W7*(x4+x5) + 4;
 855   1              x4 = (x8+(W1-W7)*x4)>>3;
 856   1              x5 = (x8-(W1+W7)*x5)>>3;
 857   1              x8 = W3*(x6+x7) + 4;
 858   1              x6 = (x8-(W3-W5)*x6)>>3;
 859   1              x7 = (x8-(W3+W5)*x7)>>3;
 860   1              //second stage
C51 COMPILER V8.05a   JPEG                                                                 03/14/2009 18:41:29 PAGE 15  

 861   1              x8 = x0 + x1;
 862   1              x0 -= x1;
 863   1              x1 = W6*(x3+x2) + 4;
 864   1              x2 = (x1-(W2+W6)*x2)>>3;
 865   1              x3 = (x1+(W2-W6)*x3)>>3;
 866   1              x1 = x4 + x6;
 867   1              x4 -= x6;
 868   1              x6 = x5 + x7;
 869   1              x5 -= x7;
 870   1              //third stage
 871   1              x7 = x8 + x3;
 872   1              x8 -= x3;
 873   1              x3 = x0 + x2;
 874   1              x0 -= x2;
 875   1              x2 = (181*(x4+x5)+128)>>8;
 876   1              x4 = (181*(x4-x5)+128)>>8;
 877   1              //fourth stage
 878   1              blk[8*0] = iclp[(x7+x1)>>14];
 879   1              blk[8*1] = iclp[(x3+x2)>>14];
 880   1              blk[8*2] = iclp[(x0+x4)>>14];
 881   1              blk[8*3] = iclp[(x8+x6)>>14];
 882   1              blk[8*4] = iclp[(x8-x6)>>14];
 883   1              blk[8*5] = iclp[(x0-x4)>>14];
 884   1              blk[8*6] = iclp[(x3-x2)>>14];
 885   1              blk[8*7] = iclp[(x7-x1)>>14];
 886   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =  20679    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =  18579     528
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      2      50
   IDATA SIZE       =   ----       4
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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