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

多媒体编程

开发平台:

Visual C++

  1. #include "mp4_vars.h"
  2. void init_idct ();
  3. #define W1 2841                 
  4. #define W2 2676                 
  5. #define W3 2408                
  6. #define W5 1609                 
  7. #define W6 1108                
  8. #define W7 565                  
  9. static void idctrow (short *blk)
  10. {
  11.   int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  12.   if (!((x1 = blk[4] << 11) | (x2 = blk[6]) | (x3 = blk[2]) |
  13.         (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
  14.   {
  15.     blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = blk[0] << 3;
  16.     return;
  17.   }
  18.   x0 = (blk[0] << 11) + 128;    
  19.   x8 = W7 * (x4 + x5);
  20.   x4 = x8 + (W1 - W7) * x4;
  21.   x5 = x8 - (W1 + W7) * x5;
  22.   x8 = W3 * (x6 + x7);
  23.   x6 = x8 - (W3 - W5) * x6;
  24.   x7 = x8 - (W3 + W5) * x7;
  25.   x8 = x0 + x1;
  26.   x0 -= x1;
  27.   x1 = W6 * (x3 + x2);
  28.   x2 = x1 - (W2 + W6) * x2;
  29.   x3 = x1 + (W2 - W6) * x3;
  30.   x1 = x4 + x6;
  31.   x4 -= x6;
  32.   x6 = x5 + x7;
  33.   x5 -= x7;
  34.   x7 = x8 + x3;
  35.   x8 -= x3;
  36.   x3 = x0 + x2;
  37.   x0 -= x2;
  38.   x2 = (181 * (x4 + x5) + 128) >> 8;
  39.   x4 = (181 * (x4 - x5) + 128) >> 8;
  40.   blk[0] = (x7 + x1) >> 8;
  41.   blk[1] = (x3 + x2) >> 8;
  42.   blk[2] = (x0 + x4) >> 8;
  43.   blk[3] = (x8 + x6) >> 8;
  44.   blk[4] = (x8 - x6) >> 8;
  45.   blk[5] = (x0 - x4) >> 8;
  46.   blk[6] = (x3 - x2) >> 8;
  47.   blk[7] = (x7 - x1) >> 8;
  48. }
  49. static void idctcol (short *blk)
  50. {
  51.   int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  52.   if (!((x1 = (blk[8 * 4] << 8)) | (x2 = blk[8 * 6]) | (x3 = blk[8 * 2]) |
  53.         (x4 = blk[8 * 1]) | (x5 = blk[8 * 7]) | (x6 = blk[8 * 5]) | (x7 = blk[8 * 3])))
  54.   {
  55.     blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = blk[8 * 3] = blk[8 * 4] = blk[8 * 5] = blk[8 * 6] = blk[8 * 7] =
  56.       mp4_state->clp[(blk[8 * 0] + 32) >> 6];
  57.     return;
  58.   }
  59.   x0 = (blk[8 * 0] << 8) + 8192;
  60.   x8 = W7 * (x4 + x5) + 4;
  61.   x4 = (x8 + (W1 - W7) * x4) >> 3;
  62.   x5 = (x8 - (W1 + W7) * x5) >> 3;
  63.   x8 = W3 * (x6 + x7) + 4;
  64.   x6 = (x8 - (W3 - W5) * x6) >> 3;
  65.   x7 = (x8 - (W3 + W5) * x7) >> 3;
  66.   x8 = x0 + x1;
  67.   x0 -= x1;
  68.   x1 = W6 * (x3 + x2) + 4;
  69.   x2 = (x1 - (W2 + W6) * x2) >> 3;
  70.   x3 = (x1 + (W2 - W6) * x3) >> 3;
  71.   x1 = x4 + x6;
  72.   x4 -= x6;
  73.   x6 = x5 + x7;
  74.   x5 -= x7;
  75.   x7 = x8 + x3;
  76.   x8 -= x3;
  77.   x3 = x0 + x2;
  78.   x0 -= x2;
  79.   x2 = (181 * (x4 + x5) + 128) >> 8;
  80.   x4 = (181 * (x4 - x5) + 128) >> 8;
  81.   blk[8 * 0] = mp4_state->clp[(x7 + x1) >> 14];
  82.   blk[8 * 1] = mp4_state->clp[(x3 + x2) >> 14];
  83.   blk[8 * 2] = mp4_state->clp[(x0 + x4) >> 14];
  84.   blk[8 * 3] = mp4_state->clp[(x8 + x6) >> 14];
  85.   blk[8 * 4] = mp4_state->clp[(x8 - x6) >> 14];
  86.   blk[8 * 5] = mp4_state->clp[(x0 - x4) >> 14];
  87.   blk[8 * 6] = mp4_state->clp[(x3 - x2) >> 14];
  88.   blk[8 * 7] = mp4_state->clp[(x7 - x1) >> 14];
  89. }
  90. void idct (short *block)
  91. {
  92.   int i;
  93.   for (i = 0; i < 8; i++)
  94.     idctrow (block + 8 * i);
  95.   for (i = 0; i < 8; i++)
  96.     idctcol (block + i);
  97. }