IDCT.C
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:3k
- #include "mp4_vars.h"
- void init_idct ();
- #define W1 2841
- #define W2 2676
- #define W3 2408
- #define W5 1609
- #define W6 1108
- #define W7 565
- static void idctrow (short *blk)
- {
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
- if (!((x1 = blk[4] << 11) | (x2 = blk[6]) | (x3 = blk[2]) |
- (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
- {
- blk[0] = blk[1] = blk[2] = blk[3] = blk[4] = blk[5] = blk[6] = blk[7] = blk[0] << 3;
- return;
- }
- x0 = (blk[0] << 11) + 128;
- x8 = W7 * (x4 + x5);
- x4 = x8 + (W1 - W7) * x4;
- x5 = x8 - (W1 + W7) * x5;
- x8 = W3 * (x6 + x7);
- x6 = x8 - (W3 - W5) * x6;
- x7 = x8 - (W3 + W5) * x7;
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6 * (x3 + x2);
- x2 = x1 - (W2 + W6) * x2;
- x3 = x1 + (W2 - W6) * x3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181 * (x4 + x5) + 128) >> 8;
- x4 = (181 * (x4 - x5) + 128) >> 8;
- blk[0] = (x7 + x1) >> 8;
- blk[1] = (x3 + x2) >> 8;
- blk[2] = (x0 + x4) >> 8;
- blk[3] = (x8 + x6) >> 8;
- blk[4] = (x8 - x6) >> 8;
- blk[5] = (x0 - x4) >> 8;
- blk[6] = (x3 - x2) >> 8;
- blk[7] = (x7 - x1) >> 8;
- }
- static void idctcol (short *blk)
- {
- int x0, x1, x2, x3, x4, x5, x6, x7, x8;
- if (!((x1 = (blk[8 * 4] << 8)) | (x2 = blk[8 * 6]) | (x3 = blk[8 * 2]) |
- (x4 = blk[8 * 1]) | (x5 = blk[8 * 7]) | (x6 = blk[8 * 5]) | (x7 = blk[8 * 3])))
- {
- blk[8 * 0] = blk[8 * 1] = blk[8 * 2] = blk[8 * 3] = blk[8 * 4] = blk[8 * 5] = blk[8 * 6] = blk[8 * 7] =
- mp4_state->clp[(blk[8 * 0] + 32) >> 6];
- return;
- }
- x0 = (blk[8 * 0] << 8) + 8192;
- x8 = W7 * (x4 + x5) + 4;
- x4 = (x8 + (W1 - W7) * x4) >> 3;
- x5 = (x8 - (W1 + W7) * x5) >> 3;
- x8 = W3 * (x6 + x7) + 4;
- x6 = (x8 - (W3 - W5) * x6) >> 3;
- x7 = (x8 - (W3 + W5) * x7) >> 3;
- x8 = x0 + x1;
- x0 -= x1;
- x1 = W6 * (x3 + x2) + 4;
- x2 = (x1 - (W2 + W6) * x2) >> 3;
- x3 = (x1 + (W2 - W6) * x3) >> 3;
- x1 = x4 + x6;
- x4 -= x6;
- x6 = x5 + x7;
- x5 -= x7;
- x7 = x8 + x3;
- x8 -= x3;
- x3 = x0 + x2;
- x0 -= x2;
- x2 = (181 * (x4 + x5) + 128) >> 8;
- x4 = (181 * (x4 - x5) + 128) >> 8;
- blk[8 * 0] = mp4_state->clp[(x7 + x1) >> 14];
- blk[8 * 1] = mp4_state->clp[(x3 + x2) >> 14];
- blk[8 * 2] = mp4_state->clp[(x0 + x4) >> 14];
- blk[8 * 3] = mp4_state->clp[(x8 + x6) >> 14];
- blk[8 * 4] = mp4_state->clp[(x8 - x6) >> 14];
- blk[8 * 5] = mp4_state->clp[(x0 - x4) >> 14];
- blk[8 * 6] = mp4_state->clp[(x3 - x2) >> 14];
- blk[8 * 7] = mp4_state->clp[(x7 - x1) >> 14];
- }
- void idct (short *block)
- {
- int i;
- for (i = 0; i < 8; i++)
- idctrow (block + 8 * i);
- for (i = 0; i < 8; i++)
- idctcol (block + i);
- }