/* Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <stdio.h> #include <stdlib.h> #include <inttypes.h> #include "swscale.h" #include "rgb2rgb.h" #include "cpudetect.h" #define SIZE 1000 #define srcByte 0x55 #define dstByte 0xBB #ifdef __APPLE_CC__ #define memalign(x,y) malloc(y) #endif static int get_sws_cpuflags() { return (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) | (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0) | (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0); } main(int argc, char **argv) { int i, funcNum; uint8_t *srcBuffer= (uint8_t*)memalign(128, SIZE); uint8_t *dstBuffer= (uint8_t*)memalign(128, SIZE); int failedNum=0; int passedNum=0; printf("memory corruption test ...\n"); if(argc==2){ GetCpuCaps(&gCpuCaps); printf("testing mmx\n"); } sws_rgb2rgb_init(get_sws_cpuflags()); for(funcNum=0; funcNum<100; funcNum++){ int width; int failed=0; int srcBpp=0; int dstBpp=0; printf("."); fflush(stdout); memset(srcBuffer, srcByte, SIZE); for(width=32; width<64; width++){ int dstOffset; for(dstOffset=128; dstOffset<196; dstOffset++){ int srcOffset; memset(dstBuffer, dstByte, SIZE); for(srcOffset=128; srcOffset<196; srcOffset++){ uint8_t *src= srcBuffer+srcOffset; uint8_t *dst= dstBuffer+dstOffset; char *name=NULL; if(failed) break; //don't fill the screen with shit ... switch(funcNum){ case 0: srcBpp=2; dstBpp=2; name="rgb15to16"; rgb15to16(src, dst, width*srcBpp); break; case 1: srcBpp=2; dstBpp=3; name="rgb15to24"; rgb15to24(src, dst, width*srcBpp); break; case 2: srcBpp=2; dstBpp=4; name="rgb15to32"; rgb15to32(src, dst, width*srcBpp); break; case 3: srcBpp=2; dstBpp=3; name="rgb16to24"; rgb16to24(src, dst, width*srcBpp); break; case 4: srcBpp=2; dstBpp=4; name="rgb16to32"; rgb16to32(src, dst, width*srcBpp); break; case 5: srcBpp=3; dstBpp=2; name="rgb24to15"; rgb24to15(src, dst, width*srcBpp); break; case 6: srcBpp=3; dstBpp=2; name="rgb24to16"; rgb24to16(src, dst, width*srcBpp); break; case 7: srcBpp=3; dstBpp=4; name="rgb24to32"; rgb24to32(src, dst, width*srcBpp); break; case 8: srcBpp=4; dstBpp=2; name="rgb32to15"; rgb32to15(src, dst, width*srcBpp); break; case 9: srcBpp=4; dstBpp=2; name="rgb32to16"; rgb32to16(src, dst, width*srcBpp); break; case 10: srcBpp=4; dstBpp=3; name="rgb32to24"; rgb32to24(src, dst, width*srcBpp); break; case 11: srcBpp=2; dstBpp=2; name="rgb16to15"; rgb16to15(src, dst, width*srcBpp); break; case 14: srcBpp=2; dstBpp=2; name="rgb15tobgr15"; rgb15tobgr15(src, dst, width*srcBpp); break; case 15: srcBpp=2; dstBpp=2; name="rgb15tobgr16"; rgb15tobgr16(src, dst, width*srcBpp); break; case 16: srcBpp=2; dstBpp=3; name="rgb15tobgr24"; rgb15tobgr24(src, dst, width*srcBpp); break; case 17: srcBpp=2; dstBpp=4; name="rgb15tobgr32"; rgb15tobgr32(src, dst, width*srcBpp); break; case 18: srcBpp=2; dstBpp=2; name="rgb16tobgr15"; rgb16tobgr15(src, dst, width*srcBpp); break; case 19: srcBpp=2; dstBpp=2; name="rgb16tobgr16"; rgb16tobgr16(src, dst, width*srcBpp); break; case 20: srcBpp=2; dstBpp=3; name="rgb16tobgr24"; rgb16tobgr24(src, dst, width*srcBpp); break; case 21: srcBpp=2; dstBpp=4; name="rgb16tobgr32"; rgb16tobgr32(src, dst, width*srcBpp); break; case 22: srcBpp=3; dstBpp=2; name="rgb24tobgr15"; rgb24tobgr15(src, dst, width*srcBpp); break; case 23: srcBpp=3; dstBpp=2; name="rgb24tobgr16"; rgb24tobgr16(src, dst, width*srcBpp); break; case 24: srcBpp=3; dstBpp=3; name="rgb24tobgr24"; rgb24tobgr24(src, dst, width*srcBpp); break; case 25: srcBpp=3; dstBpp=4; name="rgb24tobgr32"; rgb24tobgr32(src, dst, width*srcBpp); break; case 26: srcBpp=4; dstBpp=2; name="rgb32tobgr15"; rgb32tobgr15(src, dst, width*srcBpp); break; case 27: srcBpp=4; dstBpp=2; name="rgb32tobgr16"; rgb32tobgr16(src, dst, width*srcBpp); break; case 28: srcBpp=4; dstBpp=3; name="rgb32tobgr24"; rgb32tobgr24(src, dst, width*srcBpp); break; case 29: srcBpp=4; dstBpp=4; name="rgb32tobgr32"; rgb32tobgr32(src, dst, width*srcBpp); break; } if(!srcBpp) break; for(i=0; i<SIZE; i++){ if(srcBuffer[i]!=srcByte){ printf("src damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } for(i=0; i<dstOffset; i++){ if(dstBuffer[i]!=dstByte){ printf("dst damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } for(i=dstOffset + width*dstBpp; i<SIZE; i++){ if(dstBuffer[i]!=dstByte){ printf("dst damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } } } } if(failed) failedNum++; else if(srcBpp) passedNum++; } printf("%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum); return failedNum; }