Browse code

New full search ME

Originally committed as revision 14142 to svn://svn.ffmpeg.org/ffmpeg/trunk

Michael Niedermayer authored on 2008/07/10 03:59:52
Showing 1 changed files
... ...
@@ -776,6 +776,41 @@ static int umh_search(MpegEncContext * s, int *best, int dmin,
776 776
     return hex_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags, 2);
777 777
 }
778 778
 
779
+static int full_search(MpegEncContext * s, int *best, int dmin,
780
+                                       int src_index, int ref_index, int const penalty_factor,
781
+                                       int size, int h, int flags)
782
+{
783
+    MotionEstContext * const c= &s->me;
784
+    me_cmp_func cmpf, chroma_cmpf;
785
+    LOAD_COMMON
786
+    LOAD_COMMON2
787
+    int map_generation= c->map_generation;
788
+    int x,y, d;
789
+    const int dia_size= c->dia_size&0xFF;
790
+
791
+    cmpf= s->dsp.me_cmp[size];
792
+    chroma_cmpf= s->dsp.me_cmp[size+1];
793
+
794
+    for(y=FFMAX(-dia_size, ymin); y<=FFMIN(dia_size,ymax); y++){
795
+        for(x=FFMAX(-dia_size, xmin); x<=FFMIN(dia_size,xmax); x++){
796
+            CHECK_MV(x, y);
797
+        }
798
+    }
799
+
800
+    x= best[0];
801
+    y= best[1];
802
+    d= dmin;
803
+    CHECK_CLIPPED_MV(x  , y);
804
+    CHECK_CLIPPED_MV(x+1, y);
805
+    CHECK_CLIPPED_MV(x, y+1);
806
+    CHECK_CLIPPED_MV(x-1, y);
807
+    CHECK_CLIPPED_MV(x, y-1);
808
+    best[0]= x;
809
+    best[1]= y;
810
+
811
+    return d;
812
+}
813
+
779 814
 #define SAB_CHECK_MV(ax,ay)\
780 815
 {\
781 816
     const int key= ((ay)<<ME_MAP_MV_BITS) + (ax) + map_generation;\
... ...
@@ -980,6 +1015,8 @@ static av_always_inline int diamond_search(MpegEncContext * s, int *best, int dm
980 980
         return   sab_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
981 981
     else if(c->dia_size<2)
982 982
         return small_diamond_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
983
+    else if(c->dia_size>1024)
984
+        return          full_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
983 985
     else if(c->dia_size>768)
984 986
         return           umh_search(s, best, dmin, src_index, ref_index, penalty_factor, size, h, flags);
985 987
     else if(c->dia_size>512)