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.

284 lines
6.4KB

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