int estimate_motion(MpegEncContext * s,

		    int mb_x, int mb_y,

		    int *mx_ptr, int *my_ptr)

{

    UINT8 *pix, *ppix;

    int sum, varc, vard, mx, my, range, dmin, xx, yy;

    int xmin, ymin, xmax, ymax;

    int rel_xmin, rel_ymin, rel_xmax, rel_ymax;

    int pred_x=0, pred_y=0;

    int P[5][2];

    const int shift= 1+s->quarter_sample;

    

    range = 8 * (1 << (s->f_code - 1));

    /* XXX: temporary kludge to avoid overflow for msmpeg4 */

    if (s->out_format == FMT_H263 && !s->h263_msmpeg4)

	range = range * 2;



    if (s->unrestricted_mv) {

        xmin = -16;

        ymin = -16;

        if (s->h263_plus)

            range *= 2;

        if(s->avctx==NULL || s->avctx->codec->id!=CODEC_ID_MPEG4){

            xmax = s->mb_width*16;

            ymax = s->mb_height*16;

        }else {

            /* XXX: dunno if this is correct but ffmpeg4 decoder wont like it otherwise 

	            (cuz the drawn edge isnt large enough))*/

            xmax = s->width;

            ymax = s->height;

        }

    } else {

        xmin = 0;

        ymin = 0;

        xmax = s->mb_width*16 - 16;

        ymax = s->mb_height*16 - 16;

    }

    switch(s->full_search) {

    case ME_ZERO:

    default:

	no_motion_search(s, &mx, &my);

        dmin = 0;

        break;

    case ME_FULL:

	dmin = full_motion_search(s, &mx, &my, range, xmin, ymin, xmax, ymax);

        break;

    case ME_LOG:

	dmin = log_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax);

        break;

    case ME_PHODS:

	dmin = phods_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax);

        break;

    case ME_X1: // just reserving some space for experiments ...

    case ME_EPZS:

        rel_xmin= xmin - s->mb_x*16;

        rel_xmax= xmax - s->mb_x*16;

        rel_ymin= ymin - s->mb_y*16;

        rel_ymax= ymax - s->mb_y*16;

        if(s->out_format == FMT_H263){

            static const int off[4]= {2, 1, 1, -1};

            const int mot_stride = s->block_wrap[0];

            const int mot_xy = s->block_index[0];

         

            P[0][0] = s->motion_val[mot_xy    ][0];

            P[0][1] = s->motion_val[mot_xy    ][1];

            P[1][0] = s->motion_val[mot_xy - 1][0];

            P[1][1] = s->motion_val[mot_xy - 1][1];

            if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift);



            /* special case for first line */

            if ((s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) {

                pred_x = P[1][0];

                pred_y = P[1][1];

            } else {

                P[2][0] = s->motion_val[mot_xy - mot_stride             ][0];

                P[2][1] = s->motion_val[mot_xy - mot_stride             ][1];

                P[3][0] = s->motion_val[mot_xy - mot_stride + off[0]    ][0];

                P[3][1] = s->motion_val[mot_xy - mot_stride + off[0]    ][1];

                if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift);

                if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift);

                if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift);

        

                P[4][0]= pred_x = mid_pred(P[1][0], P[2][0], P[3][0]);

                P[4][1]= pred_y = mid_pred(P[1][1], P[2][1], P[3][1]);

            }

        }else {

            const int xy= s->mb_y*s->mb_width + s->mb_x;

            pred_x= s->last_mv[0][0][0];

            pred_y= s->last_mv[0][0][1];



            P[0][0]= s->mv_table[0][xy  ];

            P[0][1]= s->mv_table[1][xy  ];

            if(s->mb_x == 0){

                P[1][0]= 0;

                P[1][1]= 0;

            }else{

                P[1][0]= s->mv_table[0][xy-1];

                P[1][1]= s->mv_table[1][xy-1];

                if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift);

            }

    

            if (!(s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) {

                P[2][0] = s->mv_table[0][xy - s->mb_width];

                P[2][1] = s->mv_table[1][xy - s->mb_width];

                P[3][0] = s->mv_table[0][xy - s->mb_width+1];

                P[3][1] = s->mv_table[1][xy - s->mb_width+1];

                if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift);

                if(P[3][0] > (rel_xmax<<shift)) P[3][0]= (rel_xmax<<shift);

                if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift);

                if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift);

        

                P[4][0]= mid_pred(P[1][0], P[2][0], P[3][0]);

                P[4][1]= mid_pred(P[1][1], P[2][1], P[3][1]);

            }

        }

	dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax);

        mx+= s->mb_x*16;

        my+= s->mb_y*16;

        break;

    }



    /* intra / predictive decision */

    xx = mb_x * 16;

    yy = mb_y * 16;



    pix = s->new_picture[0] + (yy * s->linesize) + xx;

    /* At this point (mx,my) are full-pell and the absolute displacement */

    ppix = s->last_picture[0] + (my * s->linesize) + mx;



    sum = pix_sum(pix, s->linesize);

    varc = pix_norm1(pix, s->linesize);

    vard = pix_norm(pix, ppix, s->linesize);



    vard = vard >> 8;

    sum = sum >> 8;

    varc = (varc >> 8) - (sum * sum);

    s->mb_var[s->mb_width * mb_y + mb_x] = varc;

    s->avg_mb_var += varc;

    s->mc_mb_var += vard;

     

#if 0

    printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",

	   varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);

#endif

    if (vard <= 64 || vard < varc) {

        if (s->full_search != ME_ZERO) {

            halfpel_motion_search(s, &mx, &my, dmin, xmin, ymin, xmax, ymax, pred_x, pred_y);

        } else {

            mx -= 16 * s->mb_x;

            my -= 16 * s->mb_y;

        }

	*mx_ptr = mx;

	*my_ptr = my;

	return 0;

    } else {

	*mx_ptr = 0;

	*my_ptr = 0;

	return 1;

    }

}

int estimate_motion(MpegEncContext * s,

		    int mb_x, int mb_y,

		    int *mx_ptr, int *my_ptr)

{

    UINT8 *pix, *ppix;

    int sum, varc, vard, mx, my, range, dmin, xx, yy;

    int xmin, ymin, xmax, ymax;

    int rel_xmin, rel_ymin, rel_xmax, rel_ymax;

    int pred_x=0, pred_y=0;

    int P[5][2];

    const int shift= 1+s->quarter_sample;

    

    range = 8 * (1 << (s->f_code - 1));

    

    if (s->out_format == FMT_H263 && !s->h263_msmpeg4)

	range = range * 2;



    if (s->unrestricted_mv) {

        xmin = -16;

        ymin = -16;

        if (s->h263_plus)

            range *= 2;

        if(s->avctx==NULL || s->avctx->codec->id!=CODEC_ID_MPEG4){

            xmax = s->mb_width*16;

            ymax = s->mb_height*16;

        }else {

            



            xmax = s->width;

            ymax = s->height;

        }

    } else {

        xmin = 0;

        ymin = 0;

        xmax = s->mb_width*16 - 16;

        ymax = s->mb_height*16 - 16;

    }

    switch(s->full_search) {

    case ME_ZERO:

    default:

	no_motion_search(s, &mx, &my);

        dmin = 0;

        break;

    case ME_FULL:

	dmin = full_motion_search(s, &mx, &my, range, xmin, ymin, xmax, ymax);

        break;

    case ME_LOG:

	dmin = log_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax);

        break;

    case ME_PHODS:

	dmin = phods_motion_search(s, &mx, &my, range / 2, xmin, ymin, xmax, ymax);

        break;

    case ME_X1: 

    case ME_EPZS:

        rel_xmin= xmin - s->mb_x*16;

        rel_xmax= xmax - s->mb_x*16;

        rel_ymin= ymin - s->mb_y*16;

        rel_ymax= ymax - s->mb_y*16;

        if(s->out_format == FMT_H263){

            static const int off[4]= {2, 1, 1, -1};

            const int mot_stride = s->block_wrap[0];

            const int mot_xy = s->block_index[0];

         

            P[0][0] = s->motion_val[mot_xy    ][0];

            P[0][1] = s->motion_val[mot_xy    ][1];

            P[1][0] = s->motion_val[mot_xy - 1][0];

            P[1][1] = s->motion_val[mot_xy - 1][1];

            if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift);



            

            if ((s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) {

                pred_x = P[1][0];

                pred_y = P[1][1];

            } else {

                P[2][0] = s->motion_val[mot_xy - mot_stride             ][0];

                P[2][1] = s->motion_val[mot_xy - mot_stride             ][1];

                P[3][0] = s->motion_val[mot_xy - mot_stride + off[0]    ][0];

                P[3][1] = s->motion_val[mot_xy - mot_stride + off[0]    ][1];

                if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift);

                if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift);

                if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift);

        

                P[4][0]= pred_x = mid_pred(P[1][0], P[2][0], P[3][0]);

                P[4][1]= pred_y = mid_pred(P[1][1], P[2][1], P[3][1]);

            }

        }else {

            const int xy= s->mb_y*s->mb_width + s->mb_x;

            pred_x= s->last_mv[0][0][0];

            pred_y= s->last_mv[0][0][1];



            P[0][0]= s->mv_table[0][xy  ];

            P[0][1]= s->mv_table[1][xy  ];

            if(s->mb_x == 0){

                P[1][0]= 0;

                P[1][1]= 0;

            }else{

                P[1][0]= s->mv_table[0][xy-1];

                P[1][1]= s->mv_table[1][xy-1];

                if(P[1][0] > (rel_xmax<<shift)) P[1][0]= (rel_xmax<<shift);

            }

    

            if (!(s->mb_y == 0 || s->first_slice_line || s->first_gob_line)) {

                P[2][0] = s->mv_table[0][xy - s->mb_width];

                P[2][1] = s->mv_table[1][xy - s->mb_width];

                P[3][0] = s->mv_table[0][xy - s->mb_width+1];

                P[3][1] = s->mv_table[1][xy - s->mb_width+1];

                if(P[2][1] > (rel_ymax<<shift)) P[2][1]= (rel_ymax<<shift);

                if(P[3][0] > (rel_xmax<<shift)) P[3][0]= (rel_xmax<<shift);

                if(P[3][0] < (rel_xmin<<shift)) P[3][0]= (rel_xmin<<shift);

                if(P[3][1] > (rel_ymax<<shift)) P[3][1]= (rel_ymax<<shift);

        

                P[4][0]= mid_pred(P[1][0], P[2][0], P[3][0]);

                P[4][1]= mid_pred(P[1][1], P[2][1], P[3][1]);

            }

        }

	dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax);

        mx+= s->mb_x*16;

        my+= s->mb_y*16;

        break;

    }



    

    xx = mb_x * 16;

    yy = mb_y * 16;



    pix = s->new_picture[0] + (yy * s->linesize) + xx;

    

    ppix = s->last_picture[0] + (my * s->linesize) + mx;



    sum = pix_sum(pix, s->linesize);

    varc = pix_norm1(pix, s->linesize);

    vard = pix_norm(pix, ppix, s->linesize);



    vard = vard >> 8;

    sum = sum >> 8;

    varc = (varc >> 8) - (sum * sum);

    s->mb_var[s->mb_width * mb_y + mb_x] = varc;

    s->avg_mb_var += varc;

    s->mc_mb_var += vard;

     

#if 0

    printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",

	   varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);

#endif

    if (vard <= 64 || vard < varc) {

        if (s->full_search != ME_ZERO) {

            halfpel_motion_search(s, &mx, &my, dmin, xmin, ymin, xmax, ymax, pred_x, pred_y);

        } else {

            mx -= 16 * s->mb_x;

            my -= 16 * s->mb_y;

        }

	*mx_ptr = mx;

	*my_ptr = my;

	return 0;

    } else {

	*mx_ptr = 0;

	*my_ptr = 0;

	return 1;

    }

}

            const int mot_stride = s->block_wrap[0];             const int mot_xy = s->block_index[0]; 	dmin = epzs_motion_search(s, &mx, &my, P, pred_x, pred_y, rel_xmin, rel_ymin, rel_xmax, rel_ymax);
int FUNC_0(MpegEncContext * VAR_0,

		    int VAR_1, int VAR_2,

		    int *VAR_3, int *VAR_4)

{

    UINT8 *pix, *ppix;

    int VAR_5, VAR_6, VAR_7, VAR_8, VAR_9, VAR_10, VAR_11, VAR_12, VAR_13;

    int VAR_14, VAR_15, VAR_16, VAR_17;

    int VAR_18, VAR_19, VAR_20, VAR_21;

    int VAR_22=0, VAR_23=0;

    int VAR_24[5][2];

    const int VAR_25= 1+VAR_0->quarter_sample;

    

    VAR_10 = 8 * (1 << (VAR_0->f_code - 1));

    

    if (VAR_0->out_format == FMT_H263 && !VAR_0->h263_msmpeg4)

	VAR_10 = VAR_10 * 2;



    if (VAR_0->unrestricted_mv) {

        VAR_14 = -16;

        VAR_15 = -16;

        if (VAR_0->h263_plus)

            VAR_10 *= 2;

        if(VAR_0->avctx==NULL || VAR_0->avctx->codec->id!=CODEC_ID_MPEG4){

            VAR_16 = VAR_0->mb_width*16;

            VAR_17 = VAR_0->mb_height*16;

        }else {

            



            VAR_16 = VAR_0->width;

            VAR_17 = VAR_0->height;

        }

    } else {

        VAR_14 = 0;

        VAR_15 = 0;

        VAR_16 = VAR_0->mb_width*16 - 16;

        VAR_17 = VAR_0->mb_height*16 - 16;

    }

    switch(VAR_0->full_search) {

    case ME_ZERO:

    default:

	no_motion_search(VAR_0, &VAR_8, &VAR_9);

        VAR_11 = 0;

        break;

    case ME_FULL:

	VAR_11 = full_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_10, VAR_14, VAR_15, VAR_16, VAR_17);

        break;

    case ME_LOG:

	VAR_11 = log_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_10 / 2, VAR_14, VAR_15, VAR_16, VAR_17);

        break;

    case ME_PHODS:

	VAR_11 = phods_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_10 / 2, VAR_14, VAR_15, VAR_16, VAR_17);

        break;

    case ME_X1: 

    case ME_EPZS:

        VAR_18= VAR_14 - VAR_0->VAR_1*16;

        VAR_20= VAR_16 - VAR_0->VAR_1*16;

        VAR_19= VAR_15 - VAR_0->VAR_2*16;

        VAR_21= VAR_17 - VAR_0->VAR_2*16;

        if(VAR_0->out_format == FMT_H263){

            static const int VAR_26[4]= {2, 1, 1, -1};

            const int VAR_27 = VAR_0->block_wrap[0];

            const int VAR_28 = VAR_0->block_index[0];

         

            VAR_24[0][0] = VAR_0->motion_val[VAR_28    ][0];

            VAR_24[0][1] = VAR_0->motion_val[VAR_28    ][1];

            VAR_24[1][0] = VAR_0->motion_val[VAR_28 - 1][0];

            VAR_24[1][1] = VAR_0->motion_val[VAR_28 - 1][1];

            if(VAR_24[1][0] > (VAR_20<<VAR_25)) VAR_24[1][0]= (VAR_20<<VAR_25);



            

            if ((VAR_0->VAR_2 == 0 || VAR_0->first_slice_line || VAR_0->first_gob_line)) {

                VAR_22 = VAR_24[1][0];

                VAR_23 = VAR_24[1][1];

            } else {

                VAR_24[2][0] = VAR_0->motion_val[VAR_28 - VAR_27             ][0];

                VAR_24[2][1] = VAR_0->motion_val[VAR_28 - VAR_27             ][1];

                VAR_24[3][0] = VAR_0->motion_val[VAR_28 - VAR_27 + VAR_26[0]    ][0];

                VAR_24[3][1] = VAR_0->motion_val[VAR_28 - VAR_27 + VAR_26[0]    ][1];

                if(VAR_24[2][1] > (VAR_21<<VAR_25)) VAR_24[2][1]= (VAR_21<<VAR_25);

                if(VAR_24[3][0] < (VAR_18<<VAR_25)) VAR_24[3][0]= (VAR_18<<VAR_25);

                if(VAR_24[3][1] > (VAR_21<<VAR_25)) VAR_24[3][1]= (VAR_21<<VAR_25);

        

                VAR_24[4][0]= VAR_22 = mid_pred(VAR_24[1][0], VAR_24[2][0], VAR_24[3][0]);

                VAR_24[4][1]= VAR_23 = mid_pred(VAR_24[1][1], VAR_24[2][1], VAR_24[3][1]);

            }

        }else {

            const int VAR_29= VAR_0->VAR_2*VAR_0->mb_width + VAR_0->VAR_1;

            VAR_22= VAR_0->last_mv[0][0][0];

            VAR_23= VAR_0->last_mv[0][0][1];



            VAR_24[0][0]= VAR_0->mv_table[0][VAR_29  ];

            VAR_24[0][1]= VAR_0->mv_table[1][VAR_29  ];

            if(VAR_0->VAR_1 == 0){

                VAR_24[1][0]= 0;

                VAR_24[1][1]= 0;

            }else{

                VAR_24[1][0]= VAR_0->mv_table[0][VAR_29-1];

                VAR_24[1][1]= VAR_0->mv_table[1][VAR_29-1];

                if(VAR_24[1][0] > (VAR_20<<VAR_25)) VAR_24[1][0]= (VAR_20<<VAR_25);

            }

    

            if (!(VAR_0->VAR_2 == 0 || VAR_0->first_slice_line || VAR_0->first_gob_line)) {

                VAR_24[2][0] = VAR_0->mv_table[0][VAR_29 - VAR_0->mb_width];

                VAR_24[2][1] = VAR_0->mv_table[1][VAR_29 - VAR_0->mb_width];

                VAR_24[3][0] = VAR_0->mv_table[0][VAR_29 - VAR_0->mb_width+1];

                VAR_24[3][1] = VAR_0->mv_table[1][VAR_29 - VAR_0->mb_width+1];

                if(VAR_24[2][1] > (VAR_21<<VAR_25)) VAR_24[2][1]= (VAR_21<<VAR_25);

                if(VAR_24[3][0] > (VAR_20<<VAR_25)) VAR_24[3][0]= (VAR_20<<VAR_25);

                if(VAR_24[3][0] < (VAR_18<<VAR_25)) VAR_24[3][0]= (VAR_18<<VAR_25);

                if(VAR_24[3][1] > (VAR_21<<VAR_25)) VAR_24[3][1]= (VAR_21<<VAR_25);

        

                VAR_24[4][0]= mid_pred(VAR_24[1][0], VAR_24[2][0], VAR_24[3][0]);

                VAR_24[4][1]= mid_pred(VAR_24[1][1], VAR_24[2][1], VAR_24[3][1]);

            }

        }

	VAR_11 = epzs_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_24, VAR_22, VAR_23, VAR_18, VAR_19, VAR_20, VAR_21);

        VAR_8+= VAR_0->VAR_1*16;

        VAR_9+= VAR_0->VAR_2*16;

        break;

    }



    

    VAR_12 = VAR_1 * 16;

    VAR_13 = VAR_2 * 16;



    pix = VAR_0->new_picture[0] + (VAR_13 * VAR_0->linesize) + VAR_12;

    

    ppix = VAR_0->last_picture[0] + (VAR_9 * VAR_0->linesize) + VAR_8;



    VAR_5 = pix_sum(pix, VAR_0->linesize);

    VAR_6 = pix_norm1(pix, VAR_0->linesize);

    VAR_7 = pix_norm(pix, ppix, VAR_0->linesize);



    VAR_7 = VAR_7 >> 8;

    VAR_5 = VAR_5 >> 8;

    VAR_6 = (VAR_6 >> 8) - (VAR_5 * VAR_5);

    VAR_0->mb_var[VAR_0->mb_width * VAR_2 + VAR_1] = VAR_6;

    VAR_0->avg_mb_var += VAR_6;

    VAR_0->mc_mb_var += VAR_7;

     

#if 0

    printf("VAR_6=%4d avg_var=%4d (VAR_5=%4d) VAR_7=%4d VAR_8=%2d VAR_9=%2d\n",

	   VAR_6, VAR_0->avg_mb_var, VAR_5, VAR_7, VAR_8 - VAR_12, VAR_9 - VAR_13);

#endif

    if (VAR_7 <= 64 || VAR_7 < VAR_6) {

        if (VAR_0->full_search != ME_ZERO) {

            halfpel_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_11, VAR_14, VAR_15, VAR_16, VAR_17, VAR_22, VAR_23);

        } else {

            VAR_8 -= 16 * VAR_0->VAR_1;

            VAR_9 -= 16 * VAR_0->VAR_2;

        }

	*VAR_3 = VAR_8;

	*VAR_4 = VAR_9;

	return 0;

    } else {

	*VAR_3 = 0;

	*VAR_4 = 0;

	return 1;

    }

}

int FUNC_0(MpegEncContext * VAR_0,
int VAR_1, int VAR_2,
int *VAR_3, int *VAR_4)
{ UINT8 *pix, *ppix; int VAR_5, VAR_6, VAR_7, VAR_8, VAR_9, VAR_10, VAR_11, VAR_12, VAR_13; int VAR_14, VAR_15, VAR_16, VAR_17; int VAR_18, VAR_19, VAR_20, VAR_21; int VAR_22=0, VAR_23=0; int VAR_24[5][2]; const int VAR_25= 1+VAR_0->quarter_sample; VAR_10 = 8 * (1 << (VAR_0->f_code - 1)); if (VAR_0->out_format == FMT_H263 && !VAR_0->h263_msmpeg4)
VAR_10 = VAR_10 * 2; if (VAR_0->unrestricted_mv) { VAR_14 = -16; VAR_15 = -16; if (VAR_0->h263_plus)
VAR_10 *= 2; if(VAR_0->avctx==NULL || VAR_0->avctx->codec->id!=CODEC_ID_MPEG4){ VAR_16 = VAR_0->mb_width*16; VAR_17 = VAR_0->mb_height*16; }else { VAR_16 = VAR_0->width; VAR_17 = VAR_0->height; } } else { VAR_14 = 0; VAR_15 = 0; VAR_16 = VAR_0->mb_width*16 - 16; VAR_17 = VAR_0->mb_height*16 - 16; } switch(VAR_0->full_search) { case ME_ZERO:
default:
no_motion_search(VAR_0, &VAR_8, &VAR_9); VAR_11 = 0; break; case ME_FULL:
VAR_11 = full_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_10, VAR_14, VAR_15, VAR_16, VAR_17); break; case ME_LOG:
VAR_11 = log_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_10 / 2, VAR_14, VAR_15, VAR_16, VAR_17); break; case ME_PHODS:
VAR_11 = phods_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_10 / 2, VAR_14, VAR_15, VAR_16, VAR_17); break; case ME_X1:
case ME_EPZS:
VAR_18= VAR_14 - VAR_0->VAR_1*16; VAR_20= VAR_16 - VAR_0->VAR_1*16; VAR_19= VAR_15 - VAR_0->VAR_2*16; VAR_21= VAR_17 - VAR_0->VAR_2*16; if(VAR_0->out_format == FMT_H263){ static const int VAR_26[4]= {2, 1, 1, -1}; const int VAR_27 = VAR_0->block_wrap[0]; const int VAR_28 = VAR_0->block_index[0]; VAR_24[0][0] = VAR_0->motion_val[VAR_28    ][0]; VAR_24[0][1] = VAR_0->motion_val[VAR_28    ][1]; VAR_24[1][0] = VAR_0->motion_val[VAR_28 - 1][0]; VAR_24[1][1] = VAR_0->motion_val[VAR_28 - 1][1]; if(VAR_24[1][0] > (VAR_20<<VAR_25)) VAR_24[1][0]= (VAR_20<<VAR_25); if ((VAR_0->VAR_2 == 0 || VAR_0->first_slice_line || VAR_0->first_gob_line)) { VAR_22 = VAR_24[1][0]; VAR_23 = VAR_24[1][1]; } else { VAR_24[2][0] = VAR_0->motion_val[VAR_28 - VAR_27             ][0]; VAR_24[2][1] = VAR_0->motion_val[VAR_28 - VAR_27             ][1]; VAR_24[3][0] = VAR_0->motion_val[VAR_28 - VAR_27 + VAR_26[0]    ][0]; VAR_24[3][1] = VAR_0->motion_val[VAR_28 - VAR_27 + VAR_26[0]    ][1]; if(VAR_24[2][1] > (VAR_21<<VAR_25)) VAR_24[2][1]= (VAR_21<<VAR_25); if(VAR_24[3][0] < (VAR_18<<VAR_25)) VAR_24[3][0]= (VAR_18<<VAR_25); if(VAR_24[3][1] > (VAR_21<<VAR_25)) VAR_24[3][1]= (VAR_21<<VAR_25); VAR_24[4][0]= VAR_22 = mid_pred(VAR_24[1][0], VAR_24[2][0], VAR_24[3][0]); VAR_24[4][1]= VAR_23 = mid_pred(VAR_24[1][1], VAR_24[2][1], VAR_24[3][1]); } }else { const int VAR_29= VAR_0->VAR_2*VAR_0->mb_width + VAR_0->VAR_1; VAR_22= VAR_0->last_mv[0][0][0]; VAR_23= VAR_0->last_mv[0][0][1]; VAR_24[0][0]= VAR_0->mv_table[0][VAR_29  ]; VAR_24[0][1]= VAR_0->mv_table[1][VAR_29  ]; if(VAR_0->VAR_1 == 0){ VAR_24[1][0]= 0; VAR_24[1][1]= 0; }else{ VAR_24[1][0]= VAR_0->mv_table[0][VAR_29-1]; VAR_24[1][1]= VAR_0->mv_table[1][VAR_29-1]; if(VAR_24[1][0] > (VAR_20<<VAR_25)) VAR_24[1][0]= (VAR_20<<VAR_25); } if (!(VAR_0->VAR_2 == 0 || VAR_0->first_slice_line || VAR_0->first_gob_line)) { VAR_24[2][0] = VAR_0->mv_table[0][VAR_29 - VAR_0->mb_width]; VAR_24[2][1] = VAR_0->mv_table[1][VAR_29 - VAR_0->mb_width]; VAR_24[3][0] = VAR_0->mv_table[0][VAR_29 - VAR_0->mb_width+1]; VAR_24[3][1] = VAR_0->mv_table[1][VAR_29 - VAR_0->mb_width+1]; if(VAR_24[2][1] > (VAR_21<<VAR_25)) VAR_24[2][1]= (VAR_21<<VAR_25); if(VAR_24[3][0] > (VAR_20<<VAR_25)) VAR_24[3][0]= (VAR_20<<VAR_25); if(VAR_24[3][0] < (VAR_18<<VAR_25)) VAR_24[3][0]= (VAR_18<<VAR_25); if(VAR_24[3][1] > (VAR_21<<VAR_25)) VAR_24[3][1]= (VAR_21<<VAR_25); VAR_24[4][0]= mid_pred(VAR_24[1][0], VAR_24[2][0], VAR_24[3][0]); VAR_24[4][1]= mid_pred(VAR_24[1][1], VAR_24[2][1], VAR_24[3][1]); } } VAR_11 = epzs_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_24, VAR_22, VAR_23, VAR_18, VAR_19, VAR_20, VAR_21); VAR_8+= VAR_0->VAR_1*16; VAR_9+= VAR_0->VAR_2*16; break; } VAR_12 = VAR_1 * 16; VAR_13 = VAR_2 * 16; pix = VAR_0->new_picture[0] + (VAR_13 * VAR_0->linesize) + VAR_12; ppix = VAR_0->last_picture[0] + (VAR_9 * VAR_0->linesize) + VAR_8; VAR_5 = pix_sum(pix, VAR_0->linesize); VAR_6 = pix_norm1(pix, VAR_0->linesize); VAR_7 = pix_norm(pix, ppix, VAR_0->linesize); VAR_7 = VAR_7 >> 8; VAR_5 = VAR_5 >> 8; VAR_6 = (VAR_6 >> 8) - (VAR_5 * VAR_5); VAR_0->mb_var[VAR_0->mb_width * VAR_2 + VAR_1] = VAR_6; VAR_0->avg_mb_var += VAR_6; VAR_0->mc_mb_var += VAR_7; #if 0
printf("VAR_6=%4d avg_var=%4d (VAR_5=%4d) VAR_7=%4d VAR_8=%2d VAR_9=%2d\n",
VAR_6, VAR_0->avg_mb_var, VAR_5, VAR_7, VAR_8 - VAR_12, VAR_9 - VAR_13); #endif
if (VAR_7 <= 64 || VAR_7 < VAR_6) { if (VAR_0->full_search != ME_ZERO) { halfpel_motion_search(VAR_0, &VAR_8, &VAR_9, VAR_11, VAR_14, VAR_15, VAR_16, VAR_17, VAR_22, VAR_23); } else { VAR_8 -= 16 * VAR_0->VAR_1; VAR_9 -= 16 * VAR_0->VAR_2; } *VAR_3 = VAR_8; *VAR_4 = VAR_9; return 0; } else { *VAR_3 = 0; *VAR_4 = 0; return 1; } }