static void add_xblock(DWTELEM *dst, uint8_t *src, uint8_t *obmc, int s_x, int s_y, int b_w, int b_h, int mv_x, int mv_y, int w, int h, int dst_stride, int src_stride, int obmc_stride, int mb_type, int add){

    uint8_t tmp[src_stride*(b_h+5)]; //FIXME move to context to gurantee alignment

    int x,y;



    if(s_x<0){

        obmc -= s_x;

        b_w += s_x;

        s_x=0;

    }else if(s_x + b_w > w){

        b_w = w - s_x;

    }

    if(s_y<0){

        obmc -= s_y*obmc_stride;

        b_h += s_y;

        s_y=0;

    }else if(s_y + b_h> h){

        b_h = h - s_y;

    }



    if(b_w<=0 || b_h<=0) return;

    

    dst += s_x + s_y*dst_stride;

    

    if(mb_type==1){

        src += s_x + s_y*src_stride;

        for(y=0; y < b_h; y++){

            for(x=0; x < b_w; x++){

                if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);

                else    dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);

            }

        }

    }else{

        int dx= mv_x&15;

        int dy= mv_y&15;

//        int dxy= (mv_x&1) + 2*(mv_y&1);



        s_x += (mv_x>>4) - 2;

        s_y += (mv_y>>4) - 2;

        src += s_x + s_y*src_stride;

        //use dsputil

    

        if(   (unsigned)s_x >= w - b_w - 4

           || (unsigned)s_y >= h - b_h - 4){

            ff_emulated_edge_mc(tmp + 32, src, src_stride, b_w+5, b_h+5, s_x, s_y, w, h);

            src= tmp + 32;

        }



        if(mb_type==0){

            mc_block(tmp, src, tmp + 64+8, src_stride, b_w, b_h, dx, dy);

        }else{

            int sum=0;

            for(y=0; y < b_h; y++){

                for(x=0; x < b_w; x++){

                    sum += src[x+  y*src_stride];

                }

            }

            sum= (sum + b_h*b_w/2) / (b_h*b_w);

            for(y=0; y < b_h; y++){

                for(x=0; x < b_w; x++){

                    tmp[x + y*src_stride]= sum; 

                }

            }

        }



        for(y=0; y < b_h; y++){

            for(x=0; x < b_w; x++){

                if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);

                else    dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);

            }

        }

    }

}

static void add_xblock(DWTELEM *dst, uint8_t *src, uint8_t *obmc, int s_x, int s_y, int b_w, int b_h, int mv_x, int mv_y, int w, int h, int dst_stride, int src_stride, int obmc_stride, int mb_type, int add){

    uint8_t tmp[src_stride*(b_h+5)]; 

    int x,y;



    if(s_x<0){

        obmc -= s_x;

        b_w += s_x;

        s_x=0;

    }else if(s_x + b_w > w){

        b_w = w - s_x;

    }

    if(s_y<0){

        obmc -= s_y*obmc_stride;

        b_h += s_y;

        s_y=0;

    }else if(s_y + b_h> h){

        b_h = h - s_y;

    }



    if(b_w<=0 || b_h<=0) return;

    

    dst += s_x + s_y*dst_stride;

    

    if(mb_type==1){

        src += s_x + s_y*src_stride;

        for(y=0; y < b_h; y++){

            for(x=0; x < b_w; x++){

                if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);

                else    dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * 128 * (256/OBMC_MAX);

            }

        }

    }else{

        int dx= mv_x&15;

        int dy= mv_y&15;





        s_x += (mv_x>>4) - 2;

        s_y += (mv_y>>4) - 2;

        src += s_x + s_y*src_stride;

        

    

        if(   (unsigned)s_x >= w - b_w - 4

           || (unsigned)s_y >= h - b_h - 4){

            ff_emulated_edge_mc(tmp + 32, src, src_stride, b_w+5, b_h+5, s_x, s_y, w, h);

            src= tmp + 32;

        }



        if(mb_type==0){

            mc_block(tmp, src, tmp + 64+8, src_stride, b_w, b_h, dx, dy);

        }else{

            int sum=0;

            for(y=0; y < b_h; y++){

                for(x=0; x < b_w; x++){

                    sum += src[x+  y*src_stride];

                }

            }

            sum= (sum + b_h*b_w/2) / (b_h*b_w);

            for(y=0; y < b_h; y++){

                for(x=0; x < b_w; x++){

                    tmp[x + y*src_stride]= sum; 

                }

            }

        }



        for(y=0; y < b_h; y++){

            for(x=0; x < b_w; x++){

                if(add) dst[x + y*dst_stride] += obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);

                else    dst[x + y*dst_stride] -= obmc[x + y*obmc_stride] * tmp[x + y*src_stride] * (256/OBMC_MAX);

            }

        }

    }

}

static void FUNC_0(DWTELEM *VAR_0, uint8_t *VAR_1, uint8_t *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, int VAR_11, int VAR_12, int VAR_13, int VAR_14, int VAR_15){

    uint8_t tmp[VAR_12*(VAR_6+5)]; 

    int VAR_16,VAR_17;



    if(VAR_3<0){

        VAR_2 -= VAR_3;

        VAR_5 += VAR_3;

        VAR_3=0;

    }else if(VAR_3 + VAR_5 > VAR_9){

        VAR_5 = VAR_9 - VAR_3;

    }

    if(VAR_4<0){

        VAR_2 -= VAR_4*VAR_13;

        VAR_6 += VAR_4;

        VAR_4=0;

    }else if(VAR_4 + VAR_6> VAR_10){

        VAR_6 = VAR_10 - VAR_4;

    }



    if(VAR_5<=0 || VAR_6<=0) return;

    

    VAR_0 += VAR_3 + VAR_4*VAR_11;

    

    if(VAR_14==1){

        VAR_1 += VAR_3 + VAR_4*VAR_12;

        for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){

            for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){

                if(VAR_15) VAR_0[VAR_16 + VAR_17*VAR_11] += VAR_2[VAR_16 + VAR_17*VAR_13] * 128 * (256/OBMC_MAX);

                else    VAR_0[VAR_16 + VAR_17*VAR_11] -= VAR_2[VAR_16 + VAR_17*VAR_13] * 128 * (256/OBMC_MAX);

            }

        }

    }else{

        int VAR_18= VAR_7&15;

        int VAR_19= VAR_8&15;





        VAR_3 += (VAR_7>>4) - 2;

        VAR_4 += (VAR_8>>4) - 2;

        VAR_1 += VAR_3 + VAR_4*VAR_12;

        

    

        if(   (unsigned)VAR_3 >= VAR_9 - VAR_5 - 4

           || (unsigned)VAR_4 >= VAR_10 - VAR_6 - 4){

            ff_emulated_edge_mc(tmp + 32, VAR_1, VAR_12, VAR_5+5, VAR_6+5, VAR_3, VAR_4, VAR_9, VAR_10);

            VAR_1= tmp + 32;

        }



        if(VAR_14==0){

            mc_block(tmp, VAR_1, tmp + 64+8, VAR_12, VAR_5, VAR_6, VAR_18, VAR_19);

        }else{

            int VAR_20=0;

            for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){

                for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){

                    VAR_20 += VAR_1[VAR_16+  VAR_17*VAR_12];

                }

            }

            VAR_20= (VAR_20 + VAR_6*VAR_5/2) / (VAR_6*VAR_5);

            for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){

                for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){

                    tmp[VAR_16 + VAR_17*VAR_12]= VAR_20; 

                }

            }

        }



        for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){

            for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){

                if(VAR_15) VAR_0[VAR_16 + VAR_17*VAR_11] += VAR_2[VAR_16 + VAR_17*VAR_13] * tmp[VAR_16 + VAR_17*VAR_12] * (256/OBMC_MAX);

                else    VAR_0[VAR_16 + VAR_17*VAR_11] -= VAR_2[VAR_16 + VAR_17*VAR_13] * tmp[VAR_16 + VAR_17*VAR_12] * (256/OBMC_MAX);

            }

        }

    }

}

static void FUNC_0(DWTELEM *VAR_0, uint8_t *VAR_1, uint8_t *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, int VAR_11, int VAR_12, int VAR_13, int VAR_14, int VAR_15){ uint8_t tmp[VAR_12*(VAR_6+5)]; int VAR_16,VAR_17; if(VAR_3<0){ VAR_2 -= VAR_3; VAR_5 += VAR_3; VAR_3=0; }else if(VAR_3 + VAR_5 > VAR_9){ VAR_5 = VAR_9 - VAR_3; } if(VAR_4<0){ VAR_2 -= VAR_4*VAR_13; VAR_6 += VAR_4; VAR_4=0; }else if(VAR_4 + VAR_6> VAR_10){ VAR_6 = VAR_10 - VAR_4; } if(VAR_5<=0 || VAR_6<=0) return; VAR_0 += VAR_3 + VAR_4*VAR_11; if(VAR_14==1){ VAR_1 += VAR_3 + VAR_4*VAR_12; for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){ for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){ if(VAR_15) VAR_0[VAR_16 + VAR_17*VAR_11] += VAR_2[VAR_16 + VAR_17*VAR_13] * 128 * (256/OBMC_MAX); else    VAR_0[VAR_16 + VAR_17*VAR_11] -= VAR_2[VAR_16 + VAR_17*VAR_13] * 128 * (256/OBMC_MAX); } } }else{ int VAR_18= VAR_7&15; int VAR_19= VAR_8&15; VAR_3 += (VAR_7>>4) - 2; VAR_4 += (VAR_8>>4) - 2; VAR_1 += VAR_3 + VAR_4*VAR_12; if(   (unsigned)VAR_3 >= VAR_9 - VAR_5 - 4
|| (unsigned)VAR_4 >= VAR_10 - VAR_6 - 4){ ff_emulated_edge_mc(tmp + 32, VAR_1, VAR_12, VAR_5+5, VAR_6+5, VAR_3, VAR_4, VAR_9, VAR_10); VAR_1= tmp + 32; } if(VAR_14==0){ mc_block(tmp, VAR_1, tmp + 64+8, VAR_12, VAR_5, VAR_6, VAR_18, VAR_19); }else{ int VAR_20=0; for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){ for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){ VAR_20 += VAR_1[VAR_16+  VAR_17*VAR_12]; } } VAR_20= (VAR_20 + VAR_6*VAR_5/2) / (VAR_6*VAR_5); for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){ for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){ tmp[VAR_16 + VAR_17*VAR_12]= VAR_20; } } } for(VAR_17=0; VAR_17 < VAR_6; VAR_17++){ for(VAR_16=0; VAR_16 < VAR_5; VAR_16++){ if(VAR_15) VAR_0[VAR_16 + VAR_17*VAR_11] += VAR_2[VAR_16 + VAR_17*VAR_13] * tmp[VAR_16 + VAR_17*VAR_12] * (256/OBMC_MAX); else    VAR_0[VAR_16 + VAR_17*VAR_11] -= VAR_2[VAR_16 + VAR_17*VAR_13] * tmp[VAR_16 + VAR_17*VAR_12] * (256/OBMC_MAX); } } } }