summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorLoren Merritt <lorenm@u.washington.edu>2005-04-24 21:06:22 +0000
committerLoren Merritt <lorenm@u.washington.edu>2005-04-24 21:06:22 +0000
commitb80875c18676304dfb3a8efd427efe28406cb04d (patch)
tree93551a68b0718e4deb700c6b98e70cef9c3f113a /libavcodec/h264.c
parent160d679c075e9f575f96ea2c2c000545a49916a0 (diff)
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
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c14
1 files 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;