简单的JPEG解码程序


[cpp]  view plain  copy
 print ?
  1. // JPGFile.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. // simplejpeg.cpp : Defines the entry point for the console application.  
  7. //  
  8. //header file  
  9. //#include "bmp.h"  
  10.   
  11.   
  12. //*************************************************************************************  
  13. //#include "jpeg.h"  
  14. #include <stdio.h>  
  15. #include <stdlib.h>  
  16.   
  17. #pragma pack(1)  
  18. #define M_SOF0  0xc0  
  19. #define M_DHT   0xc4  
  20. #define M_EOI   0xd9  
  21. #define M_SOS   0xda  
  22. #define M_DQT   0xdb  
  23. #define M_DRI   0xdd  
  24. #define M_APP0  0xe0  
  25.   
  26. static int Zig_Zag[8][8]={{0,1,5,6,14,15,27,28},  
  27.         {2,4,7,13,16,26,29,42},  
  28.         {3,8,12,17,25,30,41,43},  
  29.         {9,11,18,24,37,40,44,53},  
  30.         {10,19,23,32,39,45,52,54},  
  31.         {20,22,33,38,46,51,55,60},  
  32.         {21,34,37,47,50,56,59,61},  
  33.         {35,36,48,49,57,58,62,63}  
  34.        };  
  35.   
  36. #define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */  
  37. #define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */  
  38. #define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */  
  39. #define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */  
  40. #define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */  
  41. #define W7 565  /* 2048*sqrt(2)*cos(7*pi/16) */  
  42.   
  43.   
  44. //*************************************************************************************  
  45. typedef char CHAR;  
  46. typedef short SHORT;  
  47. typedef long LONG;  
  48.   
  49.    
  50.   
  51. typedef unsigned long       DWORD;  
  52. typedef int                 BOOL;  
  53. typedef unsigned char       BYTE;  
  54. typedef unsigned short      WORD;  
  55.   
  56.    
  57.   
  58. typedef int HFILE;  
  59. typedef CHAR *LPSTR, *PSTR;  
  60.   
  61. #define FALSE 0  
  62. #define TRUE 1  
  63.   
  64.   
  65. typedef struct tagBITMAPINFOHEADER{  
  66.         DWORD      biSize;  
  67.         LONG       biWidth;  
  68.         LONG       biHeight;  
  69.         WORD       biPlanes;  
  70.         WORD       biBitCount;  
  71.         DWORD      biCompression;  
  72.         DWORD      biSizeImage;  
  73.         LONG       biXPelsPerMeter;  
  74.         LONG       biYPelsPerMeter;  
  75.         DWORD      biClrUsed;  
  76.         DWORD      biClrImportant;  
  77. } BITMAPINFOHEADER, * LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;  
  78.   
  79. typedef struct tagBITMAPFILEHEADER {  
  80.         WORD    bfType;  
  81.         DWORD   bfSize;  
  82.         WORD    bfReserved1;  
  83.         WORD    bfReserved2;  
  84.         DWORD   bfOffBits;  
  85. }  BITMAPFILEHEADER,  * LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;  
  86.   
  87. /* constants for the biCompression field */  
  88. #define BI_RGB        0L  
  89. #define BI_RLE8       1L  
  90. #define BI_RLE4       2L  
  91. #define BI_BITFIELDS  3L  
  92.   
  93.   
  94. typedef struct tagRGBQUAD {  
  95.         BYTE    rgbBlue;  
  96.         BYTE    rgbGreen;  
  97.         BYTE    rgbRed;  
  98.         BYTE    rgbReserved;  
  99. } RGBQUAD;  
  100. typedef RGBQUAD * LPRGBQUAD;  
  101.   
  102.   
  103. #define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))  
  104. #define MAKELONG(a, b)      ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))  
  105. #define LOWORD(l)           ((WORD)(l))  
  106. #define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))  
  107. #define LOBYTE(w)           ((BYTE)(w))  
  108. #define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))  
  109.   
  110. //---yk--- add  
  111.   
  112.    
  113.   
  114.   
  115. #include "memory.h"  
  116. #include "math.h"  
  117. #include "stdio.h"  
  118. //macro definition  
  119. #define WIDTHBYTES(i)    ((i+31)/32*4)//??????????  
  120. #define PI 3.1415926535  
  121. //define return value of function  
  122. #define FUNC_OK 0  
  123. #define FUNC_MEMORY_ERROR 1  
  124. #define FUNC_FILE_ERROR 2  
  125. #define FUNC_FORMAT_ERROR 3  
  126.   
  127.   
  128. //////////////////////////////////////////////////  
  129. //Jpeg functions  
  130. BOOL LoadJpegFile(char *BmpFileName);  
  131. void showerror(int funcret);  
  132. int  InitTag();  
  133. void InitTable();  
  134. int  Decode();  
  135. int  DecodeMCUBlock();  
  136. int  HufBlock(BYTE dchufindex,BYTE achufindex);  
  137. int  DecodeElement();  
  138. void IQtIZzMCUComponent(short flag);  
  139. void IQtIZzBlock(short  *s ,int * d,short flag);  
  140. void GetYUV(short flag);  
  141. void StoreBuffer();  
  142. BYTE ReadByte();  
  143. void Initialize_Fast_IDCT();  
  144. void Fast_IDCT(int * block);  
  145. void idctrow(int * blk);  
  146. void idctcol(int * blk);  
  147. //////////////////////////////////////////////////  
  148. //global variable declaration  
  149. BITMAPFILEHEADER   bf;  
  150. BITMAPINFOHEADER   bi;  
  151. //HPALETTE           hPalette=NULL;  
  152. //HBITMAP            hBitmap=NULL;  
  153. char *            hImgData=NULL;  
  154. DWORD              NumColors;  
  155. DWORD              LineBytes;  
  156. DWORD              ImgWidth=0 , ImgHeight=0;  
  157. char*             lpPtr;  
  158. //////////////////////////////////////////////////  
  159. //variables used in jpeg function  
  160. short   SampRate_Y_H,SampRate_Y_V;  
  161. short   SampRate_U_H,SampRate_U_V;  
  162. short   SampRate_V_H,SampRate_V_V;  
  163. short   H_YtoU,V_YtoU,H_YtoV,V_YtoV;  
  164. short   Y_in_MCU,U_in_MCU,V_in_MCU;  
  165. unsigned char   *lpJpegBuf;  
  166. unsigned char   *lp;  
  167. short   qt_table[3][64];  
  168. short   comp_num;  
  169. BYTE   comp_index[3];  
  170. BYTE      YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;  
  171. BYTE   HufTabIndex;  
  172. short      *YQtTable,*UQtTable,*VQtTable;  
  173. BYTE   And[9]={0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff};  
  174. short      code_pos_table[4][16],code_len_table[4][16];  
  175. unsigned short code_value_table[4][256];  
  176. unsigned short huf_max_value[4][16],huf_min_value[4][16];  
  177. short   BitPos,CurByte;  
  178. short   rrun,vvalue;  
  179. short   MCUBuffer[10*64];  
  180. int    QtZzMCUBuffer[10*64];  
  181. short   BlockBuffer[64];  
  182. short   ycoef,ucoef,vcoef;  
  183. BOOL   IntervalFlag;  
  184. short   interval=0;  
  185. int    Y[4*64],U[4*64],V[4*64];  
  186. DWORD      sizei,sizej;  
  187. short    restart;  
  188. static  long iclip[1024];  
  189. static  long *iclp;  
  190.   
  191.    
  192.   
  193. ////////////////////////////////////////////////////////////////  
  194. BOOL LoadJpegFile (char *JpegFileName)  
  195. {  
  196.  FILE*      hfjpg;  
  197.  DWORD          ImgSize;  
  198.  DWORD              BufSize,JpegBufSize;  
  199.  FILE*              hfbmp;  
  200.  FILE*              IMGdata;  
  201.  void *      hJpegBuf;  
  202.  int       funcret;  
  203.  DWORD i;  
  204.  LPBITMAPINFOHEADER lpImgData;  
  205.   
  206.  char * hImgData256;  
  207.   
  208.  if((hfjpg=fopen(JpegFileName,"rb"))==NULL)  
  209.  {  
  210.   showerror(FUNC_FILE_ERROR);  
  211.   return FALSE;  
  212.  }  
  213. /*SEEK_CUR  
  214. Current position of file pointer.  
  215. SEEK_END  
  216. End of file.  
  217. SEEK_SET  
  218. Beginning of file.*/  
  219.   
  220.   
  221.  //get jpg file length  
  222.  fseek(hfjpg,0L,SEEK_END);  
  223.  JpegBufSize=ftell(hfjpg);  
  224.  //rewind to the beginning of the file  
  225.  fseek(hfjpg,0L,SEEK_SET);  
  226.   
  227.  if((hJpegBuf=malloc(JpegBufSize))==NULL)  
  228.  {  
  229.   fclose(hfjpg);  
  230.   showerror(FUNC_MEMORY_ERROR);  
  231.     
  232.   return FALSE;  
  233.  }  
  234.  lpJpegBuf=(unsigned char  *)hJpegBuf;  
  235.  fread((unsigned char  *)hJpegBuf,sizeofchar ),JpegBufSize,hfjpg);  
  236.  fclose(hfjpg);  
  237.    
  238.  InitTable();  
  239.   
  240.  if((funcret=InitTag())!=FUNC_OK)  
  241.  {  
  242.  // GlobalUnlock(hJpegBuf);  
  243.   free(hJpegBuf);  
  244.   showerror(funcret);  
  245.   return FALSE;  
  246.  }  
  247.  //create new bitmapfileheader and bitmapinfoheader  
  248.  memset((char *)&bf,0,sizeof(BITMAPFILEHEADER));   
  249.  memset((char *)&bi,0,sizeof(BITMAPINFOHEADER));  
  250.   
  251.  bi.biSize=(DWORD)sizeof(BITMAPINFOHEADER);  
  252.  bi.biWidth=(LONG)(ImgWidth);  
  253.  bi.biHeight=(LONG)(ImgHeight);  
  254.  bi.biPlanes=1;  
  255.  bi.biBitCount=24;  
  256.  bi.biClrUsed=0;  
  257.  bi.biClrImportant=0;  
  258.  bi.biCompression=BI_RGB;  
  259.  NumColors=0;  
  260.  printf("bi.biWidth is %ld/n",bi.biWidth);  
  261. printf("bi.biBitCount is %ld/n",bi.biBitCount);  
  262.  LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);  
  263.  printf("LineBytes is %ld/n",LineBytes);  
  264.  ImgSize=(DWORD)LineBytes*bi.biHeight;//???????  
  265.  printf("size is %ld/n",ImgSize);  
  266.  bf.bfType=0x4d42;  
  267. int a= sizeof(BITMAPFILEHEADER);  
  268. int b= sizeof(BITMAPINFOHEADER);  
  269. //注意字节对齐问题!!!!!!!!!!!!!!!!!!!!!!!!1  
  270. //如果没有#pragma pack(1),a是16~~~~~~~  
  271. int c=NumColors*sizeof(RGBQUAD);  
  272.   
  273.  bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;  
  274.  bf.bfOffBits=54;//(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));  
  275.  BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);  
  276. // printf("size is %ld/n",BufSize);  
  277.  if((hImgData=(char*)malloc(BufSize))==NULL)  
  278.  {  
  279.   //GlobalUnlock(hJpegBuf);  
  280.   free(hJpegBuf);  
  281.   showerror(FUNC_MEMORY_ERROR);  
  282.   showerror(FUNC_MEMORY_ERROR);  
  283.   return FALSE;  
  284.  }  
  285. // lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);   
  286.  lpImgData=(LPBITMAPINFOHEADER)hImgData;   
  287.  memcpy(lpImgData,(char *)&bi,sizeof(BITMAPINFOHEADER));  
  288.  lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);  
  289.   
  290.  if((SampRate_Y_H==0)||(SampRate_Y_V==0))  
  291.  {  
  292.  // GlobalUnlock(hJpegBuf);  
  293.   free(hJpegBuf);  
  294.   //GlobalUnlock(hImgData);  
  295.   free(hImgData);  
  296.   hImgData=NULL;  
  297.   showerror(FUNC_FORMAT_ERROR);  
  298.   return FALSE ;  
  299.  }  
  300.   
  301.  funcret=Decode();  
  302.  if(funcret==FUNC_OK)  
  303.  {  
  304.   //hDc=GetDC(hWnd);  
  305. /*  hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, 
  306.       (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), 
  307.          (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS); 
  308. */  
  309.  // hfbmp=fopen("c://jpeg2-bmp.bmp","Wb");  
  310.   
  311.   if((hfbmp=fopen("F:\\data\\jpeg2-bmp.bmp","wb"))==NULL)  
  312.   {  
  313.    showerror(FUNC_FILE_ERROR);  
  314.    return FALSE;  
  315.   }  
  316.   
  317.   // hfbmp=fopen("c://jpeg2-bmp.bmp","Wb");  
  318.   
  319.    
  320.   
  321.   fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,hfbmp);   
  322.   fwrite((LPSTR)lpImgData,sizeof(char),BufSize,hfbmp);  
  323.   
  324.   if((IMGdata=fopen("111.txt","wb"))==NULL)  
  325.   {  
  326.    showerror(FUNC_FILE_ERROR);  
  327.    return FALSE;  
  328.   }  
  329.   DWORD xx = ImgWidth*ImgHeight;  
  330.   if(( hImgData256=(char *)malloc(xx))==NULL)  
  331.   {  
  332.    //GlobalUnlock(hJpegBuf);  
  333.    free(hImgData256);  
  334.    showerror(FUNC_MEMORY_ERROR);  
  335.    showerror(FUNC_MEMORY_ERROR);  
  336.    showerror(FUNC_MEMORY_ERROR);  
  337.    return FALSE;  
  338.   }  
  339.   
  340.   char * temp=hImgData256;  
  341.   for(i=0; i < xx; i++)  
  342.   {  
  343.    i;  
  344.    char t3=*lpPtr;  
  345.    t3 &= 0xE0;  
  346.    char t1=*(lpPtr+1);  
  347.    t1 = t1>>3;  
  348.    t1 &= 0x1c;  
  349.    char t2=*(lpPtr+2);  
  350.    t2=t2>>6;  
  351.    t2 &= 0x03;  
  352.    char t4 = t3 + t1 + t2 ;  
  353.    *temp++=t4;  
  354.    lpPtr=lpPtr+ 3;  
  355.    //不能使用temp+=3;  
  356.   }  
  357.   int count=fwrite(hImgData256,sizeof(char),xx,IMGdata);  
  358.   //free((void*)hImgData256);  
  359.   fclose(IMGdata);  
  360.   
  361.   fclose(hfbmp);  
  362.     
  363. //  ReleaseDC(hWnd,hDc);  
  364. //  GlobalUnlock(hJpegBuf);  
  365.   free(hJpegBuf);  
  366.   //GlobalUnlock(hImgData);  
  367.   return TRUE;  
  368.  }  
  369.  else  
  370.  {  
  371.   //GlobalUnlock(hJpegBuf);  
  372.   free(hJpegBuf);  
  373.  // GlobalUnlock(hImgData);  
  374.   free(hImgData);  
  375.   hImgData=NULL;  
  376.   showerror(funcret);  
  377.   return FALSE;  
  378.  }  
  379. }  
  380. /////////////////////////////////////////////////  
  381. void showerror(int funcret)  
  382. {  
  383.  switch(funcret)  
  384.  {  
  385.  case FUNC_MEMORY_ERROR:  
  386.      printf("Error alloc memory/n!");  
  387.   break;  
  388.  case FUNC_FILE_ERROR:  
  389.      printf("File not found!/n");  
  390.   break;  
  391.  case FUNC_FORMAT_ERROR:  
  392.   printf("File format error!/n");  
  393.   break;  
  394.  }  
  395. }  
  396. ////////////////////////////////////////////////////////////////////////////////  
  397. int InitTag()  
  398. {  
  399.  BOOL finish=FALSE;  
  400.  BYTE id;  
  401.  short  llength;  
  402.  short  i,j,k;  
  403.  short  huftab1,huftab2;  
  404.  short  huftabindex;  
  405.  BYTE hf_table_index;  
  406.  BYTE qt_table_index;  
  407.  BYTE comnum;  
  408.   
  409.  unsigned char  *lptemp;  
  410.  short  ccount;  
  411.   
  412.  lp=lpJpegBuf+2;  
  413.   
  414.  while (!finish){  
  415.   id=*(lp+1);  
  416.   lp+=2;  
  417.   switch (id){  
  418.   case M_APP0:  
  419.    llength=MAKEWORD(*(lp+1),*lp);  
  420.    lp+=llength;  
  421.    break;  
  422.   case M_DQT:  
  423.    llength=MAKEWORD(*(lp+1),*lp);  
  424.    qt_table_index=(*(lp+2))&0x0f;  
  425.    lptemp=lp+3;  
  426.    if(llength<80){  
  427.     for(i=0;i<64;i++)  
  428.      qt_table[qt_table_index][i]=(short)*(lptemp++);  
  429.    }  
  430.    else{  
  431.     for(i=0;i<64;i++)  
  432.      qt_table[qt_table_index][i]=(short)*(lptemp++);  
  433.                 qt_table_index=(*(lptemp++))&0x0f;  
  434.       for(i=0;i<64;i++)  
  435.      qt_table[qt_table_index][i]=(short)*(lptemp++);  
  436.      }  
  437.      lp+=llength;    
  438.    break;  
  439.   case M_SOF0:  
  440.     llength=MAKEWORD(*(lp+1),*lp);  
  441.     ImgHeight=MAKEWORD(*(lp+4),*(lp+3));  
  442.     ImgWidth=MAKEWORD(*(lp+6),*(lp+5));  
  443.             comp_num=*(lp+7);  
  444.       if((comp_num!=1)&&(comp_num!=3))  
  445.       return FUNC_FORMAT_ERROR;  
  446.    if(comp_num==3){  
  447.     comp_index[0]=*(lp+8);  
  448.       SampRate_Y_H=(*(lp+9))>>4;  
  449.       SampRate_Y_V=(*(lp+9))&0x0f;  
  450.       YQtTable=(short *)qt_table[*(lp+10)];  
  451.   
  452.     comp_index[1]=*(lp+11);  
  453.     SampRate_U_H=(*(lp+12))>>4;  
  454.       SampRate_U_V=(*(lp+12))&0x0f;  
  455.       UQtTable=(short *)qt_table[*(lp+13)];  
  456.   
  457.       comp_index[2]=*(lp+14);  
  458.       SampRate_V_H=(*(lp+15))>>4;  
  459.       SampRate_V_V=(*(lp+15))&0x0f;  
  460.     VQtTable=(short *)qt_table[*(lp+16)];  
  461.      }  
  462.    else{  
  463.       comp_index[0]=*(lp+8);  
  464.     SampRate_Y_H=(*(lp+9))>>4;  
  465.       SampRate_Y_V=(*(lp+9))&0x0f;  
  466.       YQtTable=(short *)qt_table[*(lp+10)];  
  467.   
  468.     comp_index[1]=*(lp+8);  
  469.       SampRate_U_H=1;  
  470.       SampRate_U_V=1;  
  471.       UQtTable=(short *)qt_table[*(lp+10)];  
  472.   
  473.     comp_index[2]=*(lp+8);  
  474.     SampRate_V_H=1;  
  475.       SampRate_V_V=1;  
  476.       VQtTable=(short *)qt_table[*(lp+10)];  
  477.    }  
  478.      lp+=llength;            
  479.    break;  
  480.   case M_DHT:               
  481.    llength=MAKEWORD(*(lp+1),*lp);  
  482.    if (llength<0xd0){  
  483.     huftab1=(short)(*(lp+2))>>4;     //huftab1=0,1  
  484.      huftab2=(short)(*(lp+2))&0x0f;   //huftab2=0,1  
  485.     huftabindex=huftab1*2+huftab2;  
  486.      lptemp=lp+3;  
  487.     for (i=0; i<16; i++)  
  488.      code_len_table[huftabindex][i]=(short)(*(lptemp++));  
  489.     j=0;  
  490.     for (i=0; i<16; i++)  
  491.      if(code_len_table[huftabindex][i]!=0){  
  492.       k=0;  
  493.       while(k<code_len_table[huftabindex][i]){  
  494.        code_value_table[huftabindex][k+j]=(short)(*(lptemp++));  
  495.        k++;  
  496.       }  
  497.       j+=k;   
  498.      }  
  499.     i=0;  
  500.     while (code_len_table[huftabindex][i]==0)  
  501.       i++;  
  502.     for (j=0;j<i;j++){  
  503.      huf_min_value[huftabindex][j]=0;  
  504.      huf_max_value[huftabindex][j]=0;  
  505.     }  
  506.     huf_min_value[huftabindex][i]=0;  
  507.     huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;  
  508.     for (j=i+1;j<16;j++){  
  509.      huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;  
  510.      huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;  
  511.     }  
  512.     code_pos_table[huftabindex][0]=0;  
  513.     for (j=1;j<16;j++)  
  514.        code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];  
  515.       lp+=llength;  
  516.    }  //if  
  517.    else{  
  518.      hf_table_index=*(lp+2);  
  519.     lp+=2;  
  520.     while (hf_table_index!=0xff){  
  521.      huftab1=(short)hf_table_index>>4;     //huftab1=0,1  
  522.       huftab2=(short)hf_table_index&0x0f;   //huftab2=0,1  
  523.      huftabindex=huftab1*2+huftab2;  
  524.      lptemp=lp+1;  
  525.      ccount=0;  
  526.      for (i=0; i<16; i++){  
  527.       code_len_table[huftabindex][i]=(short)(*(lptemp++));  
  528.       ccount+=code_len_table[huftabindex][i];  
  529.      }  
  530.      ccount+=17;   
  531.      j=0;  
  532.      for (i=0; i<16; i++)  
  533.       if(code_len_table[huftabindex][i]!=0){  
  534.        k=0;  
  535.        while(k<code_len_table[huftabindex][i])  
  536.        {  
  537.         code_value_table[huftabindex][k+j]=(short)(*(lptemp++));  
  538.         k++;  
  539.        }  
  540.        j+=k;  
  541.       }  
  542.      i=0;  
  543.      while (code_len_table[huftabindex][i]==0)  
  544.       i++;  
  545.      for (j=0;j<i;j++){  
  546.       huf_min_value[huftabindex][j]=0;  
  547.       huf_max_value[huftabindex][j]=0;  
  548.      }  
  549.      huf_min_value[huftabindex][i]=0;  
  550.      huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;  
  551.      for (j=i+1;j<16;j++){  
  552.       huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;  
  553.       huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;  
  554.      }  
  555.      code_pos_table[huftabindex][0]=0;  
  556.      for (j=1;j<16;j++)  
  557.       code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];  
  558.      lp+=ccount;  
  559.      hf_table_index=*lp;  
  560.     }  //while  
  561.    }  //else  
  562.    break;  
  563.   case M_DRI:  
  564.    llength=MAKEWORD(*(lp+1),*lp);  
  565.    restart=MAKEWORD(*(lp+3),*(lp+2));  
  566.    lp+=llength;  
  567.    break;  
  568.   case M_SOS:  
  569.    llength=MAKEWORD(*(lp+1),*lp);  
  570.    comnum=*(lp+2);  
  571.    if(comnum!=comp_num)  
  572.     return FUNC_FORMAT_ERROR;  
  573.    lptemp=lp+3;  
  574.    for (i=0;i<comp_num;i++){  
  575.     if(*lptemp==comp_index[0]){  
  576.      YDcIndex=(*(lptemp+1))>>4;   //Y  
  577.      YAcIndex=((*(lptemp+1))&0x0f)+2;  
  578.     }  
  579.     else{  
  580.      UVDcIndex=(*(lptemp+1))>>4;   //U,V  
  581.      UVAcIndex=((*(lptemp+1))&0x0f)+2;  
  582.     }  
  583.     lptemp+=2;  
  584.    }  
  585.    lp+=llength;  
  586.    finish=TRUE;  
  587.    break;  
  588.   case M_EOI:      
  589.    return FUNC_FORMAT_ERROR;  
  590.    break;  
  591.   default:  
  592.     if ((id&0xf0)!=0xd0){  
  593.     llength=MAKEWORD(*(lp+1),*lp);  
  594.      lp+=llength;  
  595.    }  
  596.    else lp+=2;  
  597.    break;  
  598.     }  //switch  
  599.  } //while  
  600.  return FUNC_OK;  
  601. }  
  602. /////////////////////////////////////////////////////////////////  
  603. void InitTable()  
  604. {  
  605.  short i,j;  
  606.  sizei=sizej=0;  
  607.  ImgWidth=ImgHeight=0;  
  608.  rrun=vvalue=0;  
  609.  BitPos=0;  
  610.  CurByte=0;  
  611.  IntervalFlag=FALSE;  
  612.  restart=0;  
  613.  for(i=0;i<3;i++)  
  614.   for(j=0;j<64;j++)  
  615.    qt_table[i][j]=0;  
  616.  comp_num=0;  
  617.  HufTabIndex=0;  
  618.  for(i=0;i<3;i++)  
  619.   comp_index[i]=0;  
  620.  for(i=0;i<4;i++)  
  621.   for(j=0;j<16;j++){  
  622.    code_len_table[i][j]=0;  
  623.    code_pos_table[i][j]=0;  
  624.    huf_max_value[i][j]=0;  
  625.    huf_min_value[i][j]=0;  
  626.   }  
  627.  for(i=0;i<4;i++)  
  628.   for(j=0;j<256;j++)  
  629.    code_value_table[i][j]=0;  
  630.    
  631.  for(i=0;i<10*64;i++){  
  632.   MCUBuffer[i]=0;  
  633.   QtZzMCUBuffer[i]=0;  
  634.  }  
  635.  for(i=0;i<64;i++){  
  636.   Y[i]=0;  
  637.   U[i]=0;  
  638.   V[i]=0;  
  639.   BlockBuffer[i]=0;  
  640.  }  
  641.  ycoef=ucoef=vcoef=0;  
  642. }  
  643. /////////////////////////////////////////////////////////////////////////  
  644. int Decode()  
  645. {  
  646.  int funcret;  
  647.   
  648.  Y_in_MCU=SampRate_Y_H*SampRate_Y_V;  
  649.  U_in_MCU=SampRate_U_H*SampRate_U_V;  
  650.  V_in_MCU=SampRate_V_H*SampRate_V_V;  
  651.  H_YtoU=SampRate_Y_H/SampRate_U_H;  
  652.  V_YtoU=SampRate_Y_V/SampRate_U_V;  
  653.  H_YtoV=SampRate_Y_H/SampRate_V_H;  
  654.  V_YtoV=SampRate_Y_V/SampRate_V_V;  
  655.  Initialize_Fast_IDCT();  
  656.  while((funcret=DecodeMCUBlock())==FUNC_OK){  
  657.   interval++;  
  658.   if((restart)&&(interval % restart==0))  
  659.     IntervalFlag=TRUE;  
  660.   else  
  661.    IntervalFlag=FALSE;  
  662.   IQtIZzMCUComponent(0);  
  663.   IQtIZzMCUComponent(1);  
  664.   IQtIZzMCUComponent(2);  
  665.   GetYUV(0);  
  666.   GetYUV(1);  
  667.   GetYUV(2);  
  668.   StoreBuffer();  
  669.   sizej+=SampRate_Y_H*8;  
  670.   if(sizej>=ImgWidth){  
  671.    sizej=0;  
  672.    sizei+=SampRate_Y_V*8;  
  673.   }  
  674.   if ((sizej==0)&&(sizei>=ImgHeight))  
  675.    break;  
  676.   }  
  677.  return funcret;  
  678. }  
  679. /////////////////////////////////////////////////////////////////////////////////////////  
  680. void  GetYUV(short flag)  
  681. {  
  682.  short H,VV;  
  683.  short i,j,k,h;  
  684.  int  *buf;  
  685.  int  *pQtZzMCU;  
  686.   
  687.  switch(flag){  
  688.  case 0:  
  689.   H=SampRate_Y_H;  
  690.   VV=SampRate_Y_V;  
  691.   buf=Y;  
  692.   pQtZzMCU=QtZzMCUBuffer;  
  693.   break;  
  694.  case 1:  
  695.   H=SampRate_U_H;  
  696.   VV=SampRate_U_V;  
  697.   buf=U;  
  698.   pQtZzMCU=QtZzMCUBuffer+Y_in_MCU*64;  
  699.   break;  
  700.  case 2:  
  701.   H=SampRate_V_H;  
  702.   VV=SampRate_V_V;  
  703.   buf=V;  
  704.   pQtZzMCU=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;  
  705.   break;  
  706.  }  
  707.  for (i=0;i<VV;i++)  
  708.   for(j=0;j<H;j++)  
  709.    for(k=0;k<8;k++)  
  710.     for(h=0;h<8;h++)  
  711.      buf[(i*8+k)*SampRate_Y_H*8+j*8+h]=*pQtZzMCU++;  
  712. }  
  713. ///////////////////////////////////////////////////////////////////////////////  
  714. void StoreBuffer()  
  715. {  
  716.  short i,j;  
  717.  unsigned char  *lpbmp;  
  718.  unsigned char R,G,B;  
  719.  int y,u,v,rr,gg,bb;  
  720.   
  721.  for(i=0;i<SampRate_Y_V*8;i++){  
  722.   if((sizei+i)<ImgHeight){  
  723.    lpbmp=((unsigned char *)lpPtr+(DWORD)(ImgHeight-sizei-i-1)*LineBytes+sizej*3);  
  724.    for(j=0;j<SampRate_Y_H*8;j++){  
  725.     if((sizej+j)<ImgWidth){  
  726.      y=Y[i*8*SampRate_Y_H+j];  
  727.      u=U[(i/V_YtoU)*8*SampRate_Y_H+j/H_YtoU];  
  728.      v=V[(i/V_YtoV)*8*SampRate_Y_H+j/H_YtoV];  
  729.      rr=((y<<8)+18*u+367*v)>>8;  
  730.      gg=((y<<8)-159*u-220*v)>>8;  
  731.      bb=((y<<8)+411*u-29*v)>>8;  
  732.      R=(unsigned char)rr;  
  733.      G=(unsigned char)gg;  
  734.      B=(unsigned char)bb;  
  735.      if (rr&0xffffff00) if (rr>255) R=255; else if (rr<0) R=0;  
  736.      if (gg&0xffffff00) if (gg>255) G=255; else if (gg<0) G=0;  
  737.      if (bb&0xffffff00) if (bb>255) B=255; else if (bb<0) B=0;  
  738.      *lpbmp++=B;  
  739.      *lpbmp++=G;  
  740.      *lpbmp++=R;  
  741.        
  742.        
  743.     }  
  744.     else  break;  
  745.    }  
  746.   }  
  747.   else break;  
  748.  }  
  749. }  
  750. ///////////////////////////////////////////////////////////////////////////////  
  751. int DecodeMCUBlock()  
  752. {  
  753.  short *lpMCUBuffer;  
  754.  short i,j;  
  755.  int funcret;  
  756.   
  757.  if (IntervalFlag){  
  758.   lp+=2;  
  759.   ycoef=ucoef=vcoef=0;  
  760.   BitPos=0;  
  761.   CurByte=0;  
  762.  }  
  763.  switch(comp_num){  
  764.  case 3:  
  765.   lpMCUBuffer=MCUBuffer;  
  766.   for (i=0;i<SampRate_Y_H*SampRate_Y_V;i++)  //Y  
  767.   {  
  768.    funcret=HufBlock(YDcIndex,YAcIndex);  
  769.    if (funcret!=FUNC_OK)  
  770.     return funcret;  
  771.    BlockBuffer[0]=BlockBuffer[0]+ycoef;  
  772.    ycoef=BlockBuffer[0];  
  773.    for (j=0;j<64;j++)  
  774.     *lpMCUBuffer++=BlockBuffer[j];  
  775.   }  
  776.   for (i=0;i<SampRate_U_H*SampRate_U_V;i++)  //U  
  777.   {  
  778.    funcret=HufBlock(UVDcIndex,UVAcIndex);  
  779.    if (funcret!=FUNC_OK)  
  780.     return funcret;  
  781.    BlockBuffer[0]=BlockBuffer[0]+ucoef;  
  782.    ucoef=BlockBuffer[0];  
  783.    for (j=0;j<64;j++)  
  784.     *lpMCUBuffer++=BlockBuffer[j];  
  785.   }  
  786.   for (i=0;i<SampRate_V_H*SampRate_V_V;i++)  //V  
  787.   {  
  788.    funcret=HufBlock(UVDcIndex,UVAcIndex);  
  789.    if (funcret!=FUNC_OK)  
  790.     return funcret;  
  791.    BlockBuffer[0]=BlockBuffer[0]+vcoef;  
  792.    vcoef=BlockBuffer[0];  
  793.    for (j=0;j<64;j++)  
  794.     *lpMCUBuffer++=BlockBuffer[j];  
  795.   }  
  796.   break;  
  797.  case 1:  
  798.   lpMCUBuffer=MCUBuffer;  
  799.   funcret=HufBlock(YDcIndex,YAcIndex);  
  800.   if (funcret!=FUNC_OK)  
  801.    return funcret;  
  802.   BlockBuffer[0]=BlockBuffer[0]+ycoef;  
  803.   ycoef=BlockBuffer[0];  
  804.   for (j=0;j<64;j++)  
  805.    *lpMCUBuffer++=BlockBuffer[j];  
  806.   for (i=0;i<128;i++)  
  807.    *lpMCUBuffer++=0;  
  808.   break;  
  809.  default:  
  810.   return FUNC_FORMAT_ERROR;  
  811.  }  
  812.  return FUNC_OK;  
  813. }  
  814. //////////////////////////////////////////////////////////////////  
  815. int HufBlock(BYTE dchufindex,BYTE achufindex)  
  816. {  
  817.  short count=0;  
  818.  short i;  
  819.  int funcret;  
  820.   
  821.  //dc  
  822.  HufTabIndex=dchufindex;  
  823.  funcret=DecodeElement();  
  824.  if(funcret!=FUNC_OK)  
  825.   return funcret;  
  826.   
  827.  BlockBuffer[count++]=vvalue;  
  828.  //ac  
  829.  HufTabIndex=achufindex;  
  830.  while (count<64){  
  831.   funcret=DecodeElement();  
  832.   if(funcret!=FUNC_OK)  
  833.    return funcret;  
  834.   if ((rrun==0)&&(vvalue==0)){  
  835.    for (i=count;i<64;i++)  
  836.     BlockBuffer[i]=0;  
  837.    count=64;  
  838.   }  
  839.   else{  
  840.    for (i=0;i<rrun;i++)  
  841.     BlockBuffer[count++]=0;  
  842.    BlockBuffer[count++]=vvalue;  
  843.   }  
  844.  }  
  845.  return FUNC_OK;  
  846. }  
  847. //////////////////////////////////////////////////////////////////////////////  
  848. int DecodeElement()  
  849. {  
  850.  int thiscode,tempcode;  
  851.  unsigned short temp,valueex;  
  852.  short codelen;  
  853.  BYTE hufexbyte,runsize,tempsize,sign;  
  854.  BYTE newbyte,lastbyte;  
  855.   
  856.  if(BitPos>=1){  
  857.   BitPos--;  
  858.   thiscode=(BYTE)CurByte>>BitPos;  
  859.   CurByte=CurByte&And[BitPos];  
  860.  }  
  861.  else{  
  862.   lastbyte=ReadByte();  
  863.   BitPos--;  
  864.   newbyte=CurByte&And[BitPos];  
  865.   thiscode=lastbyte>>7;  
  866.   CurByte=newbyte;  
  867.  }  
  868.  codelen=1;  
  869.  while ((thiscode<huf_min_value[HufTabIndex][codelen-1])||  
  870.     (code_len_table[HufTabIndex][codelen-1]==0)||  
  871.     (thiscode>huf_max_value[HufTabIndex][codelen-1]))  
  872.  {  
  873.   if(BitPos>=1){  
  874.    BitPos--;  
  875.    tempcode=(BYTE)CurByte>>BitPos;  
  876.    CurByte=CurByte&And[BitPos];  
  877.   }  
  878.   else{  
  879.    lastbyte=ReadByte();  
  880.    BitPos--;  
  881.    newbyte=CurByte&And[BitPos];  
  882.    tempcode=(BYTE)lastbyte>>7;  
  883.    CurByte=newbyte;  
  884.   }  
  885.   thiscode=(thiscode<<1)+tempcode;  
  886.   codelen++;  
  887.   if(codelen>16)  
  888.    return FUNC_FORMAT_ERROR;  
  889.  }  //while  
  890.  temp=thiscode-huf_min_value[HufTabIndex][codelen-1]+code_pos_table[HufTabIndex][codelen-1];  
  891.  hufexbyte=(BYTE)code_value_table[HufTabIndex][temp];  
  892.  rrun=(short)(hufexbyte>>4);  
  893.  runsize=hufexbyte&0x0f;  
  894.  if(runsize==0){  
  895.   vvalue=0;  
  896.   return FUNC_OK;  
  897.  }  
  898.  tempsize=runsize;  
  899.  if(BitPos>=runsize){  
  900.   BitPos-=runsize;  
  901.   valueex=(BYTE)CurByte>>BitPos;  
  902.   CurByte=CurByte&And[BitPos];  
  903.  }  
  904.  else{  
  905.   valueex=CurByte;  
  906.   tempsize-=BitPos;  
  907.   while(tempsize>8){  
  908.    lastbyte=ReadByte();  
  909.    valueex=(valueex<<8)+(BYTE)lastbyte;  
  910.    tempsize-=8;  
  911.   }  //while  
  912.   lastbyte=ReadByte();  
  913.   BitPos-=tempsize;  
  914.   valueex=(valueex<<tempsize)+(lastbyte>>BitPos);  
  915.   CurByte=lastbyte&And[BitPos];  
  916.  }  //else  
  917.  sign=valueex>>(runsize-1);  
  918.  if(sign)  
  919.   vvalue=valueex;  
  920.  else{  
  921.   valueex=valueex^0xffff;  
  922.   temp=0xffff<<runsize;  
  923.   vvalue=-(short)(valueex^temp);  
  924.  }  
  925.  return FUNC_OK;  
  926. }  
  927. /////////////////////////////////////////////////////////////////////////////////////  
  928. void IQtIZzMCUComponent(short flag)  
  929. {  
  930.  short H,VV;  
  931.  short i,j;  
  932.  int *pQtZzMCUBuffer;  
  933.  short  *pMCUBuffer;  
  934.   
  935.  switch(flag){  
  936.  case 0:  
  937.   H=SampRate_Y_H;  
  938.   VV=SampRate_Y_V;  
  939.   pMCUBuffer=MCUBuffer;  
  940.   pQtZzMCUBuffer=QtZzMCUBuffer;  
  941.   break;  
  942.  case 1:  
  943.   H=SampRate_U_H;  
  944.   VV=SampRate_U_V;  
  945.   pMCUBuffer=MCUBuffer+Y_in_MCU*64;  
  946.   pQtZzMCUBuffer=QtZzMCUBuffer+Y_in_MCU*64;  
  947.   break;  
  948.  case 2:  
  949.   H=SampRate_V_H;  
  950.   VV=SampRate_V_V;  
  951.   pMCUBuffer=MCUBuffer+(Y_in_MCU+U_in_MCU)*64;  
  952.   pQtZzMCUBuffer=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;  
  953.   break;  
  954.  }  
  955.  for(i=0;i<VV;i++)  
  956.   for (j=0;j<H;j++)  
  957.    IQtIZzBlock(pMCUBuffer+(i*H+j)*64,pQtZzMCUBuffer+(i*H+j)*64,flag);  
  958. }  
  959. //////////////////////////////////////////////////////////////////////////////////////////  
  960. void IQtIZzBlock(short  *s ,int * d,short flag)  
  961. {  
  962.  short i,j;  
  963.  short tag;  
  964.  short *pQt;  
  965.  int buffer2[8][8];  
  966.  int *buffer1;  
  967.  short offset;  
  968.   
  969.  switch(flag){  
  970.  case 0:  
  971.   pQt=YQtTable;  
  972.   offset=128;  
  973.   break;  
  974.  case 1:  
  975.   pQt=UQtTable;  
  976.   offset=0;  
  977.   break;  
  978.  case 2:  
  979.   pQt=VQtTable;  
  980.   offset=0;  
  981.   break;  
  982.  }  
  983.   
  984.  for(i=0;i<8;i++)  
  985.   for(j=0;j<8;j++){  
  986.    tag=Zig_Zag[i][j];  
  987.    buffer2[i][j]=(int)s[tag]*(int)pQt[tag];  
  988.   }  
  989.  buffer1=(int *)buffer2;  
  990.  Fast_IDCT(buffer1);  
  991.  for(i=0;i<8;i++)  
  992.   for(j=0;j<8;j++)  
  993.    d[i*8+j]=buffer2[i][j]+offset;  
  994. }  
  995. ///////////////////////////////////////////////////////////////////////////////  
  996. void Fast_IDCT(int * block)  
  997. {  
  998.  short i;  
  999.   
  1000.  for (i=0; i<8; i++)  
  1001.   idctrow(block+8*i);  
  1002.   
  1003.  for (i=0; i<8; i++)  
  1004.   idctcol(block+i);  
  1005. }  
  1006. ///////////////////////////////////////////////////////////////////////////////  
  1007. BYTE  ReadByte()  
  1008. {  
  1009.  BYTE  i;  
  1010.   
  1011.  i=*(lp++);  
  1012.  if(i==0xff)  
  1013.   lp++;  
  1014.  BitPos=8;  
  1015.  CurByte=i;  
  1016.  return i;  
  1017. }  
  1018. ///////////////////////////////////////////////////////////////////////  
  1019. void Initialize_Fast_IDCT()  
  1020. {  
  1021.  short i;  
  1022.   
  1023.  iclp = iclip+512;  
  1024.  for (i= -512; i<512; i++)  
  1025.   iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);  
  1026. }  
  1027. ////////////////////////////////////////////////////////////////////////  
  1028. void idctrow(int * blk)  
  1029. {  
  1030.  int x0, x1, x2, x3, x4, x5, x6, x7, x8;  
  1031.  //intcut  
  1032.  if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |  
  1033.   (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))  
  1034.  {  
  1035.   blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;  
  1036.   return;  
  1037.  }  
  1038.  x0 = (blk[0]<<11) + 128; // for proper rounding in the fourth stage   
  1039.  //first stage  
  1040.  x8 = W7*(x4+x5);  
  1041.  x4 = x8 + (W1-W7)*x4;  
  1042.  x5 = x8 - (W1+W7)*x5;  
  1043.  x8 = W3*(x6+x7);  
  1044.  x6 = x8 - (W3-W5)*x6;  
  1045.  x7 = x8 - (W3+W5)*x7;  
  1046.  //second stage  
  1047.  x8 = x0 + x1;  
  1048.  x0 -= x1;  
  1049.  x1 = W6*(x3+x2);  
  1050.  x2 = x1 - (W2+W6)*x2;  
  1051.  x3 = x1 + (W2-W6)*x3;  
  1052.  x1 = x4 + x6;  
  1053.  x4 -= x6;  
  1054.  x6 = x5 + x7;  
  1055.  x5 -= x7;  
  1056.  //third stage  
  1057.  x7 = x8 + x3;  
  1058.  x8 -= x3;  
  1059.  x3 = x0 + x2;  
  1060.  x0 -= x2;  
  1061.  x2 = (181*(x4+x5)+128)>>8;  
  1062.  x4 = (181*(x4-x5)+128)>>8;  
  1063.  //fourth stage  
  1064.  blk[0] = (x7+x1)>>8;  
  1065.  blk[1] = (x3+x2)>>8;  
  1066.  blk[2] = (x0+x4)>>8;  
  1067.  blk[3] = (x8+x6)>>8;  
  1068.  blk[4] = (x8-x6)>>8;  
  1069.  blk[5] = (x0-x4)>>8;  
  1070.  blk[6] = (x3-x2)>>8;  
  1071.  blk[7] = (x7-x1)>>8;  
  1072. }  
  1073. //////////////////////////////////////////////////////////////////////////////  
  1074. void idctcol(int * blk)  
  1075. {  
  1076.  int x0, x1, x2, x3, x4, x5, x6, x7, x8;  
  1077.  //intcut  
  1078.  if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |  
  1079.   (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))  
  1080.  {  
  1081.   blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]  
  1082.    =blk[8*6]=blk[8*7]=iclp[(blk[8*0]+32)>>6];  
  1083.   return;  
  1084.  }  
  1085.  x0 = (blk[8*0]<<8) + 8192;  
  1086.  //first stage  
  1087.  x8 = W7*(x4+x5) + 4;  
  1088.  x4 = (x8+(W1-W7)*x4)>>3;  
  1089.  x5 = (x8-(W1+W7)*x5)>>3;  
  1090.  x8 = W3*(x6+x7) + 4;  
  1091.  x6 = (x8-(W3-W5)*x6)>>3;  
  1092.  x7 = (x8-(W3+W5)*x7)>>3;  
  1093.  //second stage  
  1094.  x8 = x0 + x1;  
  1095.  x0 -= x1;  
  1096.  x1 = W6*(x3+x2) + 4;  
  1097.  x2 = (x1-(W2+W6)*x2)>>3;  
  1098.  x3 = (x1+(W2-W6)*x3)>>3;  
  1099.  x1 = x4 + x6;  
  1100.  x4 -= x6;  
  1101.  x6 = x5 + x7;  
  1102.  x5 -= x7;  
  1103.  //third stage  
  1104.  x7 = x8 + x3;  
  1105.  x8 -= x3;  
  1106.  x3 = x0 + x2;  
  1107.  x0 -= x2;  
  1108.  x2 = (181*(x4+x5)+128)>>8;  
  1109.  x4 = (181*(x4-x5)+128)>>8;  
  1110.  //fourth stage  
  1111.  blk[8*0] = iclp[(x7+x1)>>14];  
  1112.  blk[8*1] = iclp[(x3+x2)>>14];  
  1113.  blk[8*2] = iclp[(x0+x4)>>14];  
  1114.  blk[8*3] = iclp[(x8+x6)>>14];  
  1115.  blk[8*4] = iclp[(x8-x6)>>14];  
  1116.  blk[8*5] = iclp[(x0-x4)>>14];  
  1117.  blk[8*6] = iclp[(x3-x2)>>14];  
  1118.  blk[8*7] = iclp[(x7-x1)>>14];  
  1119. }  
  1120.   
  1121. int _tmain(int argc, _TCHAR* argv[])  
  1122. {  
  1123.     LoadJpegFile("F:\\data\\IMG_20150411_183508.jpg");  
  1124.   
  1125.     return 0;  
  1126. }  
上文来自:http://blog.csdn.net/blues1021/article/details/45390021
[cpp]  view plain  copy
 print ?
  1. // JPGFile.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. // simplejpeg.cpp : Defines the entry point for the console application.  
  7. //  
  8. //header file  
  9. //#include "bmp.h"  
  10.   
  11.   
  12. //*************************************************************************************  
  13. //#include "jpeg.h"  
  14. #include <stdio.h>  
  15. #include <stdlib.h>  
  16.   
  17. #pragma pack(1)  
  18. #define M_SOF0  0xc0  
  19. #define M_DHT   0xc4  
  20. #define M_EOI   0xd9  
  21. #define M_SOS   0xda  
  22. #define M_DQT   0xdb  
  23. #define M_DRI   0xdd  
  24. #define M_APP0  0xe0  
  25.   
  26. static int Zig_Zag[8][8]={{0,1,5,6,14,15,27,28},  
  27.         {2,4,7,13,16,26,29,42},  
  28.         {3,8,12,17,25,30,41,43},  
  29.         {9,11,18,24,37,40,44,53},  
  30.         {10,19,23,32,39,45,52,54},  
  31.         {20,22,33,38,46,51,55,60},  
  32.         {21,34,37,47,50,56,59,61},  
  33.         {35,36,48,49,57,58,62,63}  
  34.        };  
  35.   
  36. #define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */  
  37. #define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */  
  38. #define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */  
  39. #define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */  
  40. #define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */  
  41. #define W7 565  /* 2048*sqrt(2)*cos(7*pi/16) */  
  42.   
  43.   
  44. //*************************************************************************************  
  45. typedef char CHAR;  
  46. typedef short SHORT;  
  47. typedef long LONG;  
  48.   
  49.    
  50.   
  51. typedef unsigned long       DWORD;  
  52. typedef int                 BOOL;  
  53. typedef unsigned char       BYTE;  
  54. typedef unsigned short      WORD;  
  55.   
  56.    
  57.   
  58. typedef int HFILE;  
  59. typedef CHAR *LPSTR, *PSTR;  
  60.   
  61. #define FALSE 0  
  62. #define TRUE 1  
  63.   
  64.   
  65. typedef struct tagBITMAPINFOHEADER{  
  66.         DWORD      biSize;  
  67.         LONG       biWidth;  
  68.         LONG       biHeight;  
  69.         WORD       biPlanes;  
  70.         WORD       biBitCount;  
  71.         DWORD      biCompression;  
  72.         DWORD      biSizeImage;  
  73.         LONG       biXPelsPerMeter;  
  74.         LONG       biYPelsPerMeter;  
  75.         DWORD      biClrUsed;  
  76.         DWORD      biClrImportant;  
  77. } BITMAPINFOHEADER, * LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;  
  78.   
  79. typedef struct tagBITMAPFILEHEADER {  
  80.         WORD    bfType;  
  81.         DWORD   bfSize;  
  82.         WORD    bfReserved1;  
  83.         WORD    bfReserved2;  
  84.         DWORD   bfOffBits;  
  85. }  BITMAPFILEHEADER,  * LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;  
  86.   
  87. /* constants for the biCompression field */  
  88. #define BI_RGB        0L  
  89. #define BI_RLE8       1L  
  90. #define BI_RLE4       2L  
  91. #define BI_BITFIELDS  3L  
  92.   
  93.   
  94. typedef struct tagRGBQUAD {  
  95.         BYTE    rgbBlue;  
  96.         BYTE    rgbGreen;  
  97.         BYTE    rgbRed;  
  98.         BYTE    rgbReserved;  
  99. } RGBQUAD;  
  100. typedef RGBQUAD * LPRGBQUAD;  
  101.   
  102.   
  103. #define MAKEWORD(a, b)      ((WORD)(((BYTE)(a)) | ((WORD)((BYTE)(b))) << 8))  
  104. #define MAKELONG(a, b)      ((LONG)(((WORD)(a)) | ((DWORD)((WORD)(b))) << 16))  
  105. #define LOWORD(l)           ((WORD)(l))  
  106. #define HIWORD(l)           ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))  
  107. #define LOBYTE(w)           ((BYTE)(w))  
  108. #define HIBYTE(w)           ((BYTE)(((WORD)(w) >> 8) & 0xFF))  
  109.   
  110. //---yk--- add  
  111.   
  112.    
  113.   
  114.   
  115. #include "memory.h"  
  116. #include "math.h"  
  117. #include "stdio.h"  
  118. //macro definition  
  119. #define WIDTHBYTES(i)    ((i+31)/32*4)//??????????  
  120. #define PI 3.1415926535  
  121. //define return value of function  
  122. #define FUNC_OK 0  
  123. #define FUNC_MEMORY_ERROR 1  
  124. #define FUNC_FILE_ERROR 2  
  125. #define FUNC_FORMAT_ERROR 3  
  126.   
  127.   
  128. //////////////////////////////////////////////////  
  129. //Jpeg functions  
  130. BOOL LoadJpegFile(char *BmpFileName);  
  131. void showerror(int funcret);  
  132. int  InitTag();  
  133. void InitTable();  
  134. int  Decode();  
  135. int  DecodeMCUBlock();  
  136. int  HufBlock(BYTE dchufindex,BYTE achufindex);  
  137. int  DecodeElement();  
  138. void IQtIZzMCUComponent(short flag);  
  139. void IQtIZzBlock(short  *s ,int * d,short flag);  
  140. void GetYUV(short flag);  
  141. void StoreBuffer();  
  142. BYTE ReadByte();  
  143. void Initialize_Fast_IDCT();  
  144. void Fast_IDCT(int * block);  
  145. void idctrow(int * blk);  
  146. void idctcol(int * blk);  
  147. //////////////////////////////////////////////////  
  148. //global variable declaration  
  149. BITMAPFILEHEADER   bf;  
  150. BITMAPINFOHEADER   bi;  
  151. //HPALETTE           hPalette=NULL;  
  152. //HBITMAP            hBitmap=NULL;  
  153. char *            hImgData=NULL;  
  154. DWORD              NumColors;  
  155. DWORD              LineBytes;  
  156. DWORD              ImgWidth=0 , ImgHeight=0;  
  157. char*             lpPtr;  
  158. //////////////////////////////////////////////////  
  159. //variables used in jpeg function  
  160. short   SampRate_Y_H,SampRate_Y_V;  
  161. short   SampRate_U_H,SampRate_U_V;  
  162. short   SampRate_V_H,SampRate_V_V;  
  163. short   H_YtoU,V_YtoU,H_YtoV,V_YtoV;  
  164. short   Y_in_MCU,U_in_MCU,V_in_MCU;  
  165. unsigned char   *lpJpegBuf;  
  166. unsigned char   *lp;  
  167. short   qt_table[3][64];  
  168. short   comp_num;  
  169. BYTE   comp_index[3];  
  170. BYTE      YDcIndex,YAcIndex,UVDcIndex,UVAcIndex;  
  171. BYTE   HufTabIndex;  
  172. short      *YQtTable,*UQtTable,*VQtTable;  
  173. BYTE   And[9]={0,1,3,7,0xf,0x1f,0x3f,0x7f,0xff};  
  174. short      code_pos_table[4][16],code_len_table[4][16];  
  175. unsigned short code_value_table[4][256];  
  176. unsigned short huf_max_value[4][16],huf_min_value[4][16];  
  177. short   BitPos,CurByte;  
  178. short   rrun,vvalue;  
  179. short   MCUBuffer[10*64];  
  180. int    QtZzMCUBuffer[10*64];  
  181. short   BlockBuffer[64];  
  182. short   ycoef,ucoef,vcoef;  
  183. BOOL   IntervalFlag;  
  184. short   interval=0;  
  185. int    Y[4*64],U[4*64],V[4*64];  
  186. DWORD      sizei,sizej;  
  187. short    restart;  
  188. static  long iclip[1024];  
  189. static  long *iclp;  
  190.   
  191.    
  192.   
  193. ////////////////////////////////////////////////////////////////  
  194. BOOL LoadJpegFile (char *JpegFileName)  
  195. {  
  196.  FILE*      hfjpg;  
  197.  DWORD          ImgSize;  
  198.  DWORD              BufSize,JpegBufSize;  
  199.  FILE*              hfbmp;  
  200.  FILE*              IMGdata;  
  201.  void *      hJpegBuf;  
  202.  int       funcret;  
  203.  DWORD i;  
  204.  LPBITMAPINFOHEADER lpImgData;  
  205.   
  206.  char * hImgData256;  
  207.   
  208.  if((hfjpg=fopen(JpegFileName,"rb"))==NULL)  
  209.  {  
  210.   showerror(FUNC_FILE_ERROR);  
  211.   return FALSE;  
  212.  }  
  213. /*SEEK_CUR  
  214. Current position of file pointer.  
  215. SEEK_END  
  216. End of file.  
  217. SEEK_SET  
  218. Beginning of file.*/  
  219.   
  220.   
  221.  //get jpg file length  
  222.  fseek(hfjpg,0L,SEEK_END);  
  223.  JpegBufSize=ftell(hfjpg);  
  224.  //rewind to the beginning of the file  
  225.  fseek(hfjpg,0L,SEEK_SET);  
  226.   
  227.  if((hJpegBuf=malloc(JpegBufSize))==NULL)  
  228.  {  
  229.   fclose(hfjpg);  
  230.   showerror(FUNC_MEMORY_ERROR);  
  231.     
  232.   return FALSE;  
  233.  }  
  234.  lpJpegBuf=(unsigned char  *)hJpegBuf;  
  235.  fread((unsigned char  *)hJpegBuf,sizeofchar ),JpegBufSize,hfjpg);  
  236.  fclose(hfjpg);  
  237.    
  238.  InitTable();  
  239.   
  240.  if((funcret=InitTag())!=FUNC_OK)  
  241.  {  
  242.  // GlobalUnlock(hJpegBuf);  
  243.   free(hJpegBuf);  
  244.   showerror(funcret);  
  245.   return FALSE;  
  246.  }  
  247.  //create new bitmapfileheader and bitmapinfoheader  
  248.  memset((char *)&bf,0,sizeof(BITMAPFILEHEADER));   
  249.  memset((char *)&bi,0,sizeof(BITMAPINFOHEADER));  
  250.   
  251.  bi.biSize=(DWORD)sizeof(BITMAPINFOHEADER);  
  252.  bi.biWidth=(LONG)(ImgWidth);  
  253.  bi.biHeight=(LONG)(ImgHeight);  
  254.  bi.biPlanes=1;  
  255.  bi.biBitCount=24;  
  256.  bi.biClrUsed=0;  
  257.  bi.biClrImportant=0;  
  258.  bi.biCompression=BI_RGB;  
  259.  NumColors=0;  
  260.  printf("bi.biWidth is %ld/n",bi.biWidth);  
  261. printf("bi.biBitCount is %ld/n",bi.biBitCount);  
  262.  LineBytes=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount);  
  263.  printf("LineBytes is %ld/n",LineBytes);  
  264.  ImgSize=(DWORD)LineBytes*bi.biHeight;//???????  
  265.  printf("size is %ld/n",ImgSize);  
  266.  bf.bfType=0x4d42;  
  267. int a= sizeof(BITMAPFILEHEADER);  
  268. int b= sizeof(BITMAPINFOHEADER);  
  269. //注意字节对齐问题!!!!!!!!!!!!!!!!!!!!!!!!1  
  270. //如果没有#pragma pack(1),a是16~~~~~~~  
  271. int c=NumColors*sizeof(RGBQUAD);  
  272.   
  273.  bf.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+NumColors*sizeof(RGBQUAD)+ImgSize;  
  274.  bf.bfOffBits=54;//(DWORD)(NumColors*sizeof(RGBQUAD)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));  
  275.  BufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);  
  276. // printf("size is %ld/n",BufSize);  
  277.  if((hImgData=(char*)malloc(BufSize))==NULL)  
  278.  {  
  279.   //GlobalUnlock(hJpegBuf);  
  280.   free(hJpegBuf);  
  281.   showerror(FUNC_MEMORY_ERROR);  
  282.   showerror(FUNC_MEMORY_ERROR);  
  283.   return FALSE;  
  284.  }  
  285. // lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);   
  286.  lpImgData=(LPBITMAPINFOHEADER)hImgData;   
  287.  memcpy(lpImgData,(char *)&bi,sizeof(BITMAPINFOHEADER));  
  288.  lpPtr=(char *)lpImgData+sizeof(BITMAPINFOHEADER);  
  289.   
  290.  if((SampRate_Y_H==0)||(SampRate_Y_V==0))  
  291.  {  
  292.  // GlobalUnlock(hJpegBuf);  
  293.   free(hJpegBuf);  
  294.   //GlobalUnlock(hImgData);  
  295.   free(hImgData);  
  296.   hImgData=NULL;  
  297.   showerror(FUNC_FORMAT_ERROR);  
  298.   return FALSE ;  
  299.  }  
  300.   
  301.  funcret=Decode();  
  302.  if(funcret==FUNC_OK)  
  303.  {  
  304.   //hDc=GetDC(hWnd);  
  305. /*  hBitmap=CreateDIBitmap(hDc, (LPBITMAPINFOHEADER)lpImgData, (LONG)CBM_INIT, 
  306.       (LPSTR)lpImgData+sizeof(BITMAPINFOHEADER) +NumColors*sizeof(RGBQUAD), 
  307.          (LPBITMAPINFO)lpImgData, DIB_RGB_COLORS); 
  308. */  
  309.  // hfbmp=fopen("c://jpeg2-bmp.bmp","Wb");  
  310.   
  311.   if((hfbmp=fopen("F:\\data\\jpeg2-bmp.bmp","wb"))==NULL)  
  312.   {  
  313.    showerror(FUNC_FILE_ERROR);  
  314.    return FALSE;  
  315.   }  
  316.   
  317.   // hfbmp=fopen("c://jpeg2-bmp.bmp","Wb");  
  318.   
  319.    
  320.   
  321.   fwrite((LPSTR)&bf,sizeof(BITMAPFILEHEADER),1,hfbmp);   
  322.   fwrite((LPSTR)lpImgData,sizeof(char),BufSize,hfbmp);  
  323.   
  324.   if((IMGdata=fopen("111.txt","wb"))==NULL)  
  325.   {  
  326.    showerror(FUNC_FILE_ERROR);  
  327.    return FALSE;  
  328.   }  
  329.   DWORD xx = ImgWidth*ImgHeight;  
  330.   if(( hImgData256=(char *)malloc(xx))==NULL)  
  331.   {  
  332.    //GlobalUnlock(hJpegBuf);  
  333.    free(hImgData256);  
  334.    showerror(FUNC_MEMORY_ERROR);  
  335.    showerror(FUNC_MEMORY_ERROR);  
  336.    showerror(FUNC_MEMORY_ERROR);  
  337.    return FALSE;  
  338.   }  
  339.   
  340.   char * temp=hImgData256;  
  341.   for(i=0; i < xx; i++)  
  342.   {  
  343.    i;  
  344.    char t3=*lpPtr;  
  345.    t3 &= 0xE0;  
  346.    char t1=*(lpPtr+1);  
  347.    t1 = t1>>3;  
  348.    t1 &= 0x1c;  
  349.    char t2=*(lpPtr+2);  
  350.    t2=t2>>6;  
  351.    t2 &= 0x03;  
  352.    char t4 = t3 + t1 + t2 ;  
  353.    *temp++=t4;  
  354.    lpPtr=lpPtr+ 3;  
  355.    //不能使用temp+=3;  
  356.   }  
  357.   int count=fwrite(hImgData256,sizeof(char),xx,IMGdata);  
  358.   //free((void*)hImgData256);  
  359.   fclose(IMGdata);  
  360.   
  361.   fclose(hfbmp);  
  362.     
  363. //  ReleaseDC(hWnd,hDc);  
  364. //  GlobalUnlock(hJpegBuf);  
  365.   free(hJpegBuf);  
  366.   //GlobalUnlock(hImgData);  
  367.   return TRUE;  
  368.  }  
  369.  else  
  370.  {  
  371.   //GlobalUnlock(hJpegBuf);  
  372.   free(hJpegBuf);  
  373.  // GlobalUnlock(hImgData);  
  374.   free(hImgData);  
  375.   hImgData=NULL;  
  376.   showerror(funcret);  
  377.   return FALSE;  
  378.  }  
  379. }  
  380. /////////////////////////////////////////////////  
  381. void showerror(int funcret)  
  382. {  
  383.  switch(funcret)  
  384.  {  
  385.  case FUNC_MEMORY_ERROR:  
  386.      printf("Error alloc memory/n!");  
  387.   break;  
  388.  case FUNC_FILE_ERROR:  
  389.      printf("File not found!/n");  
  390.   break;  
  391.  case FUNC_FORMAT_ERROR:  
  392.   printf("File format error!/n");  
  393.   break;  
  394.  }  
  395. }  
  396. ////////////////////////////////////////////////////////////////////////////////  
  397. int InitTag()  
  398. {  
  399.  BOOL finish=FALSE;  
  400.  BYTE id;  
  401.  short  llength;  
  402.  short  i,j,k;  
  403.  short  huftab1,huftab2;  
  404.  short  huftabindex;  
  405.  BYTE hf_table_index;  
  406.  BYTE qt_table_index;  
  407.  BYTE comnum;  
  408.   
  409.  unsigned char  *lptemp;  
  410.  short  ccount;  
  411.   
  412.  lp=lpJpegBuf+2;  
  413.   
  414.  while (!finish){  
  415.   id=*(lp+1);  
  416.   lp+=2;  
  417.   switch (id){  
  418.   case M_APP0:  
  419.    llength=MAKEWORD(*(lp+1),*lp);  
  420.    lp+=llength;  
  421.    break;  
  422.   case M_DQT:  
  423.    llength=MAKEWORD(*(lp+1),*lp);  
  424.    qt_table_index=(*(lp+2))&0x0f;  
  425.    lptemp=lp+3;  
  426.    if(llength<80){  
  427.     for(i=0;i<64;i++)  
  428.      qt_table[qt_table_index][i]=(short)*(lptemp++);  
  429.    }  
  430.    else{  
  431.     for(i=0;i<64;i++)  
  432.      qt_table[qt_table_index][i]=(short)*(lptemp++);  
  433.                 qt_table_index=(*(lptemp++))&0x0f;  
  434.       for(i=0;i<64;i++)  
  435.      qt_table[qt_table_index][i]=(short)*(lptemp++);  
  436.      }  
  437.      lp+=llength;    
  438.    break;  
  439.   case M_SOF0:  
  440.     llength=MAKEWORD(*(lp+1),*lp);  
  441.     ImgHeight=MAKEWORD(*(lp+4),*(lp+3));  
  442.     ImgWidth=MAKEWORD(*(lp+6),*(lp+5));  
  443.             comp_num=*(lp+7);  
  444.       if((comp_num!=1)&&(comp_num!=3))  
  445.       return FUNC_FORMAT_ERROR;  
  446.    if(comp_num==3){  
  447.     comp_index[0]=*(lp+8);  
  448.       SampRate_Y_H=(*(lp+9))>>4;  
  449.       SampRate_Y_V=(*(lp+9))&0x0f;  
  450.       YQtTable=(short *)qt_table[*(lp+10)];  
  451.   
  452.     comp_index[1]=*(lp+11);  
  453.     SampRate_U_H=(*(lp+12))>>4;  
  454.       SampRate_U_V=(*(lp+12))&0x0f;  
  455.       UQtTable=(short *)qt_table[*(lp+13)];  
  456.   
  457.       comp_index[2]=*(lp+14);  
  458.       SampRate_V_H=(*(lp+15))>>4;  
  459.       SampRate_V_V=(*(lp+15))&0x0f;  
  460.     VQtTable=(short *)qt_table[*(lp+16)];  
  461.      }  
  462.    else{  
  463.       comp_index[0]=*(lp+8);  
  464.     SampRate_Y_H=(*(lp+9))>>4;  
  465.       SampRate_Y_V=(*(lp+9))&0x0f;  
  466.       YQtTable=(short *)qt_table[*(lp+10)];  
  467.   
  468.     comp_index[1]=*(lp+8);  
  469.       SampRate_U_H=1;  
  470.       SampRate_U_V=1;  
  471.       UQtTable=(short *)qt_table[*(lp+10)];  
  472.   
  473.     comp_index[2]=*(lp+8);  
  474.     SampRate_V_H=1;  
  475.       SampRate_V_V=1;  
  476.       VQtTable=(short *)qt_table[*(lp+10)];  
  477.    }  
  478.      lp+=llength;            
  479.    break;  
  480.   case M_DHT:               
  481.    llength=MAKEWORD(*(lp+1),*lp);  
  482.    if (llength<0xd0){  
  483.     huftab1=(short)(*(lp+2))>>4;     //huftab1=0,1  
  484.      huftab2=(short)(*(lp+2))&0x0f;   //huftab2=0,1  
  485.     huftabindex=huftab1*2+huftab2;  
  486.      lptemp=lp+3;  
  487.     for (i=0; i<16; i++)  
  488.      code_len_table[huftabindex][i]=(short)(*(lptemp++));  
  489.     j=0;  
  490.     for (i=0; i<16; i++)  
  491.      if(code_len_table[huftabindex][i]!=0){  
  492.       k=0;  
  493.       while(k<code_len_table[huftabindex][i]){  
  494.        code_value_table[huftabindex][k+j]=(short)(*(lptemp++));  
  495.        k++;  
  496.       }  
  497.       j+=k;   
  498.      }  
  499.     i=0;  
  500.     while (code_len_table[huftabindex][i]==0)  
  501.       i++;  
  502.     for (j=0;j<i;j++){  
  503.      huf_min_value[huftabindex][j]=0;  
  504.      huf_max_value[huftabindex][j]=0;  
  505.     }  
  506.     huf_min_value[huftabindex][i]=0;  
  507.     huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;  
  508.     for (j=i+1;j<16;j++){  
  509.      huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;  
  510.      huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;  
  511.     }  
  512.     code_pos_table[huftabindex][0]=0;  
  513.     for (j=1;j<16;j++)  
  514.        code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];  
  515.       lp+=llength;  
  516.    }  //if  
  517.    else{  
  518.      hf_table_index=*(lp+2);  
  519.     lp+=2;  
  520.     while (hf_table_index!=0xff){  
  521.      huftab1=(short)hf_table_index>>4;     //huftab1=0,1  
  522.       huftab2=(short)hf_table_index&0x0f;   //huftab2=0,1  
  523.      huftabindex=huftab1*2+huftab2;  
  524.      lptemp=lp+1;  
  525.      ccount=0;  
  526.      for (i=0; i<16; i++){  
  527.       code_len_table[huftabindex][i]=(short)(*(lptemp++));  
  528.       ccount+=code_len_table[huftabindex][i];  
  529.      }  
  530.      ccount+=17;   
  531.      j=0;  
  532.      for (i=0; i<16; i++)  
  533.       if(code_len_table[huftabindex][i]!=0){  
  534.        k=0;  
  535.        while(k<code_len_table[huftabindex][i])  
  536.        {  
  537.         code_value_table[huftabindex][k+j]=(short)(*(lptemp++));  
  538.         k++;  
  539.        }  
  540.        j+=k;  
  541.       }  
  542.      i=0;  
  543.      while (code_len_table[huftabindex][i]==0)  
  544.       i++;  
  545.      for (j=0;j<i;j++){  
  546.       huf_min_value[huftabindex][j]=0;  
  547.       huf_max_value[huftabindex][j]=0;  
  548.      }  
  549.      huf_min_value[huftabindex][i]=0;  
  550.      huf_max_value[huftabindex][i]=code_len_table[huftabindex][i]-1;  
  551.      for (j=i+1;j<16;j++){  
  552.       huf_min_value[huftabindex][j]=(huf_max_value[huftabindex][j-1]+1)<<1;  
  553.       huf_max_value[huftabindex][j]=huf_min_value[huftabindex][j]+code_len_table[huftabindex][j]-1;  
  554.      }  
  555.      code_pos_table[huftabindex][0]=0;  
  556.      for (j=1;j<16;j++)  
  557.       code_pos_table[huftabindex][j]=code_len_table[huftabindex][j-1]+code_pos_table[huftabindex][j-1];  
  558.      lp+=ccount;  
  559.      hf_table_index=*lp;  
  560.     }  //while  
  561.    }  //else  
  562.    break;  
  563.   case M_DRI:  
  564.    llength=MAKEWORD(*(lp+1),*lp);  
  565.    restart=MAKEWORD(*(lp+3),*(lp+2));  
  566.    lp+=llength;  
  567.    break;  
  568.   case M_SOS:  
  569.    llength=MAKEWORD(*(lp+1),*lp);  
  570.    comnum=*(lp+2);  
  571.    if(comnum!=comp_num)  
  572.     return FUNC_FORMAT_ERROR;  
  573.    lptemp=lp+3;  
  574.    for (i=0;i<comp_num;i++){  
  575.     if(*lptemp==comp_index[0]){  
  576.      YDcIndex=(*(lptemp+1))>>4;   //Y  
  577.      YAcIndex=((*(lptemp+1))&0x0f)+2;  
  578.     }  
  579.     else{  
  580.      UVDcIndex=(*(lptemp+1))>>4;   //U,V  
  581.      UVAcIndex=((*(lptemp+1))&0x0f)+2;  
  582.     }  
  583.     lptemp+=2;  
  584.    }  
  585.    lp+=llength;  
  586.    finish=TRUE;  
  587.    break;  
  588.   case M_EOI:      
  589.    return FUNC_FORMAT_ERROR;  
  590.    break;  
  591.   default:  
  592.     if ((id&0xf0)!=0xd0){  
  593.     llength=MAKEWORD(*(lp+1),*lp);  
  594.      lp+=llength;  
  595.    }  
  596.    else lp+=2;  
  597.    break;  
  598.     }  //switch  
  599.  } //while  
  600.  return FUNC_OK;  
  601. }  
  602. /////////////////////////////////////////////////////////////////  
  603. void InitTable()  
  604. {  
  605.  short i,j;  
  606.  sizei=sizej=0;  
  607.  ImgWidth=ImgHeight=0;  
  608.  rrun=vvalue=0;  
  609.  BitPos=0;  
  610.  CurByte=0;  
  611.  IntervalFlag=FALSE;  
  612.  restart=0;  
  613.  for(i=0;i<3;i++)  
  614.   for(j=0;j<64;j++)  
  615.    qt_table[i][j]=0;  
  616.  comp_num=0;  
  617.  HufTabIndex=0;  
  618.  for(i=0;i<3;i++)  
  619.   comp_index[i]=0;  
  620.  for(i=0;i<4;i++)  
  621.   for(j=0;j<16;j++){  
  622.    code_len_table[i][j]=0;  
  623.    code_pos_table[i][j]=0;  
  624.    huf_max_value[i][j]=0;  
  625.    huf_min_value[i][j]=0;  
  626.   }  
  627.  for(i=0;i<4;i++)  
  628.   for(j=0;j<256;j++)  
  629.    code_value_table[i][j]=0;  
  630.    
  631.  for(i=0;i<10*64;i++){  
  632.   MCUBuffer[i]=0;  
  633.   QtZzMCUBuffer[i]=0;  
  634.  }  
  635.  for(i=0;i<64;i++){  
  636.   Y[i]=0;  
  637.   U[i]=0;  
  638.   V[i]=0;  
  639.   BlockBuffer[i]=0;  
  640.  }  
  641.  ycoef=ucoef=vcoef=0;  
  642. }  
  643. /////////////////////////////////////////////////////////////////////////  
  644. int Decode()  
  645. {  
  646.  int funcret;  
  647.   
  648.  Y_in_MCU=SampRate_Y_H*SampRate_Y_V;  
  649.  U_in_MCU=SampRate_U_H*SampRate_U_V;  
  650.  V_in_MCU=SampRate_V_H*SampRate_V_V;  
  651.  H_YtoU=SampRate_Y_H/SampRate_U_H;  
  652.  V_YtoU=SampRate_Y_V/SampRate_U_V;  
  653.  H_YtoV=SampRate_Y_H/SampRate_V_H;  
  654.  V_YtoV=SampRate_Y_V/SampRate_V_V;  
  655.  Initialize_Fast_IDCT();  
  656.  while((funcret=DecodeMCUBlock())==FUNC_OK){  
  657.   interval++;  
  658.   if((restart)&&(interval % restart==0))  
  659.     IntervalFlag=TRUE;  
  660.   else  
  661.    IntervalFlag=FALSE;  
  662.   IQtIZzMCUComponent(0);  
  663.   IQtIZzMCUComponent(1);  
  664.   IQtIZzMCUComponent(2);  
  665.   GetYUV(0);  
  666.   GetYUV(1);  
  667.   GetYUV(2);  
  668.   StoreBuffer();  
  669.   sizej+=SampRate_Y_H*8;  
  670.   if(sizej>=ImgWidth){  
  671.    sizej=0;  
  672.    sizei+=SampRate_Y_V*8;  
  673.   }  
  674.   if ((sizej==0)&&(sizei>=ImgHeight))  
  675.    break;  
  676.   }  
  677.  return funcret;  
  678. }  
  679. /////////////////////////////////////////////////////////////////////////////////////////  
  680. void  GetYUV(short flag)  
  681. {  
  682.  short H,VV;  
  683.  short i,j,k,h;  
  684.  int  *buf;  
  685.  int  *pQtZzMCU;  
  686.   
  687.  switch(flag){  
  688.  case 0:  
  689.   H=SampRate_Y_H;  
  690.   VV=SampRate_Y_V;  
  691.   buf=Y;  
  692.   pQtZzMCU=QtZzMCUBuffer;  
  693.   break;  
  694.  case 1:  
  695.   H=SampRate_U_H;  
  696.   VV=SampRate_U_V;  
  697.   buf=U;  
  698.   pQtZzMCU=QtZzMCUBuffer+Y_in_MCU*64;  
  699.   break;  
  700.  case 2:  
  701.   H=SampRate_V_H;  
  702.   VV=SampRate_V_V;  
  703.   buf=V;  
  704.   pQtZzMCU=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;  
  705.   break;  
  706.  }  
  707.  for (i=0;i<VV;i++)  
  708.   for(j=0;j<H;j++)  
  709.    for(k=0;k<8;k++)  
  710.     for(h=0;h<8;h++)  
  711.      buf[(i*8+k)*SampRate_Y_H*8+j*8+h]=*pQtZzMCU++;  
  712. }  
  713. ///////////////////////////////////////////////////////////////////////////////  
  714. void StoreBuffer()  
  715. {  
  716.  short i,j;  
  717.  unsigned char  *lpbmp;  
  718.  unsigned char R,G,B;  
  719.  int y,u,v,rr,gg,bb;  
  720.   
  721.  for(i=0;i<SampRate_Y_V*8;i++){  
  722.   if((sizei+i)<ImgHeight){  
  723.    lpbmp=((unsigned char *)lpPtr+(DWORD)(ImgHeight-sizei-i-1)*LineBytes+sizej*3);  
  724.    for(j=0;j<SampRate_Y_H*8;j++){  
  725.     if((sizej+j)<ImgWidth){  
  726.      y=Y[i*8*SampRate_Y_H+j];  
  727.      u=U[(i/V_YtoU)*8*SampRate_Y_H+j/H_YtoU];  
  728.      v=V[(i/V_YtoV)*8*SampRate_Y_H+j/H_YtoV];  
  729.      rr=((y<<8)+18*u+367*v)>>8;  
  730.      gg=((y<<8)-159*u-220*v)>>8;  
  731.      bb=((y<<8)+411*u-29*v)>>8;  
  732.      R=(unsigned char)rr;  
  733.      G=(unsigned char)gg;  
  734.      B=(unsigned char)bb;  
  735.      if (rr&0xffffff00) if (rr>255) R=255; else if (rr<0) R=0;  
  736.      if (gg&0xffffff00) if (gg>255) G=255; else if (gg<0) G=0;  
  737.      if (bb&0xffffff00) if (bb>255) B=255; else if (bb<0) B=0;  
  738.      *lpbmp++=B;  
  739.      *lpbmp++=G;  
  740.      *lpbmp++=R;  
  741.        
  742.        
  743.     }  
  744.     else  break;  
  745.    }  
  746.   }  
  747.   else break;  
  748.  }  
  749. }  
  750. ///////////////////////////////////////////////////////////////////////////////  
  751. int DecodeMCUBlock()  
  752. {  
  753.  short *lpMCUBuffer;  
  754.  short i,j;  
  755.  int funcret;  
  756.   
  757.  if (IntervalFlag){  
  758.   lp+=2;  
  759.   ycoef=ucoef=vcoef=0;  
  760.   BitPos=0;  
  761.   CurByte=0;  
  762.  }  
  763.  switch(comp_num){  
  764.  case 3:  
  765.   lpMCUBuffer=MCUBuffer;  
  766.   for (i=0;i<SampRate_Y_H*SampRate_Y_V;i++)  //Y  
  767.   {  
  768.    funcret=HufBlock(YDcIndex,YAcIndex);  
  769.    if (funcret!=FUNC_OK)  
  770.     return funcret;  
  771.    BlockBuffer[0]=BlockBuffer[0]+ycoef;  
  772.    ycoef=BlockBuffer[0];  
  773.    for (j=0;j<64;j++)  
  774.     *lpMCUBuffer++=BlockBuffer[j];  
  775.   }  
  776.   for (i=0;i<SampRate_U_H*SampRate_U_V;i++)  //U  
  777.   {  
  778.    funcret=HufBlock(UVDcIndex,UVAcIndex);  
  779.    if (funcret!=FUNC_OK)  
  780.     return funcret;  
  781.    BlockBuffer[0]=BlockBuffer[0]+ucoef;  
  782.    ucoef=BlockBuffer[0];  
  783.    for (j=0;j<64;j++)  
  784.     *lpMCUBuffer++=BlockBuffer[j];  
  785.   }  
  786.   for (i=0;i<SampRate_V_H*SampRate_V_V;i++)  //V  
  787.   {  
  788.    funcret=HufBlock(UVDcIndex,UVAcIndex);  
  789.    if (funcret!=FUNC_OK)  
  790.     return funcret;  
  791.    BlockBuffer[0]=BlockBuffer[0]+vcoef;  
  792.    vcoef=BlockBuffer[0];  
  793.    for (j=0;j<64;j++)  
  794.     *lpMCUBuffer++=BlockBuffer[j];  
  795.   }  
  796.   break;  
  797.  case 1:  
  798.   lpMCUBuffer=MCUBuffer;  
  799.   funcret=HufBlock(YDcIndex,YAcIndex);  
  800.   if (funcret!=FUNC_OK)  
  801.    return funcret;  
  802.   BlockBuffer[0]=BlockBuffer[0]+ycoef;  
  803.   ycoef=BlockBuffer[0];  
  804.   for (j=0;j<64;j++)  
  805.    *lpMCUBuffer++=BlockBuffer[j];  
  806.   for (i=0;i<128;i++)  
  807.    *lpMCUBuffer++=0;  
  808.   break;  
  809.  default:  
  810.   return FUNC_FORMAT_ERROR;  
  811.  }  
  812.  return FUNC_OK;  
  813. }  
  814. //////////////////////////////////////////////////////////////////  
  815. int HufBlock(BYTE dchufindex,BYTE achufindex)  
  816. {  
  817.  short count=0;  
  818.  short i;  
  819.  int funcret;  
  820.   
  821.  //dc  
  822.  HufTabIndex=dchufindex;  
  823.  funcret=DecodeElement();  
  824.  if(funcret!=FUNC_OK)  
  825.   return funcret;  
  826.   
  827.  BlockBuffer[count++]=vvalue;  
  828.  //ac  
  829.  HufTabIndex=achufindex;  
  830.  while (count<64){  
  831.   funcret=DecodeElement();  
  832.   if(funcret!=FUNC_OK)  
  833.    return funcret;  
  834.   if ((rrun==0)&&(vvalue==0)){  
  835.    for (i=count;i<64;i++)  
  836.     BlockBuffer[i]=0;  
  837.    count=64;  
  838.   }  
  839.   else{  
  840.    for (i=0;i<rrun;i++)  
  841.     BlockBuffer[count++]=0;  
  842.    BlockBuffer[count++]=vvalue;  
  843.   }  
  844.  }  
  845.  return FUNC_OK;  
  846. }  
  847. //////////////////////////////////////////////////////////////////////////////  
  848. int DecodeElement()  
  849. {  
  850.  int thiscode,tempcode;  
  851.  unsigned short temp,valueex;  
  852.  short codelen;  
  853.  BYTE hufexbyte,runsize,tempsize,sign;  
  854.  BYTE newbyte,lastbyte;  
  855.   
  856.  if(BitPos>=1){  
  857.   BitPos--;  
  858.   thiscode=(BYTE)CurByte>>BitPos;  
  859.   CurByte=CurByte&And[BitPos];  
  860.  }  
  861.  else{  
  862.   lastbyte=ReadByte();  
  863.   BitPos--;  
  864.   newbyte=CurByte&And[BitPos];  
  865.   thiscode=lastbyte>>7;  
  866.   CurByte=newbyte;  
  867.  }  
  868.  codelen=1;  
  869.  while ((thiscode<huf_min_value[HufTabIndex][codelen-1])||  
  870.     (code_len_table[HufTabIndex][codelen-1]==0)||  
  871.     (thiscode>huf_max_value[HufTabIndex][codelen-1]))  
  872.  {  
  873.   if(BitPos>=1){  
  874.    BitPos--;  
  875.    tempcode=(BYTE)CurByte>>BitPos;  
  876.    CurByte=CurByte&And[BitPos];  
  877.   }  
  878.   else{  
  879.    lastbyte=ReadByte();  
  880.    BitPos--;  
  881.    newbyte=CurByte&And[BitPos];  
  882.    tempcode=(BYTE)lastbyte>>7;  
  883.    CurByte=newbyte;  
  884.   }  
  885.   thiscode=(thiscode<<1)+tempcode;  
  886.   codelen++;  
  887.   if(codelen>16)  
  888.    return FUNC_FORMAT_ERROR;  
  889.  }  //while  
  890.  temp=thiscode-huf_min_value[HufTabIndex][codelen-1]+code_pos_table[HufTabIndex][codelen-1];  
  891.  hufexbyte=(BYTE)code_value_table[HufTabIndex][temp];  
  892.  rrun=(short)(hufexbyte>>4);  
  893.  runsize=hufexbyte&0x0f;  
  894.  if(runsize==0){  
  895.   vvalue=0;  
  896.   return FUNC_OK;  
  897.  }  
  898.  tempsize=runsize;  
  899.  if(BitPos>=runsize){  
  900.   BitPos-=runsize;  
  901.   valueex=(BYTE)CurByte>>BitPos;  
  902.   CurByte=CurByte&And[BitPos];  
  903.  }  
  904.  else{  
  905.   valueex=CurByte;  
  906.   tempsize-=BitPos;  
  907.   while(tempsize>8){  
  908.    lastbyte=ReadByte();  
  909.    valueex=(valueex<<8)+(BYTE)lastbyte;  
  910.    tempsize-=8;  
  911.   }  //while  
  912.   lastbyte=ReadByte();  
  913.   BitPos-=tempsize;  
  914.   valueex=(valueex<<tempsize)+(lastbyte>>BitPos);  
  915.   CurByte=lastbyte&And[BitPos];  
  916.  }  //else  
  917.  sign=valueex>>(runsize-1);  
  918.  if(sign)  
  919.   vvalue=valueex;  
  920.  else{  
  921.   valueex=valueex^0xffff;  
  922.   temp=0xffff<<runsize;  
  923.   vvalue=-(short)(valueex^temp);  
  924.  }  
  925.  return FUNC_OK;  
  926. }  
  927. /////////////////////////////////////////////////////////////////////////////////////  
  928. void IQtIZzMCUComponent(short flag)  
  929. {  
  930.  short H,VV;  
  931.  short i,j;  
  932.  int *pQtZzMCUBuffer;  
  933.  short  *pMCUBuffer;  
  934.   
  935.  switch(flag){  
  936.  case 0:  
  937.   H=SampRate_Y_H;  
  938.   VV=SampRate_Y_V;  
  939.   pMCUBuffer=MCUBuffer;  
  940.   pQtZzMCUBuffer=QtZzMCUBuffer;  
  941.   break;  
  942.  case 1:  
  943.   H=SampRate_U_H;  
  944.   VV=SampRate_U_V;  
  945.   pMCUBuffer=MCUBuffer+Y_in_MCU*64;  
  946.   pQtZzMCUBuffer=QtZzMCUBuffer+Y_in_MCU*64;  
  947.   break;  
  948.  case 2:  
  949.   H=SampRate_V_H;  
  950.   VV=SampRate_V_V;  
  951.   pMCUBuffer=MCUBuffer+(Y_in_MCU+U_in_MCU)*64;  
  952.   pQtZzMCUBuffer=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;  
  953.   break;  
  954.  }  
  955.  for(i=0;i<VV;i++)  
  956.   for (j=0;j<H;j++)  
  957.    IQtIZzBlock(pMCUBuffer+(i*H+j)*64,pQtZzMCUBuffer+(i*H+j)*64,flag);  
  958. }  
  959. //////////////////////////////////////////////////////////////////////////////////////////  
  960. void IQtIZzBlock(short  *s ,int * d,short flag)  
  961. {  
  962.  short i,j;  
  963.  short tag;  
  964.  short *pQt;  
  965.  int buffer2[8][8];  
  966.  int *buffer1;  
  967.  short offset;  
  968.   
  969.  switch(flag){  
  970.  case 0:  
  971.   pQt=YQtTable;  
  972.   offset=128;  
  973.   break;  
  974.  case 1:  
  975.   pQt=UQtTable;  
  976.   offset=0;  
  977.   break;  
  978.  case 2:  
  979.   pQt=VQtTable;  
  980.   offset=0;  
  981.   break;  
  982.  }  
  983.   
  984.  for(i=0;i<8;i++)  
  985.   for(j=0;j<8;j++){  
  986.    tag=Zig_Zag[i][j];  
  987.    buffer2[i][j]=(int)s[tag]*(int)pQt[tag];  
  988.   }  
  989.  buffer1=(int *)buffer2;  
  990.  Fast_IDCT(buffer1);  
  991.  for(i=0;i<8;i++)  
  992.   for(j=0;j<8;j++)  
  993.    d[i*8+j]=buffer2[i][j]+offset;  
  994. }  
  995. ///////////////////////////////////////////////////////////////////////////////  
  996. void Fast_IDCT(int * block)  
  997. {  
  998.  short i;  
  999.   
  1000.  for (i=0; i<8; i++)  
  1001.   idctrow(block+8*i);  
  1002.   
  1003.  for (i=0; i<8; i++)  
  1004.   idctcol(block+i);  
  1005. }  
  1006. ///////////////////////////////////////////////////////////////////////////////  
  1007. BYTE  ReadByte()  
  1008. {  
  1009.  BYTE  i;  
  1010.   
  1011.  i=*(lp++);  
  1012.  if(i==0xff)  
  1013.   lp++;  
  1014.  BitPos=8;  
  1015.  CurByte=i;  
  1016.  return i;  
  1017. }  
  1018. ///////////////////////////////////////////////////////////////////////  
  1019. void Initialize_Fast_IDCT()  
  1020. {  
  1021.  short i;  
  1022.   
  1023.  iclp = iclip+512;  
  1024.  for (i= -512; i<512; i++)  
  1025.   iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);  
  1026. }  
  1027. ////////////////////////////////////////////////////////////////////////  
  1028. void idctrow(int * blk)  
  1029. {  
  1030.  int x0, x1, x2, x3, x4, x5, x6, x7, x8;  
  1031.  //intcut  
  1032.  if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |  
  1033.   (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))  
  1034.  {  
  1035.   blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;  
  1036.   return;  
  1037.  }  
  1038.  x0 = (blk[0]<<11) + 128; // for proper rounding in the fourth stage   
  1039.  //first stage  
  1040.  x8 = W7*(x4+x5);  
  1041.  x4 = x8 + (W1-W7)*x4;  
  1042.  x5 = x8 - (W1+W7)*x5;  
  1043.  x8 = W3*(x6+x7);  
  1044.  x6 = x8 - (W3-W5)*x6;  
  1045.  x7 = x8 - (W3+W5)*x7;  
  1046.  //second stage  
  1047.  x8 = x0 + x1;  
  1048.  x0 -= x1;  
  1049.  x1 = W6*(x3+x2);  
  1050.  x2 = x1 - (W2+W6)*x2;  
  1051.  x3 = x1 + (W2-W6)*x3;  
  1052.  x1 = x4 + x6;  
  1053.  x4 -= x6;  
  1054.  x6 = x5 + x7;  
  1055.  x5 -= x7;  
  1056.  //third stage  
  1057.  x7 = x8 + x3;  
  1058.  x8 -= x3;  
  1059.  x3 = x0 + x2;  
  1060.  x0 -= x2;  
  1061.  x2 = (181*(x4+x5)+128)>>8;  
  1062.  x4 = (181*(x4-x5)+128)>>8;  
  1063.  //fourth stage  
  1064.  blk[0] = (x7+x1)>>8;  
  1065.  blk[1] = (x3+x2)>>8;  
  1066.  blk[2] = (x0+x4)>>8;  
  1067.  blk[3] = (x8+x6)>>8;  
  1068.  blk[4] = (x8-x6)>>8;  
  1069.  blk[5] = (x0-x4)>>8;  
  1070.  blk[6] = (x3-x2)>>8;  
  1071.  blk[7] = (x7-x1)>>8;  
  1072. }  
  1073. //////////////////////////////////////////////////////////////////////////////  
  1074. void idctcol(int * blk)  
  1075. {  
  1076.  int x0, x1, x2, x3, x4, x5, x6, x7, x8;  
  1077.  //intcut  
  1078.  if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |  
  1079.   (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))  
  1080.  {  
  1081.   blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]  
  1082.    =blk[8*6]=blk[8*7]=iclp[(blk[8*0]+32)>>6];  
  1083.   return;  
  1084.  }  
  1085.  x0 = (blk[8*0]<<8) + 8192;  
  1086.  //first stage  
  1087.  x8 = W7*(x4+x5) + 4;  
  1088.  x4 = (x8+(W1-W7)*x4)>>3;  
  1089.  x5 = (x8-(W1+W7)*x5)>>3;  
  1090.  x8 = W3*(x6+x7) + 4;  
  1091.  x6 = (x8-(W3-W5)*x6)>>3;  
  1092.  x7 = (x8-(W3+W5)*x7)>>3;  
  1093.  //second stage  
  1094.  x8 = x0 + x1;  
  1095.  x0 -= x1;  
  1096.  x1 = W6*(x3+x2) + 4;  
  1097.  x2 = (x1-(W2+W6)*x2)>>3;  
  1098.  x3 = (x1+(W2-W6)*x3)>>3;  
  1099.  x1 = x4 + x6;  
  1100.  x4 -= x6;  
  1101.  x6 = x5 + x7;  
  1102.  x5 -= x7;  
  1103.  //third stage  
  1104.  x7 = x8 + x3;  
  1105.  x8 -= x3;  
  1106.  x3 = x0 + x2;  
  1107.  x0 -= x2;  
  1108.  x2 = (181*(x4+x5)+128)>>8;  
  1109.  x4 = (181*(x4-x5)+128)>>8;  
  1110.  //fourth stage  
  1111.  blk[8*0] 

你可能感兴趣的:(C++,解析,图像,C++11)