/*
 ============================================================================
 Name        : maskingmv.c
 Author      : jimbankoski
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern unsigned int vp8_sad16x16_sse3(
    unsigned char *src_ptr,
    int  src_stride,
    unsigned char *ref_ptr,
    int  ref_stride,
    int  max_err);

extern void vp8_sad16x16x3_sse3(
    unsigned char *src_ptr,
    int  src_stride,
    unsigned char *ref_ptr,
    int  ref_stride,
    int  *results);

extern int vp8_growmaskmb_sse3(
    unsigned char *om,
    unsigned char *nm);

extern void vp8_makemask_sse3(
    unsigned char *y,
    unsigned char *u,
    unsigned char *v,
    unsigned char *ym,
    int yp,
    int uvp,
    int ys,
    int us,
    int vs,
    int yt,
    int ut,
    int vt);

unsigned int vp8_sad16x16_unmasked_wmt(
    unsigned char *src_ptr,
    int  src_stride,
    unsigned char *ref_ptr,
    int  ref_stride,
    unsigned char *mask);

unsigned int vp8_sad16x16_masked_wmt(
    unsigned char *src_ptr,
    int  src_stride,
    unsigned char *ref_ptr,
    int  ref_stride,
    unsigned char *mask);

unsigned int vp8_masked_predictor_wmt(
    unsigned char *masked,
    unsigned char *unmasked,
    int  src_stride,
    unsigned char *dst_ptr,
    int  dst_stride,
    unsigned char *mask);
unsigned int vp8_masked_predictor_uv_wmt(
    unsigned char *masked,
    unsigned char *unmasked,
    int  src_stride,
    unsigned char *dst_ptr,
    int  dst_stride,
    unsigned char *mask);
unsigned int vp8_uv_from_y_mask(
    unsigned char *ymask,
    unsigned char *uvmask);
int yp=16;
unsigned char sxy[]=
{
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,80,120,120,90,90,90,90,90,80,120,120,90,90,90,90,90
};

unsigned char sts[]=
{
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
};
unsigned char str[]=
{
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
};

unsigned char y[]=
{
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,
40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,
60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,40,
60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,40,
60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,40,
40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,
40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,40,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,
40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,40,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40,
40,40,40,60,60,60,60,40,40,40,40,60,60,60,60,40
};
int uvp=8;
unsigned char u[]=
{
90,80,70,70,90,90,90,17,
90,80,70,70,90,90,90,17,
84,70,70,90,90,90,17,17,
84,70,70,90,90,90,17,17,
80,70,70,90,90,90,17,17,
90,80,70,70,90,90,90,17,
90,80,70,70,90,90,90,17,
90,80,70,70,90,90,90,17
};

unsigned char v[]=
{
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80,
80,80,80,80,80,80,80,80
};

unsigned char ym[256];
unsigned char uvm[64];
typedef struct
{
    unsigned char y;
    unsigned char yt;
    unsigned char u;
    unsigned char ut;
    unsigned char v;
    unsigned char vt;
    unsigned char use;
} COLOR_SEG_ELEMENT;

/*
COLOR_SEG_ELEMENT segmentation[]=
{
    { 60,4,80,17,80,10, 1},
    { 40,4,15,10,80,10, 1},
};
*/

COLOR_SEG_ELEMENT segmentation[]=
{
    { 79,44,92,44, 237,60, 1},
};

unsigned char pixel_mask(unsigned char y,unsigned char u,unsigned char v,
                COLOR_SEG_ELEMENT sgm[],
                int c)
{
    COLOR_SEG_ELEMENT *s=sgm;
    unsigned char m =0;
    int i;
    for(i=0;i<c;i++,s++)
        m |= ( abs(y-s->y)< s->yt &&
               abs(u-s->u)< s->ut &&
               abs(v-s->v)< s->vt ? 255 : 0 );

    return m;
}
int neighbors[256][8];
int makeneighbors(void)
{
    int i,j;
    for(i=0;i<256;i++)
    {
        int r=(i>>4),c=(i&15);
        int ni=0;
        for(j=0;j<8;j++)
            neighbors[i][j]=i;
        for(j=0;j<256;j++)
        {
            int nr=(j>>4),nc=(j&15);
            if(abs(nr-r)<2&&abs(nc-c)<2)
              neighbors[i][ni++]=j;
        }
    }
    return 0;
}
void grow_ymask(unsigned char *ym)
{
    unsigned char nym[256];
    int i,j;

    for(i=0;i<256;i++)
    {
        nym[i]=ym[i];
        for(j=0;j<8;j++)
        {
            nym[i]|=ym[neighbors[i][j]];
        }
    }
    for(i=0;i<256;i++)
        ym[i]=nym[i];
}
void make_mb_mask(unsigned char *y, unsigned char *u, unsigned char *v,
                  unsigned char *ym, unsigned char *uvm,
                  int yp, int uvp,
                  COLOR_SEG_ELEMENT sgm[],
                  int count)
{
    int r,c;
    unsigned char *oym = ym;

    memset(ym,20,256);
    for(r=0;r<8;r++,uvm+=8,u+=uvp,v+=uvp,y+=(yp+yp),ym+=32)
        for(c=0;c<8;c++)
        {
            int y1=y[c<<1];
            int u1=u[c];
            int v1=v[c];
            int m = pixel_mask(y1,u1,v1,sgm,count);
            uvm[c] = m;
            ym[c<<1] = uvm[c];// = pixel_mask(y[c<<1],u[c],v[c],sgm,count);
            ym[(c<<1)+1] = pixel_mask(y[1+(c<<1)],u[c],v[c],sgm,count);
            ym[(c<<1)+16] = pixel_mask(y[yp+(c<<1)],u[c],v[c],sgm,count);
            ym[(c<<1)+17] = pixel_mask(y[1+yp+(c<<1)],u[c],v[c],sgm,count);
        }
    grow_ymask(oym);
}

int masked_sad(unsigned char *src, int p, unsigned char *dst, int dp,
               unsigned char *ym )
{
    int i,j;
    unsigned sad = 0;
    for(i=0;i<16;i++,src+=p,dst+=dp,ym+=16)
        for(j=0;j<16;j++)
            if(ym[j])
                sad+= abs(src[j]-dst[j]);

    return sad;
}

int compare_masks(unsigned char *sym, unsigned char *ym)
{
    int i,j;
    unsigned sad = 0;
    for(i=0;i<16;i++,sym += 16,ym+=16)
        for(j=0;j<16;j++)
            sad+= (sym[j]!=ym[j]?1:0);

    return sad;
}
int unmasked_sad(unsigned char *src, int p, unsigned char *dst, int dp,
               unsigned char *ym)
{
    int i,j;
    unsigned sad = 0;
    for(i=0;i<16;i++,src+=p,dst+=dp,ym+=16)
        for(j=0;j<16;j++)
            if(!ym[j])
                sad+= abs(src[j]-dst[j]);

    return sad;
}
int masked_motion_search( unsigned char *y, unsigned char *u, unsigned char *v,
                          int yp, int uvp,
                          unsigned char *dy, unsigned char *du, unsigned char *dv,
                          int dyp, int duvp,
                          COLOR_SEG_ELEMENT sgm[],
                          int count,
                          int *mi,
                          int *mj,
                          int *ui,
                          int *uj,
                          int *wm)
{
    int i,j;

    unsigned char ym[256];
    unsigned char uvm[64];
    unsigned char dym[256];
    unsigned char duvm[64];
    unsigned int e = 0 ;
    int beste=256;
    int bmi=-32,bmj=-32;
    int bui=-32,buj=-32;
    int beste1=256;
    int bmi1=-32,bmj1=-32;
    int bui1=-32,buj1=-32;
    int obeste;

    // first try finding best mask and then unmasked
    beste = 0xffffffff;

    // find best unmasked mv
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        unsigned char *duz = i/2*duvp + du;
        unsigned char *dvz = i/2*duvp + dv;
        for(j=-32;j<32;j++)
        {
            // 0,0  masked destination
            make_mb_mask(dyz+j,duz+j/2, dvz+j/2, dym, duvm, dyp, duvp,sgm,count);

            e = unmasked_sad(y, yp, dyz+j, dyp, dym );

            if(e<beste)
            {
                bui=i;
                buj=j;
                beste=e;
            }
        }
    }
    //bui=0;buj=0;
    // best mv masked destination
    make_mb_mask(dy+bui*dyp+buj,du+bui/2*duvp+buj/2, dv+bui/2*duvp+buj/2,
                 dym, duvm, dyp, duvp,sgm,count);

    obeste = beste;
    beste = 0xffffffff;

    // find best masked
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        for(j=-32;j<32;j++)
        {
            e = masked_sad(y, yp, dyz+j, dyp, dym );

            if(e<beste)
            {
                bmi=i;
                bmj=j;
                beste=e;
            }
        }
    }
    beste1=beste+obeste;
    bmi1=bmi;bmj1=bmj;
    bui1=bui;buj1=buj;

    beste = 0xffffffff;
    // source mask
    make_mb_mask(y,u, v, ym, uvm, yp, uvp,sgm,count);

    // find best mask
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        unsigned char *duz = i/2*duvp + du;
        unsigned char *dvz = i/2*duvp + dv;
        for(j=-32;j<32;j++)
        {
            // 0,0  masked destination
            make_mb_mask(dyz+j,duz+j/2, dvz+j/2, dym, duvm, dyp, duvp,sgm,count);

            e = compare_masks(ym, dym);

            if(e<beste)
            {
                bmi=i;
                bmj=j;
                beste=e;
            }
        }
    }


    // best mv masked destination
    make_mb_mask(dy+bmi*dyp+bmj,du+bmi/2*duvp+bmj/2, dv+bmi/2*duvp+bmj/2,
                 dym, duvm, dyp, duvp,sgm,count);

    obeste = masked_sad(y, yp, dy+bmi*dyp+bmj, dyp, dym );

    beste = 0xffffffff;

    // find best unmasked mv
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        for(j=-32;j<32;j++)
        {
            e = unmasked_sad(y, yp, dyz+j, dyp, dym );

            if(e<beste)
            {
                bui=i;
                buj=j;
                beste=e;
            }
        }
    }
    beste += obeste;


    if(beste<beste1)
    {
        *mi = bmi;
        *mj = bmj;
        *ui = bui;
        *uj = buj;
        *wm = 1;
    }
    else
    {
        *mi = bmi1;
        *mj = bmj1;
        *ui = bui1;
        *uj = buj1;
        *wm = 0;

    }
    return 0;
}

int predict(unsigned char *src, int p, unsigned char *dst, int dp,
            unsigned char *ym, unsigned char *prd )
{
    int i,j;
    for(i=0;i<16;i++,src+=p,dst+=dp,ym+=16, prd+=16)
        for(j=0;j<16;j++)
            prd[j]=(ym[j] ? src[j]:dst[j]);
    return 0;
}

int fast_masked_motion_search( unsigned char *y, unsigned char *u, unsigned char *v,
                          int yp, int uvp,
                          unsigned char *dy, unsigned char *du, unsigned char *dv,
                          int dyp, int duvp,
                          COLOR_SEG_ELEMENT sgm[],
                          int count,
                          int *mi,
                          int *mj,
                          int *ui,
                          int *uj,
                          int *wm)
{
    int i,j;

    unsigned char ym[256];
    unsigned char ym2[256];
    unsigned char uvm[64];
    unsigned char dym2[256];
    unsigned char dym[256];
    unsigned char duvm[64];
    unsigned int e = 0 ;
    int beste=256;
    int bmi=-32,bmj=-32;
    int bui=-32,buj=-32;
    int beste1=256;
    int bmi1=-32,bmj1=-32;
    int bui1=-32,buj1=-32;
    int obeste;

    // first try finding best mask and then unmasked
    beste = 0xffffffff;

#if 0
    for(i=0;i<16;i++)
    {
        unsigned char *dy = i*yp + y;
        for(j=0;j<16;j++)
            printf("%2x",dy[j]);
        printf("\n");
    }
    printf("\n");

    for(i=-32;i<48;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        for(j=-32;j<48;j++)
            printf("%2x",dyz[j]);
        printf("\n");
    }
#endif

    // find best unmasked mv
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        unsigned char *duz = i/2*duvp + du;
        unsigned char *dvz = i/2*duvp + dv;
        for(j=-32;j<32;j++)
        {
            // 0,0  masked destination
            vp8_makemask_sse3(dyz+j,duz+j/2, dvz+j/2, dym, dyp, duvp,
                              sgm[0].y,sgm[0].u,sgm[0].v,
                              sgm[0].yt,sgm[0].ut,sgm[0].vt);

            vp8_growmaskmb_sse3(dym,dym2);

            e = vp8_sad16x16_unmasked_wmt(y, yp, dyz+j, dyp, dym2 );

            if(e<beste)
            {
                bui=i;
                buj=j;
                beste=e;
            }
        }
    }
    //bui=0;buj=0;
    // best mv masked destination

    vp8_makemask_sse3(dy+bui*dyp+buj,du+bui/2*duvp+buj/2, dv+bui/2*duvp+buj/2,
                      dym, dyp, duvp,
                      sgm[0].y,sgm[0].u,sgm[0].v,
                      sgm[0].yt,sgm[0].ut,sgm[0].vt);

    vp8_growmaskmb_sse3(dym,dym2);

    obeste = beste;
    beste = 0xffffffff;

    // find best masked
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        for(j=-32;j<32;j++)
        {
            e = vp8_sad16x16_masked_wmt(y, yp, dyz+j, dyp, dym2 );
            if(e<beste)
            {
                bmi=i;
                bmj=j;
                beste=e;
            }
        }
    }
    beste1=beste+obeste;
    bmi1=bmi;bmj1=bmj;
    bui1=bui;buj1=buj;

    // source mask
    vp8_makemask_sse3(y,u, v,
                        ym, yp, uvp,
                        sgm[0].y,sgm[0].u,sgm[0].v,
                        sgm[0].yt,sgm[0].ut,sgm[0].vt);

    vp8_growmaskmb_sse3(ym,ym2);

    // find best mask
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        unsigned char *duz = i/2*duvp + du;
        unsigned char *dvz = i/2*duvp + dv;
        for(j=-32;j<32;j++)
        {
            // 0,0  masked destination
            vp8_makemask_sse3(dyz+j,duz+j/2, dvz+j/2, dym, dyp, duvp,
                              sgm[0].y,sgm[0].u,sgm[0].v,
                              sgm[0].yt,sgm[0].ut,sgm[0].vt);

            vp8_growmaskmb_sse3(dym,dym2);

            e = compare_masks(ym2, dym2);

            if(e<beste)
            {
                bmi=i;
                bmj=j;
                beste=e;
            }
        }
    }

    vp8_makemask_sse3(dy+bmi*dyp+bmj,du+bmi/2*duvp+bmj/2, dv+bmi/2*duvp+bmj/2,
                      dym, dyp, duvp,
                      sgm[0].y,sgm[0].u,sgm[0].v,
                      sgm[0].yt,sgm[0].ut,sgm[0].vt);

    vp8_growmaskmb_sse3(dym,dym2);

    obeste = vp8_sad16x16_masked_wmt(y, yp, dy+bmi*dyp+bmj, dyp, dym2 );

    beste = 0xffffffff;

    // find best unmasked mv
    for(i=-32;i<32;i++)
    {
        unsigned char *dyz = i*dyp + dy;
        for(j=-32;j<32;j++)
        {
            e = vp8_sad16x16_unmasked_wmt(y, yp, dyz+j, dyp, dym2 );

            if(e<beste)
            {
                bui=i;
                buj=j;
                beste=e;
            }
        }
    }
    beste += obeste;

    if(beste<beste1)
    {
        *mi = bmi;
        *mj = bmj;
        *ui = bui;
        *uj = buj;
        *wm = 1;
    }
    else
    {
        *mi = bmi1;
        *mj = bmj1;
        *ui = bui1;
        *uj = buj1;
        *wm = 0;
        beste=beste1;

    }
    return beste;
}

int predict_all(unsigned char *ym, unsigned char *um, unsigned char *vm,
                int ymp, int uvmp,
                unsigned char *yp, unsigned char *up, unsigned char *vp,
                int ypp, int uvpp,
                COLOR_SEG_ELEMENT sgm[],
                int count,
                int mi,
                int mj,
                int ui,
                int uj,
                int wm)
{
    int i,j;
    unsigned char dym[256];
    unsigned char dym2[256];
    unsigned char duvm[64];
    unsigned char *yu=ym,*uu=um, *vu=vm;

    unsigned char *dym3=dym2;

    ym+=mi*ymp+mj;
    um+=mi/2*uvmp+mj/2;
    vm+=mi/2*uvmp+mj/2;

    yu+=ui*ymp+uj;
    uu+=ui/2*uvmp+uj/2;
    vu+=ui/2*uvmp+uj/2;

    // best mv masked destination
    if(wm)
        vp8_makemask_sse3(ym,um, vm, dym, ymp, uvmp,
                              sgm[0].y,sgm[0].u,sgm[0].v,
                              sgm[0].yt,sgm[0].ut,sgm[0].vt);
    else
        vp8_makemask_sse3(yu,uu, vu, dym, ymp, uvmp,
                              sgm[0].y,sgm[0].u,sgm[0].v,
                              sgm[0].yt,sgm[0].ut,sgm[0].vt);

    vp8_growmaskmb_sse3(dym,dym2);
    vp8_masked_predictor_wmt(ym,yu,ymp,yp,ypp,dym3);
    vp8_uv_from_y_mask(dym3,duvm);
    vp8_masked_predictor_uv_wmt(um,uu,uvmp,up,uvpp,duvm);
    vp8_masked_predictor_uv_wmt(vm,vu,uvmp,vp,uvpp,duvm);

    return 0;
}

unsigned char f0p[1280*720*3/2];
unsigned char f1p[1280*720*3/2];
unsigned char prd[1280*720*3/2];
unsigned char msk[1280*720*3/2];


int mainz(int argc, char *argv[]) {

    FILE *f=fopen(argv[1],"rb");
    FILE *g=fopen(argv[2],"wb");
    int w=atoi(argv[3]),h=atoi(argv[4]);
    int y_stride=w,uv_stride=w/2;
    int r,c;
    unsigned char *f0=f0p,*f1=f1p,*t;
    unsigned char ym[256],uvm[64];
    unsigned char ym2[256],uvm2[64];
    unsigned char ym3[256],uvm3[64];
    int a,b;

    COLOR_SEG_ELEMENT last={ 20,20,20,20, 230,20, 1},best;
#if 0
    makeneighbors();
    COLOR_SEG_ELEMENT segmentation[]=
    {
        { 60,4,80,17,80,10, 1},
        { 40,4,15,10,80,10, 1},
    };
    make_mb_mask(y, u, v,ym2,uvm2,16,8,segmentation,1);

    vp8_makemask_sse3(y,u,v,ym, (int) 16,(int) 8,
                      (int) segmentation[0].y,(int) segmentation[0].u,(int) segmentation[0].v,
                      segmentation[0].yt,segmentation[0].ut,segmentation[0].vt);

    vp8_growmaskmb_sse3(ym,ym3);

    a = vp8_sad16x16_masked_wmt(str,16,sts,16,ym3);
    b = vp8_sad16x16_unmasked_wmt(str,16,sts,16,ym3);

    vp8_masked_predictor_wmt(str,sts,16,ym,16,ym3);

    vp8_uv_from_y_mask(ym3,uvm3);

    return 4;
#endif
    makeneighbors();


    memset(prd,128,w*h*3/2);

    fread(f0,w*h*3/2,1,f);

    while(!feof(f))
    {
        unsigned char *ys=f1,*yd=f0,*yp=prd;
        unsigned char *us=f1+w*h,*ud=f0+w*h,*up=prd+w*h;
        unsigned char *vs=f1+w*h*5/4,*vd=f0+w*h*5/4,*vp=prd+w*h*5/4;
        fread(f1,w*h*3/2,1,f);

        ys+=32*y_stride;yd+=32*y_stride;yp+=32*y_stride;
        us+=16*uv_stride;ud+=16*uv_stride;up+=16*uv_stride;
        vs+=16*uv_stride;vd+=16*uv_stride;vp+=16*uv_stride;
        for(r=32;r<h-32;r+=16,
            ys+=16*w,yd+=16*w,yp+=16*w,
            us+=8*uv_stride,ud+=8*uv_stride,up+=8*uv_stride,
            vs+=8*uv_stride,vd+=8*uv_stride,vp+=8*uv_stride)
        {
            for(c=32;c<w-32;c+=16)
            {
                int mi,mj,ui,uj,wm;
                int bmi,bmj,bui,buj,bwm;
                unsigned char ym[256];

                if(vp8_sad16x16_sse3( ys+c,y_stride, yd+c,y_stride,0xffff) == 0)
                    bmi=bmj=bui=buj=bwm=0;
                else
                {
                    COLOR_SEG_ELEMENT cs[5];
                    int j;
                    unsigned int beste=0xfffffff;
                    unsigned int bestj=0;

                    // try color from last mb segmentation
                    cs[0] = last;

                    // try color segs from 4 pixels in mb recon as segmentation
                    cs[1].y = yd[c + y_stride + 1];cs[1].u = ud[c/2 + uv_stride];
                    cs[1].v = vd[c/2 + uv_stride];
                    cs[1].yt = cs[1].ut = cs[1].vt = 20;
                    cs[2].y = yd[c + w + 14];
                    cs[2].u = ud[c/2 + uv_stride+7];
                    cs[2].v = vd[c/2 + uv_stride+7];
                    cs[2].yt = cs[2].ut = cs[2].vt = 20;
                    cs[3].y = yd[c + w*14 + 1];
                    cs[3].u = ud[c/2 + uv_stride*7];
                    cs[3].v = vd[c/2 + uv_stride*7];
                    cs[3].yt = cs[3].ut = cs[3].vt = 20;
                    cs[4].y = yd[c + w*14 + 14];
                    cs[4].u = ud[c/2 + uv_stride*7+7];
                    cs[4].v = vd[c/2 + uv_stride*7+7];
                    cs[4].yt = cs[4].ut = cs[4].vt = 20;

                    for(j=0;j<5;j++)
                    {
                        int e;

                        e = fast_masked_motion_search(
                           ys+c, us+c/2, vs+c/2, y_stride, uv_stride,
                           yd+c, ud+c/2, vd+c/2, y_stride, uv_stride,
                           &cs[j], 1, &mi,&mj,&ui,&uj,&wm);

                        if(e<beste)
                        {
                            bmi=mi;bmj=mj;bui=ui;buj=uj,bwm=wm;
                            bestj=j;
                            beste=e;
                        }
                    }
                    best = cs[bestj];
                    //best = segmentation[0];
                    last = best;
                }
                predict_all(yd+c, ud+c/2, vd+c/2, w, uv_stride,
                            yp+c, up+c/2, vp+c/2, w, uv_stride,
                            &best, 1, bmi,bmj,bui,buj,bwm);

            }
        }
        fwrite(prd,w*h*3/2,1,g);
        t=f0;
        f0=f1;
        f1=t;

    }
    fclose(f);
    fclose(g);
	return;
}
