Mercurial > libavcodec.hg
comparison h264.c @ 7526:3749f13a0d02 libavcodec
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
author | michael |
---|---|
date | Sun, 10 Aug 2008 02:38:51 +0000 |
parents | 2f159f961f3a |
children | ebdac291453a |
comparison
equal
deleted
inserted
replaced
7525:2f159f961f3a | 7526:3749f13a0d02 |
---|---|
3963 | 3963 |
3964 for(j=0; j<2; j++){ | 3964 for(j=0; j<2; j++){ |
3965 int *ref2frm= h->ref2frm[h->slice_num&15][j]; | 3965 int *ref2frm= h->ref2frm[h->slice_num&15][j]; |
3966 ref2frm[0]= | 3966 ref2frm[0]= |
3967 ref2frm[1]= -1; | 3967 ref2frm[1]= -1; |
3968 for(i=0; i<48; i++) | 3968 for(i=0; i<16; i++) |
3969 ref2frm[i+2]= 4*h->ref_list[j][i].frame_num | 3969 ref2frm[i+2]= 4*h->ref_list[j][i].frame_num |
3970 +(h->ref_list[j][i].reference&3); | |
3971 ref2frm[18+0]= | |
3972 ref2frm[18+1]= -1; | |
3973 for(i=16; i<48; i++) | |
3974 ref2frm[i+4]= 4*h->ref_list[j][i].frame_num | |
3970 +(h->ref_list[j][i].reference&3); | 3975 +(h->ref_list[j][i].reference&3); |
3971 } | 3976 } |
3972 | 3977 |
3973 h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; | 3978 h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; |
3974 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; | 3979 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; |
6354 for( dir = 0; dir < 2; dir++ ) | 6359 for( dir = 0; dir < 2; dir++ ) |
6355 { | 6360 { |
6356 int edge; | 6361 int edge; |
6357 const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy; | 6362 const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy; |
6358 const int mbm_type = s->current_picture.mb_type[mbm_xy]; | 6363 const int mbm_type = s->current_picture.mb_type[mbm_xy]; |
6359 int (*ref2frm) [48+2] = h->ref2frm[ h->slice_num &15 ]; | 6364 int (*ref2frm) [64] = h->ref2frm[ h->slice_num &15 ][0] + (MB_MBAFF ? 20 : 2); |
6360 int (*ref2frmm)[48+2] = h->ref2frm[ h->slice_table[mbm_xy]&15 ]; | 6365 int (*ref2frmm)[64] = h->ref2frm[ h->slice_table[mbm_xy]&15 ][0] + (MB_MBAFF ? 20 : 2); |
6361 int start = h->slice_table[mbm_xy] == 255 ? 1 : 0; | 6366 int start = h->slice_table[mbm_xy] == 255 ? 1 : 0; |
6362 | 6367 |
6363 const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP)) | 6368 const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP)) |
6364 == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4; | 6369 == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4; |
6365 // how often to recheck mv-based bS when iterating between edges | 6370 // how often to recheck mv-based bS when iterating between edges |
6424 /* Calculate bS */ | 6429 /* Calculate bS */ |
6425 for( edge = start; edge < edges; edge++ ) { | 6430 for( edge = start; edge < edges; edge++ ) { |
6426 /* mbn_xy: neighbor macroblock */ | 6431 /* mbn_xy: neighbor macroblock */ |
6427 const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; | 6432 const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; |
6428 const int mbn_type = s->current_picture.mb_type[mbn_xy]; | 6433 const int mbn_type = s->current_picture.mb_type[mbn_xy]; |
6429 int (*ref2frmn)[48+2] = edge > 0 ? ref2frm : ref2frmm; | 6434 int (*ref2frmn)[64] = edge > 0 ? ref2frm : ref2frmm; |
6430 int16_t bS[4]; | 6435 int16_t bS[4]; |
6431 int qp; | 6436 int qp; |
6432 | 6437 |
6433 if( (edge&1) && IS_8x8DCT(mb_type) ) | 6438 if( (edge&1) && IS_8x8DCT(mb_type) ) |
6434 continue; | 6439 continue; |
6464 int b_idx= 8 + 4 + edge * (dir ? 8:1); | 6469 int b_idx= 8 + 4 + edge * (dir ? 8:1); |
6465 int bn_idx= b_idx - (dir ? 8:1); | 6470 int bn_idx= b_idx - (dir ? 8:1); |
6466 int v = 0; | 6471 int v = 0; |
6467 | 6472 |
6468 for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { | 6473 for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { |
6469 v |= ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[l][h->ref_cache[l][bn_idx]+2] || | 6474 v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] || |
6470 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || | 6475 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
6471 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit; | 6476 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit; |
6472 } | 6477 } |
6473 | 6478 |
6474 if(h->slice_type_nos == FF_B_TYPE && v){ | 6479 if(h->slice_type_nos == FF_B_TYPE && v){ |
6475 v=0; | 6480 v=0; |
6476 for( l = 0; !v && l < 2; l++ ) { | 6481 for( l = 0; !v && l < 2; l++ ) { |
6477 int ln= 1-l; | 6482 int ln= 1-l; |
6478 v |= ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[ln][h->ref_cache[ln][bn_idx]+2] || | 6483 v |= ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] || |
6479 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || | 6484 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || |
6480 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit; | 6485 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit; |
6481 } | 6486 } |
6482 } | 6487 } |
6483 | 6488 |
6499 } | 6504 } |
6500 else if(!mv_done) | 6505 else if(!mv_done) |
6501 { | 6506 { |
6502 bS[i] = 0; | 6507 bS[i] = 0; |
6503 for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { | 6508 for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { |
6504 if( ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[l][h->ref_cache[l][bn_idx]+2] || | 6509 if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[l][h->ref_cache[l][bn_idx]] || |
6505 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || | 6510 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[l][bn_idx][0] ) >= 4 || |
6506 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) { | 6511 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[l][bn_idx][1] ) >= mvy_limit ) { |
6507 bS[i] = 1; | 6512 bS[i] = 1; |
6508 break; | 6513 break; |
6509 } | 6514 } |
6511 | 6516 |
6512 if(h->slice_type_nos == FF_B_TYPE && bS[i]){ | 6517 if(h->slice_type_nos == FF_B_TYPE && bS[i]){ |
6513 bS[i] = 0; | 6518 bS[i] = 0; |
6514 for( l = 0; l < 2; l++ ) { | 6519 for( l = 0; l < 2; l++ ) { |
6515 int ln= 1-l; | 6520 int ln= 1-l; |
6516 if( ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[ln][h->ref_cache[ln][bn_idx]+2] || | 6521 if( ref2frm[l][h->ref_cache[l][b_idx]] != ref2frmn[ln][h->ref_cache[ln][bn_idx]] || |
6517 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || | 6522 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || |
6518 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) { | 6523 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) { |
6519 bS[i] = 1; | 6524 bS[i] = 1; |
6520 break; | 6525 break; |
6521 } | 6526 } |