X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=dehuff.h;h=ec9c9762c8a8bf12cfef5c44bdc7be58d5e836dc;hb=1cfb04470add4e31406785980e7ce14a8e9d0672;hp=2669034554c25fb16362ace9879f5fa280be9592;hpb=03497d9a2c6de19c6b8a0761b2703ca61b174e2a;p=fjl diff --git a/dehuff.h b/dehuff.h index 2669034..ec9c976 100644 --- a/dehuff.h +++ b/dehuff.h @@ -14,6 +14,15 @@ #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 12 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; +static const int AC_END_OF_BLOCK = 0xf0000001; +static const int AC_SIXTEEN_ZEROS = 0xf0000002; + struct huffman_table { unsigned num_codes[17]; // BITS unsigned char codes[256]; // HUFFVAL @@ -33,6 +42,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]; + int ac_table_length[DEHUF_AC_TABLE_SIZE]; + int ac_table_skip[DEHUF_AC_TABLE_SIZE]; }; enum coefficient_class {