Mercurial > libavcodec.hg
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