www.pudn.com > motion_search.rar > search.c


#include "util.h" 
#include "param.h" 
 
MV full_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV liu_full_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV part_full_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV coher_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV new_full_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV three_step_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV new_three_step_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV four_step_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV bbgd_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV ucbd_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV cd_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV scd_search(u_char *prev, u_char *cur, int x, int y, int *err); 
  
MV ncd_search(u_char *prev, u_char *cur, int x, int y, int *err);  //New Cross Diamond Search  
MV kcd_search(u_char *prev, u_char *cur, int x, int y, int *err);  //Kite Cross Diamond Search  
 
MV hsa_search(u_char *prev, u_char *cur, int x, int y, int *err); 
MV cir_search(u_char *prev, u_char *cur, int x, int y, int rx, int ry, int *err, int b, int t, int l); 
MV find_halfpel(int x, int y, MV mv, u_char *prev, u_char *cur, int bs, int *err); 
 
void set_param(char *name); 
void search(int method, MV **imv, u_char *prev, u_char *cur); 
void fsearch(int method, MVF **mvt, MVF **mvb, u_char *prev, u_char *cur); 
void compute_bound(int x, int y, int *ux, int *lx, int *uy, int *ly); 
int bound_chk(int m, int n, int cx, int cy); 
void v_init(void); 
void v_end(void); 
 
#ifdef OPC 
OP op; 
double ls; 
#endif 
 
int im_width, im_height, mv_width, mv_height, re_width, re_height; 
int im_width2, im_height2, re_width2, re_height2; 
int *point,spt; 
u_char *res,*prev,*iprev,*cur; 
MV **imv,**hmv; 
MVF **mvt,**mvb; 
clock_t start,end,over=0,net=0,nets; 
 
int mvmap[3][3]={{6,0,0},{6,9,2},{4,4,2}}; 
int cirmv[8][2]={{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1},{-1,0}}; 
/* NPDS partial distortion calculation order */ 
const u_char LL[16]={0,2,2,0,1,3,3,1,1,3,0,2,3,1,2,0}; 
const u_char KK[16]={0,2,0,2,1,3,1,3,0,2,1,3,0,2,1,3}; 
                                                        /* 1 9 3 13 */ 
                                                        /* 11 5 15 7 */ 
                                                        /* 4 14 2 10 */ 
                                                        /* 16 8 12 6 */ 
/* new_full_search's variable */ 
ME **b1,**b2,*b10; 
 
#define N1 12 
 
int main(int argc, char *argv[]) 
{ 
   FILE *fcur,*fmv,*fhmv,*fmse,*fpt; 
    
#ifdef OPC 
   FILE *fop,*fops=NULL; 
#endif 
    
   int i,s=0,method; 
   double mse; 
   u_char *b_tmp; 
   char char_buf[4096],imagename[80]; 
    
#ifndef NO_CAPTURE 
   char header[80]; 
   FILE *fres; 
#endif 
 
   char *usage = "\nsearch  \n"  
        "  method 1 = fs \n" 
        "  method 2 = ofs \n" 
        "  method 3 = 3ss \n" 
        "  method 4 = 4ss \n" 
        "  method 5 = n3ss \n" 
        "  method 6 = bbgds \n" 
        "  method 7 = hsa \n" 
        "  method 8 = coher \n" 
        "  method 9 = pfs \n" 
        "  method 10 = liu \n" 
        "  method 11 = ucbds \n"; 
        "  method 12 = cds \n" 
        "  method 13 = scds \n"; 
        "  method 14 = ncds \n" 
        "  method 15 = kcds \n"; 
    
   char *methodname[15]={"fs","ofs","3ss","4ss","n3ss","bbgds","hsa","coher","pfs","liu","ucbds","cds","scds","ncds","kcds"}; 
    
   if(argc!=3){ 
      fprintf(stderr,"%s",usage); 
      exit(1); 
   } 
    
   strcpy(imagename,argv[1]); 
   set_param(imagename); 
    
   if(im_width==0){ 
      fprintf(stderr,"\nImage not found!\n"); 
      exit(1); 
   } 
   method=atoi(argv[2]); 
   if(method<1||method>13){ 
      fprintf(stderr,"\nInvalid method!\n%s",usage); 
      exit(1); 
   } 
   v_init();    
   if(FIELD) 
      sprintf(char_buf,"%s/%s/%s.mvf.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
   else 
      sprintf(char_buf,"%s/%s/%s.mv.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
   printf("%s\n", char_buf); 
   if((fmv=fopen(char_buf,"wb"))==NULL) 
      fopen_err(); 
   if(HALF){ 
      sprintf(char_buf,"%s/%s/%s.hmv.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
   if((fhmv=fopen(char_buf,"wb"))==NULL) 
      fopen_err(); 
   } 
#ifdef OPC 
   if(HALF) 
      sprintf(char_buf,"%s/%s/%s.hop.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
   else 
      sprintf(char_buf,"%s/%s/%s.op.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
   if((fop=fopen(char_buf,"wb"))==NULL) 
      fopen_err(); 
   if(method==9){ 
      if(HALF) 
         sprintf(char_buf,"%s/%s/%s.hops.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
      else 
         sprintf(char_buf,"%s/%s/%s.ops.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
      if((fops=fopen(char_buf,"wb"))==NULL) 
         fopen_err(); 
   } 
#endif 
   if(HALF) 
      sprintf(char_buf,"%s/%s/%s.hmse.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
   else 
      sprintf(char_buf,"%s/%s/%s.mse.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
    
   if((fmse=fopen(char_buf,"wb"))==NULL) 
      fopen_err(); 
    
   sprintf(char_buf,"%s/%s/%s.pt.%s",RESULT_PATH,imagename,imagename,methodname[method-1]); 
    
   if((fpt=fopen(char_buf,"wb"))==NULL) 
      fopen_err(); 
    
   if(CIF) 
      s=(strcmp(imagename,"garden")==0)+(strcmp(imagename,"missa")==0)+(strcmp(imagename,"claire")==0); 
    
   if(FIELD) 
      sprintf(char_buf,"%s/%s/%s%03d.raw",IMAGE_PATH,imagename,imagename,START_NO); 
   else 
      sprintf(char_buf,"%s/%s/%s.%03d",IMAGE_PATH,imagename,imagename,START_NO+s); 
    
   if((fcur=fopen(char_buf,"rb"))==NULL) 
      fopen_err(); 
    
   readframe(fcur,cur,im_width,im_height); 
    
   fclose(fcur); 
    
   start=clock(); 
    
   for(i=START_NO+s;i<=END_NO+s;i++){ 
      end=clock(); 
      swap(cur,prev,b_tmp); 
    
      if(FIELD) 
         sprintf(char_buf,"%s/%s/%s%03d.raw",IMAGE_PATH,imagename,imagename,i+1); 
      else 
         sprintf(char_buf,"%s/%s/%s.%03d",IMAGE_PATH,imagename,imagename,i+1); 
    
      if((fcur=fopen(char_buf,"rb"))==NULL) 
         fopen_err(); 
    
      readframe(fcur,cur,im_width,im_height); 
      fclose(fcur); 
 
#ifdef OPC 
      op.a=op.c=op.p=0; 
      ls=0; 
#endif 
 
      over+=clock()-end; 
 
      if(FIELD) 
         fsearch(method,mvt,mvb,prev,cur); 
      else 
         search(method,imv,prev,cur); 
 
      end=clock(); 
 
      if(FIELD) 
         fres_image(prev,res,mvt,mvb); 
      else if(HALF) 
         hres_image(iprev,res,imv,hmv); 
      else 
         res_image(prev,res,imv); 
      mse=mean_squ_err(cur,res,re_width,re_height); 
      fwrite(&mse,sizeof(double),1,fmse); 
      if(FIELD){ 
         fwrite(*mvt,sizeof(MVF),mv_width*mv_height,fmv); 
         fwrite(*mvb,sizeof(MVF),mv_width*mv_height,fmv); 
      }else 
         fwrite(*imv,sizeof(MV),mv_width*mv_height,fmv); 
      if(HALF) 
         fwrite(*hmv,sizeof(MV),mv_width*mv_height,fhmv); 
#ifdef OPC 
      fwrite(&op,sizeof(OP),1,fop); 
      if(method==9) 
         fwrite(&ls,sizeof(double),1,fops); 
#endif 
      fwrite(point,sizeof(int),mv_width*mv_height,fpt); 
#ifndef NO_CAPTURE 
      if(i+1==CAPTURE_NO){ 
         sprintf(char_buf,"%s/%s/%s%03d%s.pgm",RESULT_PATH,imagename,imagename,i+1,methodname[method-1]); 
         if((fres=fopen(char_buf,"wb"))==NULL) 
            fopen_err(); 
         pgm_header(header,re_width,re_height); 
         fwrite(header,sizeof(char),strlen(header),fres); 
         writeframe(fres,res,re_width,re_height); 
         fclose(fres); 
      } 
#endif 
      /*fprintf(stdout,"\nFrame %d\n",i);*/ 
      over+=clock()-end; 
   } 
   end=clock(); 
   fprintf(stdout,"\nNet time=%f\tTotal time=%f\tOverhead=%f\nNet search time=%f\n",(double)(end-start-over)/CLOCKS_PER_SEC,(double)(end-start)/CLOCKS_PER_SEC,(double)over/CLOCKS_PER_SEC,(double)net/CLOCKS_PER_SEC); 
   if(HALF) 
      fclose(fhmv); 
   fclose(fmv); 
   fclose(fmse); 
#ifdef OPC 
   fclose(fop); 
   if(method==9) 
      fclose(fops); 
#endif 
   fclose(fpt); 
   v_end(); 
   return 0; 
} 
 
MV full_search(u_char *prev,u_char *cur, int x, int y, int *err) 
{ 
   int i,j,k,l,m,n,terr; 
   MV mv; 
   mv.x=mv.y=0; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   spt++; 
   for(l=1;l<=MAX_DISP;l++){ 
      i=-l; 
      j=-l; 
      for(k=0;k<8*l;k++){ 
         m=x+i; 
         n=y+j; 
         if(bound_chk(m,n,x,y)){ 
            terr=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
#ifdef OPC 
            op.c+=1; 
#endif 
            if(terr<(*err)){ 
               *err=terr; 
               mv.x=i; 
               mv.y=j; 
            } 
         } 
         spt++; 
         if(k<2*l)      i++; 
         else if(k<4*l) j++; 
         else if(k<6*l) i--; 
         else           j--; 
      } 
   } 
   return mv; 
} 
 
MV liu_full_search(u_char *prev,u_char *cur, int x, int y, int *err) 
{ 
   int i,j,m,n,px,py,terr,tmerr; 
   MV mv,tmv; 
   mv.x=mv.y=0; 
   *err=MAX_INT; 
   spt++; 
   for(py=0;py<2;py++)for(px=0;px<2;px++){ 
      tmerr=MAX_INT; 
      tmv.x=tmv.y=0; 
      for(j=py-MAX_DISP;j<=MAX_DISP;j+=2) 
       for(i=px-MAX_DISP;i<=MAX_DISP;i+=2){ 
         m=x+i; 
         n=y+j; 
         if(bound_chk(m,n,x,y)){ 
            terr=liu_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT,px,py); 
#ifdef OPC 
            op.c+=1; 
#endif 
            if(terr=scan1){ 
#ifdef OPC 
                  op.c+=1; 
#endif 
                  if(terr<(*err)) 
                     to--; 
                  else 
                     continue; 
               } 
               b1[to]->mae=terr; 
               b1[to]->mv.x=i; 
               b1[to]->mv.y=j; 
               insert_me(b1+can1,to+1-can1); 
               *err=b1[to++]->mae; 
            } 
         } 
         can1=to; 
#ifdef OPC 
         op.c-=1;   /* The first MAD needs no comparison */ 
#endif 
      } 
   *err=MAX_INT; 
   to=0; 
   for(i=0;imae<(*err)){ 
         m=x+b1[i]->mv.x; 
         n=y+b1[i]->mv.y; 
         terr=smean_abs_err2(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT,d2); 
#ifdef OPC 
         op.c+=1; 
#endif 
         if(to>=can2){ 
#ifdef OPC 
            op.c+=1; 
#endif 
            if(terr<(*err)) 
               to--; 
            else 
               continue; 
         } 
         b2[to]=b1[i]; 
         b2[to]->mae=terr; 
         insert_me(b2,to+1); 
         *err=b2[to++]->mae; 
      } 
   } 
#ifdef OPC 
   op.c-=2;   /* The first MAD needs no comparison */ 
#endif 
   *err=MAX_INT; 
   for(i=0;imae<(*err)){ 
         m=x+b2[i]->mv.x; 
         n=y+b2[i]->mv.y; 
         terr=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
#ifdef OPC 
         op.c+=1; 
#endif 
         if(terr<(*err)){ 
            *err=terr; 
            mv=b2[i]->mv; 
         } 
      } 
   } 
#ifdef OPC 
   op.c-=2;   /* The first MAD needs no comparison */ 
#endif 
   return mv; 
} 
 
MV three_step_search(u_char *prev,u_char *cur, int x, int y, int *err) 
{ 
   int cx,cy; 
   int step_size=cint(MAX_DISP)>>1; 
   MV mv,tmv; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   spt++; 
   mv.x=mv.y=0; 
   cx=x; 
   cy=y; 
   while(step_size>=1){ 
      tmv=cir_search(prev,cur,cx,cy,x,y,err,0,8,step_size); 
      spt+=8; 
      mv.x+=tmv.x; 
      mv.y+=tmv.y; 
      cx+=tmv.x; 
      cy+=tmv.y; 
      step_size=step_size>>1; 
   } 
   return mv; 
} 
 
MV new_three_step_search(u_char *prev,u_char *cur, int x, int y, int *err) 
{ 
   int cx,cy,err1,err2; 
   int step_size=cint(MAX_DISP)>>1; 
   MV mv,tmv,tmv1; 
   mv.x=mv.y=0; 
   cx=x; 
   cy=y; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   spt++; 
   err1=err2=(*err); 
   tmv1=cir_search(prev,cur,cx,cy,x,y,&err1,0,8,1); 
   tmv=cir_search(prev,cur,cx,cy,x,y,&err2,0,8,step_size); 
   spt+=16; 
   if(tmv.x==0 && tmv.y==0 && tmv1.x==0 && tmv1.y==0) 
      return mv; 
   if(err1<=err2){ 
      step_size=1; 
      *err=err1; 
      tmv=tmv1; 
      mv.x+=tmv.x; 
      mv.y+=tmv.y; 
      cx+=tmv.x; 
      cy+=tmv.y; 
      if(abs(tmv.x)==abs(tmv.y)){ 
         tmv=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv.y+1][tmv.x+1],5,step_size); 
         spt+=5; 
      } 
      else{ 
         tmv=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv.y+1][tmv.x+1],3,step_size); 
         spt+=3; 
      } 
      mv.x+=tmv.x; 
      mv.y+=tmv.y; 
      return mv; 
   } 
   step_size=step_size>>1; 
   *err=err2; 
   mv.x+=tmv.x; 
   mv.y+=tmv.y; 
   cx+=tmv.x; 
   cy+=tmv.y; 
   while(step_size>=1){ 
      tmv=cir_search(prev,cur,cx,cy,x,y,err,0,8,step_size); 
      spt+=8; 
      mv.x+=tmv.x; 
      mv.y+=tmv.y; 
      cx+=tmv.x; 
      cy+=tmv.y; 
      step_size=step_size>>1; 
   } 
   return mv; 
} 
 
MV four_step_search(u_char *prev,u_char *cur, int x, int y, int *err) 
{ 
   int cx,cy,dx=0,dy=0; 
   int step=1,step_size=cint(MAX_DISP)>>2; 
   MV mv,tmv1,tmv2; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT);  
   /* *err=npd_mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT,MAX_INT); */ 
   spt++; 
   cx=x; 
   cy=y; 
   tmv1.x=0; 
   tmv1.y=0; 
   tmv2=tmv1; 
   while(step_size>=1){ 
      if((step==1)||(abs(cx-x)>MAX_DISP-step_size)||\ 
           (abs(cy-y)>MAX_DISP-step_size)){ 
         tmv2=cir_search(prev,cur,cx,cy,x,y,err,0,8,step_size); 
         spt+=8; 
      } 
      else{ 
         if(abs(tmv1.x)==abs(tmv1.y)){ 
            tmv2=cir_search(prev,cur,cx,cy,x,y,err,\ 
                 mvmap[dy+1][dx+1],5,step_size); 
            if((abs(tmv1.x)==abs(tmv1.y))&&(((tmv1.x+tmv2.x)==0)\ 
                 ||((tmv1.y+tmv2.y)==0))&&step==3) 
               spt+=4; 
            else 
               spt+=5; 
         } 
         else{ 
            tmv2=cir_search(prev,cur,cx,cy,x,y,err,\ 
                      mvmap[dy+1][dx+1],3,step_size); 
            spt+=3; 
         } 
      } 
      cx+=tmv2.x; 
      cy+=tmv2.y; 
      dx=tmv2.x/step_size; 
      dy=tmv2.y/step_size; 
      tmv1=tmv2; 
      if(step_size==1||step==3||(tmv2.x==0&&tmv2.y==0)){ 
         step_size=step_size>>1; 
         step=1; 
      } 
      else 
         step++; 
   } 
      mv.x=cx-x; 
      mv.y=cy-y; 
      return mv; 
} 
 
 
MV bbgd_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
   int cx,cy; 
   MV mv,tmv1,tmv2,tmv3; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   mv.x=mv.y=0; 
   cx=x; 
   cy=y; 
   /* step 1 */ 
   tmv1=cir_search(prev,cur,cx,cy,x,y,err,0,8,1); 
   spt+=9; 
   if(tmv1.x==0 && tmv1.y==0) 
       return tmv1; 
   else{ 
      cx+=tmv1.x; 
      cy+=tmv1.y; 
   } 
   /* step 2 */ 
   if(abs(tmv1.x)==abs(tmv1.y)){ 
      tmv2=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv1.y+1][tmv1.x+1],5,1); 
      spt+=5; 
   } 
   else{ 
      tmv2=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv1.y+1][tmv1.x+1],3,1); 
      spt+=3; 
   } 
   if(tmv2.x==0 && tmv2.y==0) 
      return tmv1; 
   cx+=tmv2.x; 
   cy+=tmv2.y; 
   mv.x=tmv1.x+tmv2.x; 
   mv.y=tmv1.y+tmv2.y; 
   /* step 3 */ 
   do{ 
      if(abs(tmv2.x)==abs(tmv2.y)){ 
         tmv3=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv2.y+1][tmv2.x+1],5,1); 
         if((abs(tmv1.x)==abs(tmv1.y))&&(((tmv1.x+tmv2.x)==0)||((tmv1.y+tmv2.y)==0))) 
            spt+=4; 
         else 
            spt+=5; 
      } 
      else{ 
         tmv3=cir_search(prev,cur,cx,cy,x,y,err,mvmap[tmv2.y+1][tmv2.x+1],3,1); 
         spt+=3; 
      } 
      if(tmv3.x==0 && tmv3.y==0) 
         return mv; 
      mv.x+=tmv3.x; 
      mv.y+=tmv3.y; 
      cx+=tmv3.x; 
      cy+=tmv3.y; 
      tmv1=tmv2; 
      tmv2=tmv3; 
   }while(abs(mv.x)!=MAX_DISP&&abs(mv.y)!=MAX_DISP); 
   return mv; 
} 
 
MV hsa_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
   MV mv; 
   int D,Dd; 
   float M,Md,nk,nc; 
   static int Do=0; 
   static float t,c=50.0*256,k=500.0,d=2.8284; 
   static float u=0.002,v=0.002,Mo=0; 
   mv.x=0; 
   mv.y=0; 
   t=k*d+c; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   D=*err; 
   if((float)D0){ 
      nk=Dd/Md; 
      k=(1-v)*k+v*nk; 
   } 
   else{ 
      nc=D-k*M; 
      c=(1-u)*c+u*nc; 
   } 
   Do=D; 
   Mo=M; 
   return mv; 
} 
 
MV ucbd_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
   int i,j,k,b,t,m,n,err0; 
   MV mv,tmv; 
   static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}}; 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   spt++; 
   tmv.x=0; 
   tmv.y=0; 
   k=9; 
   for(i=0;i<8;i++){ 
      m=x+dia[i].x; 
      n=y+dia[i].y; 
      if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
#ifdef OPC 
         op.c++; 
#endif 
         if(err0<(*err)){ 
            *err=err0; 
            tmv=dia[i]; 
            k=i; 
         } 
      } 
   } 
   spt+=8; 
   mv=tmv; 
   while(1){ 
      if(k==9) 
         break; 
      else{ 
         j=k;k=9; 
         tmv.x=0;tmv.y=0; 
      } 
      if(abs(dia[j].x)==1){ 
         t=3;b=-1; 
      }else{ 
         t=5;b=-2; 
      } 
      j=(j+b)<0?(8+j+b):(j+b); 
      for(i=0;i7?0:(j+1); 
      } 
      spt+=t; 
      mv.x=mv.x+tmv.x; 
      mv.y=mv.y+tmv.y; 
   } 
   tmv.x=0;tmv.y=0; 
   for(i=0;i<8;i+=2){ 
      m=x+mv.x+(dia[i].x>>1); 
      n=y+mv.y+(dia[i].y>>1); 
      if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
#ifdef OPC 
         op.c++; 
#endif 
         if(err0<(*err)){ 
            *err=err0; 
            tmv=dia[i]; 
         } 
      } 
   } 
   spt+=4; 
   mv.x=mv.x+(tmv.x>>1); 
   mv.y=mv.y+(tmv.y>>1); 
   return mv; 
} 
  
MV cd_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
   int i,j,k,b,t,m,n,err0,c=9,ox=x,oy=y,step; 
   MV mv,tmv; 
   static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}}; 
   static MV crx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}}; 
 
   init_searchedpt(); 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   searchedpt[MAX_DISP][MAX_DISP]=1; 
 
   tmv.x=0; 
   tmv.y=0; 
   k=9; 
   step=1; 
   for(i=0;i<8;i++){ 
      m=x+crx[i].x; 
      n=y+crx[i].y; 
      if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
         searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
#ifdef OPC 
         op.c++; 
#endif 
         if(err0<(*err)){ 
            *err=err0; 
            tmv=crx[i]; 
            k=i; 
         } 
      } 
   } 
   mv=tmv; 
   if(k==9) { 
     spt += count_searchedpt(); 
     printf("c%d ", count_searchedpt()); 
     return mv;  //1st-step-stop 
   } 
 
   if(k!=9) { 
     step+=1; 
     c=k; k=9; 
     tmv.x=0; tmv.y=0;  
     if(c==0||c==1) j=7; 
     else if(c==2||c==3) j=1;  
     else if(c==4||c==5) j=3; 
     else if(c==6||c==7) j=5; 
     t=4; //Once not the center of CSP, 4 new point anyway. 
     for(i=0;i7?1:(j+2); 
     } 
   } 
 
   if(k==9 && c%2==1) { 
     spt += count_searchedpt(); 
     printf("s%d ", count_searchedpt()); 
     return mv;  //2nd-step-stop 
   } 
 
   if(k==9 && c%2==0) k=c; 
 
   while(1){ 
      if(k==9) 
         break; 
      else{ 
         j=k;k=9; 
         tmv.x=0;tmv.y=0; 
      } 
      step+=1; 
      if(j%2==1){ 
         t=3;b=-1; 
      } else{ 
         t=5;b=-2; 
      } 
      j=(j+b)<0?(8+j+b):(j+b); 
      for(i=0;i7?0:(j+1); 
      } 
      mv.x=mv.x+tmv.x; 
      mv.y=mv.y+tmv.y; 
   } 
 
   tmv.x=0;tmv.y=0; 
   for(i=0;i<8;i+=2){ 
      m=x+mv.x+(dia[i].x>>1); 
      n=y+mv.y+(dia[i].y>>1); 
      if(bound_chk(m,n,x,y)){ 
        err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
        searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
#ifdef OPC 
        op.c++; 
#endif 
        if(err0<(*err)){ 
          *err=err0; 
          tmv.x=(dia[i].x>>1); 
          tmv.y=(dia[i].y>>1); 
        } 
      } 
   } 
   mv.x=mv.x+tmv.x; 
   mv.y=mv.y+tmv.y; 
   spt += count_searchedpt(); 
   return mv; 
}  
 
MV scd_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
   int i,j,k,b,t,m,n,err0,c=9,ox=x,oy=y,step; 
   MV mv,tmv; 
   static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}}; 
   static MV crx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}}; 
 
   init_searchedpt(); 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   searchedpt[MAX_DISP][MAX_DISP]=1; 
 
   tmv.x=0; 
   tmv.y=0; 
   k=9; 
   step=1; 
   for(i=1;i<8;i+=2){ 
      m=x+crx[i].x; 
      n=y+crx[i].y; 
      if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
         searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
#ifdef OPC 
         op.c++; 
#endif 
         if(err0<(*err)){ 
            *err=err0; 
            tmv=crx[i]; 
            k=i; 
         } 
      } 
   } 
   mv=tmv; 
   if(k==9) { 
     spt += count_searchedpt(); 
     printf("c%d ", count_searchedpt()); 
     return mv;  //1st-step-stop 
   } 
 
   if(k!=9) { 
     step+=1; 
     c=k; k=9; 
     tmv.x=0; tmv.y=0;  
      t=3; //3 new point of SCSP. 
     b=-2; j=(c+b)<0?(8+c+b):(c+b); 
     for(i=0;i7?1:(j+2); 
     } 
     mv.x=mv.x+tmv.x; 
     mv.y=mv.y+tmv.y; 
   } 
 
   if(k==9 && c%2==1) { 
     spt += count_searchedpt(); 
     printf("s%d ", count_searchedpt()); 
     return mv;  //2nd-step-stop 
   } 
   k=k-1; 
 
   while(1){ 
      if(k==9) 
         break; 
      else{ 
         j=k;k=9; 
         tmv.x=0;tmv.y=0; 
      } 
      step+=1; 
      if(j%2==1){ 
         t=3;b=-1; 
      } else{ 
         t=5;b=-2; 
      } 
      j=(j+b)<0?(8+j+b):(j+b); 
      for(i=0;i7?0:(j+1); 
      } 
      mv.x=mv.x+tmv.x; 
      mv.y=mv.y+tmv.y; 
   } 
 
   tmv.x=0;tmv.y=0; 
   for(i=0;i<8;i+=2){ 
      m=x+mv.x+(dia[i].x>>1); 
      n=y+mv.y+(dia[i].y>>1); 
      if(bound_chk(m,n,x,y)){ 
        err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
        searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
#ifdef OPC 
        op.c++; 
#endif 
        if(err0<(*err)){ 
          *err=err0; 
          tmv.x=(dia[i].x>>1); 
          tmv.y=(dia[i].y>>1); 
        } 
      } 
   } 
   mv.x=mv.x+tmv.x; 
   mv.y=mv.y+tmv.y; 
   spt += count_searchedpt(); 
   return mv; 
} 
 
 
MV ncd_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
  int i,j,k,b,t,m,n,err0,c=9,ox=x,oy=y,step; 
   MV mv,tmv; 
   static MV dia[8]={{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1},{0,2},{-1,1}}; 
   static MV crx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}}; 
   static MV lcrx[8]={{-2,0},{0,-2},{2,0},{0,2}}; 
   static MV scrx[4]={{-1,0},{0,-1},{1,0},{0,1}}; 
    
 
 
   init_searchedpt(); 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   searchedpt[MAX_DISP][MAX_DISP]=1; 
 
   tmv.x=0; 
   tmv.y=0; 
   k=5; 
   step=1;    
    for(i=0;i<4;i++){   
      m=x+scrx[i].x; 
      n=y+scrx[i].y; 
      if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
         searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
 
         if(err0<(*err)){ 
            *err=err0; 
            tmv=scrx[i]; 
            k=i; 
         } 
      } 
   } 
   mv=tmv; 
   if(k==5) { 
     spt += count_searchedpt(); 
     return mv;    
   } 
   if(k!=5) { 
     step+=1; 
   k=5; 
     tmv.x=0; tmv.y=0;  
     for(i=0;i<4;i++){ 
        m=x+mv.x+scrx[i].x; 
        n=y+mv.y+scrx[i].y; 
         
        if(bound_chk(m,n,x,y)){ 
           err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
           searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
 
           if(err0<(*err)){ 
             *err=err0; 
             tmv=scrx[i]; 
             k=i; 
             } 
        } 
        } 
     mv.x=mv.x+tmv.x; 
     mv.y=mv.y+tmv.y; 
   } 
 
   if(k==5) { 
     spt += count_searchedpt(); 
      return mv;  //2nd-step-stop 
   } 
 
    k=5; 
     tmv.x=0; tmv.y=0;  
     for(i=0;i<4;i++){ 
        m=x+lcrx[i].x; 
        n=y+lcrx[i].y; 
         
        if(bound_chk(m,n,x,y)){ 
           err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
           searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
 
           if(err0<(*err)){ 
             *err=err0; 
             tmv=lcrx[i]; 
             k=i; 
             } 
        } 
        } 
   if(k!=5) { 
      mv = tmv ; 
   } 
   
   k = 0; 
   while(1){ 
      if(k==9) 
         break; 
      else{ 
          k=9; 
         tmv.x=0;tmv.y=0; 
      } 
      step+=1; 
        for(i=0;i<8;i++){ 
         m=x+mv.x+dia[i].x; 
         n=y+mv.y+dia[i].y; 
         if(bound_chk(m,n,x,y)){ 
            err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
            searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
  
            if(err0<(*err)){ 
               *err=err0; 
               tmv=dia[i]; 
               k=i; 
            } 
         } 
          } 
      mv.x=mv.x+tmv.x; 
      mv.y=mv.y+tmv.y; 
   } 
 
   tmv.x=0;tmv.y=0; 
   for(i=0;i<8;i+=2){ 
      m=x+mv.x+(dia[i].x>>1); 
      n=y+mv.y+(dia[i].y>>1); 
      if(bound_chk(m,n,x,y)){ 
        err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
        searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
 
        if(err0<(*err)){ 
          *err=err0; 
          tmv.x=(dia[i].x>>1); 
          tmv.y=(dia[i].y>>1); 
        } 
      } 
   } 
   mv.x=mv.x+tmv.x; 
   mv.y=mv.y+tmv.y; 
   spt += count_searchedpt(); 
   return mv; 
} 
 
MV kcd_search(u_char *prev, u_char *cur, int x, int y, int *err) 
{ 
  int i, k, m,n,err0, ox=x,oy=y,step=1,side,ops_pt_x,ops_pt_y; 
   MV mv,tmv,ttmv; 
   static MV dia[8]={{-2,0},{-1,1},{0,2},{1,1},{2,0},{1,-1},{0,-2},{-1,-1}}; 
   static MV scrx[8]={{-2,0},{-1,0},{0,-2},{0,-1},{2,0},{1,0},{0,2},{0,1}}; 
   //static MV scrx[4]={{-1,0},{0,-1},{1,0},{0,1}};// 
   static MV sdia[4]={{-1,0},{0,-1},{1,0},{0,1}}; 
   static MV lcrx[4]={{-2,0},{0,-2},{2,0},{0,2}}; 
   static MV sacrx_d[5]={{-1,0},{0,-1},{1,0},{0,1},{0,-2}}; 
   static MV sacrx_t[5]={{-1,0},{0,-1},{1,0},{0,1},{0,2}}; 
   static MV sacrx_l[5]={{-1,0},{0,-1},{1,0},{0,1},{-2,0}}; 
   static MV sacrx_r[5]={{-1,0},{0,-1},{1,0},{0,1},{2,0}}; 
   static MV sacrx_search[5]={{0,0},{0,0},{0,0},{0,0},{0,0}}; 
   static MV ssqr[4]={{-1,1},{-1,-1},{1,-1},{1,1}}; 
  
   init_searchedpt(); 
   *err=mean_abs_err(cur,prev,x,y,x,y,BLOCK_WIDTH,BLOCK_HEIGHT); 
   searchedpt[MAX_DISP][MAX_DISP]=1; 
 
   tmv.x=0; 
   tmv.y=0; 
   k=9; 
   step=1;    
   // SC Step 1 
   for(i=0;i<4;i++){   
      m=x+scrx[i].x; 
      n=y+scrx[i].y; 
      if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
         searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
 	if(err0<(*err)){ 
            *err=err0; 
            tmv=scrx[i]; 
            k=i; 
         } 
      } 
   } 
   mv=tmv; 
   if(k==9) { 
     spt += count_searchedpt(); 
     return mv;  //1st-step-stop 
   } 
 
   // Asym.Cross Search : Step 2 
   else  if ((mv.x == 0)&&(mv.y == 1)){ 
    	 for(i=0;i<5;i++){ 
    	 	sacrx_search[i] = sacrx_t[i]; 
         } 
    	 side = 1; 
    } 
    else if ((mv.x == 1)&&(mv.y == 0)){ 
    	 for(i=0;i<5;i++){ 
    	 	sacrx_search[i] = sacrx_r[i]; 
    	  } 
    	 side = 2; 
    } 
    else if ((mv.x == 0)&&(mv.y == -1)){ 
    	 for(i=0;i<5;i++){ 
    	 	sacrx_search[i] = sacrx_d[i]; 
    	 } 
    	 side = 1; 
    	  
    } 
    else if ((mv.x == -1)&&(mv.y == 0)){ 
    	 for(i=0;i<5;i++){ 
    	 	sacrx_search[i] = sacrx_l[i]; 
    	 } 
    	 side = 2; 
   } 
    
if (step !=3){ 
 
   k = 6; 
   ttmv= tmv; 
   for(i=0;i<5;i++){ 
       m=x+mv.x+sacrx_search[i].x; 
       n=y+mv.y+sacrx_search[i].y; 
      if(bound_chk(m,n,x,y)){ 
            err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
            searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
  	    if(err0<(*err)){ 
               *err=err0; 
               tmv=sacrx_search[i]; 
               k=i; 
            } 
         } 
           } 
      mv.x=mv.x+tmv.x; 
      mv.y=mv.y+tmv.y; 
   if(k==6) {  // unchanged Step 3  
      tmv.x=0; 
      tmv.y=0; 
      k=5; 
      for(i=0;i<4;i++){ 
     	 m=x+mv.x+(sdia[i].x); 
      	 n=y+mv.y+(sdia[i].y); 
       	if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
  	 searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
         if(err0<(*err)){ 
            *err=err0; 
            tmv=sdia[i]; 
            k = i; 
         } 
        } 
      } 
       mv.x=mv.x+(tmv.x); 
       mv.y=mv.y+(tmv.y); 
       if(k==5) {  // Unchanged 
       		spt += count_searchedpt(); 
    		mv.x=mv.x-ttmv.x; 
       		mv.y=mv.y-ttmv.y; 
  		return mv;  //2nd-step-stop 
       } 
    }  
    
}  
   // Step 4 : Large Diamond 
     k = 0; 
      while(1){ 
        if(k==9) 
        	 break; 
            else{ 
         // j=k; 
        	 k=9; 
        	 tmv.x=0;tmv.y=0; 
          } 
      	 step+=1; 
      
       for(i=0;i<8;i++){ 
         m=x+mv.x+dia[i].x; 
         n=y+mv.y+dia[i].y; 
         if(bound_chk(m,n,x,y)){ 
            err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
            searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
  
            if(err0<(*err)){ 
               *err=err0; 
               tmv=dia[i]; 
               k=i; 
            } 
         } 
        // j=(j+1)>7?0:(j+1); 
        } 
        mv.x=mv.x+tmv.x; 
        mv.y=mv.y+tmv.y; 
      } 
      tmv.x=0;tmv.y=0; 
      
      for(i=0;i<4;i++){ 
     	 m=x+mv.x+(sdia[i].x); 
      	 n=y+mv.y+(sdia[i].y); 
       	if(bound_chk(m,n,x,y)){ 
         err0=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
  	 searchedpt[MAX_DISP+m-ox][MAX_DISP+n-oy]=1; 
  
         if(err0<(*err)){ 
            *err=err0; 
            tmv=sdia[i]; 
            k = i; 
         } 
        } 
     } 
         
     mv.x=mv.x+tmv.x; 
      mv.y=mv.y+tmv.y; 
     spt += count_searchedpt(); 
     return mv; 
      
} 
 
 
MV cir_search(u_char *prev, u_char *cur, int x, int y, int rx, int ry, int *err, int b, int t, int l) 
{ 
   int i,j,k,m,n,o,terr; 
   MV mv; 
   i=cirmv[b][0]*l; 
   j=cirmv[b][1]*l; 
   mv.x=0; 
   mv.y=0; 
   k=b; 
   for(o=0;o0) 
      mv1=imv[iy][ix-1]; 
   else 
      mv1.x=mv1.y=0; 
   if(iy==0) 
      mv2=mv3=mv1; 
   else{ 
      mv2=imv[iy-1][ix]; 
      if(ix==(re_width/BLOCK_WIDTH-1)) 
         mv3.x=mv3.y=0; 
      else 
         mv3=imv[iy-1][ix+1]; 
   } 
   pmv.x=med(mv1.x,mv2.x,mv3.x); 
   pmv.y=med(mv1.y,mv2.y,mv3.y); 
   m=x+pmv.x; 
   n=y+pmv.y; 
   pmad=mean_abs_err(cur,prev,x,y,m,n,BLOCK_WIDTH,BLOCK_HEIGHT); 
   smad=MAX_INT; 
   tmv=four_step_search(prev,cur,x,y,&smad); 
   if((pmad-smad)<100){ 
      *err=pmad; 
      return pmv; 
   } 
   *err=smad; 
   return tmv; 
} 
 
void set_param(char *name) //ÐèÒª¸Äд 
{ 
   if(FIELD){ 
      if(!strcmp(name,"tt")){ 
         im_width=720;im_height=486; 
      }else if(!strcmp(name,"football")){ 
         im_width=720;im_height=486; 
      }else if(!strcmp(name,"fg")){ 
         im_width=720;im_height=486; 
      } 
   } 
   else if(CIF){ 
      if(!strcmp(name,"tennis")){ 
         im_width=360;im_height=240; 
      }else if(!strcmp(name,"football")){ 
         im_width=360;im_height=240; 
      }else if(!strcmp(name,"saleman")){ 
         im_width=360;im_height=288; 
      }else if(!strcmp(name,"missa")){ 
         im_width=256;im_height=256; 
      }else if(!strcmp(name,"garden")){ 
         im_width=352;im_height=240; 
      }else if(!strcmp(name,"claire")){ 
         im_width=310;im_height=280; 
      } 
   } 
   else{ 
      if(!strcmp(name,"tennis")){ 
         im_width=720;im_height=486; 
      }else if(!strcmp(name,"football")){ 
         im_width=720;im_height=486; 
      }else if(!strcmp(name,"garden")){ 
         im_width=720;im_height=486; 
      } 
   } 
   re_width=im_width-(im_width%BLOCK_WIDTH); 
   re_height=im_height-(im_height%BLOCK_HEIGHT); 
   if(FIELD){ 
      im_width2=2*im_width; 
      im_height2=im_height/2; 
      re_width2=re_width*2; 
      re_height2=re_height/2; 
   }else{ 
      im_width2=im_width; 
      im_height2=im_height; 
      re_width2=re_width; 
      re_height2=re_height; 
   } 
   mv_width=im_width/BLOCK_WIDTH; 
   mv_height=im_height2/BLOCK_HEIGHT; 
} 
 
void compute_bound(int x, int y, int *ux, int *lx, int *uy, int *ly) 
{ 
   *lx=max(0,x-MAX_DISP); 
   *ux=min(im_width-BLOCK_WIDTH,x+MAX_DISP); 
   *ly=max(0,y-MAX_DISP); 
   *uy=min(im_height2-BLOCK_HEIGHT,y+MAX_DISP); 
} 
 
int bound_chk(int m, int n, int cx, int cy) 
{ 
   int ilow,ihigh,jlow,jhigh; 
   compute_bound(cx,cy,&ihigh,&ilow,&jhigh,&jlow); 
   return(m<=ihigh&&m>=ilow&&n<=jhigh&&n>=jlow); 
} 
 
void search(int method, MV **mv, u_char *prev, u_char *cur) 
{ 
   int i,j,err,c=0,s,e,a; 
   if(HALF){ 
      end=clock(); 
      interpolate_frame(iprev,prev,im_width2,im_height2); 
      over+=clock()-end; 
   } 
   for(j=0;j= (im_width2-bs)) 
    stop_x = 0; 
 if ((new_y) >= (im_height2-bs)) 
    stop_y = 0; 
 search[0].x = 0;        search[0].y = 0; 
 search[1].x = start_x;        search[1].y = start_y; /*   1 2 3   */ 
 search[2].x = 0;        search[2].y = start_y; /*   4 0 5   */ 
 search[3].x = stop_x;        search[3].y = start_y; /*   6 7 8   */ 
 search[4].x = start_x;        search[4].y = 0; 
 search[5].x = stop_x;        search[5].y = 0; 
 search[6].x = start_x;        search[6].y = stop_y; 
 search[7].x = 0;        search[7].y = stop_y; 
 search[8].x = stop_x;        search[8].y = stop_y; 
 hmv=search[0]; 
 spt+=8; 
 for(i=1;i<9;i++){ 
    mae=0; 
#ifdef OPC 
    op.p--; 
#endif 
    for(n=0;n(*err)){ 
       mae=MAX_INT; 
       break; 
     } 
    } 
#ifdef OPC 
    op.c++; 
#endif 
    if(mae<(*err)){ 
       hmv=search[i]; 
       *err=mae; 
    } 
 }*/ 
/* End of PFS halfpel */ 
 return hmv; 
} 
 
void v_init(void) 
{ 
   res=block_alloc(mv_width*BLOCK_WIDTH,mv_height*(BLOCK_HEIGHT<