Eliminate edge cases for MV predictors
authorJason Garrett-Glaser <darkshikari@gmail.com>
Tue, 6 Jul 2010 20:39:44 +0000 (13:39 -0700)
committerJason Garrett-Glaser <darkshikari@gmail.com>
Thu, 15 Jul 2010 01:50:33 +0000 (18:50 -0700)
Saves a few clocks in mv pred.

common/frame.c
common/macroblock.c
common/mvpred.c
encoder/analyse.c

index d862468..fa48f5a 100644 (file)
@@ -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 );
index ebff1c5..a7085aa 100644 (file)
@@ -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] );
 
index 03dfe9f..38636e1 100644 (file)
@@ -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 */
index 93f7eed..2f19f99 100644 (file)
@@ -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 );