From 05d3fd44d7ab34b2b456c2fad9e84651575a8ae4 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Tue, 23 Dec 2008 22:04:34 +0000 Subject: [PATCH] Integrate get_te0_golomb() calls into the code, this allows some checks to be avoided and the function is pretty small. 3% speedup, though this is probably due to changed inlining and not directly this change. Originally committed as revision 16301 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 12bf126..0544bd8 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -4500,11 +4500,18 @@ decode_intra_mb: for(i=0; i<4; i++){ if(IS_DIRECT(h->sub_mb_type[i])) continue; if(IS_DIR(h->sub_mb_type[i], 0, list)){ - unsigned int tmp = get_te0_golomb(&s->gb, ref_count); //FIXME init to 0 before and skip? + unsigned int tmp; + if(ref_count == 1){ + tmp= 0; + }else if(ref_count == 2){ + tmp= get_bits1(&s->gb)^1; + }else{ + tmp= get_ue_golomb_31(&s->gb); if(tmp>=ref_count){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", tmp); return -1; } + } ref[list][i]= tmp; }else{ //FIXME @@ -4569,11 +4576,17 @@ decode_intra_mb: for(list=0; listlist_count; list++){ unsigned int val; if(IS_DIR(mb_type, 0, list)){ - val= get_te0_golomb(&s->gb, h->ref_count[list]); + if(h->ref_count[list]==1){ + val= 0; + }else if(h->ref_count[list]==2){ + val= get_bits1(&s->gb)^1; + }else{ + val= get_ue_golomb_31(&s->gb); if(val >= h->ref_count[list]){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); return -1; } + } }else val= LIST_NOT_USED&0xFF; fill_rectangle(&h->ref_cache[list][ scan8[0] ], 4, 4, 8, val, 1); @@ -4597,11 +4610,17 @@ decode_intra_mb: for(i=0; i<2; i++){ unsigned int val; if(IS_DIR(mb_type, i, list)){ - val= get_te0_golomb(&s->gb, h->ref_count[list]); + if(h->ref_count[list] == 1){ + val= 0; + }else if(h->ref_count[list] == 2){ + val= get_bits1(&s->gb)^1; + }else{ + val= get_ue_golomb_31(&s->gb); if(val >= h->ref_count[list]){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); return -1; } + } }else val= LIST_NOT_USED&0xFF; fill_rectangle(&h->ref_cache[list][ scan8[0] + 16*i ], 4, 2, 8, val, 1); @@ -4628,11 +4647,17 @@ decode_intra_mb: for(i=0; i<2; i++){ unsigned int val; if(IS_DIR(mb_type, i, list)){ //FIXME optimize - val= get_te0_golomb(&s->gb, h->ref_count[list]); + if(h->ref_count[list]==1){ + val= 0; + }else if(h->ref_count[list]==2){ + val= get_bits1(&s->gb)^1; + }else{ + val= get_ue_golomb_31(&s->gb); if(val >= h->ref_count[list]){ av_log(h->s.avctx, AV_LOG_ERROR, "ref %u overflow\n", val); return -1; } + } }else val= LIST_NOT_USED&0xFF; fill_rectangle(&h->ref_cache[list][ scan8[0] + 2*i ], 2, 4, 8, val, 1); -- 2.7.4