Replace huge switch statement by a lookup table.
[ffmpeg.git] / libswscale / cs_test.c
index cd01006..96b157c 100644 (file)
@@ -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 @@ int main(int argc, char **argv)
        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 @@ int main(int argc, char **argv)
                                        
                                        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 @@ int main(int argc, char **argv)
                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;
 }