mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
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>
This commit is contained in:
parent
c0d32686dd
commit
935453102b
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user