免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2336 | 回复: 5
打印 上一主题 下一主题

xvid中包含自身的解析代码 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-31 09:50 |只看该作者 |倒序浏览
这是gvim给出的关于xvid中#include __FILE__的用法,但是看的时候由于这种做法不太容易理解,现把经过宏展开后的代码贴出来,以供学习。
XVID中给出的源代码,有一点删减但是不影响对这个技术的理解

注以下的代码是在一个文件中,是一个.c的文件,不是.h的文件

  1. #ifndef XVID_AUTO_INCLUDE


  2. /* Quarterpel FIR definition
  3. ****************************************************************************/

  4. static const int32_t FIR_Tab_8[9][8] = {
  5.         { 14, -3,  2, -1,  0,  0,  0,  0 },
  6.         { 23, 19, -6,  3, -1,  0,  0,  0 },
  7.         { -7, 20, 20, -6,  3, -1,  0,  0 },
  8.         {  3, -6, 20, 20, -6,  3, -1,  0 },
  9.         { -1,  3, -6, 20, 20, -6,  3, -1 },
  10.         {  0, -1,  3, -6, 20, 20, -6,  3 },
  11.         {  0,  0, -1,  3, -6, 20, 20, -7 },
  12.         {  0,  0,  0, -1,  3, -6, 19, 23 },
  13.         {  0,  0,  0,  0, -1,  2, -3, 14 }
  14. };

  15. static const int32_t FIR_Tab_16[17][16] = {
  16.         { 14, -3,  2, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  17.         { 23, 19, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  18.         { -7, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  19.         {  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  20.         { -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0 },
  21.         {  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0 },
  22.         {  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0 },
  23.         {  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0 },
  24.         {  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0 },
  25.         {  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0 },
  26.         {  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0 },
  27.         {  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0 },
  28.         {  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1 },
  29.         {  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3 },
  30.         {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -7 },
  31.         {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 19, 23 },
  32.         {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  2, -3, 14 }
  33. };

  34. /* Implementation
  35. ****************************************************************************/

  36. #define XVID_AUTO_INCLUDE

  37. /* 16x? filters */

  38. #define SIZE  16
  39. #define TABLE FIR_Tab_16

  40. #define STORE(d,s)  (d) = (s)
  41. #define FUNC_H      H_Pass_16_C
  42. #define FUNC_V      V_Pass_16_C
  43. #define FUNC_HA     H_Pass_Avrg_16_C
  44. #define FUNC_VA     V_Pass_Avrg_16_C
  45. #define FUNC_HA_UP  H_Pass_Avrg_Up_16_C
  46. #define FUNC_VA_UP  V_Pass_Avrg_Up_16_C

  47. #include __FILE__   /* self-include ourself */

  48. /* note: B-frame always uses Rnd=0... */
  49. #define STORE(d,s)  (d) = ( (s)+(d)+1 ) >> 1
  50. #define FUNC_H      H_Pass_16_Add_C
  51. #define FUNC_V      V_Pass_16_Add_C
  52. #define FUNC_HA     H_Pass_Avrg_16_Add_C
  53. #define FUNC_VA     V_Pass_Avrg_16_Add_C
  54. #define FUNC_HA_UP  H_Pass_Avrg_Up_16_Add_C
  55. #define FUNC_VA_UP  V_Pass_Avrg_Up_16_Add_C

  56. #include __FILE__   /* self-include ourself */

  57. #undef SIZE
  58. #undef TABLE

  59. /* 8x? filters */

  60. #define SIZE  8
  61. #define TABLE FIR_Tab_8

  62. #define STORE(d,s)  (d) = (s)
  63. #define FUNC_H      H_Pass_8_C
  64. #define FUNC_V      V_Pass_8_C
  65. #define FUNC_HA     H_Pass_Avrg_8_C
  66. #define FUNC_VA     V_Pass_Avrg_8_C
  67. #define FUNC_HA_UP  H_Pass_Avrg_Up_8_C
  68. #define FUNC_VA_UP  V_Pass_Avrg_Up_8_C

  69. #include __FILE__   /* self-include ourself */

  70. /* note: B-frame always uses Rnd=0... */
  71. #define STORE(d,s)  (d) = ( (s)+(d)+1 ) >> 1
  72. #define FUNC_H      H_Pass_8_Add_C
  73. #define FUNC_V      V_Pass_8_Add_C
  74. #define FUNC_HA     H_Pass_Avrg_8_Add_C
  75. #define FUNC_VA     V_Pass_Avrg_8_Add_C
  76. #define FUNC_HA_UP  H_Pass_Avrg_Up_8_Add_C
  77. #define FUNC_VA_UP  V_Pass_Avrg_Up_8_Add_C

  78. #include __FILE__   /* self-include ourself */

  79. #undef SIZE
  80. #undef TABLE

  81. #undef XVID_AUTO_INCLUDE


  82. #endif /* !XVID_AUTO_INCLUDE */

  83. /*****************************************************************************
  84. * "reference" filters impl. in plain C
  85. ****************************************************************************/

  86. #ifdef XVID_AUTO_INCLUDE

  87. static
  88. void FUNC_H(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  89. {
  90.         while(H-->0) {
  91.                 int32_t i, k;
  92.                 int32_t Sums[SIZE] = { 0 };
  93.                 for(i=0; i<=SIZE; ++i)
  94.                         for(k=0; k<SIZE; ++k)
  95.                                 Sums[k] += TABLE[i][k] * Src[i];

  96.                 for(i=0; i<SIZE; ++i) {
  97.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  98.                         if (C<0) C = 0; else if (C>255) C = 255;
  99.                         STORE(Dst[i], C);
  100.                 }
  101.                 Src += BpS;
  102.                 Dst += BpS;
  103.         }
  104. }

  105. static
  106. void FUNC_V(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  107. {
  108.         while(W-->0) {
  109.                 int32_t i, k;
  110.                 int32_t Sums[SIZE] = { 0 };
  111.                 const uint8_t *S = Src++;
  112.                 uint8_t *D = Dst++;
  113.                 for(i=0; i<=SIZE; ++i) {
  114.                         for(k=0; k<SIZE; ++k)
  115.                                 Sums[k] += TABLE[i][k] * S[0];
  116.                         S += BpS;
  117.                 }

  118.                 for(i=0; i<SIZE; ++i) {
  119.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  120.                         if (C<0) C = 0; else if (C>255) C = 255;
  121.                         STORE(D[0], C);
  122.                         D += BpS;
  123.                 }
  124.         }
  125. }

  126. static
  127. void FUNC_HA(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  128. {
  129.         while(H-->0) {
  130.                 int32_t i, k;
  131.                 int32_t Sums[SIZE] = { 0 };
  132.                 for(i=0; i<=SIZE; ++i)
  133.                         for(k=0; k<SIZE; ++k)
  134.                                 Sums[k] += TABLE[i][k] * Src[i];

  135.                 for(i=0; i<SIZE; ++i) {
  136.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  137.                         if (C<0) C = 0; else if (C>255) C = 255;
  138.                         C = (C+Src[i]+1-Rnd) >> 1;
  139.                         STORE(Dst[i], C);
  140.                 }
  141.                 Src += BpS;
  142.                 Dst += BpS;
  143.         }
  144. }

  145. static
  146. void FUNC_HA_UP(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  147. {
  148.         while(H-->0) {
  149.                 int32_t i, k;
  150.                 int32_t Sums[SIZE] = { 0 };
  151.                 for(i=0; i<=SIZE; ++i)
  152.                         for(k=0; k<SIZE; ++k)
  153.                                 Sums[k] += TABLE[i][k] * Src[i];

  154.                 for(i=0; i<SIZE; ++i) {
  155.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  156.                         if (C<0) C = 0; else if (C>255) C = 255;
  157.                         C = (C+Src[i+1]+1-Rnd) >> 1;
  158.                         STORE(Dst[i], C);
  159.                 }
  160.                 Src += BpS;
  161.                 Dst += BpS;
  162.         }
  163. }

  164. static
  165. void FUNC_VA(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  166. {
  167.         while(W-->0) {
  168.                 int32_t i, k;
  169.                 int32_t Sums[SIZE] = { 0 };
  170.                 const uint8_t *S = Src;
  171.                 uint8_t *D = Dst;

  172.                 for(i=0; i<=SIZE; ++i) {
  173.                         for(k=0; k<SIZE; ++k)
  174.                                 Sums[k] += TABLE[i][k] * S[0];
  175.                         S += BpS;
  176.                 }

  177.                 S = Src;
  178.                 for(i=0; i<SIZE; ++i) {
  179.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  180.                         if (C<0) C = 0; else if (C>255) C = 255;
  181.                         C = ( C+S[0]+1-Rnd ) >> 1;
  182.                         STORE(D[0], C);
  183.                         D += BpS;
  184.                         S += BpS;
  185.                 }
  186.                 Src++;
  187.                 Dst++;
  188.         }
  189. }

  190. static
  191. void FUNC_VA_UP(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  192. {
  193.         while(W-->0) {
  194.                 int32_t i, k;
  195.                 int32_t Sums[SIZE] = { 0 };
  196.                 const uint8_t *S = Src;
  197.                 uint8_t *D = Dst;

  198.                 for(i=0; i<=SIZE; ++i) {
  199.                         for(k=0; k<SIZE; ++k)
  200.                                 Sums[k] += TABLE[i][k] * S[0];
  201.                         S += BpS;
  202.                 }

  203.                 S = Src + BpS;
  204.                 for(i=0; i<SIZE; ++i) {
  205.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  206.                         if (C<0) C = 0; else if (C>255) C = 255;
  207.                         C = ( C+S[0]+1-Rnd ) >> 1;
  208.                         STORE(D[0], C);
  209.                         D += BpS;
  210.                         S += BpS;
  211.                 }
  212.                 Dst++;
  213.                 Src++;
  214.         }
  215. }

  216. #undef STORE
  217. #undef FUNC_H
  218. #undef FUNC_V
  219. #undef FUNC_HA
  220. #undef FUNC_VA
  221. #undef FUNC_HA_UP
  222. #undef FUNC_VA_UP

  223. #endif /* XVID_AUTO_INCLUDE */

复制代码

[ 本帖最后由 hawk2012 于 2007-1-31 09:59 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-01-31 09:55 |只看该作者
这是上面的xvid代码,经过宏展开后的代码,一目了然,他的目的。


  1. #line 1 "c:\\program files\\microsoft visual studio\\myprojects\\testadvancedmacro\\selfinclude.cpp"

  2. static const int32_t FIR_Tab_8[9][8] = {
  3.         { 14, -3,  2, -1,  0,  0,  0,  0 },
  4.         { 23, 19, -6,  3, -1,  0,  0,  0 },
  5.         { -7, 20, 20, -6,  3, -1,  0,  0 },
  6.         {  3, -6, 20, 20, -6,  3, -1,  0 },
  7.         { -1,  3, -6, 20, 20, -6,  3, -1 },
  8.         {  0, -1,  3, -6, 20, 20, -6,  3 },
  9.         {  0,  0, -1,  3, -6, 20, 20, -7 },
  10.         {  0,  0,  0, -1,  3, -6, 19, 23 },
  11.         {  0,  0,  0,  0, -1,  2, -3, 14 }
  12. };

  13. static const int32_t FIR_Tab_16[17][16] = {
  14.         { 14, -3,  2, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  15.         { 23, 19, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  16.         { -7, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  17.         {  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
  18.         { -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0,  0 },
  19.         {  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0,  0 },
  20.         {  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0,  0 },
  21.         {  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0,  0 },
  22.         {  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0,  0 },
  23.         {  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0,  0 },
  24.         {  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0,  0 },
  25.         {  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1,  0 },
  26.         {  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3, -1 },
  27.         {  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -6,  3 },
  28.         {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 20, 20, -7 },
  29.         {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  3, -6, 19, 23 },
  30.         {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, -1,  2, -3, 14 }
  31. };




  32. #line 1 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"


  33. static
  34. void H_Pass_16_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  35. {
  36.         while(H-->0) {
  37.                 int32_t i, k;
  38.                 int32_t Sums[16] = { 0 };
  39.                 for(i=0; i<=16; ++i)
  40.                         for(k=0; k<16; ++k)
  41.                                 Sums[k] += FIR_Tab_16[i][k] * Src[i];

  42.                 for(i=0; i<16; ++i) {
  43.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  44.                         if (C<0) C = 0; else if (C>255) C = 255;
  45.                         (Dst[i]) = (C);
  46.                 }
  47.                 Src += BpS;
  48.                 Dst += BpS;
  49.         }
  50. }

  51. static
  52. void V_Pass_16_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  53. {
  54.         while(W-->0) {
  55.                 int32_t i, k;
  56.                 int32_t Sums[16] = { 0 };
  57.                 const uint8_t *S = Src++;
  58.                 uint8_t *D = Dst++;
  59.                 for(i=0; i<=16; ++i) {
  60.                         for(k=0; k<16; ++k)
  61.                                 Sums[k] += FIR_Tab_16[i][k] * S[0];
  62.                         S += BpS;
  63.                 }

  64.                 for(i=0; i<16; ++i) {
  65.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  66.                         if (C<0) C = 0; else if (C>255) C = 255;
  67.                         (D[0]) = (C);
  68.                         D += BpS;
  69.                 }
  70.         }
  71. }

  72. static
  73. void H_Pass_Avrg_16_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  74. {
  75.         while(H-->0) {
  76.                 int32_t i, k;
  77.                 int32_t Sums[16] = { 0 };
  78.                 for(i=0; i<=16; ++i)
  79.                         for(k=0; k<16; ++k)
  80.                                 Sums[k] += FIR_Tab_16[i][k] * Src[i];

  81.                 for(i=0; i<16; ++i) {
  82.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  83.                         if (C<0) C = 0; else if (C>255) C = 255;
  84.                         C = (C+Src[i]+1-Rnd) >> 1;
  85.                         (Dst[i]) = (C);
  86.                 }
  87.                 Src += BpS;
  88.                 Dst += BpS;
  89.         }
  90. }

  91. static
  92. void H_Pass_Avrg_Up_16_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  93. {
  94.         while(H-->0) {
  95.                 int32_t i, k;
  96.                 int32_t Sums[16] = { 0 };
  97.                 for(i=0; i<=16; ++i)
  98.                         for(k=0; k<16; ++k)
  99.                                 Sums[k] += FIR_Tab_16[i][k] * Src[i];

  100.                 for(i=0; i<16; ++i) {
  101.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  102.                         if (C<0) C = 0; else if (C>255) C = 255;
  103.                         C = (C+Src[i+1]+1-Rnd) >> 1;
  104.                         (Dst[i]) = (C);
  105.                 }
  106.                 Src += BpS;
  107.                 Dst += BpS;
  108.         }
  109. }

  110. static
  111. void V_Pass_Avrg_16_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  112. {
  113.         while(W-->0) {
  114.                 int32_t i, k;
  115.                 int32_t Sums[16] = { 0 };
  116.                 const uint8_t *S = Src;
  117.                 uint8_t *D = Dst;

  118.                 for(i=0; i<=16; ++i) {
  119.                         for(k=0; k<16; ++k)
  120.                                 Sums[k] += FIR_Tab_16[i][k] * S[0];
  121.                         S += BpS;
  122.                 }

  123.                 S = Src;
  124.                 for(i=0; i<16; ++i) {
  125.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  126.                         if (C<0) C = 0; else if (C>255) C = 255;
  127.                         C = ( C+S[0]+1-Rnd ) >> 1;
  128.                         (D[0]) = (C);
  129.                         D += BpS;
  130.                         S += BpS;
  131.                 }
  132.                 Src++;
  133.                 Dst++;
  134.         }
  135. }

  136. static
  137. void V_Pass_Avrg_Up_16_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  138. {
  139.         while(W-->0) {
  140.                 int32_t i, k;
  141.                 int32_t Sums[16] = { 0 };
  142.                 const uint8_t *S = Src;
  143.                 uint8_t *D = Dst;

  144.                 for(i=0; i<=16; ++i) {
  145.                         for(k=0; k<16; ++k)
  146.                                 Sums[k] += FIR_Tab_16[i][k] * S[0];
  147.                         S += BpS;
  148.                 }

  149.                 S = Src + BpS;
  150.                 for(i=0; i<16; ++i) {
  151.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  152.                         if (C<0) C = 0; else if (C>255) C = 255;
  153.                         C = ( C+S[0]+1-Rnd ) >> 1;
  154.                         (D[0]) = (C);
  155.                         D += BpS;
  156.                         S += BpS;
  157.                 }
  158.                 Dst++;
  159.                 Src++;
  160.         }
  161. }



  162. #line 265 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"
  163. #line 58 "c:\\program files\\microsoft visual studio\\myprojects\\testadvancedmacro\\selfinclude.cpp"



  164. #line 1 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"

  165. static
  166. void H_Pass_16_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  167. {
  168.         while(H-->0) {
  169.                 int32_t i, k;
  170.                 int32_t Sums[16] = { 0 };
  171.                 for(i=0; i<=16; ++i)
  172.                         for(k=0; k<16; ++k)
  173.                                 Sums[k] += FIR_Tab_16[i][k] * Src[i];

  174.                 for(i=0; i<16; ++i) {
  175.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  176.                         if (C<0) C = 0; else if (C>255) C = 255;
  177.                         (Dst[i]) = ( (C)+(Dst[i])+1 ) >> 1;
  178.                 }
  179.                 Src += BpS;
  180.                 Dst += BpS;
  181.         }
  182. }

  183. static
  184. void V_Pass_16_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  185. {
  186.         while(W-->0) {
  187.                 int32_t i, k;
  188.                 int32_t Sums[16] = { 0 };
  189.                 const uint8_t *S = Src++;
  190.                 uint8_t *D = Dst++;
  191.                 for(i=0; i<=16; ++i) {
  192.                         for(k=0; k<16; ++k)
  193.                                 Sums[k] += FIR_Tab_16[i][k] * S[0];
  194.                         S += BpS;
  195.                 }

  196.                 for(i=0; i<16; ++i) {
  197.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  198.                         if (C<0) C = 0; else if (C>255) C = 255;
  199.                         (D[0]) = ( (C)+(D[0])+1 ) >> 1;
  200.                         D += BpS;
  201.                 }
  202.         }
  203. }

  204. static
  205. void H_Pass_Avrg_16_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  206. {
  207.         while(H-->0) {
  208.                 int32_t i, k;
  209.                 int32_t Sums[16] = { 0 };
  210.                 for(i=0; i<=16; ++i)
  211.                         for(k=0; k<16; ++k)
  212.                                 Sums[k] += FIR_Tab_16[i][k] * Src[i];

  213.                 for(i=0; i<16; ++i) {
  214.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  215.                         if (C<0) C = 0; else if (C>255) C = 255;
  216.                         C = (C+Src[i]+1-Rnd) >> 1;
  217.                         (Dst[i]) = ( (C)+(Dst[i])+1 ) >> 1;
  218.                 }
  219.                 Src += BpS;
  220.                 Dst += BpS;
  221.         }
  222. }

  223. static
  224. void H_Pass_Avrg_Up_16_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  225. {
  226.         while(H-->0) {
  227.                 int32_t i, k;
  228.                 int32_t Sums[16] = { 0 };
  229.                 for(i=0; i<=16; ++i)
  230.                         for(k=0; k<16; ++k)
  231.                                 Sums[k] += FIR_Tab_16[i][k] * Src[i];

  232.                 for(i=0; i<16; ++i) {
  233.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  234.                         if (C<0) C = 0; else if (C>255) C = 255;
  235.                         C = (C+Src[i+1]+1-Rnd) >> 1;
  236.                         (Dst[i]) = ( (C)+(Dst[i])+1 ) >> 1;
  237.                 }
  238.                 Src += BpS;
  239.                 Dst += BpS;
  240.         }
  241. }

  242. static
  243. void V_Pass_Avrg_16_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  244. {
  245.         while(W-->0) {
  246.                 int32_t i, k;
  247.                 int32_t Sums[16] = { 0 };
  248.                 const uint8_t *S = Src;
  249.                 uint8_t *D = Dst;

  250.                 for(i=0; i<=16; ++i) {
  251.                         for(k=0; k<16; ++k)
  252.                                 Sums[k] += FIR_Tab_16[i][k] * S[0];
  253.                         S += BpS;
  254.                 }

  255.                 S = Src;
  256.                 for(i=0; i<16; ++i) {
  257.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  258.                         if (C<0) C = 0; else if (C>255) C = 255;
  259.                         C = ( C+S[0]+1-Rnd ) >> 1;
  260.                         (D[0]) = ( (C)+(D[0])+1 ) >> 1;
  261.                         D += BpS;
  262.                         S += BpS;
  263.                 }
  264.                 Src++;
  265.                 Dst++;
  266.         }
  267. }

  268. static
  269. void V_Pass_Avrg_Up_16_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  270. {
  271.         while(W-->0) {
  272.                 int32_t i, k;
  273.                 int32_t Sums[16] = { 0 };
  274.                 const uint8_t *S = Src;
  275.                 uint8_t *D = Dst;

  276.                 for(i=0; i<=16; ++i) {
  277.                         for(k=0; k<16; ++k)
  278.                                 Sums[k] += FIR_Tab_16[i][k] * S[0];
  279.                         S += BpS;
  280.                 }

  281.                 S = Src + BpS;
  282.                 for(i=0; i<16; ++i) {
  283.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  284.                         if (C<0) C = 0; else if (C>255) C = 255;
  285.                         C = ( C+S[0]+1-Rnd ) >> 1;
  286.                         (D[0]) = ( (C)+(D[0])+1 ) >> 1;
  287.                         D += BpS;
  288.                         S += BpS;
  289.                 }
  290.                 Dst++;
  291.                 Src++;
  292.         }
  293. }

  294. #line 265 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"
  295. #line 69 "c:\\program files\\microsoft visual studio\\myprojects\\testadvancedmacro\\selfinclude.cpp"




  296. #line 1 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"

  297. static
  298. void H_Pass_8_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  299. {
  300.         while(H-->0) {
  301.                 int32_t i, k;
  302.                 int32_t Sums[8] = { 0 };
  303.                 for(i=0; i<=8; ++i)
  304.                         for(k=0; k<8; ++k)
  305.                                 Sums[k] += FIR_Tab_8[i][k] * Src[i];

  306.                 for(i=0; i<8; ++i) {
  307.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  308.                         if (C<0) C = 0; else if (C>255) C = 255;
  309.                         (Dst[i]) = (C);
  310.                 }
  311.                 Src += BpS;
  312.                 Dst += BpS;
  313.         }
  314. }

  315. static
  316. void V_Pass_8_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  317. {
  318.         while(W-->0) {
  319.                 int32_t i, k;
  320.                 int32_t Sums[8] = { 0 };
  321.                 const uint8_t *S = Src++;
  322.                 uint8_t *D = Dst++;
  323.                 for(i=0; i<=8; ++i) {
  324.                         for(k=0; k<8; ++k)
  325.                                 Sums[k] += FIR_Tab_8[i][k] * S[0];
  326.                         S += BpS;
  327.                 }

  328.                 for(i=0; i<8; ++i) {
  329.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  330.                         if (C<0) C = 0; else if (C>255) C = 255;
  331.                         (D[0]) = (C);
  332.                         D += BpS;
  333.                 }
  334.         }
  335. }

  336. static
  337. void H_Pass_Avrg_8_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  338. {
  339.         while(H-->0) {
  340.                 int32_t i, k;
  341.                 int32_t Sums[8] = { 0 };
  342.                 for(i=0; i<=8; ++i)
  343.                         for(k=0; k<8; ++k)
  344.                                 Sums[k] += FIR_Tab_8[i][k] * Src[i];

  345.                 for(i=0; i<8; ++i) {
  346.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  347.                         if (C<0) C = 0; else if (C>255) C = 255;
  348.                         C = (C+Src[i]+1-Rnd) >> 1;
  349.                         (Dst[i]) = (C);
  350.                 }
  351.                 Src += BpS;
  352.                 Dst += BpS;
  353.         }
  354. }

  355. static
  356. void H_Pass_Avrg_Up_8_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  357. {
  358.         while(H-->0) {
  359.                 int32_t i, k;
  360.                 int32_t Sums[8] = { 0 };
  361.                 for(i=0; i<=8; ++i)
  362.                         for(k=0; k<8; ++k)
  363.                                 Sums[k] += FIR_Tab_8[i][k] * Src[i];

  364.                 for(i=0; i<8; ++i) {
  365.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  366.                         if (C<0) C = 0; else if (C>255) C = 255;
  367.                         C = (C+Src[i+1]+1-Rnd) >> 1;
  368.                         (Dst[i]) = (C);
  369.                 }
  370.                 Src += BpS;
  371.                 Dst += BpS;
  372.         }
  373. }

  374. static
  375. void V_Pass_Avrg_8_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  376. {
  377.         while(W-->0) {
  378.                 int32_t i, k;
  379.                 int32_t Sums[8] = { 0 };
  380.                 const uint8_t *S = Src;
  381.                 uint8_t *D = Dst;

  382.                 for(i=0; i<=8; ++i) {
  383.                         for(k=0; k<8; ++k)
  384.                                 Sums[k] += FIR_Tab_8[i][k] * S[0];
  385.                         S += BpS;
  386.                 }

  387.                 S = Src;
  388.                 for(i=0; i<8; ++i) {
  389.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  390.                         if (C<0) C = 0; else if (C>255) C = 255;
  391.                         C = ( C+S[0]+1-Rnd ) >> 1;
  392.                         (D[0]) = (C);
  393.                         D += BpS;
  394.                         S += BpS;
  395.                 }
  396.                 Src++;
  397.                 Dst++;
  398.         }
  399. }

  400. static
  401. void V_Pass_Avrg_Up_8_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  402. {
  403.         while(W-->0) {
  404.                 int32_t i, k;
  405.                 int32_t Sums[8] = { 0 };
  406.                 const uint8_t *S = Src;
  407.                 uint8_t *D = Dst;

  408.                 for(i=0; i<=8; ++i) {
  409.                         for(k=0; k<8; ++k)
  410.                                 Sums[k] += FIR_Tab_8[i][k] * S[0];
  411.                         S += BpS;
  412.                 }

  413.                 S = Src + BpS;
  414.                 for(i=0; i<8; ++i) {
  415.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  416.                         if (C<0) C = 0; else if (C>255) C = 255;
  417.                         C = ( C+S[0]+1-Rnd ) >> 1;
  418.                         (D[0]) = (C);
  419.                         D += BpS;
  420.                         S += BpS;
  421.                 }
  422.                 Dst++;
  423.                 Src++;
  424.         }
  425. }

  426. #line 265 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"
  427. #line 87 "c:\\program files\\microsoft visual studio\\myprojects\\testadvancedmacro\\selfinclude.cpp"


  428. #line 1 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"



  429. static
  430. void H_Pass_8_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  431. {
  432.         while(H-->0) {
  433.                 int32_t i, k;
  434.                 int32_t Sums[8] = { 0 };
  435.                 for(i=0; i<=8; ++i)
  436.                         for(k=0; k<8; ++k)
  437.                                 Sums[k] += FIR_Tab_8[i][k] * Src[i];

  438.                 for(i=0; i<8; ++i) {
  439.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  440.                         if (C<0) C = 0; else if (C>255) C = 255;
  441.                         (Dst[i]) = ( (C)+(Dst[i])+1 ) >> 1;
  442.                 }
  443.                 Src += BpS;
  444.                 Dst += BpS;
  445.         }
  446. }

  447. static
  448. void V_Pass_8_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  449. {
  450.         while(W-->0) {
  451.                 int32_t i, k;
  452.                 int32_t Sums[8] = { 0 };
  453.                 const uint8_t *S = Src++;
  454.                 uint8_t *D = Dst++;
  455.                 for(i=0; i<=8; ++i) {
  456.                         for(k=0; k<8; ++k)
  457.                                 Sums[k] += FIR_Tab_8[i][k] * S[0];
  458.                         S += BpS;
  459.                 }

  460.                 for(i=0; i<8; ++i) {
  461.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  462.                         if (C<0) C = 0; else if (C>255) C = 255;
  463.                         (D[0]) = ( (C)+(D[0])+1 ) >> 1;
  464.                         D += BpS;
  465.                 }
  466.         }
  467. }

  468. static
  469. void H_Pass_Avrg_8_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  470. {
  471.         while(H-->0) {
  472.                 int32_t i, k;
  473.                 int32_t Sums[8] = { 0 };
  474.                 for(i=0; i<=8; ++i)
  475.                         for(k=0; k<8; ++k)
  476.                                 Sums[k] += FIR_Tab_8[i][k] * Src[i];

  477.                 for(i=0; i<8; ++i) {
  478.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  479.                         if (C<0) C = 0; else if (C>255) C = 255;
  480.                         C = (C+Src[i]+1-Rnd) >> 1;
  481.                         (Dst[i]) = ( (C)+(Dst[i])+1 ) >> 1;
  482.                 }
  483.                 Src += BpS;
  484.                 Dst += BpS;
  485.         }
  486. }

  487. static
  488. void H_Pass_Avrg_Up_8_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t H, int32_t BpS, int32_t Rnd)
  489. {
  490.         while(H-->0) {
  491.                 int32_t i, k;
  492.                 int32_t Sums[8] = { 0 };
  493.                 for(i=0; i<=8; ++i)
  494.                         for(k=0; k<8; ++k)
  495.                                 Sums[k] += FIR_Tab_8[i][k] * Src[i];

  496.                 for(i=0; i<8; ++i) {
  497.                         int32_t C = ( Sums[i] + 16-Rnd ) >> 5;
  498.                         if (C<0) C = 0; else if (C>255) C = 255;
  499.                         C = (C+Src[i+1]+1-Rnd) >> 1;
  500.                         (Dst[i]) = ( (C)+(Dst[i])+1 ) >> 1;
  501.                 }
  502.                 Src += BpS;
  503.                 Dst += BpS;
  504.         }
  505. }

  506. static
  507. void V_Pass_Avrg_8_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  508. {
  509.         while(W-->0) {
  510.                 int32_t i, k;
  511.                 int32_t Sums[8] = { 0 };
  512.                 const uint8_t *S = Src;
  513.                 uint8_t *D = Dst;

  514.                 for(i=0; i<=8; ++i) {
  515.                         for(k=0; k<8; ++k)
  516.                                 Sums[k] += FIR_Tab_8[i][k] * S[0];
  517.                         S += BpS;
  518.                 }

  519.                 S = Src;
  520.                 for(i=0; i<8; ++i) {
  521.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  522.                         if (C<0) C = 0; else if (C>255) C = 255;
  523.                         C = ( C+S[0]+1-Rnd ) >> 1;
  524.                         (D[0]) = ( (C)+(D[0])+1 ) >> 1;
  525.                         D += BpS;
  526.                         S += BpS;
  527.                 }
  528.                 Src++;
  529.                 Dst++;
  530.         }
  531. }

  532. static
  533. void V_Pass_Avrg_Up_8_Add_C(uint8_t *Dst, const uint8_t *Src, int32_t W, int32_t BpS, int32_t Rnd)
  534. {
  535.         while(W-->0) {
  536.                 int32_t i, k;
  537.                 int32_t Sums[8] = { 0 };
  538.                 const uint8_t *S = Src;
  539.                 uint8_t *D = Dst;

  540.                 for(i=0; i<=8; ++i) {
  541.                         for(k=0; k<8; ++k)
  542.                                 Sums[k] += FIR_Tab_8[i][k] * S[0];
  543.                         S += BpS;
  544.                 }

  545.                 S = Src + BpS;
  546.                 for(i=0; i<8; ++i) {
  547.                         int32_t C = ( Sums[i] + 16-Rnd )>>5;
  548.                         if (C<0) C = 0; else if (C>255) C = 255;
  549.                         C = ( C+S[0]+1-Rnd ) >> 1;
  550.                         (D[0]) = ( (C)+(D[0])+1 ) >> 1;
  551.                         D += BpS;
  552.                         S += BpS;
  553.                 }
  554.                 Dst++;
  555.                 Src++;
  556.         }
  557. }


  558. #line 265 "c:\\\\program files\\\\microsoft visual studio\\\\myprojects\\\\testadvancedmacro\\\\selfinclude.cpp"
  559. #line 98 "c:\\program files\\microsoft visual studio\\myprojects\\testadvancedmacro\\selfinclude.cpp"



  560. #line 106 "c:\\program files\\microsoft visual studio\\myprojects\\testadvancedmacro\\selfinclude.cpp"

复制代码


实现了简单的C++中的template中的功能。对照上面的宏展开后的代码,分析起来就很容易明白上面代码的含义

[ 本帖最后由 hawk2012 于 2007-1-31 10:25 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-01-31 10:15 |只看该作者
什么叫做实现STL? 不就是个宏替换,至于这样么?
这样做只不过是为了让C编译器产生类似template的功能,

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
4 [报告]
发表于 2007-01-31 10:28 |只看该作者
原帖由 蚊见蚊爱 于 2007-1-31 10:15 发表
什么叫做实现STL? 不就是个宏替换,至于这样么?
这样做只不过是为了让C编译器产生类似template的功能,


替换? no,如果是简单的替换,还不值得拿出来讨论。原始的C++模版不也是简单的替换(+类型检查)吗?
问题的实质是递归,不同层面的递归。我在前面的帖子里说过:模版迭代是C++编译器的递归(参见<modern C++ design>),#include __FILE__迭代是CPP预处理器的递归。
"只不过",Alexandrescu之前却没人想到可以这样蹂躏C++ compiler。

论坛徽章:
0
5 [报告]
发表于 2007-01-31 22:50 |只看该作者
原帖由 gvim 于 2007-1-31 10:28 发表


替换? no,如果是简单的替换,还不值得拿出来讨论。原始的C++模版不也是简单的替换(+类型检查)吗?
问题的实质是递归,不同层面的递归。我在前面的帖子里说过:模版迭代是C++编译器的递归(参见<modern C ...



这个怎么能够叫做简单实现STL? STL是什么? STL是利用范型技术实现了一些基本的算法和容器的库
这个既不是基本算法, 更不是容器了, 怎么能够和STL扯上?最多是对template的模仿,
里面的语法亮点也就一个#include __FILE__了

C++里面的template有推导能力, 有人用template实现了1个24点的程序, 计算是在编译期进行,
让我相信有人能用 C语言实现在编译期计算的24点程序, 我宁愿相信外星人
呵呵

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
6 [报告]
发表于 2007-01-31 23:34 |只看该作者
pass

[ 本帖最后由 gvim 于 2007-1-31 23:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP