[FFmpeg-cvslog] r14511 - in trunk/libavcodec: h264.c mpegvideo.h
michael
subversion
Sun Aug 3 01:13:27 CEST 2008
Author: michael
Date: Sun Aug 3 01:13:27 2008
New Revision: 14511
Log:
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
Modified:
trunk/libavcodec/h264.c
trunk/libavcodec/mpegvideo.h
Modified: trunk/libavcodec/h264.c
==============================================================================
--- trunk/libavcodec/h264.c (original)
+++ trunk/libavcodec/h264.c Sun Aug 3 01:13:27 2008
@@ -873,7 +873,8 @@ static inline void pred_pskip_motion(H26
}
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 @@ static inline void direct_ref_list_init(
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 @@ static inline void direct_ref_list_init(
}
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 @@ static void pic_as_field(Picture *pic, c
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,
Modified: trunk/libavcodec/mpegvideo.h
==============================================================================
--- trunk/libavcodec/mpegvideo.h (original)
+++ trunk/libavcodec/mpegvideo.h Sun Aug 3 01:13:27 2008
@@ -118,8 +118,8 @@ typedef struct Picture{
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
More information about the ffmpeg-cvslog
mailing list