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.

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