Mercurial > libavcodec.hg
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 } |