changeset 22964:5922ce1dfefc

Replace huge switch statement by a lookup table. Add newline to final report.
author ivo
date Thu, 12 Apr 2007 19:25:36 +0000
parents 84add524a0f4
children c6be5039a7ca
files libswscale/cs_test.c
diffstat 1 files changed, 46 insertions(+), 174 deletions(-) [+]
line wrap: on
line diff
--- a/libswscale/cs_test.c	Thu Apr 12 16:33:48 2007 +0000
+++ b/libswscale/cs_test.c	Thu Apr 12 19:25:36 2007 +0000
@@ -31,6 +31,7 @@
 #define srcByte 0x55
 #define dstByte 0xBB
 
+#define FUNC(s,d,n) {s,d,#n,n}
 
 static int cpu_caps;
 
@@ -70,12 +71,50 @@
 	av_log(NULL, AV_LOG_INFO, "CPU capabilities forced to %x\n", cpu_caps);
 	sws_rgb2rgb_init(cpu_caps);
 	
-	for(funcNum=0; funcNum<100; funcNum++){
+	for(funcNum=0; ; funcNum++){
+		struct func_info_s {
+			int src_bpp;
+			int dst_bpp;
+			char *name;
+			void (*func)(const uint8_t *src, uint8_t *dst, long src_size);
+		} func_info[] = {
+			FUNC(2, 2, rgb15to16),
+			FUNC(2, 3, rgb15to24),
+			FUNC(2, 4, rgb15to32),
+			FUNC(2, 3, rgb16to24),
+			FUNC(2, 4, rgb16to32),
+			FUNC(3, 2, rgb24to15),
+			FUNC(3, 2, rgb24to16),
+			FUNC(3, 4, rgb24to32),
+			FUNC(4, 2, rgb32to15),
+			FUNC(4, 2, rgb32to16),
+			FUNC(4, 3, rgb32to24),
+			FUNC(2, 2, rgb16to15),
+			FUNC(2, 2, rgb15tobgr15),
+			FUNC(2, 2, rgb15tobgr16),
+			FUNC(2, 3, rgb15tobgr24),
+			FUNC(2, 4, rgb15tobgr32),
+			FUNC(2, 2, rgb16tobgr15),
+			FUNC(2, 2, rgb16tobgr16),
+			FUNC(2, 3, rgb16tobgr24),
+			FUNC(2, 4, rgb16tobgr32),
+			FUNC(3, 2, rgb24tobgr15),
+			FUNC(3, 2, rgb24tobgr16),
+			FUNC(3, 3, rgb24tobgr24),
+			FUNC(3, 4, rgb24tobgr32),
+			FUNC(4, 2, rgb32tobgr15),
+			FUNC(4, 2, rgb32tobgr16),
+			FUNC(4, 3, rgb32tobgr24),
+			FUNC(4, 4, rgb32tobgr32),
+			FUNC(0, 0, NULL)
+		};
 		int width;
 		int failed=0;
 		int srcBpp=0;
 		int dstBpp=0;
 
+		if (!func_info[funcNum].func) break;
+
 		av_log(NULL, AV_LOG_INFO,".");
 		memset(srcBuffer, srcByte, SIZE);
 
@@ -92,179 +131,12 @@
 					
 					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";
-                        //((*s++) << TGA_SHIFT32) | TGA_ALPHA32;
-						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;
+					srcBpp = func_info[funcNum].src_bpp;
+					dstBpp = func_info[funcNum].dst_bpp;
+					name   = func_info[funcNum].name;
 
-					}
+					func_info[funcNum].func(src, dst, width*srcBpp);
+
 					if(!srcBpp) break;
 
 					for(i=0; i<SIZE; i++){
@@ -298,6 +170,6 @@
 		else if(srcBpp) passedNum++;
 	}
 	
-	av_log(NULL, AV_LOG_INFO, "%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum);
+	av_log(NULL, AV_LOG_INFO, "\n%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum);
 	return failedNum;
 }