HuffmanEncode.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /* Compress/HuffmanEncode.c */
  2. #include "HuffmanEncode.h"
  3. #include "../../Sort.h"
  4. #define kMaxLen 16
  5. #define NUM_BITS 10
  6. #define MASK ((1 << NUM_BITS) - 1)
  7. #define NUM_COUNTERS 64
  8. /* use BLOCK_SORT_EXTERNAL_FLAGS if blockSize > 1M */
  9. #define HUFFMAN_SPEED_OPT
  10. void Huffman_Generate(const UInt32 *freqs, UInt32 *p, Byte *lens, UInt32 numSymbols, UInt32 maxLen)
  11. {
  12. UInt32 num = 0;
  13. /* if (maxLen > 10) maxLen = 10; */
  14. {
  15. UInt32 i;
  16. #ifdef HUFFMAN_SPEED_OPT
  17. UInt32 counters[NUM_COUNTERS];
  18. for (i = 0; i < NUM_COUNTERS; i++)
  19. counters[i] = 0;
  20. for (i = 0; i < numSymbols; i++)
  21. {
  22. UInt32 freq = freqs[i];
  23. counters[(freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1]++;
  24. }
  25. for (i = 1; i < NUM_COUNTERS; i++)
  26. {
  27. UInt32 temp = counters[i];
  28. counters[i] = num;
  29. num += temp;
  30. }
  31. for (i = 0; i < numSymbols; i++)
  32. {
  33. UInt32 freq = freqs[i];
  34. if (freq == 0)
  35. lens[i] = 0;
  36. else
  37. p[counters[((freq < NUM_COUNTERS - 1) ? freq : NUM_COUNTERS - 1)]++] = i | (freq << NUM_BITS);
  38. }
  39. counters[0] = 0;
  40. HeapSort(p + counters[NUM_COUNTERS - 2], counters[NUM_COUNTERS - 1] - counters[NUM_COUNTERS - 2]);
  41. #else
  42. for (i = 0; i < numSymbols; i++)
  43. {
  44. UInt32 freq = freqs[i];
  45. if (freq == 0)
  46. lens[i] = 0;
  47. else
  48. p[num++] = i | (freq << NUM_BITS);
  49. }
  50. HeapSort(p, num);
  51. #endif
  52. }
  53. if (num < 2)
  54. {
  55. int minCode = 0;
  56. int maxCode = 1;
  57. if (num == 1)
  58. {
  59. maxCode = p[0] & MASK;
  60. if (maxCode == 0)
  61. maxCode++;
  62. }
  63. p[minCode] = 0;
  64. p[maxCode] = 1;
  65. lens[minCode] = lens[maxCode] = 1;
  66. return;
  67. }
  68. {
  69. UInt32 b, e, i;
  70. i = b = e = 0;
  71. do
  72. {
  73. UInt32 n, m, freq;
  74. n = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;
  75. freq = (p[n] & ~MASK);
  76. p[n] = (p[n] & MASK) | (e << NUM_BITS);
  77. m = (i != num && (b == e || (p[i] >> NUM_BITS) <= (p[b] >> NUM_BITS))) ? i++ : b++;
  78. freq += (p[m] & ~MASK);
  79. p[m] = (p[m] & MASK) | (e << NUM_BITS);
  80. p[e] = (p[e] & MASK) | freq;
  81. e++;
  82. }
  83. while (num - e > 1);
  84. {
  85. UInt32 lenCounters[kMaxLen + 1];
  86. for (i = 0; i <= kMaxLen; i++)
  87. lenCounters[i] = 0;
  88. p[--e] &= MASK;
  89. lenCounters[1] = 2;
  90. while (e > 0)
  91. {
  92. UInt32 len = (p[p[--e] >> NUM_BITS] >> NUM_BITS) + 1;
  93. p[e] = (p[e] & MASK) | (len << NUM_BITS);
  94. if (len >= maxLen)
  95. for (len = maxLen - 1; lenCounters[len] == 0; len--);
  96. lenCounters[len]--;
  97. lenCounters[len + 1] += 2;
  98. }
  99. {
  100. UInt32 len;
  101. i = 0;
  102. for (len = maxLen; len != 0; len--)
  103. {
  104. UInt32 num;
  105. for (num = lenCounters[len]; num != 0; num--)
  106. lens[p[i++] & MASK] = (Byte)len;
  107. }
  108. }
  109. {
  110. UInt32 nextCodes[kMaxLen + 1];
  111. {
  112. UInt32 code = 0;
  113. UInt32 len;
  114. for (len = 1; len <= kMaxLen; len++)
  115. nextCodes[len] = code = (code + lenCounters[len - 1]) << 1;
  116. }
  117. /* if (code + lenCounters[kMaxLen] - 1 != (1 << kMaxLen) - 1) throw 1; */
  118. {
  119. UInt32 i;
  120. for (i = 0; i < numSymbols; i++)
  121. p[i] = nextCodes[lens[i]]++;
  122. }
  123. }
  124. }
  125. }
  126. }