static int doTest(uint8_t *ref[3], int refStride[3], 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];

    int i;

    uint64_t ssdY, ssdU, ssdV;

    struct SwsContext *srcContext, *dstContext, *outContext;

    int res;



    res = 0;

    for (i=0; i<3; i++){

        // avoid stride % bpp != 0

        if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24)

            srcStride[i]= srcW*3;

        else

            srcStride[i]= srcW*4;



        if (dstFormat==PIX_FMT_RGB24 || dstFormat==PIX_FMT_BGR24)

            dstStride[i]= dstW*3;

        else

            dstStride[i]= dstW*4;



        src[i]= (uint8_t*) malloc(srcStride[i]*srcH);

        dst[i]= (uint8_t*) malloc(dstStride[i]*dstH);

        out[i]= (uint8_t*) malloc(refStride[i]*h);

        if (!src[i] || !dst[i] || !out[i]) {

            perror("Malloc");

            res = -1;



            goto end;

        }

    }



    dstContext = outContext = NULL;

    srcContext= sws_getContext(w, h, PIX_FMT_YUV420P, 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(srcFormat));

        res = -1;



        goto end;

    }

    dstContext= sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL, NULL);

    if (!dstContext) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(srcFormat),

                sws_format_name(dstFormat));

        res = -1;



        goto end;

    }

    outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUV420P, flags, NULL, NULL, NULL);

    if (!outContext) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(dstFormat),

                sws_format_name(PIX_FMT_YUV420P));

        res = -1;



        goto end;

    }

//    printf("test %X %X %X -> %X %X %X\n", (int)ref[0], (int)ref[1], (int)ref[2],

//        (int)src[0], (int)src[1], (int)src[2]);



    sws_scale(srcContext, ref, refStride, 0, h   , src, srcStride);

    sws_scale(dstContext, src, srcStride, 0, srcH, dst, dstStride);

    sws_scale(outContext, dst, dstStride, 0, dstH, out, refStride);



    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 (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;



    printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld\n",

           sws_format_name(srcFormat), srcW, srcH,

           sws_format_name(dstFormat), dstW, dstH,

           flags, ssdY, ssdU, ssdV);

    fflush(stdout);



    end:



    sws_freeContext(srcContext);

    sws_freeContext(dstContext);

    sws_freeContext(outContext);



    for (i=0; i<3; i++){

        free(src[i]);

        free(dst[i]);

        free(out[i]);

    }



    return res;

}

static int doTest(uint8_t *ref[3], int refStride[3], 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];

    int i;

    uint64_t ssdY, ssdU, ssdV;

    struct SwsContext *srcContext, *dstContext, *outContext;

    int res;



    res = 0;

    for (i=0; i<3; i++){

        

        if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24)

            srcStride[i]= srcW*3;

        else

            srcStride[i]= srcW*4;



        if (dstFormat==PIX_FMT_RGB24 || dstFormat==PIX_FMT_BGR24)

            dstStride[i]= dstW*3;

        else

            dstStride[i]= dstW*4;



        src[i]= (uint8_t*) malloc(srcStride[i]*srcH);

        dst[i]= (uint8_t*) malloc(dstStride[i]*dstH);

        out[i]= (uint8_t*) malloc(refStride[i]*h);

        if (!src[i] || !dst[i] || !out[i]) {

            perror("Malloc");

            res = -1;



            goto end;

        }

    }



    dstContext = outContext = NULL;

    srcContext= sws_getContext(w, h, PIX_FMT_YUV420P, 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(srcFormat));

        res = -1;



        goto end;

    }

    dstContext= sws_getContext(srcW, srcH, srcFormat, dstW, dstH, dstFormat, flags, NULL, NULL, NULL);

    if (!dstContext) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(srcFormat),

                sws_format_name(dstFormat));

        res = -1;



        goto end;

    }

    outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUV420P, flags, NULL, NULL, NULL);

    if (!outContext) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(dstFormat),

                sws_format_name(PIX_FMT_YUV420P));

        res = -1;



        goto end;

    }







    sws_scale(srcContext, ref, refStride, 0, h   , src, srcStride);

    sws_scale(dstContext, src, srcStride, 0, srcH, dst, dstStride);

    sws_scale(outContext, dst, dstStride, 0, dstH, out, refStride);



    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 (srcFormat == PIX_FMT_GRAY8 || dstFormat==PIX_FMT_GRAY8) ssdU=ssdV=0; 



    ssdY/= w*h;

    ssdU/= w*h/4;

    ssdV/= w*h/4;



    printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld\n",

           sws_format_name(srcFormat), srcW, srcH,

           sws_format_name(dstFormat), dstW, dstH,

           flags, ssdY, ssdU, ssdV);

    fflush(stdout);



    end:



    sws_freeContext(srcContext);

    sws_freeContext(dstContext);

    sws_freeContext(outContext);



    for (i=0; i<3; i++){

        free(src[i]);

        free(dst[i]);

        free(out[i]);

    }



    return res;

}

    struct SwsContext *srcContext, *dstContext, *outContext;     dstContext = outContext = NULL;
static int FUNC_0(uint8_t *VAR_0[3], int VAR_1[3], int VAR_2, int VAR_3, int VAR_4, int VAR_5,

                  int VAR_6, int VAR_7, int VAR_8, int VAR_9, int VAR_10){

    uint8_t *src[3];

    uint8_t *dst[3];

    uint8_t *out[3];

    int VAR_11[3], VAR_12[3];

    int VAR_13;

    uint64_t ssdY, ssdU, ssdV;

    struct SwsContext *VAR_14, *VAR_15, *VAR_16;

    int VAR_17;



    VAR_17 = 0;

    for (VAR_13=0; VAR_13<3; VAR_13++){

        

        if (VAR_4==PIX_FMT_RGB24 || VAR_4==PIX_FMT_BGR24)

            VAR_11[VAR_13]= VAR_6*3;

        else

            VAR_11[VAR_13]= VAR_6*4;



        if (VAR_5==PIX_FMT_RGB24 || VAR_5==PIX_FMT_BGR24)

            VAR_12[VAR_13]= VAR_8*3;

        else

            VAR_12[VAR_13]= VAR_8*4;



        src[VAR_13]= (uint8_t*) malloc(VAR_11[VAR_13]*VAR_7);

        dst[VAR_13]= (uint8_t*) malloc(VAR_12[VAR_13]*VAR_9);

        out[VAR_13]= (uint8_t*) malloc(VAR_1[VAR_13]*VAR_3);

        if (!src[VAR_13] || !dst[VAR_13] || !out[VAR_13]) {

            perror("Malloc");

            VAR_17 = -1;



            goto end;

        }

    }



    VAR_15 = VAR_16 = NULL;

    VAR_14= sws_getContext(VAR_2, VAR_3, PIX_FMT_YUV420P, VAR_6, VAR_7, VAR_4, VAR_10, NULL, NULL, NULL);

    if (!VAR_14) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(PIX_FMT_YUV420P),

                sws_format_name(VAR_4));

        VAR_17 = -1;



        goto end;

    }

    VAR_15= sws_getContext(VAR_6, VAR_7, VAR_4, VAR_8, VAR_9, VAR_5, VAR_10, NULL, NULL, NULL);

    if (!VAR_15) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(VAR_4),

                sws_format_name(VAR_5));

        VAR_17 = -1;



        goto end;

    }

    VAR_16= sws_getContext(VAR_8, VAR_9, VAR_5, VAR_2, VAR_3, PIX_FMT_YUV420P, VAR_10, NULL, NULL, NULL);

    if (!VAR_16) {

        fprintf(stderr, "Failed to get %s ---> %s\n",

                sws_format_name(VAR_5),

                sws_format_name(PIX_FMT_YUV420P));

        VAR_17 = -1;



        goto end;

    }







    sws_scale(VAR_14, VAR_0, VAR_1, 0, VAR_3   , src, VAR_11);

    sws_scale(VAR_15, src, VAR_11, 0, VAR_7, dst, VAR_12);

    sws_scale(VAR_16, dst, VAR_12, 0, VAR_9, out, VAR_1);



    ssdY= getSSD(VAR_0[0], out[0], VAR_1[0], VAR_1[0], VAR_2, VAR_3);

    ssdU= getSSD(VAR_0[1], out[1], VAR_1[1], VAR_1[1], (VAR_2+1)>>1, (VAR_3+1)>>1);

    ssdV= getSSD(VAR_0[2], out[2], VAR_1[2], VAR_1[2], (VAR_2+1)>>1, (VAR_3+1)>>1);



    if (VAR_4 == PIX_FMT_GRAY8 || VAR_5==PIX_FMT_GRAY8) ssdU=ssdV=0; 



    ssdY/= VAR_2*VAR_3;

    ssdU/= VAR_2*VAR_3/4;

    ssdV/= VAR_2*VAR_3/4;



    printf(" %s %dx%d -> %s %4dx%4d VAR_10=%2d SSD=%5lld,%5lld,%5lld\n",

           sws_format_name(VAR_4), VAR_6, VAR_7,

           sws_format_name(VAR_5), VAR_8, VAR_9,

           VAR_10, ssdY, ssdU, ssdV);

    fflush(stdout);



    end:



    sws_freeContext(VAR_14);

    sws_freeContext(VAR_15);

    sws_freeContext(VAR_16);



    for (VAR_13=0; VAR_13<3; VAR_13++){

        free(src[VAR_13]);

        free(dst[VAR_13]);

        free(out[VAR_13]);

    }



    return VAR_17;

}

static int FUNC_0(uint8_t *VAR_0[3], int VAR_1[3], int VAR_2, int VAR_3, int VAR_4, int VAR_5,
int VAR_6, int VAR_7, int VAR_8, int VAR_9, int VAR_10){ uint8_t *src[3]; uint8_t *dst[3]; uint8_t *out[3]; int VAR_11[3], VAR_12[3]; int VAR_13; uint64_t ssdY, ssdU, ssdV; struct SwsContext *VAR_14, *VAR_15, *VAR_16; int VAR_17; VAR_17 = 0; for (VAR_13=0; VAR_13<3; VAR_13++){ if (VAR_4==PIX_FMT_RGB24 || VAR_4==PIX_FMT_BGR24)
VAR_11[VAR_13]= VAR_6*3; else
VAR_11[VAR_13]= VAR_6*4; if (VAR_5==PIX_FMT_RGB24 || VAR_5==PIX_FMT_BGR24)
VAR_12[VAR_13]= VAR_8*3; else
VAR_12[VAR_13]= VAR_8*4; src[VAR_13]= (uint8_t*) malloc(VAR_11[VAR_13]*VAR_7); dst[VAR_13]= (uint8_t*) malloc(VAR_12[VAR_13]*VAR_9); out[VAR_13]= (uint8_t*) malloc(VAR_1[VAR_13]*VAR_3); if (!src[VAR_13] || !dst[VAR_13] || !out[VAR_13]) { perror("Malloc"); VAR_17 = -1; goto end; } } VAR_15 = VAR_16 = NULL; VAR_14= sws_getContext(VAR_2, VAR_3, PIX_FMT_YUV420P, VAR_6, VAR_7, VAR_4, VAR_10, NULL, NULL, NULL); if (!VAR_14) { fprintf(stderr, "Failed to get %s ---> %s\n",
sws_format_name(PIX_FMT_YUV420P),
sws_format_name(VAR_4)); VAR_17 = -1; goto end; } VAR_15= sws_getContext(VAR_6, VAR_7, VAR_4, VAR_8, VAR_9, VAR_5, VAR_10, NULL, NULL, NULL); if (!VAR_15) { fprintf(stderr, "Failed to get %s ---> %s\n",
sws_format_name(VAR_4),
sws_format_name(VAR_5)); VAR_17 = -1; goto end; } VAR_16= sws_getContext(VAR_8, VAR_9, VAR_5, VAR_2, VAR_3, PIX_FMT_YUV420P, VAR_10, NULL, NULL, NULL); if (!VAR_16) { fprintf(stderr, "Failed to get %s ---> %s\n",
sws_format_name(VAR_5),
sws_format_name(PIX_FMT_YUV420P)); VAR_17 = -1; goto end; } sws_scale(VAR_14, VAR_0, VAR_1, 0, VAR_3   , src, VAR_11); sws_scale(VAR_15, src, VAR_11, 0, VAR_7, dst, VAR_12); sws_scale(VAR_16, dst, VAR_12, 0, VAR_9, out, VAR_1); ssdY= getSSD(VAR_0[0], out[0], VAR_1[0], VAR_1[0], VAR_2, VAR_3); ssdU= getSSD(VAR_0[1], out[1], VAR_1[1], VAR_1[1], (VAR_2+1)>>1, (VAR_3+1)>>1); ssdV= getSSD(VAR_0[2], out[2], VAR_1[2], VAR_1[2], (VAR_2+1)>>1, (VAR_3+1)>>1); if (VAR_4 == PIX_FMT_GRAY8 || VAR_5==PIX_FMT_GRAY8) ssdU=ssdV=0; ssdY/= VAR_2*VAR_3; ssdU/= VAR_2*VAR_3/4; ssdV/= VAR_2*VAR_3/4; printf(" %s %dx%d -> %s %4dx%4d VAR_10=%2d SSD=%5lld,%5lld,%5lld\n",
sws_format_name(VAR_4), VAR_6, VAR_7,
sws_format_name(VAR_5), VAR_8, VAR_9,
VAR_10, ssdY, ssdU, ssdV); fflush(stdout); end:
sws_freeContext(VAR_14); sws_freeContext(VAR_15); sws_freeContext(VAR_16); for (VAR_13=0; VAR_13<3; VAR_13++){ free(src[VAR_13]); free(dst[VAR_13]); free(out[VAR_13]); } return VAR_17; }