[FFmpeg-cvslog] h264: move dist_scale_factor[_field] into the per-slice context

Anton Khirnov git at videolan.org
Sat Mar 21 14:46:53 CET 2015


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Sat Jan 17 22:28:46 2015 +0100| [ee0d774dfa94655e44707ff3e02f4a4d282c1963] | committer: Anton Khirnov

h264: move dist_scale_factor[_field] into the per-slice context

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

 libavcodec/h264.h        |    7 ++++---
 libavcodec/h264_direct.c |   11 ++++++-----
 libavcodec/h264_slice.c  |    2 +-
 3 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 3d8f624..71f531e 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -359,6 +359,9 @@ typedef struct H264SliceContext {
     int col_parity;
     int col_fieldoff;
 
+    int dist_scale_factor[32];
+    int dist_scale_factor_field[2][32];
+
     /**
      * non zero coeff count cache.
      * is 64 if not available.
@@ -444,8 +447,6 @@ typedef struct H264Context {
     int picture_structure;
     int first_field;
 
-    int dist_scale_factor[32];
-    int dist_scale_factor_field[2][32];
     int map_col_to_list0[2][16 + 32];
     int map_col_to_list0_field[2][2][16 + 32];
 
@@ -821,7 +822,7 @@ void ff_h264_init_cabac_states(H264Context *h, H264SliceContext *sl);
 
 void h264_init_dequant_tables(H264Context *h);
 
-void ff_h264_direct_dist_scale_factor(H264Context *const h);
+void ff_h264_direct_dist_scale_factor(H264Context *const h, H264SliceContext *sl);
 void ff_h264_direct_ref_list_init(H264Context *const h, H264SliceContext *sl);
 void ff_h264_pred_direct_motion(H264Context *const h, H264SliceContext *sl,
                                 int *mb_type);
diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c
index 989c64a..13f710b 100644
--- a/libavcodec/h264_direct.c
+++ b/libavcodec/h264_direct.c
@@ -47,7 +47,8 @@ static int get_scale_factor(H264Context *const h, int poc, int poc1, int i)
     }
 }
 
-void ff_h264_direct_dist_scale_factor(H264Context *const h)
+void ff_h264_direct_dist_scale_factor(H264Context *const h,
+                                      H264SliceContext *sl)
 {
     const int poc  = FIELD_PICTURE(h) ? h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD]
                                       : h->cur_pic_ptr->poc;
@@ -59,12 +60,12 @@ void ff_h264_direct_dist_scale_factor(H264Context *const h)
             const int poc  = h->cur_pic_ptr->field_poc[field];
             const int poc1 = h->ref_list[1][0].field_poc[field];
             for (i = 0; i < 2 * h->ref_count[0]; i++)
-                h->dist_scale_factor_field[field][i ^ field] =
+                sl->dist_scale_factor_field[field][i ^ field] =
                     get_scale_factor(h, poc, poc1, i + 16);
         }
 
     for (i = 0; i < h->ref_count[0]; i++)
-        h->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i);
+        sl->dist_scale_factor[i] = get_scale_factor(h, poc, poc1, i);
 }
 
 static void fill_colmap(H264Context *h, int map[2][16 + 32], int list,
@@ -555,13 +556,13 @@ single_col:
     {
         const int *map_col_to_list0[2] = { h->map_col_to_list0[0],
                                            h->map_col_to_list0[1] };
-        const int *dist_scale_factor = h->dist_scale_factor;
+        const int *dist_scale_factor = sl->dist_scale_factor;
         int ref_offset;
 
         if (FRAME_MBAFF(h) && IS_INTERLACED(*mb_type)) {
             map_col_to_list0[0] = h->map_col_to_list0_field[h->mb_y & 1][0];
             map_col_to_list0[1] = h->map_col_to_list0_field[h->mb_y & 1][1];
-            dist_scale_factor   = h->dist_scale_factor_field[h->mb_y & 1];
+            dist_scale_factor   = sl->dist_scale_factor_field[h->mb_y & 1];
         }
         ref_offset = (h->ref_list[1][0].mbaff << 4) & (mb_type_col[0] >> 3);
 
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index fb420fa..e1ec578 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -1647,7 +1647,7 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, H264Contex
     }
 
     if (sl->slice_type_nos == AV_PICTURE_TYPE_B && !sl->direct_spatial_mv_pred)
-        ff_h264_direct_dist_scale_factor(h);
+        ff_h264_direct_dist_scale_factor(h, sl);
     ff_h264_direct_ref_list_init(h, sl);
 
     if (sl->slice_type_nos != AV_PICTURE_TYPE_I && h->pps.cabac) {



More information about the ffmpeg-cvslog mailing list