Originally committed as revision 20100 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale
		
			
				
	
	
		
			307 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			307 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
 | |
|  *
 | |
|  * This file is part of FFmpeg.
 | |
|  *
 | |
|  * FFmpeg 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.
 | |
|  *
 | |
|  * FFmpeg 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 FFmpeg; if not, write to the Free Software
 | |
|  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <string.h>              /* for memset() */
 | |
| #include <unistd.h>
 | |
| #include <stdlib.h>
 | |
| #include <inttypes.h>
 | |
| #include <malloc.h>
 | |
| 
 | |
| #include "swscale.h"
 | |
| #include "rgb2rgb.h"
 | |
| 
 | |
| #define SIZE 1000
 | |
| #define srcByte 0x55
 | |
| #define dstByte 0xBB
 | |
| 
 | |
| #ifdef __APPLE_CC__
 | |
| #define memalign(x,y) malloc(y)
 | |
| #endif
 | |
| 
 | |
| static int cpu_caps;
 | |
| 
 | |
| static char *args_parse(int argc, char *argv[])
 | |
| {
 | |
|     int o;
 | |
| 
 | |
|     while ((o = getopt(argc, argv, "m23")) != -1) {
 | |
|         switch (o) {
 | |
|             case 'm':
 | |
|                 cpu_caps |= SWS_CPU_CAPS_MMX;
 | |
|                 break;
 | |
|             case '2':
 | |
|                 cpu_caps |= SWS_CPU_CAPS_MMX2;
 | |
|                 break;
 | |
|             case '3':
 | |
|                 cpu_caps |= SWS_CPU_CAPS_3DNOW;
 | |
|                 break;
 | |
|             default:
 | |
|                 fprintf(stderr, "Unknown option %c\n", o);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return argv[optind];
 | |
| }
 | |
| 
 | |
| int 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");
 | |
| 	args_parse(argc, argv);
 | |
| 	fprintf(stderr, "CPU capabilities forced to %x\n", cpu_caps);
 | |
| 	sws_rgb2rgb_init(cpu_caps);
 | |
| 	
 | |
| 	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;
 | |
| }
 |