static inline int snake_search(MpegEncContext * s, int *best, int dmin,

                                       UINT8 *new_pic, UINT8 *old_pic, int pic_stride,

                                       int pred_x, int pred_y, UINT16 *mv_penalty, int quant,

                                       int xmin, int ymin, int xmax, int ymax, int shift)

{

    int dir=0;

    int c=1;

    static int x_dir[8]= {1,1,0,-1,-1,-1, 0, 1};

    static int y_dir[8]= {0,1,1, 1, 0,-1,-1,-1};

    int fails=0;

    int last_d[2]={dmin, dmin};



/*static int good=0;

static int bad=0;

static int point=0;



point++;

if(256*256*256*64%point==0)

{

    printf("%d %d %d\n", good, bad, point);

}*/



    for(;;){

        int x= best[0];

        int y= best[1];

        int d;

        x+=x_dir[dir];

        y+=y_dir[dir];

        if(x>=xmin && x<=xmax && y>=ymin && y<=ymax){

            d = pix_abs16x16(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);

            d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;

        }else{

            d = dmin + 10000; //FIXME smarter boundary handling

        }

        if(d<dmin){

            best[0]=x;

            best[1]=y;

            dmin=d;



            if(last_d[1] - last_d[0] > last_d[0] - d) c= -c;

            dir+=c;



            fails=0;

//good++;

            last_d[1]=last_d[0];

            last_d[0]=d;

        }else{

//bad++;

            if(fails){

                if(fails>=3) return dmin;

            }else{

                c= -c;

            }

            dir+=c*2;

            fails++;

        }

        dir&=7;

    }

}

static inline int snake_search(MpegEncContext * s, int *best, int dmin,

                                       UINT8 *new_pic, UINT8 *old_pic, int pic_stride,

                                       int pred_x, int pred_y, UINT16 *mv_penalty, int quant,

                                       int xmin, int ymin, int xmax, int ymax, int shift)

{

    int dir=0;

    int c=1;

    static int x_dir[8]= {1,1,0,-1,-1,-1, 0, 1};

    static int y_dir[8]= {0,1,1, 1, 0,-1,-1,-1};

    int fails=0;

    int last_d[2]={dmin, dmin};























    for(;;){

        int x= best[0];

        int y= best[1];

        int d;

        x+=x_dir[dir];

        y+=y_dir[dir];

        if(x>=xmin && x<=xmax && y>=ymin && y<=ymax){

            d = pix_abs16x16(new_pic, old_pic + (x) + (y)*pic_stride, pic_stride);

            d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*quant;

        }else{

            d = dmin + 10000; 

        }

        if(d<dmin){

            best[0]=x;

            best[1]=y;

            dmin=d;



            if(last_d[1] - last_d[0] > last_d[0] - d) c= -c;

            dir+=c;



            fails=0;



            last_d[1]=last_d[0];

            last_d[0]=d;

        }else{



            if(fails){

                if(fails>=3) return dmin;

            }else{

                c= -c;

            }

            dir+=c*2;

            fails++;

        }

        dir&=7;

    }

}

static inline int FUNC_0(MpegEncContext * VAR_0, int *VAR_1, int VAR_2,

                                       UINT8 *VAR_3, UINT8 *VAR_4, int VAR_5,

                                       int VAR_6, int VAR_7, UINT16 *VAR_8, int VAR_9,

                                       int VAR_10, int VAR_11, int VAR_12, int VAR_13, int VAR_14)

{

    int VAR_15=0;

    int VAR_16=1;

    static int VAR_17[8]= {1,1,0,-1,-1,-1, 0, 1};

    static int VAR_18[8]= {0,1,1, 1, 0,-1,-1,-1};

    int VAR_19=0;

    int VAR_20[2]={VAR_2, VAR_2};























    for(;;){

        int VAR_21= VAR_1[0];

        int VAR_22= VAR_1[1];

        int VAR_23;

        VAR_21+=VAR_17[VAR_15];

        VAR_22+=VAR_18[VAR_15];

        if(VAR_21>=VAR_10 && VAR_21<=VAR_12 && VAR_22>=VAR_11 && VAR_22<=VAR_13){

            VAR_23 = pix_abs16x16(VAR_3, VAR_4 + (VAR_21) + (VAR_22)*VAR_5, VAR_5);

            VAR_23 += (VAR_8[((VAR_21)<<VAR_14)-VAR_6] + VAR_8[((VAR_22)<<VAR_14)-VAR_7])*VAR_9;

        }else{

            VAR_23 = VAR_2 + 10000; 

        }

        if(VAR_23<VAR_2){

            VAR_1[0]=VAR_21;

            VAR_1[1]=VAR_22;

            VAR_2=VAR_23;



            if(VAR_20[1] - VAR_20[0] > VAR_20[0] - VAR_23) VAR_16= -VAR_16;

            VAR_15+=VAR_16;



            VAR_19=0;



            VAR_20[1]=VAR_20[0];

            VAR_20[0]=VAR_23;

        }else{



            if(VAR_19){

                if(VAR_19>=3) return VAR_2;

            }else{

                VAR_16= -VAR_16;

            }

            VAR_15+=VAR_16*2;

            VAR_19++;

        }

        VAR_15&=7;

    }

}

static inline int FUNC_0(MpegEncContext * VAR_0, int *VAR_1, int VAR_2,
UINT8 *VAR_3, UINT8 *VAR_4, int VAR_5,
int VAR_6, int VAR_7, UINT16 *VAR_8, int VAR_9,
int VAR_10, int VAR_11, int VAR_12, int VAR_13, int VAR_14)
{ int VAR_15=0; int VAR_16=1; static int VAR_17[8]= {1,1,0,-1,-1,-1, 0, 1}; static int VAR_18[8]= {0,1,1, 1, 0,-1,-1,-1}; int VAR_19=0; int VAR_20[2]={VAR_2, VAR_2}; for(;;){ int VAR_21= VAR_1[0]; int VAR_22= VAR_1[1]; int VAR_23; VAR_21+=VAR_17[VAR_15]; VAR_22+=VAR_18[VAR_15]; if(VAR_21>=VAR_10 && VAR_21<=VAR_12 && VAR_22>=VAR_11 && VAR_22<=VAR_13){ VAR_23 = pix_abs16x16(VAR_3, VAR_4 + (VAR_21) + (VAR_22)*VAR_5, VAR_5); VAR_23 += (VAR_8[((VAR_21)<<VAR_14)-VAR_6] + VAR_8[((VAR_22)<<VAR_14)-VAR_7])*VAR_9; }else{ VAR_23 = VAR_2 + 10000; } if(VAR_23<VAR_2){ VAR_1[0]=VAR_21; VAR_1[1]=VAR_22; VAR_2=VAR_23; if(VAR_20[1] - VAR_20[0] > VAR_20[0] - VAR_23) VAR_16= -VAR_16; VAR_15+=VAR_16; VAR_19=0; VAR_20[1]=VAR_20[0]; VAR_20[0]=VAR_23; }else{ if(VAR_19){ if(VAR_19>=3) return VAR_2; }else{ VAR_16= -VAR_16; } VAR_15+=VAR_16*2; VAR_19++; } VAR_15&=7; } }