Originally committed as revision 7204 to svn://svn.ffmpeg.org/ffmpeg/trunk
Michael Niedermayer authored on 2006/12/02 19:45:51... | ... |
@@ -658,6 +658,79 @@ if(256*256*256*64 % (stats[0]+1)==0){ |
658 | 658 |
return dmin; |
659 | 659 |
} |
660 | 660 |
|
661 |
+static int hex_search(MpegEncContext * s, int *best, int dmin, |
|
662 |
+ int src_index, int ref_index, int const penalty_factor, |
|
663 |
+ int size, int h, int flags, int dia_size) |
|
664 |
+{ |
|
665 |
+ MotionEstContext * const c= &s->me; |
|
666 |
+ me_cmp_func cmpf, chroma_cmpf; |
|
667 |
+ LOAD_COMMON |
|
668 |
+ LOAD_COMMON2 |
|
669 |
+ int map_generation= c->map_generation; |
|
670 |
+ int x,y,i,d; |
|
671 |
+ static const int hex[6][2]={{-2, 0}, { 2,0}, {-1,-2}, {1,-2}, {-1,2},{1,2}}; |
|
672 |
+ |
|
673 |
+ cmpf= s->dsp.me_cmp[size]; |
|
674 |
+ chroma_cmpf= s->dsp.me_cmp[size+1]; |
|
675 |
+ |
|
676 |
+ for(;dia_size; dia_size--){ |
|
677 |
+ do{ |
|
678 |
+ x= best[0]; |
|
679 |
+ y= best[1]; |
|
680 |
+ for(i=0; i<6; i++){ |
|
681 |
+ CHECK_CLIPED_MV(x+hex[i][0]*dia_size, y+hex[i][1]*dia_size); |
|
682 |
+ } |
|
683 |
+ }while(best[0] != x || best[1] != y); |
|
684 |
+ } |
|
685 |
+ |
|
686 |
+ do{ |
|
687 |
+ x= best[0]; |
|
688 |
+ y= best[1]; |
|
689 |
+ CHECK_CLIPED_MV(x+1, y); |
|
690 |
+ CHECK_CLIPED_MV(x, y+1); |
|
691 |
+ CHECK_CLIPED_MV(x-1, y); |
|
692 |
+ CHECK_CLIPED_MV(x, y-1); |
|
693 |
+ }while(best[0] != x || best[1] != y); |
|
694 |
+ |
|
695 |
+ return dmin; |
|
696 |
+} |
|
697 |
+ |
|
698 |
+static int l2s_dia_search(MpegEncContext * s, int *best, int dmin, |
|
699 |
+ int src_index, int ref_index, int const penalty_factor, |
|
700 |
+ int size, int h, int flags) |
|
701 |
+{ |
|
702 |
+ MotionEstContext * const c= &s->me; |
|
703 |
+ me_cmp_func cmpf, chroma_cmpf; |
|
704 |
+ LOAD_COMMON |
|
705 |
+ LOAD_COMMON2 |
|
706 |
+ int map_generation= c->map_generation; |
|
707 |
+ int x,y,i,d, dia_size; |
|
708 |
+ static const int hex[8][2]={{-2, 0}, {-1,-1}, { 0,-2}, { 1,-1}, |
|
709 |
+ { 2, 0}, { 1, 1}, { 0, 2}, {-1, 1}}; |
|
710 |
+ |
|
711 |
+ cmpf= s->dsp.me_cmp[size]; |
|
712 |
+ chroma_cmpf= s->dsp.me_cmp[size+1]; |
|
713 |
+ |
|
714 |
+ for(dia_size= c->dia_size&0xFF; dia_size; dia_size--){ |
|
715 |
+ do{ |
|
716 |
+ x= best[0]; |
|
717 |
+ y= best[1]; |
|
718 |
+ for(i=0; i<8; i++){ |
|
719 |
+ CHECK_CLIPED_MV(x+hex[i][0]*dia_size, y+hex[i][1]*dia_size); |
|
720 |
+ } |
|
721 |
+ }while(best[0] != x || best[1] != y); |
|
722 |
+ } |
|
723 |
+ |
|
724 |
+ x= best[0]; |
|
725 |
+ y= best[1]; |
|
726 |
+ CHECK_CLIPED_MV(x+1, y); |
|
727 |
+ CHECK_CLIPED_MV(x, y+1); |
|
728 |
+ CHECK_CLIPED_MV(x-1, y); |
|
729 |
+ CHECK_CLIPED_MV(x, y-1); |
|
730 |
+ |
|
731 |
+ return dmin; |
|
732 |
+} |
|
733 |
+ |
|
661 | 734 |
static int umh_search(MpegEncContext * s, int *best, int dmin, |
662 | 735 |
int src_index, int ref_index, int const penalty_factor, |
663 | 736 |
int size, int h, int flags) |
... | ... |
@@ -672,7 +745,6 @@ static int umh_search(MpegEncContext * s, int *best, int dmin, |
672 | 672 |
{ 4,-2}, { 4,-1}, { 4, 0}, { 4, 1}, { 4, 2}, |
673 | 673 |
{-2, 3}, { 0, 4}, { 2, 3}, |
674 | 674 |
{-2,-3}, { 0,-4}, { 2,-3},}; |
675 |
- static const int hex2[6][2]={{-2, 0}, { 2,0}, {-1,-2}, {1,-2}, {-1,2},{1,2}}; |
|
676 | 675 |
|
677 | 676 |
cmpf= s->dsp.me_cmp[size]; |
678 | 677 |
chroma_cmpf= s->dsp.me_cmp[size+1]; |
... | ... |
@@ -702,24 +774,7 @@ static int umh_search(MpegEncContext * s, int *best, int dmin, |
702 | 702 |
} |
703 | 703 |
} |
704 | 704 |
|
705 |
- do{ |
|
706 |
- x= best[0]; |
|
707 |
- y= best[1]; |
|
708 |
- for(i=0; i<6; i++){ |
|
709 |
- CHECK_CLIPED_MV(x+hex2[i][0], y+hex2[i][1]); |
|
710 |
- } |
|
711 |
- }while(best[0] != x || best[1] != y); |
|
712 |
- |
|
713 |
- do{ |
|
714 |
- x= best[0]; |
|
715 |
- y= best[1]; |
|
716 |
- CHECK_CLIPED_MV(x+1, y); |
|
717 |
- CHECK_CLIPED_MV(x, y+1); |
|
718 |
- CHECK_CLIPED_MV(x-1, y); |
|
719 |
- CHECK_CLIPED_MV(x, y-1); |
|
720 |
- }while(best[0] != x || best[1] != y); |
|
721 |
- |
|
722 |
- return dmin; |
|
705 |
+ return hex_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags, 1); |
|
723 | 706 |
} |
724 | 707 |
|
725 | 708 |
#define SAB_CHECK_MV(ax,ay)\ |
... | ... |
@@ -919,6 +974,10 @@ static always_inline int diamond_search(MpegEncContext * s, int *best, int dmin, |
919 | 919 |
return sab_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags); |
920 | 920 |
else if(c->dia_size<2) |
921 | 921 |
return small_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags); |
922 |
+ else if(c->dia_size>512) |
|
923 |
+ return hex_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags, c->dia_size&0xFF); |
|
924 |
+ else if(c->dia_size>256) |
|
925 |
+ return l2s_dia_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags); |
|
922 | 926 |
else |
923 | 927 |
return var_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags); |
924 | 928 |
} |