From 4e29528da021a831ce65cedd7899c6a9d9f1ebfb Mon Sep 17 00:00:00 2001 From: Zoltan Szabadka Date: Wed, 13 Nov 2024 11:03:37 +0000 Subject: [PATCH] Extend prefix code alphabet size to 68. This commit also adds the tool that was used to extend the prefix codes to the new alphabet size. --- encoder/CMakeLists.txt | 3 + encoder/config.h | 2 +- encoder/enc_entropy_code.cc | 4 +- encoder/enc_entropy_code.h | 3 + encoder/entropy_code.h | 2 +- encoder/read_pfm.cc | 2 +- encoder/static_entropy_codes.h | 381 ++++++++++---------- encoder/update_static_entropy_codes_main.cc | 162 +++++++++ 8 files changed, 365 insertions(+), 194 deletions(-) create mode 100644 encoder/update_static_entropy_codes_main.cc diff --git a/encoder/CMakeLists.txt b/encoder/CMakeLists.txt index 185d55cd..97bfc7d0 100644 --- a/encoder/CMakeLists.txt +++ b/encoder/CMakeLists.txt @@ -31,3 +31,6 @@ target_link_libraries(jxl_tiny hwy pthread) add_executable(cjxl_tiny cjxl_main.cc) target_link_libraries(cjxl_tiny jxl_tiny) + +add_executable(update_static_entropy_codes update_static_entropy_codes_main.cc) +target_link_libraries(update_static_entropy_codes jxl_tiny) diff --git a/encoder/config.h b/encoder/config.h index c49a7ae5..751aa3ed 100644 --- a/encoder/config.h +++ b/encoder/config.h @@ -7,7 +7,7 @@ #ifndef ENCODER_CONFIG_H_ #define ENCODER_CONFIG_H_ -#define OPTIMIZE_CODE 1 +#define OPTIMIZE_CODE 0 #define OPTIMIZE_CHROMA_FROM_LUMA 1 #define OPTIMIZE_BLOCK_SIZES 1 diff --git a/encoder/enc_entropy_code.cc b/encoder/enc_entropy_code.cc index 3b83c1a6..7bc7cb75 100644 --- a/encoder/enc_entropy_code.cc +++ b/encoder/enc_entropy_code.cc @@ -274,8 +274,6 @@ void WriteHuffmanTree(const uint8_t* depth, size_t length, size_t* tree_size, } } -namespace { - uint16_t ReverseBits(int num_bits, uint16_t bits) { static const size_t kLut[16] = {// Pre-reversed 4-bit values. 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, @@ -321,6 +319,8 @@ void ConvertBitDepthsToSymbols(const uint8_t* depth, size_t len, } } +namespace { + // num = alphabet size // depths = symbol depths void StoreHuffmanTree(const uint8_t* depths, size_t num, BitWriter* writer) { diff --git a/encoder/enc_entropy_code.h b/encoder/enc_entropy_code.h index fa83f321..a198c16e 100644 --- a/encoder/enc_entropy_code.h +++ b/encoder/enc_entropy_code.h @@ -17,6 +17,9 @@ namespace jxl { +void ConvertBitDepthsToSymbols(const uint8_t* depth, size_t len, + uint16_t* bits); + void OptimizePrefixCodes(const std::vector& tokens, EntropyCode* code); void OptimizeEntropyCode(const std::vector& tokens, EntropyCode* code); diff --git a/encoder/entropy_code.h b/encoder/entropy_code.h index 6e37297f..ed88a392 100644 --- a/encoder/entropy_code.h +++ b/encoder/entropy_code.h @@ -13,7 +13,7 @@ namespace jxl { -static constexpr size_t kAlphabetSize = 64; +static constexpr size_t kAlphabetSize = 68; static constexpr uint8_t kMaxContexts = 128; struct PrefixCode { diff --git a/encoder/read_pfm.cc b/encoder/read_pfm.cc index 8a2aaed5..d2f3ad2b 100644 --- a/encoder/read_pfm.cc +++ b/encoder/read_pfm.cc @@ -202,7 +202,7 @@ bool ReadPFM(const char* fn, Image3F* image) { for (size_t c = 0; c < 3; ++c) { float* row_out = img.PlaneRow(c, y); for (size_t x = 0; x < xsize; ++x) { - row_out[x] = row_in[x * 3 + c]; + memcpy(&row_out[x], &row_in[x * 3 + c], sizeof(*row_out)); if (big_endian) row_out[x] = BSwapFloat(row_out[x]); } } diff --git a/encoder/static_entropy_codes.h b/encoder/static_entropy_codes.h index 3d964778..687a6421 100644 --- a/encoder/static_entropy_codes.h +++ b/encoder/static_entropy_codes.h @@ -30,129 +30,132 @@ static constexpr uint8_t kDCContextMap[] = { static constexpr size_t kNumDCPrefixCodes = 8; static constexpr PrefixCode kDCPrefixCodes[kNumDCPrefixCodes] = { {{ - 6, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 6, 7, 7, 7, 7, 7, 7, 7, 1, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 10, 10, 10, 10, }, { - 0x0001, 0x0021, 0x0061, 0x0011, 0x0051, 0x0031, 0x0071, 0x0009, - 0x0000, 0x0049, 0x0029, 0x0069, 0x0019, 0x0059, 0x0039, 0x0079, - 0x0005, 0x0045, 0x0025, 0x0065, 0x0015, 0x0055, 0x0035, 0x0075, - 0x000d, 0x004d, 0x002d, 0x006d, 0x001d, 0x005d, 0x003d, 0x007d, - 0x0003, 0x0043, 0x0023, 0x0063, 0x0013, 0x0053, 0x0033, 0x0073, - 0x000b, 0x004b, 0x002b, 0x006b, 0x001b, 0x005b, 0x003b, 0x007b, - 0x0007, 0x0047, 0x0027, 0x0067, 0x0017, 0x0057, 0x0037, 0x0077, - 0x000f, 0x004f, 0x002f, 0x006f, 0x001f, 0x005f, 0x003f, 0x007f, + 0x0001, 0x0021, 0x0061, 0x0011, 0x0051, 0x0031, 0x0071, 0x0009, 0x0000, + 0x0049, 0x0029, 0x0069, 0x0019, 0x0059, 0x0039, 0x0079, 0x0005, 0x0045, + 0x0025, 0x0065, 0x0015, 0x0055, 0x0035, 0x0075, 0x000d, 0x004d, 0x002d, + 0x006d, 0x001d, 0x005d, 0x003d, 0x007d, 0x0003, 0x0043, 0x0023, 0x0063, + 0x0013, 0x0053, 0x0033, 0x0073, 0x000b, 0x004b, 0x002b, 0x006b, 0x001b, + 0x005b, 0x003b, 0x007b, 0x0007, 0x0047, 0x0027, 0x0067, 0x0017, 0x0057, + 0x0037, 0x0077, 0x000f, 0x004f, 0x002f, 0x006f, 0x001f, 0x005f, 0x003f, + 0x007f, 0x00ff, 0x02ff, 0x01ff, 0x03ff, }}, {{ - 1, 3, 2, 5, 4, 7, 7, 8, 8, 10, 9, 12, 10, 13, 11, 14, - 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 1, 3, 2, 5, 4, 7, 7, 8, 8, 10, 9, 13, 10, 13, 11, 14, 13, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, }, { - 0x0000, 0x0003, 0x0001, 0x000f, 0x0007, 0x001f, 0x005f, 0x003f, - 0x00bf, 0x017f, 0x007f, 0x04ff, 0x037f, 0x0cff, 0x00ff, 0x02ff, - 0x1cff, 0x22ff, 0x12ff, 0x32ff, 0x0aff, 0x2aff, 0x1aff, 0x3aff, - 0x06ff, 0x26ff, 0x16ff, 0x36ff, 0x0eff, 0x2eff, 0x1eff, 0x3eff, - 0x01ff, 0x21ff, 0x11ff, 0x31ff, 0x09ff, 0x29ff, 0x19ff, 0x39ff, - 0x05ff, 0x25ff, 0x15ff, 0x35ff, 0x0dff, 0x2dff, 0x1dff, 0x3dff, - 0x03ff, 0x23ff, 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x3bff, - 0x07ff, 0x27ff, 0x17ff, 0x37ff, 0x0fff, 0x2fff, 0x1fff, 0x3fff, + 0x0000, 0x0003, 0x0001, 0x000f, 0x0007, 0x001f, 0x005f, 0x003f, 0x00bf, + 0x017f, 0x007f, 0x04ff, 0x037f, 0x14ff, 0x00ff, 0x1cff, 0x0cff, 0x3cff, + 0x02ff, 0x22ff, 0x12ff, 0x32ff, 0x0aff, 0x2aff, 0x1aff, 0x3aff, 0x06ff, + 0x26ff, 0x16ff, 0x36ff, 0x0eff, 0x2eff, 0x1eff, 0x3eff, 0x01ff, 0x21ff, + 0x11ff, 0x31ff, 0x09ff, 0x29ff, 0x19ff, 0x39ff, 0x05ff, 0x25ff, 0x15ff, + 0x35ff, 0x0dff, 0x2dff, 0x1dff, 0x3dff, 0x03ff, 0x23ff, 0x13ff, 0x33ff, + 0x0bff, 0x2bff, 0x1bff, 0x3bff, 0x07ff, 0x27ff, 0x17ff, 0x37ff, 0x0fff, + 0x2fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 1, 2, 4, 4, 8, 4, 13, 5, 15, 6, 15, 7, 15, 9, 15, 12, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 1, 2, 4, 4, 8, 4, 13, 5, 15, 6, 15, 7, 15, 9, 15, 13, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0001, 0x0003, 0x000b, 0x007f, 0x0007, 0x09ff, 0x000f, - 0x19ff, 0x001f, 0x59ff, 0x003f, 0x39ff, 0x00ff, 0x79ff, 0x01ff, - 0x05ff, 0x45ff, 0x25ff, 0x65ff, 0x15ff, 0x55ff, 0x35ff, 0x75ff, - 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, - 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, - 0x0bff, 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, - 0x07ff, 0x47ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0001, 0x0003, 0x000b, 0x007f, 0x0007, 0x01ff, 0x000f, 0x09ff, + 0x001f, 0x49ff, 0x003f, 0x29ff, 0x00ff, 0x69ff, 0x11ff, 0x19ff, 0x59ff, + 0x39ff, 0x79ff, 0x05ff, 0x45ff, 0x25ff, 0x65ff, 0x15ff, 0x55ff, 0x35ff, + 0x75ff, 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, + 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, 0x0bff, + 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 1, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 9, 2, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 9, 2, 9, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 12, 12, 12, 12, }, { - 0x0000, 0x0007, 0x0087, 0x00c7, 0x01c7, 0x0027, 0x0127, 0x00a7, - 0x01a7, 0x0067, 0x0167, 0x00e7, 0x0003, 0x01e7, 0x0001, 0x0017, - 0x0047, 0x0117, 0x0097, 0x0197, 0x0057, 0x0157, 0x00d7, 0x01d7, - 0x0037, 0x0137, 0x00b7, 0x01b7, 0x0077, 0x0177, 0x00f7, 0x01f7, - 0x000f, 0x010f, 0x008f, 0x018f, 0x004f, 0x014f, 0x00cf, 0x01cf, - 0x002f, 0x012f, 0x00af, 0x01af, 0x006f, 0x016f, 0x00ef, 0x01ef, - 0x001f, 0x011f, 0x009f, 0x019f, 0x005f, 0x015f, 0x00df, 0x01df, - 0x003f, 0x013f, 0x00bf, 0x01bf, 0x007f, 0x017f, 0x00ff, 0x01ff, + 0x0000, 0x0007, 0x0087, 0x00c7, 0x01c7, 0x0027, 0x0127, 0x00a7, 0x01a7, + 0x0067, 0x0167, 0x00e7, 0x0003, 0x01e7, 0x0001, 0x0017, 0x0047, 0x0117, + 0x0097, 0x0197, 0x0057, 0x0157, 0x00d7, 0x01d7, 0x0037, 0x0137, 0x00b7, + 0x01b7, 0x0077, 0x0177, 0x00f7, 0x01f7, 0x000f, 0x010f, 0x008f, 0x018f, + 0x004f, 0x014f, 0x00cf, 0x01cf, 0x002f, 0x012f, 0x00af, 0x01af, 0x006f, + 0x016f, 0x00ef, 0x01ef, 0x001f, 0x011f, 0x009f, 0x019f, 0x005f, 0x015f, + 0x00df, 0x01df, 0x003f, 0x013f, 0x00bf, 0x01bf, 0x007f, 0x017f, 0x00ff, + 0x01ff, 0x03ff, 0x0bff, 0x07ff, 0x0fff, }}, {{ - 1, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 3, 9, 2, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 1, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 3, 9, 2, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 12, 12, 12, 12, }, { - 0x0000, 0x0007, 0x0087, 0x0047, 0x00c7, 0x01c7, 0x0027, 0x0127, - 0x00a7, 0x01a7, 0x0067, 0x0167, 0x0003, 0x00e7, 0x0001, 0x01e7, - 0x0017, 0x0117, 0x0097, 0x0197, 0x0057, 0x0157, 0x00d7, 0x01d7, - 0x0037, 0x0137, 0x00b7, 0x01b7, 0x0077, 0x0177, 0x00f7, 0x01f7, - 0x000f, 0x010f, 0x008f, 0x018f, 0x004f, 0x014f, 0x00cf, 0x01cf, - 0x002f, 0x012f, 0x00af, 0x01af, 0x006f, 0x016f, 0x00ef, 0x01ef, - 0x001f, 0x011f, 0x009f, 0x019f, 0x005f, 0x015f, 0x00df, 0x01df, - 0x003f, 0x013f, 0x00bf, 0x01bf, 0x007f, 0x017f, 0x00ff, 0x01ff, + 0x0000, 0x0007, 0x0087, 0x0047, 0x00c7, 0x01c7, 0x0027, 0x0127, 0x00a7, + 0x01a7, 0x0067, 0x0167, 0x0003, 0x00e7, 0x0001, 0x01e7, 0x0017, 0x0117, + 0x0097, 0x0197, 0x0057, 0x0157, 0x00d7, 0x01d7, 0x0037, 0x0137, 0x00b7, + 0x01b7, 0x0077, 0x0177, 0x00f7, 0x01f7, 0x000f, 0x010f, 0x008f, 0x018f, + 0x004f, 0x014f, 0x00cf, 0x01cf, 0x002f, 0x012f, 0x00af, 0x01af, 0x006f, + 0x016f, 0x00ef, 0x01ef, 0x001f, 0x011f, 0x009f, 0x019f, 0x005f, 0x015f, + 0x00df, 0x01df, 0x003f, 0x013f, 0x00bf, 0x01bf, 0x007f, 0x017f, 0x00ff, + 0x01ff, 0x03ff, 0x0bff, 0x07ff, 0x0fff, }}, {{ - 5, 6, 6, 6, 6, 7, 6, 7, 6, 7, 7, 7, 7, 8, 7, 8, - 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, - 4, 5, 5, 5, 4, 5, 5, 5, 5, 5, 6, 6, 6, 7, 8, 9, - 10, 11, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 5, 6, 6, 6, 6, 7, 6, 7, 6, 7, 7, 7, 7, 8, 7, 8, 6, + 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, + 5, 5, 4, 5, 5, 5, 5, 5, 6, 6, 6, 7, 8, 9, 11, 12, 13, + 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, }, { - 0x0004, 0x0015, 0x0035, 0x000d, 0x002d, 0x0037, 0x001d, 0x0077, - 0x003d, 0x000f, 0x004f, 0x002f, 0x006f, 0x003f, 0x001f, 0x00bf, - 0x0003, 0x0023, 0x0013, 0x0033, 0x000b, 0x002b, 0x001b, 0x003b, - 0x0014, 0x000c, 0x001c, 0x0002, 0x0012, 0x000a, 0x001a, 0x0006, - 0x0000, 0x0016, 0x000e, 0x001e, 0x0008, 0x0001, 0x0011, 0x0009, - 0x0019, 0x0005, 0x0007, 0x0027, 0x0017, 0x005f, 0x007f, 0x00ff, - 0x01ff, 0x03ff, 0x07ff, 0x27ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0004, 0x0015, 0x0035, 0x000d, 0x002d, 0x0037, 0x001d, 0x0077, 0x003d, + 0x000f, 0x004f, 0x002f, 0x006f, 0x003f, 0x001f, 0x00bf, 0x0003, 0x0023, + 0x0013, 0x0033, 0x000b, 0x002b, 0x001b, 0x003b, 0x0014, 0x000c, 0x001c, + 0x0002, 0x0012, 0x000a, 0x001a, 0x0006, 0x0000, 0x0016, 0x000e, 0x001e, + 0x0008, 0x0001, 0x0011, 0x0009, 0x0019, 0x0005, 0x0007, 0x0027, 0x0017, + 0x005f, 0x007f, 0x00ff, 0x01ff, 0x05ff, 0x0dff, 0x1dff, 0x03ff, 0x23ff, + 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x3bff, 0x07ff, 0x27ff, 0x17ff, + 0x37ff, 0x0fff, 0x2fff, 0x1fff, 0x3fff, }}, {{ - 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, - 4, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 7, 7, 7, 8, 8, - 8, 9, 9, 10, 10, 10, 11, 11, 10, 11, 11, 12, 11, 12, 13, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 4, + 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, + 9, 10, 10, 10, 11, 11, 10, 11, 11, 12, 11, 13, 13, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0008, 0x0004, 0x000c, 0x0002, 0x000a, 0x000e, 0x001e, - 0x0001, 0x0011, 0x0009, 0x0019, 0x0005, 0x001b, 0x003b, 0x0007, - 0x0006, 0x0015, 0x000d, 0x001d, 0x0003, 0x0013, 0x0027, 0x0017, - 0x000b, 0x0037, 0x000f, 0x002f, 0x006f, 0x001f, 0x005f, 0x00df, - 0x003f, 0x00bf, 0x01bf, 0x007f, 0x027f, 0x017f, 0x00ff, 0x04ff, - 0x037f, 0x02ff, 0x06ff, 0x05ff, 0x01ff, 0x0dff, 0x03ff, 0x13ff, - 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x3bff, 0x07ff, 0x27ff, 0x17ff, - 0x37ff, 0x0fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0008, 0x0004, 0x000c, 0x0002, 0x000a, 0x000e, 0x001e, 0x0001, + 0x0011, 0x0009, 0x0019, 0x0005, 0x001b, 0x003b, 0x0007, 0x0006, 0x0015, + 0x000d, 0x001d, 0x0003, 0x0013, 0x0027, 0x0017, 0x000b, 0x0037, 0x000f, + 0x002f, 0x006f, 0x001f, 0x005f, 0x00df, 0x003f, 0x00bf, 0x01bf, 0x007f, + 0x027f, 0x017f, 0x00ff, 0x04ff, 0x037f, 0x02ff, 0x06ff, 0x05ff, 0x01ff, + 0x0dff, 0x1dff, 0x03ff, 0x23ff, 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, + 0x3bff, 0x07ff, 0x27ff, 0x17ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 4, 4, 5, 5, 4, 4, 5, 5, 4, 5, 5, 5, 5, 6, 7, 7, - 7, 8, 8, 9, 9, 9, 9, 10, 9, 10, 10, 11, 10, 12, 13, 13, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 4, + 4, 5, 5, 4, 4, 5, 5, 4, 5, 5, 5, 5, 6, 7, 7, 7, 8, + 8, 9, 9, 9, 9, 10, 9, 10, 10, 11, 10, 13, 13, 13, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, }, { - 0x000a, 0x001a, 0x0006, 0x0016, 0x000e, 0x001e, 0x0001, 0x0011, - 0x000b, 0x002b, 0x001b, 0x003b, 0x0007, 0x0027, 0x0017, 0x0037, - 0x0000, 0x0008, 0x0009, 0x0019, 0x0004, 0x000c, 0x0005, 0x0015, - 0x0002, 0x000d, 0x001d, 0x0003, 0x0013, 0x000f, 0x002f, 0x006f, - 0x001f, 0x005f, 0x00df, 0x003f, 0x013f, 0x00bf, 0x01bf, 0x017f, - 0x007f, 0x037f, 0x00ff, 0x01ff, 0x02ff, 0x05ff, 0x0dff, 0x1dff, - 0x03ff, 0x23ff, 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x3bff, - 0x07ff, 0x27ff, 0x17ff, 0x37ff, 0x0fff, 0x2fff, 0x1fff, 0x3fff, + 0x000a, 0x001a, 0x0006, 0x0016, 0x000e, 0x001e, 0x0001, 0x0011, 0x000b, + 0x002b, 0x001b, 0x003b, 0x0007, 0x0027, 0x0017, 0x0037, 0x0000, 0x0008, + 0x0009, 0x0019, 0x0004, 0x000c, 0x0005, 0x0015, 0x0002, 0x000d, 0x001d, + 0x0003, 0x0013, 0x000f, 0x002f, 0x006f, 0x001f, 0x005f, 0x00df, 0x003f, + 0x013f, 0x00bf, 0x01bf, 0x017f, 0x007f, 0x037f, 0x00ff, 0x01ff, 0x02ff, + 0x05ff, 0x15ff, 0x0dff, 0x1dff, 0x3dff, 0x03ff, 0x23ff, 0x13ff, 0x33ff, + 0x0bff, 0x2bff, 0x1bff, 0x3bff, 0x07ff, 0x27ff, 0x17ff, 0x37ff, 0x0fff, + 0x2fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, }; #endif @@ -837,132 +840,132 @@ static constexpr uint8_t kACContextMap[] = { static constexpr size_t kNumACPrefixCodes = 8; static constexpr PrefixCode kACPrefixCodes[kNumACPrefixCodes] = { {{ - 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 4, 4, 5, 5, 4, 5, 6, 6, 6, 7, 9, 9, 9, 11, 12, 13, - 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, + 4, 5, 5, 4, 5, 6, 6, 6, 7, 9, 9, 9, 11, 13, 13, 13, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0008, 0x0004, 0x000c, 0x0002, 0x0001, 0x0011, 0x0009, - 0x0019, 0x0005, 0x0015, 0x000d, 0x001d, 0x0003, 0x0013, 0x000b, - 0x000a, 0x0006, 0x001b, 0x0007, 0x000e, 0x0017, 0x000f, 0x002f, - 0x001f, 0x003f, 0x007f, 0x017f, 0x00ff, 0x01ff, 0x05ff, 0x0dff, - 0x1dff, 0x03ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, - 0x0bff, 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, - 0x07ff, 0x47ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0008, 0x0004, 0x000c, 0x0002, 0x0001, 0x0011, 0x0009, 0x0019, + 0x0005, 0x0015, 0x000d, 0x001d, 0x0003, 0x0013, 0x000b, 0x000a, 0x0006, + 0x001b, 0x0007, 0x000e, 0x0017, 0x000f, 0x002f, 0x001f, 0x003f, 0x007f, + 0x017f, 0x00ff, 0x01ff, 0x05ff, 0x15ff, 0x0dff, 0x1dff, 0x3dff, 0x7dff, + 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, 0x0bff, + 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 1, 2, 3, 5, 4, 6, 7, 9, 9, 11, 11, 12, 12, 12, 13, 13, - 12, 12, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 1, 2, 3, 5, 4, 6, 7, 9, 9, 11, 11, 12, 12, 12, 13, 13, 12, + 13, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0001, 0x0003, 0x000f, 0x0007, 0x001f, 0x003f, 0x007f, - 0x017f, 0x00ff, 0x04ff, 0x02ff, 0x0aff, 0x06ff, 0x09ff, 0x19ff, - 0x0eff, 0x01ff, 0x05ff, 0x15ff, 0x25ff, 0x55ff, 0x35ff, 0x75ff, - 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, - 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, - 0x0bff, 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, - 0x07ff, 0x47ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0001, 0x0003, 0x000f, 0x0007, 0x001f, 0x003f, 0x007f, 0x017f, + 0x00ff, 0x04ff, 0x02ff, 0x0aff, 0x06ff, 0x01ff, 0x11ff, 0x0eff, 0x09ff, + 0x19ff, 0x05ff, 0x39ff, 0x45ff, 0x25ff, 0x65ff, 0x15ff, 0x55ff, 0x35ff, + 0x75ff, 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, + 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, 0x0bff, + 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 2, 3, 3, 4, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, - 6, 7, 8, 8, 8, 10, 11, 12, 11, 12, 13, 13, 13, 14, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 2, 3, 3, 4, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 6, + 7, 8, 8, 8, 10, 11, 12, 11, 13, 13, 13, 13, 14, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0002, 0x0006, 0x0005, 0x0001, 0x000d, 0x0003, 0x000b, - 0x001b, 0x0007, 0x0027, 0x0017, 0x0037, 0x002f, 0x006f, 0x001f, - 0x000f, 0x005f, 0x003f, 0x00bf, 0x007f, 0x00ff, 0x02ff, 0x01ff, - 0x06ff, 0x09ff, 0x05ff, 0x15ff, 0x0dff, 0x1dff, 0x3dff, 0x7dff, - 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, - 0x0bff, 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, - 0x07ff, 0x47ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0002, 0x0006, 0x0005, 0x0001, 0x000d, 0x0003, 0x000b, 0x001b, + 0x0007, 0x0027, 0x0017, 0x0037, 0x002f, 0x006f, 0x001f, 0x000f, 0x005f, + 0x003f, 0x00bf, 0x007f, 0x00ff, 0x02ff, 0x01ff, 0x06ff, 0x09ff, 0x19ff, + 0x05ff, 0x15ff, 0x0dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, + 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, 0x0bff, + 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, - 4, 4, 4, 4, 4, 4, 5, 5, 4, 5, 6, 6, 6, 7, 8, 10, - 10, 11, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 4, + 4, 4, 4, 4, 4, 5, 5, 4, 5, 6, 6, 6, 7, 8, 10, 10, 11, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x000e, 0x001e, 0x0001, 0x0011, 0x0009, 0x0019, 0x0005, 0x0015, - 0x000d, 0x001b, 0x001d, 0x003b, 0x0007, 0x0027, 0x0017, 0x0037, - 0x0000, 0x0008, 0x0004, 0x000c, 0x0002, 0x000a, 0x0003, 0x0013, - 0x0006, 0x000b, 0x000f, 0x002f, 0x001f, 0x003f, 0x007f, 0x00ff, - 0x02ff, 0x01ff, 0x05ff, 0x15ff, 0x35ff, 0x0dff, 0x2dff, 0x1dff, - 0x3dff, 0x03ff, 0x23ff, 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, - 0x3bff, 0x07ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x000e, 0x001e, 0x0001, 0x0011, 0x0009, 0x0019, 0x0005, 0x0015, 0x000d, + 0x001b, 0x001d, 0x003b, 0x0007, 0x0027, 0x0017, 0x0037, 0x0000, 0x0008, + 0x0004, 0x000c, 0x0002, 0x000a, 0x0003, 0x0013, 0x0006, 0x000b, 0x000f, + 0x002f, 0x001f, 0x003f, 0x007f, 0x00ff, 0x02ff, 0x01ff, 0x05ff, 0x25ff, + 0x15ff, 0x35ff, 0x0dff, 0x2dff, 0x1dff, 0x3dff, 0x03ff, 0x23ff, 0x13ff, + 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9, 11, 11, 12, 12, 12, - 11, 12, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9, 11, 11, 12, 12, 12, 11, + 13, 14, 15, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0003, 0x0001, 0x000f, 0x0007, 0x001f, 0x005f, 0x003f, - 0x00bf, 0x007f, 0x017f, 0x00ff, 0x04ff, 0x06ff, 0x0eff, 0x01ff, - 0x02ff, 0x09ff, 0x05ff, 0x15ff, 0x25ff, 0x55ff, 0x35ff, 0x75ff, - 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, - 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, - 0x0bff, 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, - 0x07ff, 0x47ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0003, 0x0001, 0x000f, 0x0007, 0x001f, 0x005f, 0x003f, 0x00bf, + 0x007f, 0x017f, 0x00ff, 0x04ff, 0x06ff, 0x0eff, 0x01ff, 0x02ff, 0x09ff, + 0x19ff, 0x05ff, 0x39ff, 0x45ff, 0x25ff, 0x65ff, 0x15ff, 0x55ff, 0x35ff, + 0x75ff, 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, + 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, 0x0bff, + 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, - 4, 5, 5, 6, 6, 7, 9, 9, 10, 11, 12, 12, 12, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 4, + 5, 5, 6, 6, 7, 9, 9, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x0000, 0x0004, 0x000c, 0x0002, 0x000a, 0x0006, 0x000e, 0x0001, - 0x0009, 0x000d, 0x001d, 0x0003, 0x0013, 0x000b, 0x001b, 0x000f, - 0x0005, 0x0007, 0x0017, 0x002f, 0x001f, 0x003f, 0x007f, 0x017f, - 0x00ff, 0x02ff, 0x06ff, 0x0eff, 0x01ff, 0x09ff, 0x29ff, 0x19ff, - 0x39ff, 0x05ff, 0x25ff, 0x15ff, 0x35ff, 0x0dff, 0x2dff, 0x1dff, - 0x3dff, 0x03ff, 0x23ff, 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, - 0x3bff, 0x07ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x0000, 0x0004, 0x000c, 0x0002, 0x000a, 0x0006, 0x000e, 0x0001, 0x0009, + 0x000d, 0x001d, 0x0003, 0x0013, 0x000b, 0x001b, 0x000f, 0x0005, 0x0007, + 0x0017, 0x002f, 0x001f, 0x003f, 0x007f, 0x017f, 0x00ff, 0x02ff, 0x06ff, + 0x0eff, 0x01ff, 0x11ff, 0x31ff, 0x09ff, 0x29ff, 0x19ff, 0x39ff, 0x05ff, + 0x25ff, 0x15ff, 0x35ff, 0x0dff, 0x2dff, 0x1dff, 0x3dff, 0x03ff, 0x23ff, + 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 9, 13, 13, 14, 13, 14, 13, 13, 13, 12, 12, 12, 11, 12, 11, 12, - 10, 9, 8, 6, 5, 3, 2, 1, 4, 9, 11, 12, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 9, 13, 13, 14, 13, 14, 13, 13, 13, 12, 12, 12, 11, 12, 11, 12, 10, + 9, 8, 6, 5, 3, 2, 1, 4, 9, 11, 13, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x00bf, 0x01ff, 0x11ff, 0x0dff, 0x09ff, 0x2dff, 0x19ff, 0x05ff, - 0x15ff, 0x04ff, 0x0cff, 0x02ff, 0x037f, 0x0aff, 0x077f, 0x06ff, - 0x017f, 0x01bf, 0x003f, 0x001f, 0x000f, 0x0003, 0x0001, 0x0000, - 0x0007, 0x007f, 0x00ff, 0x0eff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, - 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, - 0x0bff, 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, - 0x07ff, 0x47ff, 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, - 0x0fff, 0x4fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x00bf, 0x0eff, 0x1eff, 0x15ff, 0x01ff, 0x35ff, 0x11ff, 0x09ff, 0x19ff, + 0x04ff, 0x0cff, 0x02ff, 0x037f, 0x0aff, 0x077f, 0x06ff, 0x017f, 0x01bf, + 0x003f, 0x001f, 0x000f, 0x0003, 0x0001, 0x0000, 0x0007, 0x007f, 0x00ff, + 0x05ff, 0x0dff, 0x4dff, 0x2dff, 0x6dff, 0x1dff, 0x5dff, 0x3dff, 0x7dff, + 0x03ff, 0x43ff, 0x23ff, 0x63ff, 0x13ff, 0x53ff, 0x33ff, 0x73ff, 0x0bff, + 0x4bff, 0x2bff, 0x6bff, 0x1bff, 0x5bff, 0x3bff, 0x7bff, 0x07ff, 0x47ff, + 0x27ff, 0x67ff, 0x17ff, 0x57ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, {{ - 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, - 5, 5, 5, 5, 4, 5, 5, 5, 4, 4, 4, 5, 4, 5, 5, 6, - 5, 6, 7, 8, 8, 8, 10, 10, 11, 12, 13, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, + 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 5, + 5, 5, 5, 4, 5, 5, 5, 4, 4, 4, 5, 4, 5, 5, 6, 5, 6, + 7, 8, 8, 8, 10, 10, 11, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, }, { - 0x000a, 0x001a, 0x0006, 0x0003, 0x0023, 0x0013, 0x0033, 0x000b, - 0x002b, 0x001b, 0x003b, 0x0007, 0x0027, 0x0017, 0x0037, 0x001f, - 0x0016, 0x000e, 0x001e, 0x0001, 0x0000, 0x0011, 0x0009, 0x0019, - 0x0008, 0x0004, 0x000c, 0x0005, 0x0002, 0x0015, 0x000d, 0x000f, - 0x001d, 0x002f, 0x005f, 0x003f, 0x00bf, 0x007f, 0x00ff, 0x02ff, - 0x01ff, 0x05ff, 0x0dff, 0x1dff, 0x3dff, 0x03ff, 0x23ff, 0x13ff, - 0x33ff, 0x0bff, 0x2bff, 0x1bff, 0x3bff, 0x07ff, 0x27ff, 0x17ff, - 0x37ff, 0x0fff, 0x2fff, 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, + 0x000a, 0x001a, 0x0006, 0x0003, 0x0023, 0x0013, 0x0033, 0x000b, 0x002b, + 0x001b, 0x003b, 0x0007, 0x0027, 0x0017, 0x0037, 0x001f, 0x0016, 0x000e, + 0x001e, 0x0001, 0x0000, 0x0011, 0x0009, 0x0019, 0x0008, 0x0004, 0x000c, + 0x0005, 0x0002, 0x0015, 0x000d, 0x000f, 0x001d, 0x002f, 0x005f, 0x003f, + 0x00bf, 0x007f, 0x00ff, 0x02ff, 0x01ff, 0x05ff, 0x15ff, 0x0dff, 0x2dff, + 0x1dff, 0x3dff, 0x03ff, 0x23ff, 0x13ff, 0x33ff, 0x0bff, 0x2bff, 0x1bff, + 0x3bff, 0x07ff, 0x27ff, 0x17ff, 0x37ff, 0x77ff, 0x0fff, 0x4fff, 0x2fff, + 0x6fff, 0x1fff, 0x5fff, 0x3fff, 0x7fff, }}, }; #endif diff --git a/encoder/update_static_entropy_codes_main.cc b/encoder/update_static_entropy_codes_main.cc new file mode 100644 index 00000000..c5a98ae1 --- /dev/null +++ b/encoder/update_static_entropy_codes_main.cc @@ -0,0 +1,162 @@ +// Copyright (c) the JPEG XL Project Authors. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file or at +// https://developers.google.com/open-source/licenses/bsd + +#include +#include +#include + +#include +#include + +#include "encoder/base/printf_macros.h" +#include "encoder/enc_entropy_code.h" +#include "encoder/enc_huffman_tree.h" +#include "encoder/entropy_code.h" +#include "encoder/static_entropy_codes.h" + +namespace jxl { + +struct DynamicPrefixCode { + std::vector depths; + std::vector bits; +}; + +void OutputCodes(const char* type, + const std::vector& prefix_codes) { + printf("static constexpr size_t kNum%sPrefixCodes = %" PRIuS ";\n", type, + prefix_codes.size()); + printf("static constexpr PrefixCode k%sPrefixCodes[kNum%sPrefixCodes] = {\n", + type, type); + for (const auto& prefix_code : prefix_codes) { + size_t alphabet_size = prefix_code.depths.size(); + printf(" {{\n"); + for (size_t j = 0; j < alphabet_size; ++j) { + printf("%s%2d,%s", j % 16 == 0 ? " " : " ", prefix_code.depths[j], + (j % 16 == 15 || j + 1 == alphabet_size) ? "\n" : ""); + } + printf(" },\n"); + printf(" {\n"); + for (size_t j = 0; j < alphabet_size; ++j) { + printf("%s0x%04x,%s", j % 8 == 0 ? " " : " ", prefix_code.bits[j], + (j % 8 == 7 || j + 1 == alphabet_size) ? "\n" : ""); + } + printf(" }},\n"); + } + printf("};\n"); +} + +bool ExtendPrefixCode(DynamicPrefixCode& prefix_code, + size_t new_alphabet_size) { + static const int kTreeLimit = 15; + + const size_t alphabet_size = prefix_code.depths.size(); + if (prefix_code.bits.size() != alphabet_size) { + return false; + } + + // Step 1. Convert bit depths to population counts. + std::vector counts(new_alphabet_size); + uint32_t total_count = 0; + for (size_t i = 0; i < alphabet_size; ++i) { + counts[i] = 1 << (kTreeLimit - prefix_code.depths[i]); + total_count += counts[i]; + } + if (total_count != 1 << kTreeLimit) { + return false; + } + + // Step 2. Extend population counts by 1s. + for (size_t i = alphabet_size; i < new_alphabet_size; ++i) { + counts[i] = 1; + } + + // Step 3. Regenerate depths and bits from new population counts. + prefix_code.depths.resize(new_alphabet_size); + prefix_code.bits.resize(new_alphabet_size); + CreateHuffmanTree(&counts[0], new_alphabet_size, kTreeLimit, + &prefix_code.depths[0]); + ConvertBitDepthsToSymbols(&prefix_code.depths[0], new_alphabet_size, + &prefix_code.bits[0]); + return true; +} + +enum PrefixCodeType { + DC = 0, + AC = 1, +}; + +std::vector ConvertToDynamicCodes( + const PrefixCode* prefix_codes, size_t num_codes) { + std::vector out; + for (size_t i = 0; i < num_codes; ++i) { + const uint8_t* depths = prefix_codes[i].depths; + const uint16_t* bits = prefix_codes[i].bits; + DynamicPrefixCode code = { + {depths, depths + kAlphabetSize}, + {bits, bits + kAlphabetSize}, + }; + out.emplace_back(std::move(code)); + } + return out; +} + +bool GenerateNewPrefixCodes(PrefixCodeType type, size_t new_alphabet_size) { + const char* type_name; + std::vector prefix_codes; + if (type == PrefixCodeType::DC) { + type_name = "DC"; + prefix_codes = ConvertToDynamicCodes(kDCPrefixCodes, kNumDCPrefixCodes); + } else if (type == PrefixCodeType::AC) { + type_name = "AC"; + prefix_codes = ConvertToDynamicCodes(kACPrefixCodes, kNumACPrefixCodes); + } + for (auto& prefix_code : prefix_codes) { + if (!ExtendPrefixCode(prefix_code, new_alphabet_size)) { + return false; + } + } + OutputCodes(type_name, prefix_codes); + return true; +} + +} // namespace jxl + +void PrintHelp(char* arg0) { + fprintf(stderr, + "Usage: %s \n\n" + "Prints the updated entropy codes of the given type to stdout.\n" + " can be either 'DC' or 'AC'\n", + arg0); +}; + +int main(int argc, char** argv) { + if (argc != 3) { + PrintHelp(argv[0]); + return EXIT_FAILURE; + } + jxl::PrefixCodeType type = jxl::PrefixCodeType::DC; + if (strcmp(argv[1], "DC") == 0) { + type = jxl::PrefixCodeType::DC; + } else if (strcmp(argv[1], "AC") == 0) { + type = jxl::PrefixCodeType::AC; + } else { + PrintHelp(argv[0]); + return EXIT_FAILURE; + } + size_t new_alphabet_size = std::stoi(argv[2]); + if (new_alphabet_size <= jxl::kAlphabetSize) { + fprintf(stderr, + "New alphabet size must be greater than current alphabet size, " + "which is %" PRIuS ".\n", + jxl::kAlphabetSize); + return EXIT_FAILURE; + } + if (!jxl::GenerateNewPrefixCodes(type, new_alphabet_size)) { + fprintf(stderr, "Failed to extend prefix codes (internal error)\n"); + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +}