Commit 93545310 authored by Reimar Döffinger's avatar Reimar Döffinger

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: 's avatarReimar Döffinger <Reimar.Doeffinger@gmx.de>
parent c0d32686
...@@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){ ...@@ -418,7 +418,7 @@ static void h263_decode_dquant(MpegEncContext *s){
static int h263_decode_block(MpegEncContext * s, int16_t * block, static int h263_decode_block(MpegEncContext * s, int16_t * block,
int n, int coded) int n, int coded)
{ {
int level, i, j, last, run; int level, i, j, run;
RLTable *rl = &ff_h263_rl_inter; RLTable *rl = &ff_h263_rl_inter;
const uint8_t *scan_table; const uint8_t *scan_table;
GetBitContext gb= s->gb; GetBitContext gb= s->gb;
...@@ -493,26 +493,22 @@ retry: ...@@ -493,26 +493,22 @@ retry:
if (CONFIG_FLV_DECODER && s->h263_flv > 1) { if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
int is11 = SHOW_UBITS(re, &s->gb, 1); int is11 = SHOW_UBITS(re, &s->gb, 1);
SKIP_CACHE(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 1);
last = SHOW_UBITS(re, &s->gb, 1); run = SHOW_UBITS(re, &s->gb, 7) + 1;
SKIP_CACHE(re, &s->gb, 1);
run = SHOW_UBITS(re, &s->gb, 6);
if (is11) { if (is11) {
SKIP_COUNTER(re, &s->gb, 6); SKIP_COUNTER(re, &s->gb, 1 + 7);
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
level = SHOW_SBITS(re, &s->gb, 11); level = SHOW_SBITS(re, &s->gb, 11);
SKIP_COUNTER(re, &s->gb, 1 + 1 + 6 + 11); SKIP_COUNTER(re, &s->gb, 11);
} else { } else {
SKIP_CACHE(re, &s->gb, 6); SKIP_CACHE(re, &s->gb, 7);
level = SHOW_SBITS(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 { } else {
last = SHOW_UBITS(re, &s->gb, 1); run = SHOW_UBITS(re, &s->gb, 7) + 1;
SKIP_CACHE(re, &s->gb, 1); SKIP_CACHE(re, &s->gb, 7);
run = SHOW_UBITS(re, &s->gb, 6);
SKIP_CACHE(re, &s->gb, 6);
level = (int8_t)SHOW_UBITS(re, &s->gb, 8); 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){ if(level == -128){
UPDATE_CACHE(re, &s->gb); UPDATE_CACHE(re, &s->gb);
if (s->codec_id == AV_CODEC_ID_RV10) { if (s->codec_id == AV_CODEC_ID_RV10) {
...@@ -528,15 +524,19 @@ retry: ...@@ -528,15 +524,19 @@ retry:
} }
} }
} else { } else {
run--;
last = run >= 192;
run &= 63;
if (SHOW_UBITS(re, &s->gb, 1)) if (SHOW_UBITS(re, &s->gb, 1))
level = -level; level = -level;
SKIP_COUNTER(re, &s->gb, 1); SKIP_COUNTER(re, &s->gb, 1);
} }
i += run; 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){ if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){
CLOSE_READER(re, &s->gb); CLOSE_READER(re, &s->gb);
//Looks like a hack but no, it's the way it is supposed to work ... //Looks like a hack but no, it's the way it is supposed to work ...
...@@ -549,11 +549,8 @@ retry: ...@@ -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); 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; return -1;
} }
j = scan_table[i]; j = scan_table[i-1];
block[j] = level; block[j] = level;
if (last)
break;
i++;
} }
CLOSE_READER(re, &s->gb); CLOSE_READER(re, &s->gb);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment