24 #ifndef COMMON_HUFFMAN_H 25 #define COMMON_HUFFMAN_H 27 #include "common/array.h" 28 #include "common/list.h" 29 #include "common/queue.h" 30 #include "common/types.h" 46 inline uint32 REVERSEBITS(uint32 x) {
47 x = (((x & ~0x55555555) >> 1) | ((x & 0x55555555) << 1));
48 x = (((x & ~0x33333333) >> 2) | ((x & 0x33333333) << 2));
49 x = (((x & ~0x0F0F0F0F) >> 4) | ((x & 0x0F0F0F0F) << 4));
50 x = (((x & ~0x00FF00FF) >> 8) | ((x & 0x00FF00FF) << 8));
52 return ((x >> 16) | (x << 16));
59 template<
class BITSTREAM>
70 Huffman(uint8 maxLength, uint32 codeCount,
const uint32 *codes,
const uint8 *lengths,
const uint32 *symbols =
nullptr);
95 Symbol(uint32 c, uint32 s) : code(c), symbol(s) {}
109 PrefixEntry() : length(0xFF) {}
112 static const uint8 _prefixTableBits = 8;
113 PrefixEntry _prefixTable[1 << _prefixTableBits];
116 template<
class BITSTREAM>
121 for (
auto freq : init) {
131 template<
class BITSTREAM>
133 assert(freqCount > 0);
140 static constexpr uint32 End = ~uint32(0);
147 for (uint32_t i = 0; i != freqCount; ++i)
148 syms.
push_back(Symbol{End, End, freq[i]});
150 auto appendBit = [&](uint32 top,
bool bit) {
153 while (!queue.empty()) {
154 auto idx = queue.front();
156 if (idx < freqCount) {
157 auto &len = lengths[idx];
159 codes[idx] |= (1 << len);
162 assert(syms[idx].zero != End);
163 queue.push(syms[idx].zero);
164 assert(syms[idx].one != End);
165 queue.push(syms[idx].one);
171 uint32 smallest1 = End, smallest2 = End;
172 for (uint32 idx = 0; idx != syms.
size(); ++idx) {
173 auto &sym = syms[idx];
175 if (smallest1 != End && sym.freq >= syms[smallest1].freq) {
176 if (smallest2 == End || sym.freq < syms[smallest2].freq) {
180 smallest2 = smallest1;
185 if (smallest2 == End)
188 auto &zero = syms[smallest1];
189 auto &one = syms[smallest2];
190 auto sum = zero.freq + one.freq;
193 syms.
push_back(Symbol{smallest1, smallest2, sum});
194 appendBit(smallest1,
false);
195 appendBit(smallest2,
true);
201 template<
class BITSTREAM>
203 assert(codeCount > 0);
209 for (uint32 i = 0; i < codeCount; i++)
210 maxLength =
MAX(maxLength, lengths[i]);
212 assert(maxLength <= 32);
215 _codes.resize(
MAX(maxLength - _prefixTableBits, 0));
217 for (uint i = 0; i < codeCount; i++) {
218 uint8 length = lengths[i];
222 uint32 symbol = symbols ? symbols[i] : i;
224 if (length <= _prefixTableBits) {
228 if (BITSTREAM::isMSB2LSB()) {
229 startIndex = codes[i] << (_prefixTableBits - length);
231 startIndex = REVERSEBITS(codes[i]) >> (32 - _prefixTableBits);
234 uint32 endIndex = startIndex | ((1 << (_prefixTableBits - length)) - 1);
236 for (uint32 j = startIndex; j <= endIndex; j++) {
237 uint32 index = BITSTREAM::isMSB2LSB() ? j : REVERSEBITS(j) >> (32 - _prefixTableBits);
238 _prefixTable[index].symbol = symbol;
239 _prefixTable[index].length = length;
243 _codes[lengths[i] - 1 - _prefixTableBits].push_back(Symbol(codes[i], symbol));
248 template<
class BITSTREAM>
250 uint32 code = bits.peekBits(_prefixTableBits);
252 uint8 length = _prefixTable[code].length;
254 if (length != 0xFF) {
256 return _prefixTable[code].symbol;
258 bits.skip(_prefixTableBits);
260 for (uint32 i = 0; i < _codes.size(); i++) {
261 bits.addBit(code, i + _prefixTableBits);
264 if (code == cCode->code)
265 return cCode->symbol;
269 error(
"Unknown Huffman code");
277 #endif // COMMON_HUFFMAN_H const T * data() const
Definition: array.h:208
uint32 getSymbol(BITSTREAM &bits) const
Definition: huffman.h:249
Huffman(uint8 maxLength, uint32 codeCount, const uint32 *codes, const uint8 *lengths, const uint32 *symbols=nullptr)
Definition: huffman.h:202
void push_back(const T &element)
Definition: array.h:181
static Huffman fromFrequencies(uint32 freqCount, const uint32 *freq, const uint32 *symbols)
Definition: huffman.h:132
Definition: algorithm.h:29
size_type size() const
Definition: array.h:316
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: list_intern.h:51
T MAX(T a, T b)
Definition: util.h:64