Browse code

hexagon search dia_size=512 + hexagon size (513 is the normal one used in h264) large to small diamond search dia_size=256 + diamond size

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

Michael Niedermayer authored on 2006/12/02 19:45:51
Showing 1 changed files
... ...
@@ -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
 }