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.

289 lines
6.5KB

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