comparison h264.c @ 7343:9a4cb430d8ff libavcodec

Loop filtering with multiple slice types fix. Fixes at least: CABAST3_Sony_E.jsv CABASTBR3_Sony_A.jsv CABASTBR3_Sony_B.jsv
author michael
date Mon, 21 Jul 2008 22:19:06 +0000
parents b75aa0197be4
children c2d0de091b69
comparison
equal deleted inserted replaced
7342:8c4e0043c068 7343:9a4cb430d8ff
4159 decode_ref_pic_marking(h0, &s->gb); 4159 decode_ref_pic_marking(h0, &s->gb);
4160 4160
4161 if(FRAME_MBAFF) 4161 if(FRAME_MBAFF)
4162 fill_mbaff_ref_list(h); 4162 fill_mbaff_ref_list(h);
4163 4163
4164 h->ref2frm[1][0]= h->ref2frm[1][1]= -1;
4165 for(j=0; j<2; j++){
4166 h->ref2frm[j][ 0]=
4167 h->ref2frm[j][ 1]= -1;
4168 for(i=0; i<48; i++)
4169 h->ref2frm[j][i+2]= 4*h->ref_list[j][i].frame_num
4170 +(h->ref_list[j][i].reference&3);
4171 }
4172
4173 if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){ 4164 if( h->slice_type_nos != FF_I_TYPE && h->pps.cabac ){
4174 tmp = get_ue_golomb(&s->gb); 4165 tmp = get_ue_golomb(&s->gb);
4175 if(tmp > 2){ 4166 if(tmp > 2){
4176 av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n"); 4167 av_log(s->avctx, AV_LOG_ERROR, "cabac_init_idc overflow\n");
4177 return -1; 4168 return -1;
4242 slice_group_change_cycle= get_bits(&s->gb, ?); 4233 slice_group_change_cycle= get_bits(&s->gb, ?);
4243 #endif 4234 #endif
4244 4235
4245 h0->last_slice_type = slice_type; 4236 h0->last_slice_type = slice_type;
4246 h->slice_num = ++h0->current_slice; 4237 h->slice_num = ++h0->current_slice;
4238
4239 for(j=0; j<2; j++){
4240 int *ref2frm= h->ref2frm[h->slice_num&15][j];
4241 ref2frm[0]=
4242 ref2frm[1]= -1;
4243 for(i=0; i<48; i++)
4244 ref2frm[i+2]= 4*h->ref_list[j][i].frame_num
4245 +(h->ref_list[j][i].reference&3);
4246 }
4247 4247
4248 h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16; 4248 h->emu_edge_width= (s->flags&CODEC_FLAG_EMU_EDGE) ? 0 : 16;
4249 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width; 4249 h->emu_edge_height= (FRAME_MBAFF || FIELD_PICTURE) ? 0 : h->emu_edge_width;
4250 4250
4251 if(s->avctx->debug&FF_DEBUG_PICT_INFO){ 4251 if(s->avctx->debug&FF_DEBUG_PICT_INFO){
6625 for( dir = 0; dir < 2; dir++ ) 6625 for( dir = 0; dir < 2; dir++ )
6626 { 6626 {
6627 int edge; 6627 int edge;
6628 const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy; 6628 const int mbm_xy = dir == 0 ? mb_xy -1 : h->top_mb_xy;
6629 const int mbm_type = s->current_picture.mb_type[mbm_xy]; 6629 const int mbm_type = s->current_picture.mb_type[mbm_xy];
6630 int (*ref2frm) [48+2] = h->ref2frm[ h->slice_num &15 ];
6631 int (*ref2frmm)[48+2] = h->ref2frm[ h->slice_table[mbm_xy]&15 ];
6630 int start = h->slice_table[mbm_xy] == 255 ? 1 : 0; 6632 int start = h->slice_table[mbm_xy] == 255 ? 1 : 0;
6631 6633
6632 const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP)) 6634 const int edges = (mb_type & (MB_TYPE_16x16|MB_TYPE_SKIP))
6633 == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4; 6635 == (MB_TYPE_16x16|MB_TYPE_SKIP) ? 1 : 4;
6634 // how often to recheck mv-based bS when iterating between edges 6636 // how often to recheck mv-based bS when iterating between edges
6693 /* Calculate bS */ 6695 /* Calculate bS */
6694 for( edge = start; edge < edges; edge++ ) { 6696 for( edge = start; edge < edges; edge++ ) {
6695 /* mbn_xy: neighbor macroblock */ 6697 /* mbn_xy: neighbor macroblock */
6696 const int mbn_xy = edge > 0 ? mb_xy : mbm_xy; 6698 const int mbn_xy = edge > 0 ? mb_xy : mbm_xy;
6697 const int mbn_type = s->current_picture.mb_type[mbn_xy]; 6699 const int mbn_type = s->current_picture.mb_type[mbn_xy];
6700 int (*ref2frmn)[48+2] = edge > 0 ? ref2frm : ref2frmm;
6698 int16_t bS[4]; 6701 int16_t bS[4];
6699 int qp; 6702 int qp;
6700 6703
6701 if( (edge&1) && IS_8x8DCT(mb_type) ) 6704 if( (edge&1) && IS_8x8DCT(mb_type) )
6702 continue; 6705 continue;
6730 } 6733 }
6731 else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) { 6734 else if( mask_par0 && (edge || (mbn_type & (MB_TYPE_16x16 | (MB_TYPE_8x16 >> dir)))) ) {
6732 int b_idx= 8 + 4 + edge * (dir ? 8:1); 6735 int b_idx= 8 + 4 + edge * (dir ? 8:1);
6733 int bn_idx= b_idx - (dir ? 8:1); 6736 int bn_idx= b_idx - (dir ? 8:1);
6734 int v = 0; 6737 int v = 0;
6735 int xn= h->slice_type_nos == FF_B_TYPE && h->ref2frm[0][h->ref_cache[0][b_idx]+2] != h->ref2frm[0][h->ref_cache[0][bn_idx]+2]; 6738 int xn= h->slice_type_nos == FF_B_TYPE && ref2frm[0][h->ref_cache[0][b_idx]+2] != ref2frmn[0][h->ref_cache[0][bn_idx]+2];
6736 6739
6737 for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { 6740 for( l = 0; !v && l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6738 int ln= l^xn; 6741 int ln= l^xn;
6739 v |= h->ref2frm[l][h->ref_cache[l][b_idx]+2] != h->ref2frm[ln][h->ref_cache[ln][bn_idx]+2] || 6742 v |= ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[ln][h->ref_cache[ln][bn_idx]+2] ||
6740 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || 6743 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6741 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit; 6744 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit;
6742 } 6745 }
6743 bS[0] = bS[1] = bS[2] = bS[3] = v; 6746 bS[0] = bS[1] = bS[2] = bS[3] = v;
6744 mv_done = 1; 6747 mv_done = 1;
6756 h->non_zero_count_cache[bn_idx] != 0 ) { 6759 h->non_zero_count_cache[bn_idx] != 0 ) {
6757 bS[i] = 2; 6760 bS[i] = 2;
6758 } 6761 }
6759 else if(!mv_done) 6762 else if(!mv_done)
6760 { 6763 {
6761 int xn= h->slice_type_nos == FF_B_TYPE && h->ref2frm[0][h->ref_cache[0][b_idx]+2] != h->ref2frm[0][h->ref_cache[0][bn_idx]+2]; 6764 int xn= h->slice_type_nos == FF_B_TYPE && ref2frm[0][h->ref_cache[0][b_idx]+2] != ref2frmn[0][h->ref_cache[0][bn_idx]+2];
6762 bS[i] = 0; 6765 bS[i] = 0;
6763 for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) { 6766 for( l = 0; l < 1 + (h->slice_type_nos == FF_B_TYPE); l++ ) {
6764 int ln= l^xn; 6767 int ln= l^xn;
6765 if( h->ref2frm[l][h->ref_cache[l][b_idx]+2] != h->ref2frm[ln][h->ref_cache[ln][bn_idx]+2] || 6768 if( ref2frm[l][h->ref_cache[l][b_idx]+2] != ref2frmn[ln][h->ref_cache[ln][bn_idx]+2] ||
6766 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 || 6769 FFABS( h->mv_cache[l][b_idx][0] - h->mv_cache[ln][bn_idx][0] ) >= 4 ||
6767 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) { 6770 FFABS( h->mv_cache[l][b_idx][1] - h->mv_cache[ln][bn_idx][1] ) >= mvy_limit ) {
6768 bS[i] = 1; 6771 bS[i] = 1;
6769 break; 6772 break;
6770 } 6773 }