changeset 7462:5cbf11f56c02 libavcodec

Picture.ref_count/ref_poc have to be stored per field (actually also per slice but thats a seperate bug) Fixes at least: CABREF3_Sand_D.264 camp_mot_fld0_full.26l CVFI2_Sony_H.jsv CVNLFI2_Sony_H.jsv
author michael
date Sat, 02 Aug 2008 23:13:27 +0000
parents 5bcf597a321c
children 5515e19b9137
files h264.c mpegvideo.h
diffstat 2 files changed, 13 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/h264.c	Sat Aug 02 22:51:49 2008 +0000
+++ b/h264.c	Sat Aug 02 23:13:27 2008 +0000
@@ -873,7 +873,8 @@
 }
 
 static inline void direct_dist_scale_factor(H264Context * const h){
-    const int poc = h->s.current_picture_ptr->poc;
+    MpegEncContext * const s = &h->s;
+    const int poc = h->s.current_picture_ptr->field_poc[ s->picture_structure == PICT_BOTTOM_FIELD ];
     const int poc1 = h->ref_list[1][0].poc;
     int i;
     for(i=0; i<h->ref_count[0]; i++){
@@ -899,20 +900,21 @@
     Picture * const ref1 = &h->ref_list[1][0];
     Picture * const cur = s->current_picture_ptr;
     int list, i, j;
+    int sidx= s->picture_structure&1;
     if(cur->pict_type == FF_I_TYPE)
-        cur->ref_count[0] = 0;
+        cur->ref_count[sidx][0] = 0;
     if(cur->pict_type != FF_B_TYPE)
-        cur->ref_count[1] = 0;
+        cur->ref_count[sidx][1] = 0;
     for(list=0; list<2; list++){
-        cur->ref_count[list] = h->ref_count[list];
+        cur->ref_count[sidx][list] = h->ref_count[list];
         for(j=0; j<h->ref_count[list]; j++)
-            cur->ref_poc[list][j] = h->ref_list[list][j].poc;
+            cur->ref_poc[sidx][list][j] = h->ref_list[list][j].poc;
     }
     if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred)
         return;
     for(list=0; list<2; list++){
-        for(i=0; i<ref1->ref_count[list]; i++){
-            const int poc = ref1->ref_poc[list][i];
+        for(i=0; i<ref1->ref_count[sidx][list]; i++){
+            const int poc = ref1->ref_poc[sidx][list][i];
             h->map_col_to_list0[list][i] = 0; /* bogus; fills in for missing frames */
             for(j=0; j<h->ref_count[list]; j++)
                 if(h->ref_list[list][j].poc == poc){
@@ -923,7 +925,7 @@
     }
     if(FRAME_MBAFF){
         for(list=0; list<2; list++){
-            for(i=0; i<ref1->ref_count[list]; i++){
+            for(i=0; i<ref1->ref_count[sidx][list]; i++){
                 j = h->map_col_to_list0[list][i];
                 h->map_col_to_list0_field[list][2*i] = 2*j;
                 h->map_col_to_list0_field[list][2*i+1] = 2*j+1;
@@ -2723,6 +2725,7 @@
         pic->reference = parity;
         pic->linesize[i] *= 2;
     }
+    pic->poc= pic->field_poc[parity == PICT_BOTTOM_FIELD];
 }
 
 static int split_field_copy(Picture *dest, Picture *src,
--- a/mpegvideo.h	Sat Aug 02 22:51:49 2008 +0000
+++ b/mpegvideo.h	Sat Aug 02 23:13:27 2008 +0000
@@ -118,8 +118,8 @@
     int pic_id;                 /**< h264 pic_num (short -> no wrap version of pic_num,
                                      pic_num & max_pic_num; long -> long_pic_num) */
     int long_ref;               ///< 1->long term reference 0->short term reference
-    int ref_poc[2][16];         ///< h264 POCs of the frames used as reference
-    int ref_count[2];           ///< number of entries in ref_poc
+    int ref_poc[2][2][16];      ///< h264 POCs of the frames used as reference (FIXME need per slice)
+    int ref_count[2][2];        ///< number of entries in ref_poc              (FIXME need per slice)
 
     int mb_var_sum;             ///< sum of MB variance for current frame
     int mc_mb_var_sum;          ///< motion compensated MB variance for current frame