test_basic_prediction.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  test_basic_prediction.c
  3.  Test program for basic_prediction.  Tests for accuracy and can also be used for
  4.  testing the speed of this module.
  5.  Version 0.1
  6.  John Funnell, 18 March 2001
  7.  (C) 2001 Project Mayo
  8.  */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include "basic_prediction.h"
  12. /*
  13.  comment out the next line if you know your functions produce the correct 
  14.  results and you are only interested in speed.
  15.  */
  16. #define CHECK_RESULTS
  17. #define WIDTH             640
  18. #define HEIGHT            480
  19. #define ITERATIONS        100
  20. #define INTERPOLATE2(A, B, R) (((int)(A) + (int)(B) + 1 - (R)) >> 1)
  21. #define INTERPOLATE4(A, B, C, D, R) (((int)(A) + (int)(B) + (int)(C) + (int)(D) + 2 - (R)) >> 2)
  22. int main(int argc, char **argv) {
  23. unsigned char *source, *dest, *Src, *Dst, pel;
  24. int x, y, i, sx, sy, dx, dy, blocksize, mode, rounding_control;
  25. /* allocate memory */
  26. source = malloc(WIDTH * HEIGHT);
  27. dest   = malloc(WIDTH * HEIGHT);
  28. if (!source || !dest) return -1;
  29. /* create random images */
  30. for(y=0; y<HEIGHT; y++) {
  31. for(x=0; x<WIDTH; x++) {
  32. source[WIDTH*y + x] = rand();
  33. dest  [WIDTH*y + x] = rand();
  34. }
  35. }
  36. printf("testing basic_prediction functions.....n");
  37. #ifdef CHECK_RESULTS
  38. printf("[not checking b-frame functions]n");
  39. #endif
  40. /* run the test */
  41. for (i=0; i<ITERATIONS; i++) {
  42. blocksize = i%2 ? 8 : 16; /* alternate block/macroblock with every frame */
  43. for(y=0; y<HEIGHT; y+=blocksize) {
  44. for(x=0; x<WIDTH; x+=blocksize) {
  45. sx = x + (rand() & 0x3f) - 0x20;
  46. sy = y + (rand() & 0x3f) - 0x20; 
  47. sx = sx < 0 ? 0 : sx;
  48. sy = sy < 0 ? 0 : sy;
  49. sx = sx+blocksize+1 > WIDTH  ? WIDTH- blocksize-1 : sx;
  50. sy = sy+blocksize+1 > HEIGHT ? HEIGHT-blocksize-1 : sy;
  51. Src = &(source[WIDTH*sy+sx]);
  52. Dst = &(  dest[WIDTH* y+ x]);
  53. mode = (x/blocksize)%8;
  54. rounding_control = (y/blocksize)%2;
  55. if (blocksize == 8) {
  56. if (rounding_control == 0) {
  57. /* no rounding versions */
  58. switch(mode) {
  59. case 0:
  60. CopyBlock(Src, Dst, WIDTH);
  61. break;
  62. case 1:
  63. CopyBlockHor(Src, Dst, WIDTH);
  64. break;
  65. case 2:
  66. CopyBlockVer(Src, Dst, WIDTH);
  67. break;
  68. case 3:
  69. CopyBlockHorVer(Src, Dst, WIDTH);
  70. break;
  71. /*
  72. case 4:
  73. BCopyBlock(Src, Dst, WIDTH);
  74. break;
  75. case 5:
  76. BCopyBlockHor(Src, Dst, WIDTH);
  77. break;
  78. case 6:
  79. BCopyBlockVer(Src, Dst, WIDTH);
  80. break;
  81. case 7:
  82. BCopyBlockHorVer(Src, Dst, WIDTH);
  83. break;*/
  84. }
  85. } else {
  86. /* rounding versions */
  87. switch(mode) {
  88. case 0:
  89. CopyBlock(Src, Dst, WIDTH);
  90. break;
  91. case 1:
  92. CopyBlockHorRound(Src, Dst, WIDTH);
  93. break;
  94. case 2:
  95. CopyBlockVerRound(Src, Dst, WIDTH);
  96. break;
  97. case 3:
  98. CopyBlockHorVerRound(Src, Dst, WIDTH);
  99. break;
  100. /*
  101. case 4:
  102. BCopyBlock(Src, Dst, WIDTH);
  103. break;
  104. case 5:
  105. BCopyBlockHor(Src, Dst, WIDTH);
  106. break;
  107. case 6:
  108. BCopyBlockVer(Src, Dst, WIDTH);
  109. break;
  110. case 7:
  111. BCopyBlockHorVer(Src, Dst, WIDTH);
  112. break;*/
  113. }
  114. }
  115. } else { /* blocksize == 16 */
  116. if (rounding_control == 0) {
  117. /* no rounding versions */
  118. switch(mode) {
  119. case 0:
  120. CopyMBlock(Src, Dst, WIDTH);
  121. break;
  122. case 1:
  123. CopyMBlockHor(Src, Dst, WIDTH);
  124. break;
  125. case 2:
  126. CopyMBlockVer(Src, Dst, WIDTH);
  127. break;
  128. case 3:
  129. CopyMBlockHorVer(Src, Dst, WIDTH);
  130. break;
  131. /*
  132. case 4:
  133. BCopyMBlock(Src, Dst, WIDTH);
  134. break;
  135. case 5:
  136. BCopyMBlockHor(Src, Dst, WIDTH);
  137. break;
  138. case 6:
  139. BCopyMBlockVer(Src, Dst, WIDTH);
  140. break;
  141. case 7:
  142. BCopyMBlockHorVer(Src, Dst, WIDTH);
  143. break;*/
  144. }
  145. } else {
  146. /* rounding versions */
  147. switch(mode) {
  148. case 0:
  149. CopyMBlock(Src, Dst, WIDTH);
  150. break;
  151. case 1:
  152. CopyMBlockHorRound(Src, Dst, WIDTH);
  153. break;
  154. case 2:
  155. CopyMBlockVerRound(Src, Dst, WIDTH);
  156. break;
  157. case 3:
  158. CopyMBlockHorVerRound(Src, Dst, WIDTH);
  159. break;
  160. /*
  161. case 4:
  162. BCopyMBlock(Src, Dst, WIDTH);
  163. break;
  164. case 5:
  165. BCopyMBlockHor(Src, Dst, WIDTH);
  166. break;
  167. case 6:
  168. BCopyMBlockVer(Src, Dst, WIDTH);
  169. break;
  170. case 7:
  171. BCopyMBlockHorVer(Src, Dst, WIDTH);
  172. break;*/
  173. }
  174. }
  175. }
  176. #ifdef CHECK_RESULTS
  177. /* check results */
  178. for(dy=0; dy<blocksize; dy++) {
  179. for(dx=0; dx<blocksize; dx++) {
  180. switch (mode) {
  181. case 0:
  182. pel = Src[WIDTH*dy+dx];
  183. break;
  184. case 1:
  185. pel = INTERPOLATE2(Src[WIDTH*dy+dx], Src[WIDTH*dy+dx+1], rounding_control);
  186. break;
  187. case 2:
  188. pel = INTERPOLATE2(Src[WIDTH*dy+dx], Src[WIDTH*(dy+1)+dx], rounding_control);
  189. break;
  190. case 3:
  191. pel = INTERPOLATE4(Src[WIDTH*dy+dx], Src[WIDTH*dy+dx+1], Src[WIDTH*(dy+1)+dx], Src[WIDTH*(dy+1)+dx+1], rounding_control);
  192. break;
  193. default:
  194. pel =  Dst[WIDTH*dy+dx];
  195. /* too fiddly to check the results for B frames */
  196. }
  197. if (pel != Dst[WIDTH*dy+dx]) {
  198. printf("failure: blocksize=%d mode=%d rounding_control=%dn", blocksize, mode, rounding_control);
  199. goto getoutofhere;
  200. }
  201. }
  202. }
  203. #endif
  204. }
  205. }
  206. }
  207. printf("completed sucessfullyn");
  208. getoutofhere:
  209. fgetc(stdin);
  210. return 0;
  211. }