[x264-devel] commit: Faster chroma CBP handling (Henrik Gramner )

git at videolan.org git at videolan.org
Sat Apr 24 00:40:02 CEST 2010


x264 | branch: master | Henrik Gramner <hengar-6 at student.ltu.se> | Fri Apr 16 22:39:45 2010 +0200| [5dab1efd428735f10a9670637dddffe763286dc4] | committer: Jason Garrett-Glaser 

Faster chroma CBP handling

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

 common/common.h      |    4 ++--
 encoder/cabac.c      |    4 ++--
 encoder/encoder.c    |   14 +++++++-------
 encoder/macroblock.c |   26 ++++++++++----------------
 4 files changed, 21 insertions(+), 27 deletions(-)

diff --git a/common/common.h b/common/common.h
index 0d7dd99..e75f743 100644
--- a/common/common.h
+++ b/common/common.h
@@ -347,7 +347,7 @@ static const int x264_scan8[16+2*4+3] =
     4+5*8,
 
     /* Chroma DC */
-    5+5*8, 6+5*8
+    6+5*8, 7+5*8
 };
 /*
    0 1 2 3 4 5 6 7
@@ -356,7 +356,7 @@ static const int x264_scan8[16+2*4+3] =
  2   B B   L L L L
  3         L L L L
  4   R R   L L L L
- 5   R R   DyDuDv
+ 5   R R   Dy  DuDv
 */
 
 typedef struct x264_ratecontrol_t   x264_ratecontrol_t;
diff --git a/encoder/cabac.c b/encoder/cabac.c
index a0dcff2..82ced42 100644
--- a/encoder/cabac.c
+++ b/encoder/cabac.c
@@ -237,7 +237,7 @@ static void x264_cabac_mb_cbp_chroma( x264_t *h, x264_cabac_t *cb )
         ctx = 4;
         if( cbp_a == 0x20 ) ctx++;
         if( cbp_b == 0x20 ) ctx += 2;
-        x264_cabac_encode_decision_noup( cb, 77 + ctx, h->mb.i_cbp_chroma > 1 );
+        x264_cabac_encode_decision_noup( cb, 77 + ctx, h->mb.i_cbp_chroma >> 1 );
     }
 }
 
@@ -960,7 +960,7 @@ void x264_macroblock_write_cabac( x264_t *h, x264_cabac_t *cb )
                     block_residual_write_cabac_cbf( h, cb, DCT_LUMA_4x4, i, h->dct.luma4x4[i], b_intra );
         }
 
-        if( h->mb.i_cbp_chroma&0x03 )    /* Chroma DC residual present */
+        if( h->mb.i_cbp_chroma ) /* Chroma DC residual present */
         {
             block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_DC, 25, h->dct.chroma_dc[0], b_intra );
             block_residual_write_cabac_cbf( h, cb, DCT_CHROMA_DC, 26, h->dct.chroma_dc[1], b_intra );
diff --git a/encoder/encoder.c b/encoder/encoder.c
index 06eb843..da4565b 100644
--- a/encoder/encoder.c
+++ b/encoder/encoder.c
@@ -1902,7 +1902,8 @@ static int x264_slice_write( x264_t *h )
         /* accumulate mb stats */
         h->stat.frame.i_mb_count[h->mb.i_type]++;
 
-        if( !IS_INTRA(h->mb.i_type) && !IS_SKIP(h->mb.i_type) && !IS_DIRECT(h->mb.i_type) )
+        int b_intra = IS_INTRA( h->mb.i_type );
+        if( !b_intra && !IS_SKIP( h->mb.i_type ) && !IS_DIRECT( h->mb.i_type ) )
         {
             if( h->mb.i_partition != D_8x8 )
                     h->stat.frame.i_mb_partition[h->mb.i_partition] += 4;
@@ -1921,21 +1922,20 @@ static int x264_slice_write( x264_t *h )
 
         if( h->param.i_log_level >= X264_LOG_INFO )
         {
-            if( h->mb.i_cbp_luma || h->mb.i_cbp_chroma )
+            if( h->mb.i_cbp_luma | h->mb.i_cbp_chroma )
             {
                 int cbpsum = (h->mb.i_cbp_luma&1) + ((h->mb.i_cbp_luma>>1)&1)
                            + ((h->mb.i_cbp_luma>>2)&1) + (h->mb.i_cbp_luma>>3);
-                int b_intra = IS_INTRA(h->mb.i_type);
                 h->stat.frame.i_mb_cbp[!b_intra + 0] += cbpsum;
-                h->stat.frame.i_mb_cbp[!b_intra + 2] += h->mb.i_cbp_chroma >= 1;
-                h->stat.frame.i_mb_cbp[!b_intra + 4] += h->mb.i_cbp_chroma == 2;
+                h->stat.frame.i_mb_cbp[!b_intra + 2] += !!h->mb.i_cbp_chroma;
+                h->stat.frame.i_mb_cbp[!b_intra + 4] += h->mb.i_cbp_chroma >> 1;
             }
-            if( h->mb.i_cbp_luma && !IS_INTRA(h->mb.i_type) )
+            if( h->mb.i_cbp_luma && !b_intra )
             {
                 h->stat.frame.i_mb_count_8x8dct[0] ++;
                 h->stat.frame.i_mb_count_8x8dct[1] += h->mb.b_transform_8x8;
             }
-            if( IS_INTRA(h->mb.i_type) && h->mb.i_type != I_PCM )
+            if( b_intra && h->mb.i_type != I_PCM )
             {
                 if( h->mb.i_type == I_16x16 )
                     h->stat.frame.i_mb_pred_mode[0][h->mb.i_intra16x16_pred_mode]++;
diff --git a/encoder/macroblock.c b/encoder/macroblock.c
index 50f939a..fefbcb2 100644
--- a/encoder/macroblock.c
+++ b/encoder/macroblock.c
@@ -343,8 +343,8 @@ void x264_mb_encode_8x8_chroma( x264_t *h, int b_inter, int i_qp )
             h->mb.cache.non_zero_count[x264_scan8[21]] = 0;
             h->mb.cache.non_zero_count[x264_scan8[22]] = 0;
             h->mb.cache.non_zero_count[x264_scan8[23]] = 0;
-            h->mb.cache.non_zero_count[x264_scan8[25]] = 0;
-            h->mb.cache.non_zero_count[x264_scan8[26]] = 0;
+            M16( &h->mb.cache.non_zero_count[x264_scan8[25]] ) = 0;
+
             for( int ch = 0; ch < 2; ch++ )
             {
                 if( ssd[ch] > thresh )
@@ -452,11 +452,8 @@ void x264_mb_encode_8x8_chroma( x264_t *h, int b_inter, int i_qp )
         }
     }
 
-    if( h->mb.i_cbp_chroma )
-        h->mb.i_cbp_chroma = 2;    /* dc+ac (we can't do only ac) */
-    else if( h->mb.cache.non_zero_count[x264_scan8[25]] |
-             h->mb.cache.non_zero_count[x264_scan8[26]] )
-        h->mb.i_cbp_chroma = 1;    /* dc only */
+    /* 0 = none, 1 = DC only, 2 = DC+AC */
+    h->mb.i_cbp_chroma = ((!!M16( &h->mb.cache.non_zero_count[x264_scan8[25]] )) | h->mb.i_cbp_chroma) + h->mb.i_cbp_chroma;
 }
 
 static void x264_macroblock_encode_skip( x264_t *h )
@@ -581,7 +578,6 @@ void x264_predict_lossless_16x16( x264_t *h, int i_mode )
  *****************************************************************************/
 void x264_macroblock_encode( x264_t *h )
 {
-    int i_cbp_dc = 0;
     int i_qp = h->mb.i_qp;
     int b_decimate = h->mb.b_dct_decimate;
     int b_force_no_skip = 0;
@@ -865,15 +861,13 @@ void x264_macroblock_encode( x264_t *h )
     /* encode the 8x8 blocks */
     x264_mb_encode_8x8_chroma( h, !IS_INTRA( h->mb.i_type ), h->mb.i_chroma_qp );
 
-    if( h->param.b_cabac )
-    {
-        i_cbp_dc = h->mb.cache.non_zero_count[x264_scan8[24]]
-                 | h->mb.cache.non_zero_count[x264_scan8[25]] << 1
-                 | h->mb.cache.non_zero_count[x264_scan8[26]] << 2;
-    }
-
     /* store cbp */
-    h->mb.cbp[h->mb.i_mb_xy] = (i_cbp_dc << 8) | (h->mb.i_cbp_chroma << 4) | h->mb.i_cbp_luma;
+    int cbp = h->mb.i_cbp_chroma << 4 | h->mb.i_cbp_luma;
+    if( h->param.b_cabac )
+        cbp |= h->mb.cache.non_zero_count[x264_scan8[24]] << 8
+            |  h->mb.cache.non_zero_count[x264_scan8[25]] << 9
+            |  h->mb.cache.non_zero_count[x264_scan8[26]] << 10;
+    h->mb.cbp[h->mb.i_mb_xy] = cbp;
 
     /* Check for P_SKIP
      * XXX: in the me perhaps we should take x264_mb_predict_mv_pskip into account



More information about the x264-devel mailing list