comparison motion_est_template.c @ 4265:4241e92fb0c7 libavcodec

make hex and large 2 small diamond search half their size instead or -1 if the initial size was a power of 2 double the hex size so odd sized hexagons are possible
author michael
date Tue, 05 Dec 2006 12:34:52 +0000
parents 9b74144471c5
children 8a50de4eafca
comparison
equal deleted inserted replaced
4264:769ea5de44d3 4265:4241e92fb0c7
665 MotionEstContext * const c= &s->me; 665 MotionEstContext * const c= &s->me;
666 me_cmp_func cmpf, chroma_cmpf; 666 me_cmp_func cmpf, chroma_cmpf;
667 LOAD_COMMON 667 LOAD_COMMON
668 LOAD_COMMON2 668 LOAD_COMMON2
669 int map_generation= c->map_generation; 669 int map_generation= c->map_generation;
670 int x,y,i,d; 670 int x,y,d;
671 static const int hex[6][2]={{-2, 0}, { 2,0}, {-1,-2}, {1,-2}, {-1,2},{1,2}}; 671 const int dec= dia_size & (dia_size-1);
672 672
673 cmpf= s->dsp.me_cmp[size]; 673 cmpf= s->dsp.me_cmp[size];
674 chroma_cmpf= s->dsp.me_cmp[size+1]; 674 chroma_cmpf= s->dsp.me_cmp[size+1];
675 675
676 for(;dia_size; dia_size--){ 676 for(;dia_size; dia_size= dec ? dia_size-1 : dia_size>>1){
677 do{ 677 do{
678 x= best[0]; 678 x= best[0];
679 y= best[1]; 679 y= best[1];
680 for(i=0; i<6; i++){ 680
681 CHECK_CLIPPED_MV(x+hex[i][0]*dia_size, y+hex[i][1]*dia_size); 681 CHECK_CLIPPED_MV(x -dia_size , y);
682 CHECK_CLIPPED_MV(x+ dia_size , y);
683 CHECK_CLIPPED_MV(x+( dia_size>>1), y+dia_size);
684 CHECK_CLIPPED_MV(x+( dia_size>>1), y-dia_size);
685 if(dia_size>1){
686 CHECK_CLIPPED_MV(x+(-dia_size>>1), y+dia_size);
687 CHECK_CLIPPED_MV(x+(-dia_size>>1), y-dia_size);
682 } 688 }
683 }while(best[0] != x || best[1] != y); 689 }while(best[0] != x || best[1] != y);
684 } 690 }
685
686 do{
687 x= best[0];
688 y= best[1];
689 CHECK_CLIPPED_MV(x+1, y);
690 CHECK_CLIPPED_MV(x, y+1);
691 CHECK_CLIPPED_MV(x-1, y);
692 CHECK_CLIPPED_MV(x, y-1);
693 }while(best[0] != x || best[1] != y);
694 691
695 return dmin; 692 return dmin;
696 } 693 }
697 694
698 static int l2s_dia_search(MpegEncContext * s, int *best, int dmin, 695 static int l2s_dia_search(MpegEncContext * s, int *best, int dmin,
702 MotionEstContext * const c= &s->me; 699 MotionEstContext * const c= &s->me;
703 me_cmp_func cmpf, chroma_cmpf; 700 me_cmp_func cmpf, chroma_cmpf;
704 LOAD_COMMON 701 LOAD_COMMON
705 LOAD_COMMON2 702 LOAD_COMMON2
706 int map_generation= c->map_generation; 703 int map_generation= c->map_generation;
707 int x,y,i,d, dia_size; 704 int x,y,i,d;
705 int dia_size= c->dia_size&0xFF;
706 const int dec= dia_size & (dia_size-1);
708 static const int hex[8][2]={{-2, 0}, {-1,-1}, { 0,-2}, { 1,-1}, 707 static const int hex[8][2]={{-2, 0}, {-1,-1}, { 0,-2}, { 1,-1},
709 { 2, 0}, { 1, 1}, { 0, 2}, {-1, 1}}; 708 { 2, 0}, { 1, 1}, { 0, 2}, {-1, 1}};
710 709
711 cmpf= s->dsp.me_cmp[size]; 710 cmpf= s->dsp.me_cmp[size];
712 chroma_cmpf= s->dsp.me_cmp[size+1]; 711 chroma_cmpf= s->dsp.me_cmp[size+1];
713 712
714 for(dia_size= c->dia_size&0xFF; dia_size; dia_size--){ 713 for(; dia_size; dia_size= dec ? dia_size-1 : dia_size>>1){
715 do{ 714 do{
716 x= best[0]; 715 x= best[0];
717 y= best[1]; 716 y= best[1];
718 for(i=0; i<8; i++){ 717 for(i=0; i<8; i++){
719 CHECK_CLIPPED_MV(x+hex[i][0]*dia_size, y+hex[i][1]*dia_size); 718 CHECK_CLIPPED_MV(x+hex[i][0]*dia_size, y+hex[i][1]*dia_size);