[FFmpeg-devel] [PATCH 3/4] ituh263dec: Optimize new RL_VLC based decoding.
Michael Niedermayer
michaelni at gmx.at
Sun Aug 31 19:09:13 CEST 2014
On Sun, Aug 31, 2014 at 04:48:43PM +0200, Reimar Döffinger wrote:
> Signed-off-by: Reimar Döffinger <Reimar.Doeffinger at gmx.de>
> ---
> libavcodec/ituh263dec.c | 39 ++++++++++++++++++---------------------
> 1 file changed, 18 insertions(+), 21 deletions(-)
>
> diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c
> index 26f0ec5..083f5ae 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];
the - 1 feels avoidable
patch should be ok
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I have often repented speaking, but never of holding my tongue.
-- Xenocrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20140831/93d1096c/attachment.asc>
More information about the ffmpeg-devel
mailing list