pub fn write_huffman_tree(depth: &[u8]) -> CompressedTreeExpand description
Compresses a depth array into RLE-encoded code length codes.
// libjxl: enc_huffman_tree.cc
void WriteHuffmanTree(const uint8_t* depth, size_t length, size_t* tree_size,
uint8_t* tree, uint8_t* extra_bits_data) {
uint8_t previous_value = 8;
// Throw away trailing zeros.
size_t new_length = length;
for (size_t i = 0; i < length; ++i) {
if (depth[length - i - 1] == 0) {
--new_length;
} else {
break;
}
}
// First gather statistics on if it is a good idea to do rle.
bool use_rle_for_non_zero = false;
bool use_rle_for_zero = false;
if (length > 50) {
DecideOverRleUse(depth, new_length, &use_rle_for_non_zero, &use_rle_for_zero);
}
// Actual rle coding.
for (size_t i = 0; i < new_length;) {
const uint8_t value = depth[i];
size_t reps = 1;
if ((value != 0 && use_rle_for_non_zero) || (value == 0 && use_rle_for_zero)) {
for (size_t k = i + 1; k < new_length && depth[k] == value; ++k) {
++reps;
}
}
if (value == 0) {
WriteHuffmanTreeRepetitionsZeros(reps, tree_size, tree, extra_bits_data);
} else {
WriteHuffmanTreeRepetitions(previous_value, value, reps, tree_size, tree, extra_bits_data);
previous_value = value;
}
i += reps;
}
}