/* Stores a number between 0 and 255. */ static void StoreVarLenUint8(size_t n, size_t* storage_ix, uint8_t* storage) { if (n == 0) { BrotliWriteBits(1, 0, storage_ix, storage); } else { size_t nbits = Log2FloorNonZero(n); BrotliWriteBits(1, 1, storage_ix, storage); BrotliWriteBits(3, nbits, storage_ix, storage); BrotliWriteBits(nbits, n - ((size_t)1 << nbits), storage_ix, storage); } }
static void BrotliStoreHuffmanTreeOfHuffmanTreeToBitMask( const int num_codes, const uint8_t* code_length_bitdepth, size_t* storage_ix, uint8_t* storage) { static const uint8_t kStorageOrder[BROTLI_CODE_LENGTH_CODES] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; /* The bit lengths of the Huffman code over the code length alphabet are compressed with the following static Huffman code: Symbol Code ------ ---- 0 00 1 1110 2 110 3 01 4 10 5 1111 */ static const uint8_t kHuffmanBitLengthHuffmanCodeSymbols[6] = { 0, 7, 3, 2, 1, 15 }; static const uint8_t kHuffmanBitLengthHuffmanCodeBitLengths[6] = { 2, 4, 3, 2, 2, 4 }; size_t skip_some = 0; /* skips none. */ /* Throw away trailing zeros: */ size_t codes_to_store = BROTLI_CODE_LENGTH_CODES; if (num_codes > 1) { for (; codes_to_store > 0; --codes_to_store) { if (code_length_bitdepth[kStorageOrder[codes_to_store - 1]] != 0) { break; } } } if (code_length_bitdepth[kStorageOrder[0]] == 0 && code_length_bitdepth[kStorageOrder[1]] == 0) { skip_some = 2; /* skips two. */ if (code_length_bitdepth[kStorageOrder[2]] == 0) { skip_some = 3; /* skips three. */ } } BrotliWriteBits(2, skip_some, storage_ix, storage); { size_t i; for (i = skip_some; i < codes_to_store; ++i) { size_t l = code_length_bitdepth[kStorageOrder[i]]; BrotliWriteBits(kHuffmanBitLengthHuffmanCodeBitLengths[l], kHuffmanBitLengthHuffmanCodeSymbols[l], storage_ix, storage); } } }
/* Stores the uncompressed meta-block header. REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ static void BrotliStoreUncompressedMetaBlockHeader(size_t length, size_t* storage_ix, uint8_t* storage) { uint64_t lenbits; size_t nlenbits; uint64_t nibblesbits; /* Write ISLAST bit. Uncompressed block cannot be the last one, so set to 0. */ BrotliWriteBits(1, 0, storage_ix, storage); BrotliEncodeMlen(length, &lenbits, &nlenbits, &nibblesbits); BrotliWriteBits(2, nibblesbits, storage_ix, storage); BrotliWriteBits(nlenbits, lenbits, storage_ix, storage); /* Write ISUNCOMPRESSED bit. */ BrotliWriteBits(1, 1, storage_ix, storage); }
/* REQUIRES: insertlen < 6210 */ static BROTLI_INLINE void EmitInsertLen(size_t insertlen, const uint8_t depth[128], const uint16_t bits[128], uint32_t histo[128], size_t* storage_ix, uint8_t* storage) { if (insertlen < 6) { const size_t code = insertlen + 40; BrotliWriteBits(depth[code], bits[code], storage_ix, storage); ++histo[code]; } else if (insertlen < 130) { const size_t tail = insertlen - 2; const uint32_t nbits = Log2FloorNonZero(tail) - 1u; const size_t prefix = tail >> nbits; const size_t inscode = (nbits << 1) + prefix + 42; BrotliWriteBits(depth[inscode], bits[inscode], storage_ix, storage); BrotliWriteBits(nbits, tail - (prefix << nbits), storage_ix, storage); ++histo[inscode]; } else if (insertlen < 2114) {
static BROTLI_INLINE void StoreCommandExtra( const Command* cmd, size_t* storage_ix, uint8_t* storage) { uint32_t copylen_code = CommandCopyLenCode(cmd); uint16_t inscode = GetInsertLengthCode(cmd->insert_len_); uint16_t copycode = GetCopyLengthCode(copylen_code); uint32_t insnumextra = GetInsertExtra(inscode); uint64_t insextraval = cmd->insert_len_ - GetInsertBase(inscode); uint64_t copyextraval = copylen_code - GetCopyBase(copycode); uint64_t bits = (copyextraval << insnumextra) | insextraval; BrotliWriteBits( insnumextra + GetCopyExtra(copycode), bits, storage_ix, storage); }
/* Stores the compressed meta-block header. REQUIRES: length > 0 REQUIRES: length <= (1 << 24) */ static void StoreCompressedMetaBlockHeader(BROTLI_BOOL is_final_block, size_t length, size_t* storage_ix, uint8_t* storage) { uint64_t lenbits; size_t nlenbits; uint64_t nibblesbits; /* Write ISLAST bit. */ BrotliWriteBits(1, (uint64_t)is_final_block, storage_ix, storage); /* Write ISEMPTY bit. */ if (is_final_block) { BrotliWriteBits(1, 0, storage_ix, storage); } BrotliEncodeMlen(length, &lenbits, &nlenbits, &nibblesbits); BrotliWriteBits(2, nibblesbits, storage_ix, storage); BrotliWriteBits(nlenbits, lenbits, storage_ix, storage); if (!is_final_block) { /* Write ISUNCOMPRESSED bit. */ BrotliWriteBits(1, 0, storage_ix, storage); } }