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.

307 lines
6.9KB

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