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<