idct.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "idct.h"
  2. #include <stdlib.h>
  3. /**********************************************************/
  4. /* inverse two dimensional DCT, Chen-Wang algorithm       */
  5. /* (cf. IEEE ASSP-32, pp. 803-816, Aug. 1984)             */
  6. /* 32-bit integer arithmetic (8 bit coefficients)         */
  7. /* 11 mults, 29 adds per DCT                              */
  8. /*                                      sE, 18.8.91       */
  9. /**********************************************************/
  10. /* coefficients extended to 12 bit for IEEE1180-1990      */
  11. /* compliance                           sE,  2.1.94       */
  12. /**********************************************************/
  13. /* this code assumes >> to be a two's-complement arithmetic */
  14. /* right shift: (-2)>>1 == -1 , (-3)>>1 == -2               */
  15. #define W1 2841 /* 2048*sqrt(2)*cos(1*pi/16) */
  16. #define W2 2676 /* 2048*sqrt(2)*cos(2*pi/16) */
  17. #define W3 2408 /* 2048*sqrt(2)*cos(3*pi/16) */
  18. #define W5 1609 /* 2048*sqrt(2)*cos(5*pi/16) */
  19. #define W6 1108 /* 2048*sqrt(2)*cos(6*pi/16) */
  20. #define W7 565  /* 2048*sqrt(2)*cos(7*pi/16) */
  21. /* row (horizontal) IDCT
  22.  *
  23.  *           7                       pi         1
  24.  * dst[k] = sum c[l] * src[l] * cos( -- * ( k + - ) * l )
  25.  *          l=0                      8          2
  26.  *
  27.  * where: c[0]    = 128
  28.  *        c[1..7] = 128*sqrt(2)
  29.  */
  30. int mpeg3video_idctrow(short *blk)
  31. {
  32. int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  33. /* shortcut */
  34. if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
  35.           (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
  36. {
  37.       blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
  38.       return 0;
  39. }
  40. x0 = (blk[0]<<11) + 128; /* for proper rounding in the fourth stage */
  41. /* first stage */
  42. x8 = W7*(x4+x5);
  43. x4 = x8 + (W1-W7)*x4;
  44. x5 = x8 - (W1+W7)*x5;
  45. x8 = W3*(x6+x7);
  46. x6 = x8 - (W3-W5)*x6;
  47. x7 = x8 - (W3+W5)*x7;
  48. /* second stage */
  49. x8 = x0 + x1;
  50. x0 -= x1;
  51. x1 = W6*(x3+x2);
  52. x2 = x1 - (W2+W6)*x2;
  53. x3 = x1 + (W2-W6)*x3;
  54. x1 = x4 + x6;
  55. x4 -= x6;
  56. x6 = x5 + x7;
  57. x5 -= x7;
  58. /* third stage */
  59. x7 = x8 + x3;
  60. x8 -= x3;
  61. x3 = x0 + x2;
  62. x0 -= x2;
  63. x2 = (181*(x4+x5)+128)>>8;
  64. x4 = (181*(x4-x5)+128)>>8;
  65. /* fourth stage */
  66. blk[0] = (x7+x1)>>8;
  67. blk[1] = (x3+x2)>>8;
  68. blk[2] = (x0+x4)>>8;
  69. blk[3] = (x8+x6)>>8;
  70. blk[4] = (x8-x6)>>8;
  71. blk[5] = (x0-x4)>>8;
  72. blk[6] = (x3-x2)>>8;
  73. blk[7] = (x7-x1)>>8;
  74. return 0;
  75. }
  76. /* column (vertical) IDCT
  77.  *
  78.  *             7                         pi         1
  79.  * dst[8*k] = sum c[l] * src[8*l] * cos( -- * ( k + - ) * l )
  80.  *            l=0                        8          2
  81.  *
  82.  * where: c[0]    = 1/1024
  83.  *        c[1..7] = (1/1024)*sqrt(2)
  84.  */
  85. int mpeg3video_idctcol(short *blk)
  86. {
  87.   int x0, x1, x2, x3, x4, x5, x6, x7, x8;
  88.   /* shortcut */
  89.   if (!((x1 = (blk[8 * 4]<<8)) | (x2 = blk[8 * 6]) | (x3 = blk[8 * 2]) |
  90.         (x4 = blk[8*1]) | (x5 = blk[8 * 7]) | (x6 = blk[8 * 5]) | (x7 = blk[8 * 3]))){
  91.     blk[8*0]=blk[8*1]=blk[8 * 2]=blk[8 * 3]=blk[8 * 4]=blk[8 * 5]=blk[8 * 6]=blk[8 * 7]=
  92.       (blk[8*0]+32)>>6;
  93.     return 0;
  94.   }
  95. x0 = (blk[8*0]<<8) + 8192;
  96. /* first stage */
  97. x8 = W7*(x4+x5) + 4;
  98. x4 = (x8+(W1-W7)*x4)>>3;
  99. x5 = (x8-(W1+W7)*x5)>>3;
  100. x8 = W3*(x6+x7) + 4;
  101. x6 = (x8-(W3-W5)*x6)>>3;
  102. x7 = (x8-(W3+W5)*x7)>>3;
  103. /* second stage */
  104. x8 = x0 + x1;
  105. x0 -= x1;
  106. x1 = W6*(x3+x2) + 4;
  107. x2 = (x1-(W2+W6)*x2)>>3;
  108. x3 = (x1+(W2-W6)*x3)>>3;
  109. x1 = x4 + x6;
  110. x4 -= x6;
  111. x6 = x5 + x7;
  112. x5 -= x7;
  113. /* third stage */
  114. x7 = x8 + x3;
  115. x8 -= x3;
  116. x3 = x0 + x2;
  117. x0 -= x2;
  118. x2 = (181 * (x4 + x5) + 128) >> 8;
  119. x4 = (181 * (x4 - x5) + 128) >> 8;
  120. /* fourth stage */
  121. blk[8 * 0] = (x7 + x1) >> 14;
  122. blk[8 * 1] = (x3 + x2) >> 14;
  123. blk[8 * 2] = (x0 + x4) >> 14;
  124. blk[8 * 3] = (x8 + x6) >> 14;
  125. blk[8 * 4] = (x8 - x6) >> 14;
  126. blk[8 * 5] = (x0 - x4) >> 14;
  127. blk[8 * 6] = (x3 - x2) >> 14;
  128. blk[8 * 7] = (x7 - x1) >> 14;
  129. return 0;
  130. }
  131. /* two dimensional inverse discrete cosine transform */
  132. void mpeg3video_idct_conversion(short* block)
  133. {
  134. int i;
  135. for(i = 0; i < 8; i++) mpeg3video_idctrow(block + 8 * i);
  136. for(i = 0; i < 8; i++) mpeg3video_idctcol(block + i);
  137. }