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.

304 lines
7.0KB

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