text_dct.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include <math.h>
  2. #ifndef PI
  3. # ifdef M_PI
  4. #  define PI M_PI
  5. # else
  6. #  define PI 3.14159265358979323846
  7. # endif
  8. #endif
  9. static double c[8][8]; 
  10. void fdct_enc(block)
  11. short *block;
  12. {
  13.   int i, j, k;
  14.   double s;
  15.   double tmp[64];
  16.   for (i=0; i<8; i++)
  17.     for (j=0; j<8; j++)
  18.     {
  19.       s = 0.0;
  20.       for (k=0; k<8; k++)
  21.         s += c[j][k] * block[8*i+k];
  22.       tmp[8*i+j] = s;
  23.     }
  24.   for (j=0; j<8; j++)
  25.     for (i=0; i<8; i++)
  26.     {
  27.       s = 0.0;
  28.       for (k=0; k<8; k++)
  29.         s += c[i][k] * tmp[8*k+j];
  30.       block[8*i+j] = (int)floor(s+0.499999);
  31.       
  32.     }
  33. }
  34. void init_fdct_enc()
  35. {
  36.   int i, j;
  37.   double s;
  38.   for (i=0; i<8; i++)
  39.   {
  40.     s = (i==0) ? sqrt(0.125) : 0.5;
  41.     for (j=0; j<8; j++)
  42.       c[i][j] = s * cos((PI/8.0)*i*(j+0.5));
  43.   }
  44. }
  45. #define W1 2841 
  46. #define W2 2676 
  47. #define W3 2408 
  48. #define W5 1609 
  49. #define W6 1108 
  50. #define W7 565  
  51. static short iclip[1024]; 
  52. static short *iclp;
  53. static void idctrow_enc (short *blk);
  54. static void idctcol_enc (short *blk);
  55. void idct_enc(block)
  56. short *block;
  57. {
  58.   int i;
  59.   for (i=0; i<8; i++)
  60.     idctrow_enc(block+8*i);
  61.   for (i=0; i<8; i++)
  62.     idctcol_enc(block+i);
  63. }
  64. void init_idct_enc()
  65. {
  66.   int i;
  67.   iclp = iclip+512;
  68.   for (i= -512; i<512; i++)
  69.     iclp[i] = (i<-256) ? -256 : ((i>255) ? 255 : i);
  70. }
  71. static void idctrow_enc(blk)
  72. short *blk;
  73. {
  74.   int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  75.   
  76.   if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
  77.         (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
  78.   {
  79.     blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
  80.     return;
  81.   }
  82.   x0 = (blk[0]<<11) + 128; 
  83.   
  84.   x8 = W7*(x4+x5);
  85.   x4 = x8 + (W1-W7)*x4;
  86.   x5 = x8 - (W1+W7)*x5;
  87.   x8 = W3*(x6+x7);
  88.   x6 = x8 - (W3-W5)*x6;
  89.   x7 = x8 - (W3+W5)*x7;
  90.   
  91.   
  92.   x8 = x0 + x1;
  93.   x0 -= x1;
  94.   x1 = W6*(x3+x2);
  95.   x2 = x1 - (W2+W6)*x2;
  96.   x3 = x1 + (W2-W6)*x3;
  97.   x1 = x4 + x6;
  98.   x4 -= x6;
  99.   x6 = x5 + x7;
  100.   x5 -= x7;
  101.   
  102.   
  103.   x7 = x8 + x3;
  104.   x8 -= x3;
  105.   x3 = x0 + x2;
  106.   x0 -= x2;
  107.   x2 = (181*(x4+x5)+128)>>8;
  108.   x4 = (181*(x4-x5)+128)>>8;
  109.   
  110.   
  111.   blk[0] = (x7+x1)>>8;
  112.   blk[1] = (x3+x2)>>8;
  113.   blk[2] = (x0+x4)>>8;
  114.   blk[3] = (x8+x6)>>8;
  115.   blk[4] = (x8-x6)>>8;
  116.   blk[5] = (x0-x4)>>8;
  117.   blk[6] = (x3-x2)>>8;
  118.   blk[7] = (x7-x1)>>8;
  119. }
  120. static void idctcol_enc(blk)
  121. short *blk;
  122. {
  123.   int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  124.   
  125.   if (!((x1 = (blk[8*4]<<8)) | (x2 = blk[8*6]) | (x3 = blk[8*2]) |
  126.         (x4 = blk[8*1]) | (x5 = blk[8*7]) | (x6 = blk[8*5]) | (x7 = blk[8*3])))
  127.   {
  128.     blk[8*0]=blk[8*1]=blk[8*2]=blk[8*3]=blk[8*4]=blk[8*5]=blk[8*6]=blk[8*7]=
  129.       iclp[(blk[8*0]+32)>>6];
  130.     return;
  131.   }
  132.   x0 = (blk[8*0]<<8) + 8192;
  133.   
  134.   x8 = W7*(x4+x5) + 4;
  135.   x4 = (x8+(W1-W7)*x4)>>3;
  136.   x5 = (x8-(W1+W7)*x5)>>3;
  137.   x8 = W3*(x6+x7) + 4;
  138.   x6 = (x8-(W3-W5)*x6)>>3;
  139.   x7 = (x8-(W3+W5)*x7)>>3;
  140.   
  141.   
  142.   x8 = x0 + x1;
  143.   x0 -= x1;
  144.   x1 = W6*(x3+x2) + 4;
  145.   x2 = (x1-(W2+W6)*x2)>>3;
  146.   x3 = (x1+(W2-W6)*x3)>>3;
  147.   x1 = x4 + x6;
  148.   x4 -= x6;
  149.   x6 = x5 + x7;
  150.   x5 -= x7;
  151.   
  152.   
  153.   x7 = x8 + x3;
  154.   x8 -= x3;
  155.   x3 = x0 + x2;
  156.   x0 -= x2;
  157.   x2 = (181*(x4+x5)+128)>>8;
  158.   x4 = (181*(x4-x5)+128)>>8;
  159.   
  160.   
  161.   blk[8*0] = iclp[(x7+x1)>>14];
  162.   blk[8*1] = iclp[(x3+x2)>>14];
  163.   blk[8*2] = iclp[(x0+x4)>>14];
  164.   blk[8*3] = iclp[(x8+x6)>>14];
  165.   blk[8*4] = iclp[(x8-x6)>>14];
  166.   blk[8*5] = iclp[(x0-x4)>>14];
  167.   blk[8*6] = iclp[(x3-x2)>>14];
  168.   blk[8*7] = iclp[(x7-x1)>>14];
  169. }