aan 演算法 c 語言示例 (轉)
static int SpreSC[64]
={
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
12873, 17855, 16819, 15137, 25746, 20228, 13933, 7103,
17734, 24598, 23170, 20853, 17734, 13933, 9597, 4892,
18081, 25080, 23624, 21261, 18081, 14206, 9785, 4988
};
/*
use this table to multiply the block[j] in the decode_macroblock
stage;
after multiply,shift to right 13 bits; (17-4)
*/
#define C2 30274 // 2 C(PI/8) 1.84776
#define C4 23171 // SQRT(2) 1.41421
#define C6 12540 // 2 SIN (PI/8) 0.76537
#define C6pC2 42814 2.61313
#define C6sC2 (-17734) // -1.08239
#define RC0 14
#define RC1 18
#define ROUND (1<
// do 80 times of multiply; fastidct :176;
#define idct_unit(a,b) {x4 = x5 - x3;
t1 = x5 + x3;
x3 = (x2+x6)<
t0 = x1 + x7;
x6= x1 - x7;
x7= (t0 + t1)<
t0=C6*(x4+x6);
x4=C6sC2*x4-t0;
x6=C6pC2*x6-t0;
t0=x6-x7;
x1=(a-b)<
x6=(a+b)<
x4=x3+x6;
x6-=x3;
x3=x1+x2;
x5=x1-x2; }
static void IDCTaan_c(short* block)
{
int x0,x1,x2,x3,x4,x5,x6,x7;
int t0,t1;
short *blk;
// Field one
blk = block;
for(int i=0; i<8; i++)
{
if (!( (x1 = blk[1])
| (x2 = blk[2])
| (x3 = blk[3])
| (x4 = blk[4])
| (x5 = blk[5])
| (x6 = blk[6])
| (x7 = blk[7])))
{
// blk[0]=
blk[1]=blk[2]=blk[3]=blk[4]
=blk[5]=blk[6]=blk[7]=(blk[0]);
}
else
{
idct_unit(blk[0],blk[4])
blk[0]=(x4+x7)>>RC0 ;
blk[7]=(x4-x7)>>RC0 ;
blk[1]=(x3+t0)>>RC0 ;
blk[6]=(x3-t0)>>RC0 ;
blk[2]=(x5-t1)>>RC0 ;
blk[5]=(x5+t1)>>RC0 ;
blk[3]=(x6-x0)>>RC0 ;
blk[4]=(x6+x0)>>RC0 ;
}
blk+=8;
}
two
blk=block;
for ( i=0; i<8; i++)
{
if (!((x1 = blk[8])
| (x2 = blk[16])
| (x3 = blk[24])
| (x4 = blk[32])
| (x5 = blk[40])
| (x6 = blk[48])
| (x7 = blk[56])))
{
blk[0]=blk[8]=blk[16]=blk[24]
=blk[32]=blk[40]=blk[48]=blk[56]=
iclp[blk[0]>>4];
}
else
{
idct_unit(blk[0*8],blk[4*8])
blk[0*8]=iclp[(x4+x7+ROUND)>>RC1];
blk[7*8]=iclp[(x4-x7+ROUND)>>RC1];
blk[1*8]=iclp[(x3+t0+ROUND)>>RC1];
blk[6*8]=iclp[(x3-t0+ROUND)>>RC1];
blk[2*8]=iclp[(x5-t1+ROUND)>>RC1];
blk[5*8]=iclp[(x5+t1+ROUND)>>RC1];
blk[3*8]=iclp[(x6-x0+ROUND)>>RC1];
blk[4*8]=iclp[(x6+x0+ROUND)>>RC1];
}
blk++;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987837/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C語言庫函式及示例C語言函式
- C語言MySQL程式設計示例C語言MySql程式設計
- Perceptron演算法—C語言演算法C語言
- 位反轉的最佳演算法(C語言實現)演算法C語言
- C++語言概述 (轉)C++
- C語言---整型字串轉換C語言字串
- c語言函式庫(轉)C語言函式
- 排序演算法-C語言實現排序演算法C語言
- C語言實現A*演算法薦C語言演算法
- C語言演算法之猴子吃桃C語言演算法
- 快速排序演算法(C語言實現)排序演算法C語言
- C語言 C語言野指標C語言指標
- C語言---“C語言 誰與爭鋒?”C語言
- 【C語言】聊聊輾轉相除法C語言
- C語言動態呼叫庫(轉)C語言
- C語言連線Oracle (轉載)C語言Oracle
- c語言字串,數字轉換C語言字串
- C 語言程式設計(unix) (轉)程式設計
- C 語言常見問題(轉)
- Java語言和C++語言的差異 (轉)JavaC++
- PID演算法的C語言實現演算法C語言
- C語言C語言
- C語言學習資料(轉載)C語言
- C語言程式書寫規範 (轉)C語言
- Linux中的C語言妙用(轉)LinuxC語言
- C語言直接顯示漢字(轉)C語言
- C語言常見錯誤分析 (轉)C語言
- C語言(C++語言)中##(兩個井號)和#(一個井號)用法[轉]C語言C++
- 聊聊C語言/C++—程式和程式語言C語言C++
- 演算法導論C語言實現: 演算法基礎演算法C語言
- 最短路徑——floyd演算法程式碼(c語言)演算法C語言
- C語言實現九大排序演算法C語言排序演算法
- 試題 演算法提高 質數2(C語言)演算法C語言
- C語言演算法之17:細胞生命遊戲C語言演算法遊戲
- C 語言簡單演算法回顧總結演算法
- ORACLE 數字演算法的C語言實現Oracle演算法C語言
- C語言的隱式型別轉換C語言型別
- C語言常見的出錯資訊! (轉)C語言