huffman_encode_utils.c (13526B)
1 // Copyright 2011 Google Inc. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the COPYING file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 // ----------------------------------------------------------------------------- 9 // 10 // Author: Jyrki Alakuijala (jyrki@google.com) 11 // 12 // Entropy encoding (Huffman) for webp lossless. 13 14 #include <assert.h> 15 #include <stdlib.h> 16 #include <string.h> 17 18 #include "src/utils/huffman_encode_utils.h" 19 #include "src/webp/types.h" 20 #include "src/utils/utils.h" 21 #include "src/webp/format_constants.h" 22 23 // ----------------------------------------------------------------------------- 24 // Util function to optimize the symbol map for RLE coding 25 26 // Heuristics for selecting the stride ranges to collapse. 27 static int ValuesShouldBeCollapsedToStrideAverage(int a, int b) { 28 return abs(a - b) < 4; 29 } 30 31 // Change the population counts in a way that the consequent 32 // Huffman tree compression, especially its RLE-part, give smaller output. 33 static void OptimizeHuffmanForRle(int length, uint8_t* const good_for_rle, 34 uint32_t* const counts) { 35 // 1) Let's make the Huffman code more compatible with rle encoding. 36 int i; 37 for (; length >= 0; --length) { 38 if (length == 0) { 39 return; // All zeros. 40 } 41 if (counts[length - 1] != 0) { 42 // Now counts[0..length - 1] does not have trailing zeros. 43 break; 44 } 45 } 46 // 2) Let's mark all population counts that already can be encoded 47 // with an rle code. 48 { 49 // Let's not spoil any of the existing good rle codes. 50 // Mark any seq of 0's that is longer as 5 as a good_for_rle. 51 // Mark any seq of non-0's that is longer as 7 as a good_for_rle. 52 uint32_t symbol = counts[0]; 53 int stride = 0; 54 for (i = 0; i < length + 1; ++i) { 55 if (i == length || counts[i] != symbol) { 56 if ((symbol == 0 && stride >= 5) || 57 (symbol != 0 && stride >= 7)) { 58 int k; 59 for (k = 0; k < stride; ++k) { 60 good_for_rle[i - k - 1] = 1; 61 } 62 } 63 stride = 1; 64 if (i != length) { 65 symbol = counts[i]; 66 } 67 } else { 68 ++stride; 69 } 70 } 71 } 72 // 3) Let's replace those population counts that lead to more rle codes. 73 { 74 uint32_t stride = 0; 75 uint32_t limit = counts[0]; 76 uint32_t sum = 0; 77 for (i = 0; i < length + 1; ++i) { 78 if (i == length || good_for_rle[i] || 79 (i != 0 && good_for_rle[i - 1]) || 80 !ValuesShouldBeCollapsedToStrideAverage(counts[i], limit)) { 81 if (stride >= 4 || (stride >= 3 && sum == 0)) { 82 uint32_t k; 83 // The stride must end, collapse what we have, if we have enough (4). 84 uint32_t count = (sum + stride / 2) / stride; 85 if (count < 1) { 86 count = 1; 87 } 88 if (sum == 0) { 89 // Don't make an all zeros stride to be upgraded to ones. 90 count = 0; 91 } 92 for (k = 0; k < stride; ++k) { 93 // We don't want to change value at counts[i], 94 // that is already belonging to the next stride. Thus - 1. 95 counts[i - k - 1] = count; 96 } 97 } 98 stride = 0; 99 sum = 0; 100 if (i < length - 3) { 101 // All interesting strides have a count of at least 4, 102 // at least when non-zeros. 103 limit = (counts[i] + counts[i + 1] + 104 counts[i + 2] + counts[i + 3] + 2) / 4; 105 } else if (i < length) { 106 limit = counts[i]; 107 } else { 108 limit = 0; 109 } 110 } 111 ++stride; 112 if (i != length) { 113 sum += counts[i]; 114 if (stride >= 4) { 115 limit = (sum + stride / 2) / stride; 116 } 117 } 118 } 119 } 120 } 121 122 // A comparer function for two Huffman trees: sorts first by 'total count' 123 // (more comes first), and then by 'value' (more comes first). 124 static int CompareHuffmanTrees(const void* ptr1, const void* ptr2) { 125 const HuffmanTree* const t1 = (const HuffmanTree*)ptr1; 126 const HuffmanTree* const t2 = (const HuffmanTree*)ptr2; 127 if (t1->total_count > t2->total_count) { 128 return -1; 129 } else if (t1->total_count < t2->total_count) { 130 return 1; 131 } else { 132 assert(t1->value != t2->value); 133 return (t1->value < t2->value) ? -1 : 1; 134 } 135 } 136 137 static void SetBitDepths(const HuffmanTree* const tree, 138 const HuffmanTree* const pool, 139 uint8_t* const bit_depths, int level) { 140 if (tree->pool_index_left >= 0) { 141 SetBitDepths(&pool[tree->pool_index_left], pool, bit_depths, level + 1); 142 SetBitDepths(&pool[tree->pool_index_right], pool, bit_depths, level + 1); 143 } else { 144 bit_depths[tree->value] = level; 145 } 146 } 147 148 // Create an optimal Huffman tree. 149 // 150 // (data,length): population counts. 151 // tree_limit: maximum bit depth (inclusive) of the codes. 152 // bit_depths[]: how many bits are used for the symbol. 153 // 154 // Returns 0 when an error has occurred. 155 // 156 // The catch here is that the tree cannot be arbitrarily deep 157 // 158 // count_limit is the value that is to be faked as the minimum value 159 // and this minimum value is raised until the tree matches the 160 // maximum length requirement. 161 // 162 // This algorithm is not of excellent performance for very long data blocks, 163 // especially when population counts are longer than 2**tree_limit, but 164 // we are not planning to use this with extremely long blocks. 165 // 166 // See https://en.wikipedia.org/wiki/Huffman_coding 167 static void GenerateOptimalTree(const uint32_t* const histogram, 168 int histogram_size, 169 HuffmanTree* tree, int tree_depth_limit, 170 uint8_t* const bit_depths) { 171 uint32_t count_min; 172 HuffmanTree* tree_pool; 173 int tree_size_orig = 0; 174 int i; 175 176 for (i = 0; i < histogram_size; ++i) { 177 if (histogram[i] != 0) { 178 ++tree_size_orig; 179 } 180 } 181 182 if (tree_size_orig == 0) { // pretty optimal already! 183 return; 184 } 185 186 tree_pool = tree + tree_size_orig; 187 188 // For block sizes with less than 64k symbols we never need to do a 189 // second iteration of this loop. 190 // If we actually start running inside this loop a lot, we would perhaps 191 // be better off with the Katajainen algorithm. 192 assert(tree_size_orig <= (1 << (tree_depth_limit - 1))); 193 for (count_min = 1; ; count_min *= 2) { 194 int tree_size = tree_size_orig; 195 // We need to pack the Huffman tree in tree_depth_limit bits. 196 // So, we try by faking histogram entries to be at least 'count_min'. 197 int idx = 0; 198 int j; 199 for (j = 0; j < histogram_size; ++j) { 200 if (histogram[j] != 0) { 201 const uint32_t count = 202 (histogram[j] < count_min) ? count_min : histogram[j]; 203 tree[idx].total_count = count; 204 tree[idx].value = j; 205 tree[idx].pool_index_left = -1; 206 tree[idx].pool_index_right = -1; 207 ++idx; 208 } 209 } 210 211 // Build the Huffman tree. 212 qsort(tree, tree_size, sizeof(*tree), CompareHuffmanTrees); 213 214 if (tree_size > 1) { // Normal case. 215 int tree_pool_size = 0; 216 while (tree_size > 1) { // Finish when we have only one root. 217 uint32_t count; 218 tree_pool[tree_pool_size++] = tree[tree_size - 1]; 219 tree_pool[tree_pool_size++] = tree[tree_size - 2]; 220 count = tree_pool[tree_pool_size - 1].total_count + 221 tree_pool[tree_pool_size - 2].total_count; 222 tree_size -= 2; 223 { 224 // Search for the insertion point. 225 int k; 226 for (k = 0; k < tree_size; ++k) { 227 if (tree[k].total_count <= count) { 228 break; 229 } 230 } 231 memmove(tree + (k + 1), tree + k, (tree_size - k) * sizeof(*tree)); 232 tree[k].total_count = count; 233 tree[k].value = -1; 234 235 tree[k].pool_index_left = tree_pool_size - 1; 236 tree[k].pool_index_right = tree_pool_size - 2; 237 tree_size = tree_size + 1; 238 } 239 } 240 SetBitDepths(&tree[0], tree_pool, bit_depths, 0); 241 } else if (tree_size == 1) { // Trivial case: only one element. 242 bit_depths[tree[0].value] = 1; 243 } 244 245 { 246 // Test if this Huffman tree satisfies our 'tree_depth_limit' criteria. 247 int max_depth = bit_depths[0]; 248 for (j = 1; j < histogram_size; ++j) { 249 if (max_depth < bit_depths[j]) { 250 max_depth = bit_depths[j]; 251 } 252 } 253 if (max_depth <= tree_depth_limit) { 254 break; 255 } 256 } 257 } 258 } 259 260 // ----------------------------------------------------------------------------- 261 // Coding of the Huffman tree values 262 263 static HuffmanTreeToken* CodeRepeatedValues(int repetitions, 264 HuffmanTreeToken* tokens, 265 int value, int prev_value) { 266 assert(value <= MAX_ALLOWED_CODE_LENGTH); 267 if (value != prev_value) { 268 tokens->code = value; 269 tokens->extra_bits = 0; 270 ++tokens; 271 --repetitions; 272 } 273 while (repetitions >= 1) { 274 if (repetitions < 3) { 275 int i; 276 for (i = 0; i < repetitions; ++i) { 277 tokens->code = value; 278 tokens->extra_bits = 0; 279 ++tokens; 280 } 281 break; 282 } else if (repetitions < 7) { 283 tokens->code = 16; 284 tokens->extra_bits = repetitions - 3; 285 ++tokens; 286 break; 287 } else { 288 tokens->code = 16; 289 tokens->extra_bits = 3; 290 ++tokens; 291 repetitions -= 6; 292 } 293 } 294 return tokens; 295 } 296 297 static HuffmanTreeToken* CodeRepeatedZeros(int repetitions, 298 HuffmanTreeToken* tokens) { 299 while (repetitions >= 1) { 300 if (repetitions < 3) { 301 int i; 302 for (i = 0; i < repetitions; ++i) { 303 tokens->code = 0; // 0-value 304 tokens->extra_bits = 0; 305 ++tokens; 306 } 307 break; 308 } else if (repetitions < 11) { 309 tokens->code = 17; 310 tokens->extra_bits = repetitions - 3; 311 ++tokens; 312 break; 313 } else if (repetitions < 139) { 314 tokens->code = 18; 315 tokens->extra_bits = repetitions - 11; 316 ++tokens; 317 break; 318 } else { 319 tokens->code = 18; 320 tokens->extra_bits = 0x7f; // 138 repeated 0s 321 ++tokens; 322 repetitions -= 138; 323 } 324 } 325 return tokens; 326 } 327 328 int VP8LCreateCompressedHuffmanTree(const HuffmanTreeCode* const tree, 329 HuffmanTreeToken* tokens, int max_tokens) { 330 HuffmanTreeToken* const starting_token = tokens; 331 HuffmanTreeToken* const ending_token = tokens + max_tokens; 332 const int depth_size = tree->num_symbols; 333 int prev_value = 8; // 8 is the initial value for rle. 334 int i = 0; 335 assert(tokens != NULL); 336 while (i < depth_size) { 337 const int value = tree->code_lengths[i]; 338 int k = i + 1; 339 int runs; 340 while (k < depth_size && tree->code_lengths[k] == value) ++k; 341 runs = k - i; 342 if (value == 0) { 343 tokens = CodeRepeatedZeros(runs, tokens); 344 } else { 345 tokens = CodeRepeatedValues(runs, tokens, value, prev_value); 346 prev_value = value; 347 } 348 i += runs; 349 assert(tokens <= ending_token); 350 } 351 (void)ending_token; // suppress 'unused variable' warning 352 return (int)(tokens - starting_token); 353 } 354 355 // ----------------------------------------------------------------------------- 356 357 // Pre-reversed 4-bit values. 358 static const uint8_t kReversedBits[16] = { 359 0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe, 360 0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf 361 }; 362 363 static uint32_t ReverseBits(int num_bits, uint32_t bits) { 364 uint32_t retval = 0; 365 int i = 0; 366 while (i < num_bits) { 367 i += 4; 368 retval |= kReversedBits[bits & 0xf] << (MAX_ALLOWED_CODE_LENGTH + 1 - i); 369 bits >>= 4; 370 } 371 retval >>= (MAX_ALLOWED_CODE_LENGTH + 1 - num_bits); 372 return retval; 373 } 374 375 // Get the actual bit values for a tree of bit depths. 376 static void ConvertBitDepthsToSymbols(HuffmanTreeCode* const tree) { 377 // 0 bit-depth means that the symbol does not exist. 378 int i; 379 int len; 380 uint32_t next_code[MAX_ALLOWED_CODE_LENGTH + 1]; 381 int depth_count[MAX_ALLOWED_CODE_LENGTH + 1] = { 0 }; 382 383 assert(tree != NULL); 384 len = tree->num_symbols; 385 for (i = 0; i < len; ++i) { 386 const int code_length = tree->code_lengths[i]; 387 assert(code_length <= MAX_ALLOWED_CODE_LENGTH); 388 ++depth_count[code_length]; 389 } 390 depth_count[0] = 0; // ignore unused symbol 391 next_code[0] = 0; 392 { 393 uint32_t code = 0; 394 for (i = 1; i <= MAX_ALLOWED_CODE_LENGTH; ++i) { 395 code = (code + depth_count[i - 1]) << 1; 396 next_code[i] = code; 397 } 398 } 399 for (i = 0; i < len; ++i) { 400 const int code_length = tree->code_lengths[i]; 401 tree->codes[i] = ReverseBits(code_length, next_code[code_length]++); 402 } 403 } 404 405 // ----------------------------------------------------------------------------- 406 // Main entry point 407 408 void VP8LCreateHuffmanTree(uint32_t* const histogram, int tree_depth_limit, 409 uint8_t* const buf_rle, HuffmanTree* const huff_tree, 410 HuffmanTreeCode* const huff_code) { 411 const int num_symbols = huff_code->num_symbols; 412 memset(buf_rle, 0, num_symbols * sizeof(*buf_rle)); 413 OptimizeHuffmanForRle(num_symbols, buf_rle, histogram); 414 GenerateOptimalTree(histogram, num_symbols, huff_tree, tree_depth_limit, 415 huff_code->code_lengths); 416 // Create the actual bit codes for the bit lengths. 417 ConvertBitDepthsToSymbols(huff_code); 418 }