diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-06-29 15:01:23 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-06-29 15:01:23 +0000 |
commit | a28ea2c04debd64091588645437c8539b8a4439b (patch) | |
tree | 15e8825210ba6234de73cbaa4a98fdbfe05b5bbc /postproc | |
parent | b241cbf2cf9b6f98d9788a2d5b03024d6502fa99 (diff) | |
download | ffmpeg-streaming-a28ea2c04debd64091588645437c8539b8a4439b.zip ffmpeg-streaming-a28ea2c04debd64091588645437c8539b8a4439b.tar.gz |
colorspace converter tests (memory corruption tests at different width/src/dst)
quite impressive results only 1 of the 13 rgb->rgb converters fails for the c versions
... sadly only 1 of the mmx converters passes though :( ... i feared allready that last mplayerxp merge reversed the bugfixes :((((
Originally committed as revision 6604 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
Diffstat (limited to 'postproc')
-rw-r--r-- | postproc/Makefile | 4 | ||||
-rw-r--r-- | postproc/cs_test.c | 182 |
2 files changed, 186 insertions, 0 deletions
diff --git a/postproc/Makefile b/postproc/Makefile index a553560..71e0ad2 100644 --- a/postproc/Makefile +++ b/postproc/Makefile @@ -5,6 +5,7 @@ LIBNAME = libpostproc.a SRCS=postprocess.c swscale.c rgb2rgb.c yuv2rgb.c OBJS=$(SRCS:.c=.o) +CS_TEST_OBJS=cs_test.o rgb2rgb.o ../cpudetect.o ../mp_msg.o CFLAGS = $(OPTFLAGS) $(MLIB_INC) -I. -I.. -Wall $(EXTRA_INC) # -I/usr/X11R6/include/ @@ -32,6 +33,9 @@ dep: depend depend: $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend +cs_test: $(CS_TEST_OBJS) + $(CC) $(CS_TEST_OBJS) -o cs_test + # # include dependency files if they exist # diff --git a/postproc/cs_test.c b/postproc/cs_test.c new file mode 100644 index 0000000..308096b --- /dev/null +++ b/postproc/cs_test.c @@ -0,0 +1,182 @@ +/* + 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 "rgb2rgb.h" +#include "../cpudetect.h" + +#define SIZE 1000 +#define srcByte 0x55 +#define dstByte 0xBB + +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"); + } + + 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; //dont 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=3; + dstBpp=3; + name="rgb24tobgr24"; + rgb24tobgr24(src, dst, width*srcBpp); + break; + case 12: + 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; +}
\ No newline at end of file |