From b70c95e05a9a344e06fc4db896217ee372913d39 Mon Sep 17 00:00:00 2001 From: Jason Garrett-Glaser Date: Sat, 7 Aug 2010 12:30:44 +0000 Subject: H.264: 8% faster CAVLC zero-run decoding Originally committed as revision 24736 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264_cavlc.c | 47 ++++++++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 25 deletions(-) (limited to 'libavcodec/h264_cavlc.c') diff --git a/libavcodec/h264_cavlc.c b/libavcodec/h264_cavlc.c index 0475e9454a..6f3bcad782 100644 --- a/libavcodec/h264_cavlc.c +++ b/libavcodec/h264_cavlc.c @@ -367,7 +367,7 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in MpegEncContext * const s = &h->s; static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3}; int level[16]; - int zeros_left, coeff_num, coeff_token, total_coeff, i, j, trailing_ones, run_before; + int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before; //FIXME put trailing_onex into the context @@ -488,39 +488,36 @@ static int decode_residual(H264Context *h, GetBitContext *gb, DCTELEM *block, in zeros_left= get_vlc2(gb, (total_zeros_vlc-1)[ total_coeff ].table, TOTAL_ZEROS_VLC_BITS, 1); } - coeff_num = zeros_left + total_coeff - 1; - j = scantable[coeff_num]; + scantable += zeros_left + total_coeff - 1; if(n > 24){ - block[j] = level[0]; - for(i=1;i 0;i++) { + if(zeros_left < 7) run_before= get_vlc2(gb, (run_vlc-1)[zeros_left].table, RUN_VLC_BITS, 1); - }else{ + else run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); - } zeros_left -= run_before; - coeff_num -= 1 + run_before; - j= scantable[ coeff_num ]; - - block[j]= level[i]; + scantable -= 1 + run_before; + block[*scantable]= level[i]; + } + for(;i>6; - for(i=1;i>6; + for(i=1;i 0;i++) { + if(zeros_left < 7) run_before= get_vlc2(gb, (run_vlc-1)[zeros_left].table, RUN_VLC_BITS, 1); - }else{ + else run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2); - } zeros_left -= run_before; - coeff_num -= 1 + run_before; - j= scantable[ coeff_num ]; - - block[j]= (level[i] * qmul[j] + 32)>>6; + scantable -= 1 + run_before; + block[*scantable]= (level[i] * qmul[*scantable] + 32)>>6; + } + for(;i>6; } } -- cgit v1.2.3