Also test the alpha channel in swscale-example
authorCédric Schieli <cschieli@gmail.com>
Fri, 20 Mar 2009 14:17:20 +0000 (14:17 +0000)
committerCédric Schieli <cschieli@gmail.com>
Fri, 20 Mar 2009 14:17:20 +0000 (14:17 +0000)
Originally committed as revision 29013 to svn://svn.mplayerhq.hu/mplayer/trunk/libswscale

libswscale/swscale-example.c

index 27f6e20..1b4be8d 100644 (file)
@@ -49,20 +49,20 @@ static uint64_t getSSD(uint8_t *src1, uint8_t *src2, int stride1, int stride2, i
 
 // test by ref -> src -> dst -> out & compare out against ref
 // ref & out are YV12
-static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat, int dstFormat,
+static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, int srcFormat, int dstFormat,
                   int srcW, int srcH, int dstW, int dstH, int flags){
-    uint8_t *src[3];
-    uint8_t *dst[3];
-    uint8_t *out[3];
-    int srcStride[3], dstStride[3];
+    uint8_t *src[4];
+    uint8_t *dst[4];
+    uint8_t *out[4];
+    int srcStride[4], dstStride[4];
     int i;
-    uint64_t ssdY, ssdU, ssdV;
+    uint64_t ssdY, ssdU, ssdV, ssdA=0;
     struct SwsContext *srcContext = NULL, *dstContext = NULL,
                       *outContext = NULL;
     int res;
 
     res = 0;
-    for (i=0; i<3; i++){
+    for (i=0; i<4; i++){
         // avoid stride % bpp != 0
         if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24)
             srcStride[i]= srcW*3;
@@ -85,10 +85,10 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat
         }
     }
 
-    srcContext= sws_getContext(w, h, PIX_FMT_YUV420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL);
+    srcContext= sws_getContext(w, h, PIX_FMT_YUVA420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL);
     if (!srcContext) {
         fprintf(stderr, "Failed to get %s ---> %s\n",
-                sws_format_name(PIX_FMT_YUV420P),
+                sws_format_name(PIX_FMT_YUVA420P),
                 sws_format_name(srcFormat));
         res = -1;
 
@@ -103,11 +103,11 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat
 
         goto end;
     }
-    outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUV420P, flags, NULL, NULL, NULL);
+    outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUVA420P, flags, NULL, NULL, NULL);
     if (!outContext) {
         fprintf(stderr, "Failed to get %s ---> %s\n",
                 sws_format_name(dstFormat),
-                sws_format_name(PIX_FMT_YUV420P));
+                sws_format_name(PIX_FMT_YUVA420P));
         res = -1;
 
         goto end;
@@ -122,17 +122,20 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat
     ssdY= getSSD(ref[0], out[0], refStride[0], refStride[0], w, h);
     ssdU= getSSD(ref[1], out[1], refStride[1], refStride[1], (w+1)>>1, (h+1)>>1);
     ssdV= getSSD(ref[2], out[2], refStride[2], refStride[2], (w+1)>>1, (h+1)>>1);
+    if (isALPHA(srcFormat) && isALPHA(dstFormat))
+        ssdA= getSSD(ref[3], out[3], refStride[3], refStride[3], w, h);
 
     if (srcFormat == PIX_FMT_GRAY8 || dstFormat==PIX_FMT_GRAY8) ssdU=ssdV=0; //FIXME check that output is really gray
 
     ssdY/= w*h;
     ssdU/= w*h/4;
     ssdV/= w*h/4;
+    ssdA/= w*h;
 
-    printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld\n",
+    printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld,%5lld\n",
            sws_format_name(srcFormat), srcW, srcH,
            sws_format_name(dstFormat), dstW, dstH,
-           flags, ssdY, ssdU, ssdV);
+           flags, ssdY, ssdU, ssdV, ssdA);
     fflush(stdout);
 
     end:
@@ -141,7 +144,7 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat
     sws_freeContext(dstContext);
     sws_freeContext(outContext);
 
-    for (i=0; i<3; i++){
+    for (i=0; i<4; i++){
         free(src[i]);
         free(dst[i]);
         free(out[i]);
@@ -150,7 +153,7 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat
     return res;
 }
 
-static void selfTest(uint8_t *src[3], int stride[3], int w, int h){
+static void selfTest(uint8_t *src[4], int stride[4], int w, int h){
     enum PixelFormat srcFormat, dstFormat;
     int srcW, srcH, dstW, dstH;
     int flags;
@@ -190,14 +193,14 @@ int main(int argc, char **argv){
     uint8_t *rgb_data = malloc (W*H*4);
     uint8_t *rgb_src[3]= {rgb_data, NULL, NULL};
     int rgb_stride[3]={4*W, 0, 0};
-    uint8_t *data = malloc (3*W*H);
-    uint8_t *src[3]= {data, data+W*H, data+W*H*2};
-    int stride[3]={W, W, W};
+    uint8_t *data = malloc (4*W*H);
+    uint8_t *src[4]= {data, data+W*H, data+W*H*2, data+W*H*3};
+    int stride[4]={W, W, W, W};
     int x, y;
     struct SwsContext *sws;
     AVLFG rand;
 
-    sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUV420P, 2, NULL, NULL, NULL);
+    sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUVA420P, 2, NULL, NULL, NULL);
 
     av_lfg_init(&rand, 1);