ifdct_8x8.c
上传用户:szuygs
上传日期:2009-09-28
资源大小:2k
文件大小:7k
源码类别:

GDI/图象编程

开发平台:

C/C++

  1. /**************************************************************************
  2. *          Copyright (c) 1993 Stefan Horbelt                               *
  3. *                                                                          *
  4. * Permission to use, copy, modify, and distribute this material for any    *
  5. * purpose and without fee is hereby granted, provided that the above       *
  6. * copyright notice and this permission notice appear in all copies.        *
  7. * WE MAKE NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY OF THIS     *
  8. * MATERIAL FOR ANY PURPOSE.  IT IS PROVIDED "AS IS", WITHOUT ANY EXPRESS   *
  9. * OR IMPLIED WARRANTIES.                                                   *
  10. **************************************************************************/
  11. /**************************************************************************
  12. *                      *
  13. *  File    : ifdct_8x8.c                               *
  14. *  Date    : February 1993              *
  15. *  Author  : (c) Stefan Horbelt, horbelt@writeme.com      *
  16. *--------------------------------------------------------------------------*
  17. *  Inversion of the fast DCT program ffct.c of Thierry Turletti            *
  18. *  1992 INRIA Sophia Antipolis, FRANCE                                     *
  19. *--------------------------------------------------------------------------*
  20. *  Description : Perform a fast inverse DCT on a 8x8 block.                *
  21. *    by Inverted Matrices                                                  *
  22. *    The algorithm is refered to "A new Two-Dimensional Fast Cosine        *
  23. *    Transform Algorithm". IEEE Trans. on signal proc. vol 39 no. 2        *
  24. *    (S.C. Chan & K.L. Ho).                                                *
  25. *                                                                          *
  26. **************************************************************************/
  27. #include "h261.h"
  28. #define COL_MAX 360
  29. #define U_CHAR(x) ( (x)<-0.5 ? 0 : ( (x)>254.5 ? 255 : (u_char) (x+.5) ) )
  30. #define UnSurRac2  0.70710678
  31. #define Rac2Sur8   0.1767767
  32. #define UnSur8     0.125
  33. #define icf1_0      0.5097955792
  34. #define icf1_1      0.8999762231
  35. #define icf1_2      -2.562915448
  36. #define icf1_3      -0.6013448869
  37. #define icf2_0      0.5411961001
  38. #define icf2_1      -1.306562965
  39. #define Rac2    1.4142135625
  40. #define TwoRac2    2.828427125
  41. static float tmp0_0, tmp0_1, tmp0_2, tmp0_3, tmp0_4, tmp0_5, tmp0_6, tmp0_7;
  42. static float tmp1_0, tmp1_1, tmp1_2, tmp1_3, tmp1_4, tmp1_5, tmp1_6, tmp1_7;
  43. static float tmp2_0, tmp2_1, tmp2_2, tmp2_3, tmp2_4, tmp2_5, tmp2_6, tmp2_7;
  44. static float tmpblk[8][8];
  45. float *tmpblk_ptr;
  46. ifdct_8x8(image_in, block_out, lig, col)
  47. int image_in[8][8];  
  48. u_char block_out[][COL_MAX]; 
  49. int lig,col;
  50. {
  51.     register int u,v;
  52. #ifdef DEBUG
  53.     int      j,i;
  54.     fprintf(stderr,"nIFDCT:IMAGE_IN:n");
  55.     for (j=0;j<8;j++,fprintf(stderr,"n"))
  56.       for (i=0;i<8;fprintf(stderr,"%d, ",image_in[lig+j][col+i++]));
  57. #endif
  58. /*---------------------------------------------------------------*/
  59. image_in[0][0]=(image_in[0][0])<<3;
  60.       for(u=0; u<8; u++){
  61. /* 29 add; 17.5 mul (sum) 1D-IDCT*/
  62. /* this nonoptimised part is let inside the listing to make
  63.    the code mor transparent: *
  64. { register int *pt_tmpblk = &(image_in[u][0]);
  65. t0 = *pt_tmpblk++;
  66. t1 = *pt_tmpblk++;
  67. t2 = *pt_tmpblk++;
  68. t3 = *pt_tmpblk++;
  69. t4 = *pt_tmpblk++;
  70. t5 = *pt_tmpblk++;
  71. t6 = *pt_tmpblk++;
  72. t7 = *pt_tmpblk++;
  73. }
  74. tmp0_0 = t0;
  75. tmp0_1 =       t1;
  76. tmp0_2 =             t2;
  77. tmp0_3 =       t1      +  t3;
  78. tmp0_4 =                       t4;
  79. tmp0_5 =                  t3       +t5;
  80. tmp0_6 =             t2                 +t6;
  81. tmp0_7 =       t1+        t3       +t5       +t7;
  82. */
  83. /* same algorithmen as obove only optimised*/
  84. /* 5 add; 0 mul*/
  85. { register int *pt_tmpblk = &(image_in[u][0]),t3;
  86. tmp0_0 = *pt_tmpblk++;
  87. tmp0_1 = *pt_tmpblk++;
  88. tmp0_2 = *pt_tmpblk++;
  89. t3 = *pt_tmpblk++;
  90. tmp0_3 = tmp0_1 +t3;
  91. tmp0_4 = *pt_tmpblk++;
  92. tmp0_5 = t3 + *pt_tmpblk++;
  93. tmp0_6 = tmp0_2 + *pt_tmpblk++;
  94. tmp0_7 = tmp0_1 + tmp0_5 + *pt_tmpblk++;
  95. }
  96. if(u==0){/* 8 add; 10 mul*/
  97. tmp1_0 = (tmp0_0 + tmp0_4);
  98. tmp1_1 = (tmp0_0 - tmp0_4);
  99. tmp1_4 = (tmp0_1*Rac2 + tmp0_5);
  100. tmp1_5 = (tmp0_1*Rac2 - tmp0_5);
  101. tmp1_2 = (tmp0_2*Rac2 + tmp0_6)*icf2_0;
  102. tmp1_3 = (tmp0_2*Rac2 - tmp0_6)*icf2_1;
  103. tmp1_6 = (tmp0_3*Rac2 + tmp0_7)*icf2_0;
  104. tmp1_7 = (tmp0_3*Rac2 - tmp0_7)*icf2_1;
  105. }else{/* 8 add; 14 mul*/
  106. tmp1_0 = UnSurRac2*(tmp0_0 + tmp0_4);
  107. tmp1_1 = UnSurRac2*(tmp0_0 - tmp0_4);
  108. tmp1_4 = UnSurRac2*(tmp0_1*Rac2 + tmp0_5);
  109. tmp1_5 = UnSurRac2*(tmp0_1*Rac2 - tmp0_5);
  110. tmp1_2 = UnSurRac2*(tmp0_2*Rac2 + tmp0_6)*icf2_0;
  111. tmp1_3 = UnSurRac2*(tmp0_2*Rac2 - tmp0_6)*icf2_1;
  112. tmp1_6 = UnSurRac2*(tmp0_3*Rac2 + tmp0_7)*icf2_0;
  113. tmp1_7 = UnSurRac2*(tmp0_3*Rac2 - tmp0_7)*icf2_1;
  114. }
  115. /* 8 add; 4 mul*/
  116. tmp2_0 = (tmp1_0 + tmp1_2 );
  117. tmp2_2 = (tmp1_0 - tmp1_2 );
  118. tmp2_1 = (tmp1_1 + tmp1_3 );
  119. tmp2_3 = (tmp1_1 - tmp1_3 );
  120. tmp2_4 = (tmp1_4 + tmp1_6 )*icf1_0;
  121. tmp2_6 = (tmp1_4 - tmp1_6 )*icf1_2;
  122. tmp2_5 = (tmp1_5 + tmp1_7 )*icf1_1;
  123. tmp2_7 = (tmp1_5 - tmp1_7 )*icf1_3;
  124. { register float *pt_tmpblk = &(tmpblk[u][0]);
  125. /* 8 add; 0 mul*/
  126. *pt_tmpblk++ = (tmp2_0 + tmp2_4 );
  127. *pt_tmpblk++ = (tmp2_3 - tmp2_7 );
  128. *pt_tmpblk++ = (tmp2_1 + tmp2_5 );
  129. *pt_tmpblk++ = (tmp2_2 - tmp2_6 );
  130. *pt_tmpblk++ = (tmp2_2 + tmp2_6 );
  131. *pt_tmpblk++ = (tmp2_1 - tmp2_5 );
  132. *pt_tmpblk++ = (tmp2_3 + tmp2_7 );
  133. *pt_tmpblk++ = (tmp2_0 - tmp2_4 );
  134. }
  135.       }
  136. /*---------------------------------------------------------------*/
  137. for(v=0; v<8; v++){
  138.         register int colv=col+v;
  139. tmp0_0 =  tmpblk[0][v];
  140. tmp0_1 =  tmpblk[1][v];
  141. tmp0_2 =  tmpblk[2][v];
  142. tmp0_3 =  tmp0_1+ tmpblk[3][v];
  143. tmp0_4 =  tmpblk[4][v];
  144. tmp0_5 =  tmpblk[5][v]+tmpblk[3][v];
  145. tmp0_6 =  tmp0_2+tmpblk[6][v];
  146. tmp0_7 =  tmp0_3+tmpblk[5][v]+tmpblk[7][v];
  147. tmp1_0 = 0.125*(tmp0_0 + tmp0_4 *Rac2);
  148. tmp1_1 = 0.125*(tmp0_0 - tmp0_4 *Rac2);
  149. tmp1_4 = Rac2Sur8*(tmp0_1*Rac2 + tmp0_5);
  150. tmp1_5 = Rac2Sur8*(tmp0_1*Rac2 - tmp0_5);
  151. tmp1_2 = Rac2Sur8*(tmp0_2*Rac2 + tmp0_6)*icf2_0;
  152. tmp1_3 = Rac2Sur8*(tmp0_2*Rac2 - tmp0_6)*icf2_1;
  153. tmp1_6 = Rac2Sur8*(tmp0_3*Rac2 + tmp0_7)*icf2_0;
  154. tmp1_7 = Rac2Sur8*(tmp0_3*Rac2 - tmp0_7)*icf2_1;
  155. tmp2_0 = (tmp1_0 + tmp1_2 );
  156. tmp2_2 = (tmp1_0 - tmp1_2 );
  157. tmp2_1 = (tmp1_1 + tmp1_3 );
  158. tmp2_3 = (tmp1_1 - tmp1_3 );
  159. tmp2_4 = (tmp1_4 + tmp1_6 )*icf1_0;
  160. tmp2_6 = (tmp1_4 - tmp1_6 )*icf1_2;
  161. tmp2_5 = (tmp1_5 + tmp1_7 )*icf1_1;
  162. tmp2_7 = (tmp1_5 - tmp1_7 )*icf1_3;
  163. { register u_char *pt_tmpblk = &(block_out[lig][colv]);
  164. *pt_tmpblk = U_CHAR(tmp2_0 + tmp2_4 );
  165. pt_tmpblk+=COL_MAX;
  166. *pt_tmpblk = U_CHAR(tmp2_3 - tmp2_7 );
  167. pt_tmpblk+=COL_MAX;
  168. *pt_tmpblk = U_CHAR(tmp2_1 + tmp2_5 );
  169. pt_tmpblk+=COL_MAX;
  170. *pt_tmpblk = U_CHAR(tmp2_2 - tmp2_6 );
  171. pt_tmpblk+=COL_MAX;
  172. *pt_tmpblk = U_CHAR(tmp2_2 + tmp2_6 );
  173. pt_tmpblk+=COL_MAX;
  174. *pt_tmpblk = U_CHAR(tmp2_1 - tmp2_5 );
  175. pt_tmpblk+=COL_MAX;
  176. *pt_tmpblk = U_CHAR(tmp2_3 + tmp2_7 );
  177. pt_tmpblk+=COL_MAX;
  178. *pt_tmpblk = U_CHAR(tmp2_0 - tmp2_4 );
  179. }
  180.     }
  181. #ifdef DEBUG
  182. fprintf(stderr,"nIDFCT:n"); 
  183. for (j=0;j<8;j++,fprintf(stderr,"n"))
  184.   for (i=0;i<8;fprintf(stderr,"%d, ",(int)block_out[lig+j][col+i++]));    
  185. #endif
  186.   }