[x264-devel] MBAFF: Calculate bipred POCs

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


x264 | branch: master | Simon Horlick <simonhorlick at gmail.com> | Tue Mar 15 01:15:06 2011 +0000| [f1715be2a88fc4624f2620e14fa65a975e2c1a09] | committer: Jason Garrett-Glaser

MBAFF: Calculate bipred POCs

Need to calculate two tables for the cases where the current macroblock is
progressive or interlaced as refs are calculated differently for each.

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

 common/common.h     |    4 +-
 common/macroblock.c |   71 ++++++++++++++++++++++++++-------------------------
 2 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/common/common.h b/common/common.h
index 64947ed..d24a155 100644
--- a/common/common.h
+++ b/common/common.h
@@ -777,9 +777,9 @@ struct x264_t
         int     i_chroma_lambda2_offset;
 
         /* B_direct and weighted prediction */
-        int16_t dist_scale_factor_buf[2][X264_REF_MAX*2][4];
+        int16_t dist_scale_factor_buf[2][2][X264_REF_MAX*2][4];
         int16_t (*dist_scale_factor)[4];
-        int8_t bipred_weight_buf[2][X264_REF_MAX*2][4];
+        int8_t bipred_weight_buf[2][2][X264_REF_MAX*2][4];
         int8_t (*bipred_weight)[4];
         /* maps fref1[0]'s ref indices into the current list0 */
 #define map_col_to_list0(col) h->mb.map_col_to_list0[(col)+2]
diff --git a/common/macroblock.c b/common/macroblock.c
index 5230190..083de0d 100644
--- a/common/macroblock.c
+++ b/common/macroblock.c
@@ -1170,8 +1170,8 @@ void x264_macroblock_cache_load( x264_t *h, int mb_x, int mb_y )
     /* load skip */
     if( h->sh.i_type == SLICE_TYPE_B )
     {
-        h->mb.bipred_weight = h->mb.bipred_weight_buf[h->mb.b_interlaced&(mb_y&1)];
-        h->mb.dist_scale_factor = h->mb.dist_scale_factor_buf[h->mb.b_interlaced&(mb_y&1)];
+        h->mb.bipred_weight = h->mb.bipred_weight_buf[h->mb.b_interlaced][h->mb.b_interlaced&(mb_y&1)];
+        h->mb.dist_scale_factor = h->mb.dist_scale_factor_buf[h->mb.b_interlaced][h->mb.b_interlaced&(mb_y&1)];
         if( h->param.b_cabac )
         {
             uint8_t skipbp;
@@ -1626,42 +1626,43 @@ void x264_macroblock_cache_save( x264_t *h )
 
 void x264_macroblock_bipred_init( x264_t *h )
 {
-    for( int field = 0; field <= h->sh.b_mbaff; field++ )
-        for( int i_ref0 = 0; i_ref0 < (h->i_ref[0]<<h->sh.b_mbaff); i_ref0++ )
-        {
-            x264_frame_t *l0 = h->fref[0][i_ref0>>h->sh.b_mbaff];
-            int poc0 = l0->i_poc + l0->i_delta_poc[field^(i_ref0&1)];
-            for( int i_ref1 = 0; i_ref1 < (h->i_ref[1]<<h->sh.b_mbaff); i_ref1++ )
+    for( int mbfield = 0; mbfield <= h->sh.b_mbaff; mbfield++ )
+        for( int field = 0; field <= h->sh.b_mbaff; field++ )
+            for( int i_ref0 = 0; i_ref0 < (h->i_ref[0]<<mbfield); i_ref0++ )
             {
-                int dist_scale_factor;
-                x264_frame_t *l1 = h->fref[1][i_ref1>>h->sh.b_mbaff];
-                int poc1 = l1->i_poc + l1->i_delta_poc[field^(i_ref1&1)];
-                int cur_poc = h->fdec->i_poc + h->fdec->i_delta_poc[field];
-                int td = x264_clip3( poc1 - poc0, -128, 127 );
-                if( td == 0 /* || pic0 is a long-term ref */ )
-                    dist_scale_factor = 256;
-                else
+                x264_frame_t *l0 = h->fref[0][i_ref0>>mbfield];
+                int poc0 = l0->i_poc + mbfield*l0->i_delta_poc[field^(i_ref0&1)];
+                for( int i_ref1 = 0; i_ref1 < (h->i_ref[1]<<mbfield); i_ref1++ )
                 {
-                    int tb = x264_clip3( cur_poc - poc0, -128, 127 );
-                    int tx = (16384 + (abs(td) >> 1)) / td;
-                    dist_scale_factor = x264_clip3( (tb * tx + 32) >> 6, -1024, 1023 );
+                    int dist_scale_factor;
+                    x264_frame_t *l1 = h->fref[1][i_ref1>>mbfield];
+                    int cur_poc = h->fdec->i_poc + mbfield*h->fdec->i_delta_poc[field];
+                    int poc1 = l1->i_poc + mbfield*l1->i_delta_poc[field^(i_ref1&1)];
+                    int td = x264_clip3( poc1 - poc0, -128, 127 );
+                    if( td == 0 /* || pic0 is a long-term ref */ )
+                        dist_scale_factor = 256;
+                    else
+                    {
+                        int tb = x264_clip3( cur_poc - poc0, -128, 127 );
+                        int tx = (16384 + (abs(td) >> 1)) / td;
+                        dist_scale_factor = x264_clip3( (tb * tx + 32) >> 6, -1024, 1023 );
+                    }
+
+                    h->mb.dist_scale_factor_buf[mbfield][field][i_ref0][i_ref1] = dist_scale_factor;
+
+                    dist_scale_factor >>= 2;
+                    if( h->param.analyse.b_weighted_bipred
+                          && dist_scale_factor >= -64
+                          && dist_scale_factor <= 128 )
+                    {
+                        h->mb.bipred_weight_buf[mbfield][field][i_ref0][i_ref1] = 64 - dist_scale_factor;
+                        // ssse3 implementation of biweight doesn't support the extrema.
+                        // if we ever generate them, we'll have to drop that optimization.
+                        assert( dist_scale_factor >= -63 && dist_scale_factor <= 127 );
+                    }
+                    else
+                        h->mb.bipred_weight_buf[mbfield][field][i_ref0][i_ref1] = 32;
                 }
-
-                h->mb.dist_scale_factor_buf[field][i_ref0][i_ref1] = dist_scale_factor;
-
-                dist_scale_factor >>= 2;
-                if( h->param.analyse.b_weighted_bipred
-                      && dist_scale_factor >= -64
-                      && dist_scale_factor <= 128 )
-                {
-                    h->mb.bipred_weight_buf[field][i_ref0][i_ref1] = 64 - dist_scale_factor;
-                    // ssse3 implementation of biweight doesn't support the extrema.
-                    // if we ever generate them, we'll have to drop that optimization.
-                    assert( dist_scale_factor >= -63 && dist_scale_factor <= 127 );
-                }
-                else
-                    h->mb.bipred_weight_buf[field][i_ref0][i_ref1] = 32;
             }
-        }
 }
 



More information about the x264-devel mailing list