[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