From: Steinar H. Gunderson Date: Mon, 1 Jun 2009 15:36:48 +0000 (+0200) Subject: Minor optimizations to the new AC coefficient tables. X-Git-Url: https://git.sesse.net/?p=fjl;a=commitdiff_plain;h=a1596fbb6a92217ff5eb57600b36a9d695ca1ae8 Minor optimizations to the new AC coefficient tables. --- diff --git a/dehuff.c b/dehuff.c index 695da0b..50fb53e 100644 --- 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]; diff --git a/dehuff.h b/dehuff.h index ec9c976..0f86c3b 100644 --- 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 { diff --git a/driver.c b/driver.c index cda257e..c5ae87e 100644 --- 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);