diff --git a/libavcodec/rv40.c b/libavcodec/rv40.c index b65a2005f0..18dd51e871 100644 --- a/libavcodec/rv40.c +++ b/libavcodec/rv40.c @@ -228,8 +228,6 @@ static int rv40_decode_mb_info(RV34DecContext *r) int q, i; int prev_type = 0; int mb_pos = s->mb_x + s->mb_y * s->mb_stride; - int blocks[RV34_MB_TYPES] = {0}; - int count = 0; if(!r->s.mb_skip_run) r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1; @@ -237,22 +235,27 @@ static int rv40_decode_mb_info(RV34DecContext *r) if(--r->s.mb_skip_run) return RV34_MB_SKIP; - if(r->avail_cache[6-1]) - blocks[r->mb_type[mb_pos - 1]]++; if(r->avail_cache[6-4]){ + int blocks[RV34_MB_TYPES] = {0}; + int count = 0; + if(r->avail_cache[6-1]) + blocks[r->mb_type[mb_pos - 1]]++; blocks[r->mb_type[mb_pos - s->mb_stride]]++; if(r->avail_cache[6-2]) blocks[r->mb_type[mb_pos - s->mb_stride + 1]]++; if(r->avail_cache[6-5]) blocks[r->mb_type[mb_pos - s->mb_stride - 1]]++; - } - - for(i = 0; i < RV34_MB_TYPES; i++){ - if(blocks[i] > count){ - count = blocks[i]; - prev_type = i; + for(i = 0; i < RV34_MB_TYPES; i++){ + if(blocks[i] > count){ + count = blocks[i]; + prev_type = i; + if(count>1) + break; + } } - } + } else if (r->avail_cache[6-1]) + prev_type = r->mb_type[mb_pos - 1]; + if(s->pict_type == AV_PICTURE_TYPE_P){ prev_type = block_num_to_ptype_vlc_num[prev_type]; q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);