diff vp3.c @ 2712:9c1a436dac6b libavcodec

replace unpack_token() with a series of lookup tables
author melanson
date Thu, 19 May 2005 02:43:21 +0000
parents a119d4eb53d7
children b008c78467e6
line wrap: on
line diff
--- a/vp3.c	Thu May 19 00:17:50 2005 +0000
+++ b/vp3.c	Thu May 19 02:43:21 2005 +0000
@@ -1667,10 +1667,11 @@
 {
     int i;
     int token;
-    int zero_run;
-    DCTELEM coeff;
+    int zero_run = 0;
+    DCTELEM coeff = 0;
     Vp3Fragment *fragment;
     uint8_t *perm= s->scantable.permutated;
+    int bits_to_get;
 
     if ((first_fragment >= s->fragment_count) ||
         (last_fragment >= s->fragment_count)) {
@@ -1691,7 +1692,26 @@
             token = get_vlc2(gb, table->table, 5, 3);
             debug_vlc(" token = %2d, ", token);
             /* use the token to get a zero run, a coefficient, and an eob run */
+#if 1
+            if (token <= 6) {
+                eob_run = eob_run_base[token];
+                if (eob_run_get_bits[token])
+                    eob_run += get_bits(gb, eob_run_get_bits[token]);
+                coeff = zero_run = 0;
+            } else {
+                bits_to_get = coeff_get_bits[token];
+                if (!bits_to_get)
+                    coeff = coeff_tables[token][0];
+                else
+                    coeff = coeff_tables[token][get_bits(gb, bits_to_get)];
+
+                zero_run = zero_run_base[token];
+                if (zero_run_get_bits[token])
+                    zero_run += get_bits(gb, zero_run_get_bits[token]);
+            }
+#else
             unpack_token(gb, token, &zero_run, &coeff, &eob_run);
+#endif
         }
 
         if (!eob_run) {