diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2014-08-31 15:41:36 +0200 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2014-08-31 20:13:58 +0200 |
commit | 935453102bb5ccf868369f25049e0c3ae900f6bc (patch) | |
tree | edb5d4b629fd6a518c39ac43d8b3405684157147 | |
parent | c0d32686ddc1184e57b21802838d4654f2fd5389 (diff) | |
download | ffmpeg-935453102bb5ccf868369f25049e0c3ae900f6bc.tar.gz |
ituh263dec: Optimize new RL_VLC based decoding.
Together with the switch to RL_VLC this results in
a speedup of about 30% in this inner loop.
Overall speedup only relevant for medium to high bitrate
streams.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
-rw-r--r-- | libavcodec/ituh263dec.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c index c481621fd2..ad5a3cbc49 100644 --- a/libavcodec/ituh263dec.c +++ b/libavcodec/ituh263dec.c @@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){ static int h263_decode_block(MpegEncContext * s, int16_t * block, int n, int coded) { - int level, i, j, last, run; + int level, i, j, run; RLTable *rl = &ff_h263_rl_inter; const uint8_t *scan_table; GetBitContext gb= s->gb; @@ -493,26 +493,22 @@ retry: if (CONFIG_FLV_DECODER && s->h263_flv > 1) { int is11 = SHOW_UBITS(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1); - last = SHOW_UBITS(re, &s->gb, 1); - SKIP_CACHE(re, &s->gb, 1); - run = SHOW_UBITS(re, &s->gb, 6); + run = SHOW_UBITS(re, &s->gb, 7) + 1; if (is11) { - SKIP_COUNTER(re, &s->gb, 6); + SKIP_COUNTER(re, &s->gb, 1 + 7); UPDATE_CACHE(re, &s->gb); level = SHOW_SBITS(re, &s->gb, 11); - SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 11); + SKIP_COUNTER(re, &s->gb, 11); } else { - SKIP_CACHE(re, &s->gb, 6); + SKIP_CACHE(re, &s->gb, 7); level = SHOW_SBITS(re, &s->gb, 7); - SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 7); + SKIP_COUNTER(re, &s->gb, 1 + 7 + 7); } } else { - last = SHOW_UBITS(re, &s->gb, 1); - SKIP_CACHE(re, &s->gb, 1); - run = SHOW_UBITS(re, &s->gb, 6); - SKIP_CACHE(re, &s->gb, 6); + run = SHOW_UBITS(re, &s->gb, 7) + 1; + SKIP_CACHE(re, &s->gb, 7); level = (int8_t)SHOW_UBITS(re, &s->gb, 8); - SKIP_COUNTER(re, &s->gb, 1 + 6 + 8); + SKIP_COUNTER(re, &s->gb, 7 + 8); if(level == -128){ UPDATE_CACHE(re, &s->gb); if (s->codec_id == AV_CODEC_ID_RV10) { @@ -528,15 +524,19 @@ retry: } } } else { - run--; - last = run >= 192; - run &= 63; if (SHOW_UBITS(re, &s->gb, 1)) level = -level; SKIP_COUNTER(re, &s->gb, 1); } i += run; - if (i >= 64){ + if (i > 64){ + // redo update without last flag + i = i - run + ((run-1)&63); + if (i < 64) { + // only last marker, no overrun + block[scan_table[i]] = level; + break; + } if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){ CLOSE_READER(re, &s->gb); //Looks like a hack but no, it's the way it is supposed to work ... @@ -549,11 +549,8 @@ retry: av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra); return -1; } - j = scan_table[i]; + j = scan_table[i-1]; block[j] = level; - if (last) - break; - i++; } CLOSE_READER(re, &s->gb); } |