Skip to content

Commit

Permalink
Port the Huffman lookup table size fix from brunsli. (libjxl#3871)
Browse files Browse the repository at this point in the history
See also: https://www.youtube.com/watch?v=_ACCK0AUQ8Q&t=696s

(cherry picked from commit 9cc451b)
  • Loading branch information
szabadka authored and mo271 committed Nov 26, 2024
1 parent 7ccdcf8 commit 475b597
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 8 deletions.
16 changes: 12 additions & 4 deletions lib/jpegli/huffman.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,18 @@ namespace jpegli {

constexpr int kJpegHuffmanRootTableBits = 8;
// Maximum huffman lookup table size.
// According to zlib/examples/enough.c, 758 entries are always enough for
// an alphabet of 257 symbols (256 + 1 special symbol for the all 1s code) and
// max bit length 16 if the root table has 8 bits.
constexpr int kJpegHuffmanLutSize = 758;
// Requirements: alphabet of 257 symbols (256 + 1 special symbol for the all 1s
// code) and max bit length 16, the root table has 8 bits.
// zlib/examples/enough.c works with an assumption that Huffman code is
// "complete". Input JPEGs might have this assumption broken, hence the
// following sum is used as estimate:
// + number of 1-st level cells
// + number of symbols
// + asymptotic amount of repeated 2nd level cells
// The third number is 1 + 3 + ... + 255 i.e. it is assumed that sub-table of
// each "size" might be almost completely be filled with repetitions.
// Total sum is slightly less than 1024,...
constexpr int kJpegHuffmanLutSize = 1024;

struct HuffmanTableEntry {
uint8_t bits; // number of bits used for this symbol
Expand Down
16 changes: 12 additions & 4 deletions lib/jxl/jpeg/enc_jpeg_huffman_decode.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,18 @@ namespace jpeg {

constexpr int kJpegHuffmanRootTableBits = 8;
// Maximum huffman lookup table size.
// According to zlib/examples/enough.c, 758 entries are always enough for
// an alphabet of 257 symbols (256 + 1 special symbol for the all 1s code) and
// max bit length 16 if the root table has 8 bits.
constexpr int kJpegHuffmanLutSize = 758;
// Requirements: alphabet of 257 symbols (256 + 1 special symbol for the all 1s
// code) and max bit length 16, the root table has 8 bits.
// zlib/examples/enough.c works with an assumption that Huffman code is
// "complete". Input JPEGs might have this assumption broken, hence the
// following sum is used as estimate:
// + number of 1-st level cells
// + number of symbols
// + asymptotic amount of repeated 2nd level cells
// The third number is 1 + 3 + ... + 255 i.e. it is assumed that sub-table of
// each "size" might be almost completely be filled with repetitions.
// Total sum is slightly less than 1024,...
constexpr int kJpegHuffmanLutSize = 1024;

struct HuffmanTableEntry {
// Initialize the value to an invalid symbol so that we can recognize it
Expand Down

0 comments on commit 475b597

Please sign in to comment.