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 }