* all: Patches by Loren Merritt:
[x262.git] / encoder / analyse.c
index 27cf993..41c561d 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <math.h>
+#include <limits.h>
 
 #include "../core/common.h"
 #include "../core/macroblock.h"
@@ -464,15 +465,8 @@ static void x264_mb_analyse_inter_p16x16( x264_t *h, x264_mb_analysis_t *a )
 //    m.mvc[0]  = 0;
 //    m.mvc[1]  = 0;
 
-    /* ME for ref 0 */
-    m.p_fref = h->mb.pic.p_fref[0][0][0];
-    x264_mb_predict_mv_16x16( h, 0, 0, m.mvp );
-    x264_me_search( h, &m );
-
-    a->l0.i_ref = 0;
-    a->l0.me16x16 = m;
-
-    for( i_ref = 1; i_ref < h->i_ref0; i_ref++ )
+    a->l0.me16x16.cost = INT_MAX;
+    for( i_ref = 0; i_ref < h->i_ref0; i_ref++ )
     {
         /* search with ref */
         m.p_fref = h->mb.pic.p_fref[0][i_ref][0];
@@ -489,6 +483,9 @@ static void x264_mb_analyse_inter_p16x16( x264_t *h, x264_mb_analysis_t *a )
         }
     }
 
+    /* subtract ref cost, so we don't have to add it for the other P types */
+    a->l0.me16x16.cost -= m.lm * bs_size_te( h->sh.i_num_ref_idx_l0_active - 1, a->l0.i_ref );
+
     /* Set global ref, needed for all others modes */
     x264_macroblock_cache_ref( h, 0, 0, 4, 4, 0, a->l0.i_ref );
 }
@@ -765,15 +762,9 @@ static void x264_mb_analyse_inter_b16x16( x264_t *h, x264_mb_analysis_t *a )
     m.b_mvc   = 0;
     m.i_mv_range = a->i_mv_range;
 
-    /* ME for List 0 ref 0 */
-    m.p_fref = h->mb.pic.p_fref[0][0][0];
-    x264_mb_predict_mv_16x16( h, 0, 0, m.mvp );
-    x264_me_search( h, &m );
-
-    a->l0.i_ref = 0;
-    a->l0.me16x16 = m;
-
-    for( i_ref = 1; i_ref < h->i_ref0; i_ref++ )
+    /* ME for List 0 */
+    a->l0.me16x16.cost = INT_MAX;
+    for( i_ref = 0; i_ref < h->i_ref0; i_ref++ )
     {
         /* search with ref */
         m.p_fref = h->mb.pic.p_fref[0][i_ref][0];
@@ -790,15 +781,9 @@ static void x264_mb_analyse_inter_b16x16( x264_t *h, x264_mb_analysis_t *a )
         }
     }
 
-    /* ME for list 1 ref 0 */
-    m.p_fref = h->mb.pic.p_fref[1][0][0];
-    x264_mb_predict_mv_16x16( h, 1, 0, m.mvp );
-    x264_me_search( h, &m );
-
-    a->l1.i_ref = 0;
-    a->l1.me16x16 = m;
-
-    for( i_ref = 1; i_ref < h->i_ref1; i_ref++ )
+    /* ME for list 1 */
+    a->l1.me16x16.cost = INT_MAX;
+    for( i_ref = 0; i_ref < h->i_ref1; i_ref++ )
     {
         /* search with ref */
         m.p_fref = h->mb.pic.p_fref[1][i_ref][0];