X-Git-Url: https://git.sesse.net/?p=fjl;a=blobdiff_plain;f=dehuff.h;h=c54f68a55bf38528c629131b7802e71c3b9eda5d;hp=2669034554c25fb16362ace9879f5fa280be9592;hb=HEAD;hpb=19a58db08afd149a862506936093423db756a2dc diff --git a/dehuff.h b/dehuff.h index 2669034..c54f68a 100644 --- a/dehuff.h +++ b/dehuff.h @@ -14,6 +14,13 @@ #define DEHUF_TABLE_SIZE (1 << DEHUF_TABLE_BITS) 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 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) +static const int AC_DEHUF_SLOW_PATH = 0xf0000000; + struct huffman_table { unsigned num_codes[17]; // BITS unsigned char codes[256]; // HUFFVAL @@ -33,6 +40,15 @@ struct huffman_table { // the lookup tables is int to avoid extra zero extending. int lookup_table_codes[DEHUF_TABLE_SIZE]; int lookup_table_length[DEHUF_TABLE_SIZE]; + + // Further lookup tables for decoding AC coefficients. + // (Generated but obviously not used for DC coefficients.) + // Maps from 10-bit lookahead values to the signed coeffient (_codes), + // number of bits to skip (_length) and the number of zero coefficients + // after this one (_skip). + int ac_table_codes[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 {