aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2014-08-31 15:41:36 +0200
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2014-08-31 20:13:58 +0200
commit935453102bb5ccf868369f25049e0c3ae900f6bc (patch)
treeedb5d4b629fd6a518c39ac43d8b3405684157147
parentc0d32686ddc1184e57b21802838d4654f2fd5389 (diff)
downloadffmpeg-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.c39
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);
}