changeset 12377:37fc04bf57b4 libavcodec

H.264: 8% faster CAVLC zero-run decoding
author darkshikari
date Sat, 07 Aug 2010 12:30:44 +0000
parents 7e9b2d528e59
children 3fbaf3a70b29
files h264_cavlc.c
diffstat 1 files changed, 22 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/h264_cavlc.c	Sat Aug 07 01:36:35 2010 +0000
+++ b/h264_cavlc.c	Sat Aug 07 12:30:44 2010 +0000
@@ -367,7 +367,7 @@
     MpegEncContext * const s = &h->s;
     static const int coeff_token_table_index[17]= {0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3};
     int level[16];
-    int zeros_left, coeff_num, coeff_token, total_coeff, i, j, trailing_ones, run_before;
+    int zeros_left, coeff_token, total_coeff, i, trailing_ones, run_before;
 
     //FIXME put trailing_onex into the context
 
@@ -488,39 +488,36 @@
             zeros_left= get_vlc2(gb, (total_zeros_vlc-1)[ total_coeff ].table, TOTAL_ZEROS_VLC_BITS, 1);
     }
 
-    coeff_num = zeros_left + total_coeff - 1;
-    j = scantable[coeff_num];
+    scantable += zeros_left + total_coeff - 1;
     if(n > 24){
-        block[j] = level[0];
-        for(i=1;i<total_coeff;i++) {
-            if(zeros_left <= 0)
-                run_before = 0;
-            else if(zeros_left < 7){
+        block[*scantable] = level[0];
+        for(i=1;i<total_coeff && zeros_left > 0;i++) {
+            if(zeros_left < 7)
                 run_before= get_vlc2(gb, (run_vlc-1)[zeros_left].table, RUN_VLC_BITS, 1);
-            }else{
+            else
                 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
-            }
             zeros_left -= run_before;
-            coeff_num -= 1 + run_before;
-            j= scantable[ coeff_num ];
-
-            block[j]= level[i];
+            scantable -= 1 + run_before;
+            block[*scantable]= level[i];
+        }
+        for(;i<total_coeff;i++) {
+            scantable--;
+            block[*scantable]= level[i];
         }
     }else{
-        block[j] = (level[0] * qmul[j] + 32)>>6;
-        for(i=1;i<total_coeff;i++) {
-            if(zeros_left <= 0)
-                run_before = 0;
-            else if(zeros_left < 7){
+        block[*scantable] = (level[0] * qmul[*scantable] + 32)>>6;
+        for(i=1;i<total_coeff && zeros_left > 0;i++) {
+            if(zeros_left < 7)
                 run_before= get_vlc2(gb, (run_vlc-1)[zeros_left].table, RUN_VLC_BITS, 1);
-            }else{
+            else
                 run_before= get_vlc2(gb, run7_vlc.table, RUN7_VLC_BITS, 2);
-            }
             zeros_left -= run_before;
-            coeff_num -= 1 + run_before;
-            j= scantable[ coeff_num ];
-
-            block[j]= (level[i] * qmul[j] + 32)>>6;
+            scantable -= 1 + run_before;
+            block[*scantable]= (level[i] * qmul[*scantable] + 32)>>6;
+        }
+        for(;i<total_coeff;i++) {
+            scantable--;
+            block[*scantable]= (level[i] * qmul[*scantable] + 32)>>6;
         }
     }