diff --git a/libavcodec/h261.c b/libavcodec/h261.c index 6ec8de630a..2e025cac56 100644 --- a/libavcodec/h261.c +++ b/libavcodec/h261.c @@ -58,7 +58,6 @@ typedef struct H261Context{ void ff_h261_loop_filter(H261Context * h){ MpegEncContext * const s = &h->s; - int i; const int linesize = s->linesize; const int uvlinesize= s->uvlinesize; uint8_t *dest_y = s->dest[0]; @@ -229,11 +228,25 @@ static int h261_decode_mb_skipped(H261Context *h, return 0; } +static int decode_mv_component(GetBitContext *gb, int v){ + int mv_diff = get_vlc2(gb, h261_mv_vlc.table, H261_MV_VLC_BITS, 2); + mv_diff = mvmap[mv_diff]; + + if(mv_diff && !get_bits1(gb)) + mv_diff= -mv_diff; + + v += mv_diff; + if (v <=-16) v+= 32; + else if(v >= 16) v-= 32; + + return v; +} + static int h261_decode_mb(H261Context *h, DCTELEM block[6][64]) { MpegEncContext * const s = &h->s; - int i, cbp, mv_x_diff, mv_y_diff, sign, xy; + int i, cbp, xy; cbp = 63; // Read mba @@ -288,36 +301,8 @@ static int h261_decode_mb(H261Context *h, h->current_mv_y = 0; } - mv_x_diff = get_vlc2(&s->gb, h261_mv_vlc.table, H261_MV_VLC_BITS, 2); - mv_x_diff = mvmap[mv_x_diff]; - - if(mv_x_diff != 0){ - sign = get_bits1(&s->gb); - - if(!sign) - mv_x_diff= -mv_x_diff; - } - - mv_y_diff = get_vlc2(&s->gb, h261_mv_vlc.table, H261_MV_VLC_BITS, 2); - mv_y_diff = mvmap[mv_y_diff]; - - if(mv_y_diff != 0){ - sign = get_bits1(&s->gb); - - if(!sign) - mv_y_diff= -mv_y_diff; - } - - //mv's are in the range -15...15 - if((h->current_mv_x + mv_x_diff > -16) && (h->current_mv_x + mv_x_diff < 16) ) - h->current_mv_x += mv_x_diff; - else - h->current_mv_x += (mv_x_diff + (mv_x_diff > 0 ? -32 : 32)); - - if((h->current_mv_y + mv_y_diff > -16) && (h->current_mv_y + mv_y_diff < 16) ) - h->current_mv_y += mv_y_diff; - else - h->current_mv_y += (mv_y_diff + (mv_y_diff>0 ? -32 : 32)); + h->current_mv_x= decode_mv_component(&s->gb, h->current_mv_x); + h->current_mv_y= decode_mv_component(&s->gb, h->current_mv_y); } // Read cbp