- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
ifdct_8x8.c
资源名称:ifdct_8x8.rar [点击查看]
上传用户:szuygs
上传日期:2009-09-28
资源大小:2k
文件大小:7k
源码类别:
GDI/图象编程
开发平台:
C/C++
- /**************************************************************************
- * Copyright (c) 1993 Stefan Horbelt *
- * *
- * Permission to use, copy, modify, and distribute this material for any *
- * purpose and without fee is hereby granted, provided that the above *
- * copyright notice and this permission notice appear in all copies. *
- * WE MAKE NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY OF THIS *
- * MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS", WITHOUT ANY EXPRESS *
- * OR IMPLIED WARRANTIES. *
- **************************************************************************/
- /**************************************************************************
- * *
- * File : ifdct_8x8.c *
- * Date : February 1993 *
- * Author : (c) Stefan Horbelt, horbelt@writeme.com *
- *--------------------------------------------------------------------------*
- * Inversion of the fast DCT program ffct.c of Thierry Turletti *
- * 1992 INRIA Sophia Antipolis, FRANCE *
- *--------------------------------------------------------------------------*
- * Description : Perform a fast inverse DCT on a 8x8 block. *
- * by Inverted Matrices *
- * The algorithm is refered to "A new Two-Dimensional Fast Cosine *
- * Transform Algorithm". IEEE Trans. on signal proc. vol 39 no. 2 *
- * (S.C. Chan & K.L. Ho). *
- * *
- **************************************************************************/
- #include "h261.h"
- #define COL_MAX 360
- #define U_CHAR(x) ( (x)<-0.5 ? 0 : ( (x)>254.5 ? 255 : (u_char) (x+.5) ) )
- #define UnSurRac2 0.70710678
- #define Rac2Sur8 0.1767767
- #define UnSur8 0.125
- #define icf1_0 0.5097955792
- #define icf1_1 0.8999762231
- #define icf1_2 -2.562915448
- #define icf1_3 -0.6013448869
- #define icf2_0 0.5411961001
- #define icf2_1 -1.306562965
- #define Rac2 1.4142135625
- #define TwoRac2 2.828427125
- static float tmp0_0, tmp0_1, tmp0_2, tmp0_3, tmp0_4, tmp0_5, tmp0_6, tmp0_7;
- static float tmp1_0, tmp1_1, tmp1_2, tmp1_3, tmp1_4, tmp1_5, tmp1_6, tmp1_7;
- static float tmp2_0, tmp2_1, tmp2_2, tmp2_3, tmp2_4, tmp2_5, tmp2_6, tmp2_7;
- static float tmpblk[8][8];
- float *tmpblk_ptr;
- ifdct_8x8(image_in, block_out, lig, col)
- int image_in[8][8];
- u_char block_out[][COL_MAX];
- int lig,col;
- {
- register int u,v;
- #ifdef DEBUG
- int j,i;
- fprintf(stderr,"nIFDCT:IMAGE_IN:n");
- for (j=0;j<8;j++,fprintf(stderr,"n"))
- for (i=0;i<8;fprintf(stderr,"%d, ",image_in[lig+j][col+i++]));
- #endif
- /*---------------------------------------------------------------*/
- image_in[0][0]=(image_in[0][0])<<3;
- for(u=0; u<8; u++){
- /* 29 add; 17.5 mul (sum) 1D-IDCT*/
- /* this nonoptimised part is let inside the listing to make
- the code mor transparent: *
- { register int *pt_tmpblk = &(image_in[u][0]);
- t0 = *pt_tmpblk++;
- t1 = *pt_tmpblk++;
- t2 = *pt_tmpblk++;
- t3 = *pt_tmpblk++;
- t4 = *pt_tmpblk++;
- t5 = *pt_tmpblk++;
- t6 = *pt_tmpblk++;
- t7 = *pt_tmpblk++;
- }
- tmp0_0 = t0;
- tmp0_1 = t1;
- tmp0_2 = t2;
- tmp0_3 = t1 + t3;
- tmp0_4 = t4;
- tmp0_5 = t3 +t5;
- tmp0_6 = t2 +t6;
- tmp0_7 = t1+ t3 +t5 +t7;
- */
- /* same algorithmen as obove only optimised*/
- /* 5 add; 0 mul*/
- { register int *pt_tmpblk = &(image_in[u][0]),t3;
- tmp0_0 = *pt_tmpblk++;
- tmp0_1 = *pt_tmpblk++;
- tmp0_2 = *pt_tmpblk++;
- t3 = *pt_tmpblk++;
- tmp0_3 = tmp0_1 +t3;
- tmp0_4 = *pt_tmpblk++;
- tmp0_5 = t3 + *pt_tmpblk++;
- tmp0_6 = tmp0_2 + *pt_tmpblk++;
- tmp0_7 = tmp0_1 + tmp0_5 + *pt_tmpblk++;
- }
- if(u==0){/* 8 add; 10 mul*/
- tmp1_0 = (tmp0_0 + tmp0_4);
- tmp1_1 = (tmp0_0 - tmp0_4);
- tmp1_4 = (tmp0_1*Rac2 + tmp0_5);
- tmp1_5 = (tmp0_1*Rac2 - tmp0_5);
- tmp1_2 = (tmp0_2*Rac2 + tmp0_6)*icf2_0;
- tmp1_3 = (tmp0_2*Rac2 - tmp0_6)*icf2_1;
- tmp1_6 = (tmp0_3*Rac2 + tmp0_7)*icf2_0;
- tmp1_7 = (tmp0_3*Rac2 - tmp0_7)*icf2_1;
- }else{/* 8 add; 14 mul*/
- tmp1_0 = UnSurRac2*(tmp0_0 + tmp0_4);
- tmp1_1 = UnSurRac2*(tmp0_0 - tmp0_4);
- tmp1_4 = UnSurRac2*(tmp0_1*Rac2 + tmp0_5);
- tmp1_5 = UnSurRac2*(tmp0_1*Rac2 - tmp0_5);
- tmp1_2 = UnSurRac2*(tmp0_2*Rac2 + tmp0_6)*icf2_0;
- tmp1_3 = UnSurRac2*(tmp0_2*Rac2 - tmp0_6)*icf2_1;
- tmp1_6 = UnSurRac2*(tmp0_3*Rac2 + tmp0_7)*icf2_0;
- tmp1_7 = UnSurRac2*(tmp0_3*Rac2 - tmp0_7)*icf2_1;
- }
- /* 8 add; 4 mul*/
- tmp2_0 = (tmp1_0 + tmp1_2 );
- tmp2_2 = (tmp1_0 - tmp1_2 );
- tmp2_1 = (tmp1_1 + tmp1_3 );
- tmp2_3 = (tmp1_1 - tmp1_3 );
- tmp2_4 = (tmp1_4 + tmp1_6 )*icf1_0;
- tmp2_6 = (tmp1_4 - tmp1_6 )*icf1_2;
- tmp2_5 = (tmp1_5 + tmp1_7 )*icf1_1;
- tmp2_7 = (tmp1_5 - tmp1_7 )*icf1_3;
- { register float *pt_tmpblk = &(tmpblk[u][0]);
- /* 8 add; 0 mul*/
- *pt_tmpblk++ = (tmp2_0 + tmp2_4 );
- *pt_tmpblk++ = (tmp2_3 - tmp2_7 );
- *pt_tmpblk++ = (tmp2_1 + tmp2_5 );
- *pt_tmpblk++ = (tmp2_2 - tmp2_6 );
- *pt_tmpblk++ = (tmp2_2 + tmp2_6 );
- *pt_tmpblk++ = (tmp2_1 - tmp2_5 );
- *pt_tmpblk++ = (tmp2_3 + tmp2_7 );
- *pt_tmpblk++ = (tmp2_0 - tmp2_4 );
- }
- }
- /*---------------------------------------------------------------*/
- for(v=0; v<8; v++){
- register int colv=col+v;
- tmp0_0 = tmpblk[0][v];
- tmp0_1 = tmpblk[1][v];
- tmp0_2 = tmpblk[2][v];
- tmp0_3 = tmp0_1+ tmpblk[3][v];
- tmp0_4 = tmpblk[4][v];
- tmp0_5 = tmpblk[5][v]+tmpblk[3][v];
- tmp0_6 = tmp0_2+tmpblk[6][v];
- tmp0_7 = tmp0_3+tmpblk[5][v]+tmpblk[7][v];
- tmp1_0 = 0.125*(tmp0_0 + tmp0_4 *Rac2);
- tmp1_1 = 0.125*(tmp0_0 - tmp0_4 *Rac2);
- tmp1_4 = Rac2Sur8*(tmp0_1*Rac2 + tmp0_5);
- tmp1_5 = Rac2Sur8*(tmp0_1*Rac2 - tmp0_5);
- tmp1_2 = Rac2Sur8*(tmp0_2*Rac2 + tmp0_6)*icf2_0;
- tmp1_3 = Rac2Sur8*(tmp0_2*Rac2 - tmp0_6)*icf2_1;
- tmp1_6 = Rac2Sur8*(tmp0_3*Rac2 + tmp0_7)*icf2_0;
- tmp1_7 = Rac2Sur8*(tmp0_3*Rac2 - tmp0_7)*icf2_1;
- tmp2_0 = (tmp1_0 + tmp1_2 );
- tmp2_2 = (tmp1_0 - tmp1_2 );
- tmp2_1 = (tmp1_1 + tmp1_3 );
- tmp2_3 = (tmp1_1 - tmp1_3 );
- tmp2_4 = (tmp1_4 + tmp1_6 )*icf1_0;
- tmp2_6 = (tmp1_4 - tmp1_6 )*icf1_2;
- tmp2_5 = (tmp1_5 + tmp1_7 )*icf1_1;
- tmp2_7 = (tmp1_5 - tmp1_7 )*icf1_3;
- { register u_char *pt_tmpblk = &(block_out[lig][colv]);
- *pt_tmpblk = U_CHAR(tmp2_0 + tmp2_4 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_3 - tmp2_7 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_1 + tmp2_5 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_2 - tmp2_6 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_2 + tmp2_6 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_1 - tmp2_5 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_3 + tmp2_7 );
- pt_tmpblk+=COL_MAX;
- *pt_tmpblk = U_CHAR(tmp2_0 - tmp2_4 );
- }
- }
- #ifdef DEBUG
- fprintf(stderr,"nIDFCT:n");
- for (j=0;j<8;j++,fprintf(stderr,"n"))
- for (i=0;i<8;fprintf(stderr,"%d, ",(int)block_out[lig+j][col+i++]));
- #endif
- }