You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
6.9KB

  1. /*
  2. Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  14. */
  15. #include <stdio.h>
  16. #include <string.h> /* for memset() */
  17. #include <unistd.h>
  18. #include <stdlib.h>
  19. #include <inttypes.h>
  20. #include "swscale.h"
  21. #include "rgb2rgb.h"
  22. #define SIZE 1000
  23. #define srcByte 0x55
  24. #define dstByte 0xBB
  25. #ifdef __APPLE_CC__
  26. #define memalign(x,y) malloc(y)
  27. #endif
  28. static int cpu_caps;
  29. static char *args_parse(int argc, char *argv[])
  30. {
  31. int o;
  32. while ((o = getopt(argc, argv, "m23")) != -1) {
  33. switch (o) {
  34. case 'm':
  35. cpu_caps |= SWS_CPU_CAPS_MMX;
  36. break;
  37. case '2':
  38. cpu_caps |= SWS_CPU_CAPS_MMX2;
  39. break;
  40. case '3':
  41. cpu_caps |= SWS_CPU_CAPS_3DNOW;
  42. break;
  43. default:
  44. fprintf(stderr, "Unknown option %c\n", o);
  45. }
  46. }
  47. return argv[optind];
  48. }
  49. main(int argc, char **argv)
  50. {
  51. int i, funcNum;
  52. uint8_t *srcBuffer= (uint8_t*)memalign(128, SIZE);
  53. uint8_t *dstBuffer= (uint8_t*)memalign(128, SIZE);
  54. int failedNum=0;
  55. int passedNum=0;
  56. printf("memory corruption test ...\n");
  57. args_parse(argc, argv);
  58. fprintf(stderr, "CPU capabilities forced to %x\n", cpu_caps);
  59. sws_rgb2rgb_init(cpu_caps);
  60. for(funcNum=0; funcNum<100; funcNum++){
  61. int width;
  62. int failed=0;
  63. int srcBpp=0;
  64. int dstBpp=0;
  65. printf("."); fflush(stdout);
  66. memset(srcBuffer, srcByte, SIZE);
  67. for(width=32; width<64; width++){
  68. int dstOffset;
  69. for(dstOffset=128; dstOffset<196; dstOffset++){
  70. int srcOffset;
  71. memset(dstBuffer, dstByte, SIZE);
  72. for(srcOffset=128; srcOffset<196; srcOffset++){
  73. uint8_t *src= srcBuffer+srcOffset;
  74. uint8_t *dst= dstBuffer+dstOffset;
  75. char *name=NULL;
  76. if(failed) break; //don't fill the screen with shit ...
  77. switch(funcNum){
  78. case 0:
  79. srcBpp=2;
  80. dstBpp=2;
  81. name="rgb15to16";
  82. rgb15to16(src, dst, width*srcBpp);
  83. break;
  84. case 1:
  85. srcBpp=2;
  86. dstBpp=3;
  87. name="rgb15to24";
  88. rgb15to24(src, dst, width*srcBpp);
  89. break;
  90. case 2:
  91. srcBpp=2;
  92. dstBpp=4;
  93. name="rgb15to32";
  94. rgb15to32(src, dst, width*srcBpp);
  95. break;
  96. case 3:
  97. srcBpp=2;
  98. dstBpp=3;
  99. name="rgb16to24";
  100. rgb16to24(src, dst, width*srcBpp);
  101. break;
  102. case 4:
  103. srcBpp=2;
  104. dstBpp=4;
  105. name="rgb16to32";
  106. rgb16to32(src, dst, width*srcBpp);
  107. break;
  108. case 5:
  109. srcBpp=3;
  110. dstBpp=2;
  111. name="rgb24to15";
  112. rgb24to15(src, dst, width*srcBpp);
  113. break;
  114. case 6:
  115. srcBpp=3;
  116. dstBpp=2;
  117. name="rgb24to16";
  118. rgb24to16(src, dst, width*srcBpp);
  119. break;
  120. case 7:
  121. srcBpp=3;
  122. dstBpp=4;
  123. name="rgb24to32";
  124. rgb24to32(src, dst, width*srcBpp);
  125. break;
  126. case 8:
  127. srcBpp=4;
  128. dstBpp=2;
  129. name="rgb32to15";
  130. rgb32to15(src, dst, width*srcBpp);
  131. break;
  132. case 9:
  133. srcBpp=4;
  134. dstBpp=2;
  135. name="rgb32to16";
  136. rgb32to16(src, dst, width*srcBpp);
  137. break;
  138. case 10:
  139. srcBpp=4;
  140. dstBpp=3;
  141. name="rgb32to24";
  142. rgb32to24(src, dst, width*srcBpp);
  143. break;
  144. case 11:
  145. srcBpp=2;
  146. dstBpp=2;
  147. name="rgb16to15";
  148. rgb16to15(src, dst, width*srcBpp);
  149. break;
  150. case 14:
  151. srcBpp=2;
  152. dstBpp=2;
  153. name="rgb15tobgr15";
  154. rgb15tobgr15(src, dst, width*srcBpp);
  155. break;
  156. case 15:
  157. srcBpp=2;
  158. dstBpp=2;
  159. name="rgb15tobgr16";
  160. rgb15tobgr16(src, dst, width*srcBpp);
  161. break;
  162. case 16:
  163. srcBpp=2;
  164. dstBpp=3;
  165. name="rgb15tobgr24";
  166. rgb15tobgr24(src, dst, width*srcBpp);
  167. break;
  168. case 17:
  169. srcBpp=2;
  170. dstBpp=4;
  171. name="rgb15tobgr32";
  172. rgb15tobgr32(src, dst, width*srcBpp);
  173. break;
  174. case 18:
  175. srcBpp=2;
  176. dstBpp=2;
  177. name="rgb16tobgr15";
  178. rgb16tobgr15(src, dst, width*srcBpp);
  179. break;
  180. case 19:
  181. srcBpp=2;
  182. dstBpp=2;
  183. name="rgb16tobgr16";
  184. rgb16tobgr16(src, dst, width*srcBpp);
  185. break;
  186. case 20:
  187. srcBpp=2;
  188. dstBpp=3;
  189. name="rgb16tobgr24";
  190. rgb16tobgr24(src, dst, width*srcBpp);
  191. break;
  192. case 21:
  193. srcBpp=2;
  194. dstBpp=4;
  195. name="rgb16tobgr32";
  196. rgb16tobgr32(src, dst, width*srcBpp);
  197. break;
  198. case 22:
  199. srcBpp=3;
  200. dstBpp=2;
  201. name="rgb24tobgr15";
  202. rgb24tobgr15(src, dst, width*srcBpp);
  203. break;
  204. case 23:
  205. srcBpp=3;
  206. dstBpp=2;
  207. name="rgb24tobgr16";
  208. rgb24tobgr16(src, dst, width*srcBpp);
  209. break;
  210. case 24:
  211. srcBpp=3;
  212. dstBpp=3;
  213. name="rgb24tobgr24";
  214. rgb24tobgr24(src, dst, width*srcBpp);
  215. break;
  216. case 25:
  217. srcBpp=3;
  218. dstBpp=4;
  219. name="rgb24tobgr32";
  220. rgb24tobgr32(src, dst, width*srcBpp);
  221. break;
  222. case 26:
  223. srcBpp=4;
  224. dstBpp=2;
  225. name="rgb32tobgr15";
  226. rgb32tobgr15(src, dst, width*srcBpp);
  227. break;
  228. case 27:
  229. srcBpp=4;
  230. dstBpp=2;
  231. name="rgb32tobgr16";
  232. rgb32tobgr16(src, dst, width*srcBpp);
  233. break;
  234. case 28:
  235. srcBpp=4;
  236. dstBpp=3;
  237. name="rgb32tobgr24";
  238. rgb32tobgr24(src, dst, width*srcBpp);
  239. break;
  240. case 29:
  241. srcBpp=4;
  242. dstBpp=4;
  243. name="rgb32tobgr32";
  244. rgb32tobgr32(src, dst, width*srcBpp);
  245. break;
  246. }
  247. if(!srcBpp) break;
  248. for(i=0; i<SIZE; i++){
  249. if(srcBuffer[i]!=srcByte){
  250. printf("src damaged at %d w:%d src:%d dst:%d %s\n",
  251. i, width, srcOffset, dstOffset, name);
  252. failed=1;
  253. break;
  254. }
  255. }
  256. for(i=0; i<dstOffset; i++){
  257. if(dstBuffer[i]!=dstByte){
  258. printf("dst damaged at %d w:%d src:%d dst:%d %s\n",
  259. i, width, srcOffset, dstOffset, name);
  260. failed=1;
  261. break;
  262. }
  263. }
  264. for(i=dstOffset + width*dstBpp; i<SIZE; i++){
  265. if(dstBuffer[i]!=dstByte){
  266. printf("dst damaged at %d w:%d src:%d dst:%d %s\n",
  267. i, width, srcOffset, dstOffset, name);
  268. failed=1;
  269. break;
  270. }
  271. }
  272. }
  273. }
  274. }
  275. if(failed) failedNum++;
  276. else if(srcBpp) passedNum++;
  277. }
  278. printf("%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum);
  279. return failedNum;
  280. }