ituh263dec: Optimize new RL_VLC based decoding.
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sun, 31 Aug 2014 13:41:36 +0000 (15:41 +0200)
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>
Sun, 31 Aug 2014 18:13:58 +0000 (20:13 +0200)
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>
libavcodec/ituh263dec.c

index c481621..ad5a3cb 100644 (file)
@@ -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);
     }