[x264-devel] commit: CAVLC optimizations (Jason Garrett-Glaser )

git version control git at videolan.org
Thu Apr 9 11:16:37 CEST 2009


x264 | branch: master | Jason Garrett-Glaser <darkshikari at gmail.com> | Wed Apr  8 05:45:03 2009 -0700| [fe11a6f39e4e8235d685591ec9c0ec86eca4fee9] | committer: Jason Garrett-Glaser 

CAVLC optimizations
faster bs_write_te, port CABAC context selection optimization to CAVLC.

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

 common/bs.h       |    6 ++----
 encoder/analyse.c |    2 +-
 encoder/cavlc.c   |   35 +++++++++++++++++++++--------------
 3 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/common/bs.h b/common/bs.h
index cf4befb..e36549e 100644
--- a/common/bs.h
+++ b/common/bs.h
@@ -233,7 +233,7 @@ static inline void bs_write_te( bs_t *s, int x, int val )
 {
     if( x == 1 )
         bs_write1( s, 1^val );
-    else if( x > 1 )
+    else //if( x > 1 )
         bs_write_ue( s, val );
 }
 
@@ -265,10 +265,8 @@ static inline int bs_size_te( int x, int val )
 {
     if( x == 1 )
         return 1;
-    else if( x > 1 )
+    else //if( x > 1 )
         return x264_ue_size_tab[val+1];
-    else
-        return 0;
 }
 
 #endif
diff --git a/encoder/analyse.c b/encoder/analyse.c
index 0b65092..0aea58f 100644
--- a/encoder/analyse.c
+++ b/encoder/analyse.c
@@ -195,7 +195,7 @@ static void x264_mb_analyse_load_costs( x264_t *h, x264_mb_analysis_t *a )
         }
         for( i = 0; i < 3; i++ )
             for( j = 0; j < 33; j++ )
-                x264_cost_ref[a->i_qp][i][j] = a->i_lambda * bs_size_te( i, j );
+                x264_cost_ref[a->i_qp][i][j] = i ? a->i_lambda * bs_size_te( i, j ) : 0;
     }
     a->p_cost_mv = p_cost_mv[a->i_qp];
     a->p_cost_ref0 = x264_cost_ref[a->i_qp][x264_clip3(h->sh.i_num_ref_idx_l0_active-1,0,2)];
diff --git a/encoder/cavlc.c b/encoder/cavlc.c
index 052a16c..33997ac 100644
--- a/encoder/cavlc.c
+++ b/encoder/cavlc.c
@@ -112,16 +112,13 @@ static inline int block_residual_write_cavlc_escape( x264_t *h, bs_t *s, int i_s
     return i_suffix_length;
 }
 
-static void block_residual_write_cavlc( x264_t *h, bs_t *s, int i_ctxBlockCat, int i_idx, int16_t *l, int i_count )
+static void block_residual_write_cavlc( x264_t *h, bs_t *s, int i_ctxBlockCat, int i_idx, int16_t *l, int i_count, int nC )
 {
-    static const uint8_t ct_index[17] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3};
     static const uint8_t ctz_index[8] = {3,0,1,0,2,0,1,0};
     x264_run_level_t runlevel;
     int i_trailing, i_total_zero, i_suffix_length, i;
     int i_total = 0;
     unsigned int i_sign;
-    /* x264_mb_predict_non_zero_code return 0 <-> (16+16+1)>>1 = 16 */
-    int nC = i_idx >= 25 ? 4 : ct_index[x264_mb_predict_non_zero_code( h, i_idx == 24 ? 0 : i_idx )];
 
     if( !h->mb.cache.non_zero_count[x264_scan8[i_idx]] )
     {
@@ -198,6 +195,14 @@ static void block_residual_write_cavlc( x264_t *h, bs_t *s, int i_ctxBlockCat, i
     }
 }
 
+static const uint8_t ct_index[17] = {0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3};
+
+#define block_residual_write_cavlc(h,s,cat,idx,l,count)\
+{\
+    int nC = cat == DCT_CHROMA_DC ? 4 : ct_index[x264_mb_predict_non_zero_code( h, cat == DCT_LUMA_DC ? 0 : idx )];\
+    block_residual_write_cavlc(h,s,cat,idx,l,count,nC);\
+}
+
 static void cavlc_qp_delta( x264_t *h, bs_t *s )
 {
     int i_dqp = h->mb.i_qp - h->mb.i_last_qp;
@@ -319,7 +324,7 @@ void x264_macroblock_write_cavlc( x264_t *h, bs_t *s )
     }
 
 #if !RDO_SKIP_BS
-    if( i_mb_type == I_PCM)
+    if( i_mb_type == I_PCM )
     {
         bs_write_ue( s, i_mb_i_offset + 25 );
         i_mb_pos_tex = bs_pos( s );
@@ -382,7 +387,7 @@ void x264_macroblock_write_cavlc( x264_t *h, bs_t *s )
 
         if( h->mb.i_partition == D_16x16 )
         {
-            bs_write_ue( s, 0 );
+            bs_write1( s, 1 );
 
             if( h->mb.pic.i_fref[0] > 1 )
                 bs_write_te( s, h->mb.pic.i_fref[0] - 1, h->mb.cache.ref[0][x264_scan8[0]] );
@@ -437,7 +442,7 @@ void x264_macroblock_write_cavlc( x264_t *h, bs_t *s )
         else
         {
             bs_write_ue( s, 3 );
-            b_sub_ref = h->mb.pic.i_fref[0] > 1;
+            b_sub_ref = 1;
         }
 
         /* sub mb type */
@@ -468,12 +473,14 @@ void x264_macroblock_write_cavlc( x264_t *h, bs_t *s )
             bs_write_ue( s, sub_mb_type_b_to_golomb[ h->mb.i_sub_partition[i] ] );
 
         /* ref */
-        for( i = 0; i < 4; i++ )
-            if( x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i] ] )
-                bs_write_te( s, h->mb.pic.i_fref[0] - 1, h->mb.cache.ref[0][x264_scan8[i*4]] );
-        for( i = 0; i < 4; i++ )
-            if( x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i] ] )
-                bs_write_te( s, h->mb.pic.i_fref[1] - 1, h->mb.cache.ref[1][x264_scan8[i*4]] );
+        if( h->mb.pic.i_fref[0] > 1 )
+            for( i = 0; i < 4; i++ )
+                if( x264_mb_partition_listX_table[0][ h->mb.i_sub_partition[i] ] )
+                    bs_write_te( s, h->mb.pic.i_fref[0] - 1, h->mb.cache.ref[0][x264_scan8[i*4]] );
+        if( h->mb.pic.i_fref[1] > 1 )
+            for( i = 0; i < 4; i++ )
+                if( x264_mb_partition_listX_table[1][ h->mb.i_sub_partition[i] ] )
+                    bs_write_te( s, h->mb.pic.i_fref[1] - 1, h->mb.cache.ref[1][x264_scan8[i*4]] );
 
         /* mvd */
         for( i = 0; i < 4; i++ )
@@ -555,7 +562,7 @@ void x264_macroblock_write_cavlc( x264_t *h, bs_t *s )
         }
     }
     else if( i_mb_type == B_DIRECT )
-        bs_write_ue( s, 0 );
+        bs_write1( s, 1 );
     else
     {
         x264_log(h, X264_LOG_ERROR, "invalid/unhandled mb_type\n" );



More information about the x264-devel mailing list