[x264-devel] commit: Eliminate edge cases for MV predictors (Jason Garrett-Glaser )

git at videolan.org git at videolan.org
Thu Jul 15 04:08:43 CEST 2010


x264 | branch: master | Jason Garrett-Glaser <darkshikari at gmail.com> | Tue Jul  6 13:39:44 2010 -0700| [04e40ff9f61672bec01230ce6d70bc487f12bc2c] | committer: Jason Garrett-Glaser 

Eliminate edge cases for MV predictors
Saves a few clocks in mv pred.

> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=04e40ff9f61672bec01230ce6d70bc487f12bc2c
---

 common/frame.c      |    7 +++++--
 common/macroblock.c |    9 +++++++--
 common/mvpred.c     |   17 ++++-------------
 encoder/analyse.c   |    4 ++--
 4 files changed, 18 insertions(+), 19 deletions(-)

diff --git a/common/frame.c b/common/frame.c
index d862468..fa48f5a 100644
--- a/common/frame.c
+++ b/common/frame.c
@@ -103,7 +103,9 @@ x264_frame_t *x264_frame_new( x264_t *h, int b_fdec )
         CHECKED_MALLOC( frame->mb_type, i_mb_count * sizeof(int8_t));
         CHECKED_MALLOC( frame->mb_partition, i_mb_count * sizeof(uint8_t));
         CHECKED_MALLOC( frame->mv[0], 2*16 * i_mb_count * sizeof(int16_t) );
-        CHECKED_MALLOC( frame->mv16x16, 2*i_mb_count * sizeof(int16_t) );
+        CHECKED_MALLOC( frame->mv16x16, 2*(i_mb_count+1) * sizeof(int16_t) );
+        M32( frame->mv16x16[0] ) = 0;
+        frame->mv16x16++;
         CHECKED_MALLOC( frame->ref[0], 4 * i_mb_count * sizeof(int8_t) );
         if( h->param.i_bframe )
         {
@@ -205,7 +207,8 @@ void x264_frame_delete( x264_frame_t *frame )
         x264_free( frame->mb_partition );
         x264_free( frame->mv[0] );
         x264_free( frame->mv[1] );
-        x264_free( frame->mv16x16 );
+        if( frame->mv16x16 )
+            x264_free( frame->mv16x16-1 );
         x264_free( frame->ref[0] );
         x264_free( frame->ref[1] );
         x264_pthread_mutex_destroy( &frame->mutex );
diff --git a/common/macroblock.c b/common/macroblock.c
index ebff1c5..a7085aa 100644
--- a/common/macroblock.c
+++ b/common/macroblock.c
@@ -251,7 +251,11 @@ int x264_macroblock_cache_allocate( x264_t *h )
             i_refs = X264_MIN(16, i_refs + 1); //blind weights add one duplicate frame
 
         for( int j = !i; j < i_refs; j++ )
-            CHECKED_MALLOC( h->mb.mvr[i][j], 2 * i_mb_count * sizeof(int16_t) );
+        {
+            CHECKED_MALLOC( h->mb.mvr[i][j], 2 * (i_mb_count + 1) * sizeof(int16_t) );
+            M32( h->mb.mvr[i][j][0] ) = 0;
+            h->mb.mvr[i][j]++;
+        }
     }
 
     if( h->param.analyse.i_weighted_pred )
@@ -300,7 +304,8 @@ void x264_macroblock_cache_free( x264_t *h )
 {
     for( int i = 0; i < 2; i++ )
         for( int j = !i; j < 32; j++ )
-            x264_free( h->mb.mvr[i][j] );
+            if( h->mb.mvr[i][j] )
+                x264_free( h->mb.mvr[i][j]-1 );
     for( int i = 0; i < 16; i++ )
         x264_free( h->mb.p_weight_buf[i] );
 
diff --git a/common/mvpred.c b/common/mvpred.c
index 03dfe9f..38636e1 100644
--- a/common/mvpred.c
+++ b/common/mvpred.c
@@ -423,19 +423,10 @@ void x264_mb_predict_mv_ref16x16( x264_t *h, int i_list, int i_ref, int16_t mvc[
     }
 
     /* spatial predictors */
-    if( h->mb.i_neighbour_frame & MB_LEFT )
-    {
-        SET_MVP( mvr[h->mb.i_mb_left_xy] );
-    }
-    if( h->mb.i_neighbour_frame & MB_TOP )
-    {
-        SET_MVP( mvr[h->mb.i_mb_top_xy] );
-
-        if( h->mb.i_neighbour_frame & MB_TOPLEFT )
-            SET_MVP( mvr[h->mb.i_mb_topleft_xy] );
-        if( h->mb.i_neighbour_frame & MB_TOPRIGHT )
-            SET_MVP( mvr[h->mb.i_mb_topright_xy] );
-    }
+    SET_MVP( mvr[h->mb.i_mb_left_xy] );
+    SET_MVP( mvr[h->mb.i_mb_top_xy] );
+    SET_MVP( mvr[h->mb.i_mb_topleft_xy] );
+    SET_MVP( mvr[h->mb.i_mb_topright_xy] );
 #undef SET_MVP
 
     /* temporal predictors */
diff --git a/encoder/analyse.c b/encoder/analyse.c
index 93f7eed..2f19f99 100644
--- a/encoder/analyse.c
+++ b/encoder/analyse.c
@@ -1956,7 +1956,7 @@ static void x264_mb_analyse_inter_b8x8_mixed_ref( x264_t *h, x264_mb_analysis_t
             lX->me8x8[i].cost = INT_MAX;
             for( int i_ref = 0; i_ref <= i_maxref[l]; i_ref++ )
             {
-                m.i_ref_cost = REF_COST( l, i_ref );;
+                m.i_ref_cost = REF_COST( l, i_ref );
 
                 LOAD_HPELS( &m, h->mb.pic.p_fref[l][i_ref], l, i_ref, 8*x8, 8*y8 );
 
@@ -2104,7 +2104,7 @@ static void x264_mb_analyse_inter_b16x8( x264_t *h, x264_mb_analysis_t *a, int i
             for( int j = 0; j < i_ref8s; j++ )
             {
                 int i_ref = ref8[j];
-                m.i_ref_cost = REF_COST( l, i_ref );;
+                m.i_ref_cost = REF_COST( l, i_ref );
 
                 LOAD_HPELS( &m, h->mb.pic.p_fref[l][i_ref], l, i_ref, 0, 8*i );
 



More information about the x264-devel mailing list