From b80875c18676304dfb3a8efd427efe28406cb04d Mon Sep 17 00:00:00 2001 From: Loren Merritt Date: Sun, 24 Apr 2005 21:06:22 +0000 Subject: [PATCH] fix ref comparison in B-frame deblocker ('unused' and 'unavailable' were treated as different) Originally committed as revision 4154 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index fd7f095315..a06ba645b3 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -6079,6 +6079,10 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8 const int mb_xy= mb_x + mb_y*s->mb_stride; int first_vertical_edge_done = 0; int dir; + /* FIXME: A given frame may occupy more than one position in + * the reference list. So ref2frm should be populated with + * frame numbers, not indices. */ + static const int ref2frm[18] = {-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; if (h->mb_aff_frame // left mb is in picture @@ -6110,13 +6114,10 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8 h->non_zero_count_cache[bn_idx] != 0 ) { bS[i] = 2; } else { - /* FIXME: A given frame may occupy more than one position in - * the reference list. So we should compare the frame numbers, - * not the indices in the ref list. */ int l; bS[i] = 0; for( l = 0; l < 1 + (h->slice_type == B_TYPE); l++ ) { - if( h->ref_cache[l][b_idx] != h->ref_cache[l][bn_idx] || + if( ref2frm[h->ref_cache[l][b_idx]+2] != ref2frm[h->ref_cache[l][bn_idx]+2] || ABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || ABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= 4 ) { bS[i] = 1; @@ -6249,13 +6250,10 @@ static void filter_mb( H264Context *h, int mb_x, int mb_y, uint8_t *img_y, uint8 } else { - /* FIXME: A given frame may occupy more than one position in - * the reference list. So we should compare the frame numbers, - * not the indices in the ref list. */ int l; bS[i] = 0; for( l = 0; l < 1 + (h->slice_type == B_TYPE); l++ ) { - if( h->ref_cache[l][b_idx] != h->ref_cache[l][bn_idx] || + if( ref2frm[h->ref_cache[l][b_idx]+2] != ref2frm[h->ref_cache[l][bn_idx]+2] || ABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || ABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= 4 ) { bS[i] = 1;