Mercurial > libavcodec.hg
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); |