[x264-devel] MBAFF: CABAC encoding of skips

Simon Horlick git at videolan.org
Thu May 12 08:39:00 CEST 2011


x264 | branch: master | Simon Horlick <simonhorlick at gmail.com> | Tue Mar 29 15:46:34 2011 +0100| [e2d4d910221c0bfc816f7f19e9cc8b1309b191f8] | committer: Jason Garrett-Glaser

MBAFF: CABAC encoding of skips

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

 common/common.h     |    1 +
 common/macroblock.c |   29 +++++++++++++++++++++++++++++
 encoder/cabac.c     |    8 ++++----
 3 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/common/common.h b/common/common.h
index 263f994..f19f2f6 100644
--- a/common/common.h
+++ b/common/common.h
@@ -750,6 +750,7 @@ struct x264_t
 
             /* number of neighbors (top and left) that used 8x8 dct */
             int     i_neighbour_transform_size;
+            int     i_neighbour_skip;
 
             /* neighbor CBPs */
             int     i_cbp_top;
diff --git a/common/macroblock.c b/common/macroblock.c
index d8e95ca..251fa2d 100644
--- a/common/macroblock.c
+++ b/common/macroblock.c
@@ -1138,6 +1138,35 @@ void x264_macroblock_cache_load( x264_t *h, int mb_x, int mb_y )
         }
     }
 
+    if( h->param.b_cabac )
+    {
+        int left_xy, top_xy;
+        if( h->sh.b_mbaff )
+        {
+            /* Neighbours here are calculated based on field_decoding_flag */
+            int mb_xy = mb_x + (mb_y&~1)*h->mb.i_mb_stride;
+            left_xy = mb_xy - 1;
+            if( (mb_y&1) && mb_x > 0 && h->mb.field_decoding_flag == h->mb.field[left_xy] )
+                left_xy += h->mb.i_mb_stride;
+            if( h->mb.field_decoding_flag )
+            {
+                top_xy = mb_xy - h->mb.i_mb_stride;
+                if( !(mb_y&1) && top_xy >= 0 && h->mb.slice_table[top_xy] == h->sh.i_first_mb && h->mb.field[top_xy] )
+                    top_xy -= h->mb.i_mb_stride;
+            }
+            else
+                top_xy = mb_x + (mb_y-1)*h->mb.i_mb_stride;
+        }
+        else
+        {
+            left_xy = h->mb.i_mb_left_xy[0];
+            top_xy = h->mb.i_mb_top_xy;
+        }
+
+        h->mb.cache.i_neighbour_skip =   (mb_x >  0 && h->mb.slice_table[left_xy] == h->sh.i_first_mb && !IS_SKIP( h->mb.type[left_xy] ))
+                                     + (top_xy >= 0 && h->mb.slice_table[top_xy]  == h->sh.i_first_mb && !IS_SKIP( h->mb.type[top_xy] ));
+    }
+
     /* load skip */
     if( h->sh.i_type == SLICE_TYPE_B )
     {
diff --git a/encoder/cabac.c b/encoder/cabac.c
index 02dcedd..e04f14b 100644
--- a/encoder/cabac.c
+++ b/encoder/cabac.c
@@ -296,9 +296,9 @@ static void x264_cabac_mb_qp_delta( x264_t *h, x264_cabac_t *cb )
 #if !RDO_SKIP_BS
 void x264_cabac_mb_skip( x264_t *h, int b_skip )
 {
-    int ctx = ((h->mb.i_neighbour & MB_LEFT) && !IS_SKIP( h->mb.i_mb_type_left[0] ))
-            + ((h->mb.i_neighbour & MB_TOP) && !IS_SKIP( h->mb.i_mb_type_top ))
-            + (h->sh.i_type == SLICE_TYPE_P ? 11 : 24);
+    int ctx = h->mb.cache.i_neighbour_skip + 11;
+    if( h->sh.i_type != SLICE_TYPE_P )
+       ctx += 13;
     x264_cabac_encode_decision( &h->cabac, ctx, b_skip );
 }
 #endif
@@ -351,7 +351,7 @@ static void x264_cabac_mb_ref( x264_t *h, x264_cabac_t *cb, int i_list, int idx
     const int i8 = x264_scan8[idx];
     const int i_refa = h->mb.cache.ref[i_list][i8 - 1];
     const int i_refb = h->mb.cache.ref[i_list][i8 - 8];
-    int ctx  = 0;
+    int ctx = 0;
 
     if( i_refa > 0 && !h->mb.cache.skip[i8 - 1] )
         ctx++;



More information about the x264-devel mailing list