Minor optimizations to the new AC coefficient tables.
authorSteinar H. Gunderson <sesse@debian.org>
Mon, 1 Jun 2009 15:36:48 +0000 (17:36 +0200)
committerSteinar H. Gunderson <sesse@debian.org>
Mon, 1 Jun 2009 15:36:48 +0000 (17:36 +0200)
dehuff.c
dehuff.h
driver.c

index 695da0b..50fb53e 100644 (file)
--- a/dehuff.c
+++ b/dehuff.c
@@ -123,8 +123,6 @@ void read_huffman_tables(huffman_tables_t* dst, input_func_t* input_func, void*
                // Generate the AC lookup tables.
                for (unsigned i = 0; i < DEHUF_AC_TABLE_SIZE; ++i) {
                        tbl->ac_table_codes[i] = AC_DEHUF_SLOW_PATH;
-                       tbl->ac_table_length[i] = AC_DEHUF_SLOW_PATH;
-                       tbl->ac_table_skip[i] = AC_DEHUF_SLOW_PATH;
 
                        int lookup = i >> (DEHUF_AC_TABLE_BITS - DEHUF_TABLE_BITS);
                        int rs = tbl->lookup_table_codes[lookup];
index ec9c976..0f86c3b 100644 (file)
--- a/dehuff.h
+++ b/dehuff.h
@@ -15,7 +15,7 @@
 static const int DEHUF_SLOW_PATH = -1;
 
 // About 98% of all AC coefficients (control byte + coefficient) are <= 10 bits
-// long; again, see codelen.txt. This will cost us about 12 kB of data to store
+// long; again, see codelen.txt. This will cost us about 6 kB of data to store
 // in L1 cache.
 #define DEHUF_AC_TABLE_BITS 10
 #define DEHUF_AC_TABLE_SIZE (1 << DEHUF_AC_TABLE_BITS)
@@ -49,8 +49,8 @@ struct huffman_table {
        // number of bits to skip (_length) and the number of zero coefficients
        // after this one (_skip).
        int ac_table_codes[DEHUF_AC_TABLE_SIZE]; 
-       int ac_table_length[DEHUF_AC_TABLE_SIZE]; 
-       int ac_table_skip[DEHUF_AC_TABLE_SIZE]; 
+       uint8_t ac_table_length[DEHUF_AC_TABLE_SIZE]; 
+       uint8_t ac_table_skip[DEHUF_AC_TABLE_SIZE]; 
 };
 
 enum coefficient_class {
index cda257e..c5ae87e 100644 (file)
--- a/driver.c
+++ b/driver.c
@@ -120,8 +120,6 @@ void decode_ac_coefficients(const struct huffman_table* tbl, struct bit_source*
                possibly_refill(bits, DEHUF_AC_TABLE_BITS);
                unsigned lookup = peek_bits(bits, DEHUF_AC_TABLE_BITS);
                int code = tbl->ac_table_codes[lookup];
-               int length = tbl->ac_table_length[lookup];
-               int r = tbl->ac_table_skip[lookup];
 
                assert(length == AC_DEHUF_SLOW_PATH || (length > 0 && length <= DEHUF_AC_TABLE_BITS));
 
@@ -145,6 +143,8 @@ void decode_ac_coefficients(const struct huffman_table* tbl, struct bit_source*
 
                        coeff[unzigzag[i]] = extend(read_bits(bits, s), s);
                } else {
+                       int length = tbl->ac_table_length[lookup];
+                       int r = tbl->ac_table_skip[lookup];
                        assert(r >= 0);
                        i += r;
                        assert(bits->bits_available >= length);