# HG changeset patch # User michael # Date 1218335931 0 # Node ID 3749f13a0d02ed0a3cdf69ab9eb67e6c70f0f1d4 # Parent 2f159f961f3a84e29ccb0855b6392c2538d47071 Use the correct reference tables for interlaced MBAFF MBs in the loop filter. Fixes at least CAMP_MOT_MBAFF_L30 CAMP_MOT_MBAFF_L31 FRExt/FREXT01_JVC_D diff -r 2f159f961f3a -r 3749f13a0d02 h264.c --- a/h264.c Sun Aug 10 00:38:41 2008 +0000 +++ b/h264.c Sun Aug 10 02:38:51 2008 +0000 @@ -3965,9 +3965,14 @@ int *ref2frm= h->ref2frm[h->slice_num&15][j]; ref2frm[0]= ref2frm[1]= -1; - for(i=0; i<48; i++) + for(i=0; i<16; i++) ref2frm[i+2]= 4*h->ref_list[j][i].frame_num +(h->ref_list[j][i].reference&3); + ref2frm[18+0]= + ref2frm[18+1]= -1; + for(i=16; i<48; i++) + ref2frm[i+4]= 4*h->ref_list[j][i].frame_num + +(h->ref_list[j][i].reference&3); } h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; @@ -6356,8 +6361,8 @@ int edge; const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy; const int mbm_type = s->current_picture.mb_type[mbm_xy]; - int (*ref2frm) [48+2] = h->ref2frm[ h->slice_num &15 ]; - int (*ref2frmm)[48+2] = h->ref2frm[ h->slice_table[mbm_xy]&15 ]; + int (*ref2frm) [64] = h->ref2frm[ h->slice_num &15 ][0] + (MB_MBAFF ? 20 : 2); + int (*ref2frmm)[64] = h->ref2frm[ h->slice_table[mbm_xy]&15 ][0] + (MB_MBAFF ? 20 : 2); int start = h->slice_table[mbm_xy] == 255 ? 1 : 0; const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP)) @@ -6426,7 +6431,7 @@ /* mbn_xy: neighbor macroblock */ const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; const int mbn_type = s->current_picture.mb_type[mbn_xy]; - int (*ref2frmn)[48+2] = edge > 0 ? ref2frm : ref2frmm; + int (*ref2frmn)[64] = edge > 0 ? ref2frm : ref2frmm; int16_t bS[4]; int qp; @@ -6466,7 +6471,7 @@ int v = 0; for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { - v |= ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[l][h->ref_cache[l][bn_idx]+2] || + v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] || FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit; } @@ -6475,7 +6480,7 @@ v=0; for( l = 0; !v && l < 2; l++ ) { int ln= 1-l; - v |= ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[ln][h->ref_cache[ln][bn_idx]+2] || + v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] || FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit; } @@ -6501,7 +6506,7 @@ { bS[i] = 0; for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { - if( ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[l][h->ref_cache[l][bn_idx]+2] || + if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] || FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) { bS[i] = 1; @@ -6513,7 +6518,7 @@ bS[i] = 0; for( l = 0; l < 2; l++ ) { int ln= 1-l; - if( ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[ln][h->ref_cache[ln][bn_idx]+2] || + if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] || FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) { bS[i] = 1; diff -r 2f159f961f3a -r 3749f13a0d02 h264.h --- a/h264.h Sun Aug 10 00:38:41 2008 +0000 +++ b/h264.h Sun Aug 10 02:38:51 2008 +0000 @@ -346,7 +346,7 @@ Picture ref_list[2][48]; /**< 0..15: frame refs, 16..47: mbaff field refs. Reordered version of default_ref_list according to picture reordering in slice header */ - int ref2frm[16][2][48+2]; ///< reference to frame number lists, used in the loop filter, the first 2 are for -2,-1 + int ref2frm[16][2][64]; ///< reference to frame number lists, used in the loop filter, the first 2 are for -2,-1 Picture *delayed_pic[MAX_DELAYED_PIC_COUNT+2]; //FIXME size? int outputed_poc;