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.

308 lines
7.1KB

  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. av_log(NULL, AV_LOG_ERROR, "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. av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n");
  63. args_parse(argc, argv);
  64. av_log(NULL, AV_LOG_INFO, "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. av_log(NULL, AV_LOG_INFO,".");
  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. //((*s++) << TGA_SHIFT32) | TGA_ALPHA32;
  137. rgb32to15(src, dst, width*srcBpp);
  138. break;
  139. case 9:
  140. srcBpp=4;
  141. dstBpp=2;
  142. name="rgb32to16";
  143. rgb32to16(src, dst, width*srcBpp);
  144. break;
  145. case 10:
  146. srcBpp=4;
  147. dstBpp=3;
  148. name="rgb32to24";
  149. rgb32to24(src, dst, width*srcBpp);
  150. break;
  151. case 11:
  152. srcBpp=2;
  153. dstBpp=2;
  154. name="rgb16to15";
  155. rgb16to15(src, dst, width*srcBpp);
  156. break;
  157. case 14:
  158. srcBpp=2;
  159. dstBpp=2;
  160. name="rgb15tobgr15";
  161. rgb15tobgr15(src, dst, width*srcBpp);
  162. break;
  163. case 15:
  164. srcBpp=2;
  165. dstBpp=2;
  166. name="rgb15tobgr16";
  167. rgb15tobgr16(src, dst, width*srcBpp);
  168. break;
  169. case 16:
  170. srcBpp=2;
  171. dstBpp=3;
  172. name="rgb15tobgr24";
  173. rgb15tobgr24(src, dst, width*srcBpp);
  174. break;
  175. case 17:
  176. srcBpp=2;
  177. dstBpp=4;
  178. name="rgb15tobgr32";
  179. rgb15tobgr32(src, dst, width*srcBpp);
  180. break;
  181. case 18:
  182. srcBpp=2;
  183. dstBpp=2;
  184. name="rgb16tobgr15";
  185. rgb16tobgr15(src, dst, width*srcBpp);
  186. break;
  187. case 19:
  188. srcBpp=2;
  189. dstBpp=2;
  190. name="rgb16tobgr16";
  191. rgb16tobgr16(src, dst, width*srcBpp);
  192. break;
  193. case 20:
  194. srcBpp=2;
  195. dstBpp=3;
  196. name="rgb16tobgr24";
  197. rgb16tobgr24(src, dst, width*srcBpp);
  198. break;
  199. case 21:
  200. srcBpp=2;
  201. dstBpp=4;
  202. name="rgb16tobgr32";
  203. rgb16tobgr32(src, dst, width*srcBpp);
  204. break;
  205. case 22:
  206. srcBpp=3;
  207. dstBpp=2;
  208. name="rgb24tobgr15";
  209. rgb24tobgr15(src, dst, width*srcBpp);
  210. break;
  211. case 23:
  212. srcBpp=3;
  213. dstBpp=2;
  214. name="rgb24tobgr16";
  215. rgb24tobgr16(src, dst, width*srcBpp);
  216. break;
  217. case 24:
  218. srcBpp=3;
  219. dstBpp=3;
  220. name="rgb24tobgr24";
  221. rgb24tobgr24(src, dst, width*srcBpp);
  222. break;
  223. case 25:
  224. srcBpp=3;
  225. dstBpp=4;
  226. name="rgb24tobgr32";
  227. rgb24tobgr32(src, dst, width*srcBpp);
  228. break;
  229. case 26:
  230. srcBpp=4;
  231. dstBpp=2;
  232. name="rgb32tobgr15";
  233. rgb32tobgr15(src, dst, width*srcBpp);
  234. break;
  235. case 27:
  236. srcBpp=4;
  237. dstBpp=2;
  238. name="rgb32tobgr16";
  239. rgb32tobgr16(src, dst, width*srcBpp);
  240. break;
  241. case 28:
  242. srcBpp=4;
  243. dstBpp=3;
  244. name="rgb32tobgr24";
  245. rgb32tobgr24(src, dst, width*srcBpp);
  246. break;
  247. case 29:
  248. srcBpp=4;
  249. dstBpp=4;
  250. name="rgb32tobgr32";
  251. rgb32tobgr32(src, dst, width*srcBpp);
  252. break;
  253. }
  254. if(!srcBpp) break;
  255. for(i=0; i<SIZE; i++){
  256. if(srcBuffer[i]!=srcByte){
  257. av_log(NULL, AV_LOG_INFO, "src damaged at %d w:%d src:%d dst:%d %s\n",
  258. i, width, srcOffset, dstOffset, name);
  259. failed=1;
  260. break;
  261. }
  262. }
  263. for(i=0; i<dstOffset; i++){
  264. if(dstBuffer[i]!=dstByte){
  265. av_log(NULL, AV_LOG_INFO, "dst damaged at %d w:%d src:%d dst:%d %s\n",
  266. i, width, srcOffset, dstOffset, name);
  267. failed=1;
  268. break;
  269. }
  270. }
  271. for(i=dstOffset + width*dstBpp; i<SIZE; i++){
  272. if(dstBuffer[i]!=dstByte){
  273. av_log(NULL, AV_LOG_INFO, "dst damaged at %d w:%d src:%d dst:%d %s\n",
  274. i, width, srcOffset, dstOffset, name);
  275. failed=1;
  276. break;
  277. }
  278. }
  279. }
  280. }
  281. }
  282. if(failed) failedNum++;
  283. else if(srcBpp) passedNum++;
  284. }
  285. av_log(NULL, AV_LOG_INFO, "%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum);
  286. return failedNum;
  287. }