Simple Huffman code changes.

No empty trees are codified with the simple Huffman code. The simple Huffman
code is simplified to be either a 1-bit code or 8-bit code for symbols.

Change-Id: I3e2813027b5a643862729339303d80197c497aff
This commit is contained in:
Vikas Arora
2012-04-27 05:51:13 +00:00
committed by James Zern
parent a2849bc502
commit 781c01f421
2 changed files with 23 additions and 32 deletions

View File

@ -531,20 +531,19 @@ static int StoreHuffmanCode(VP8LBitWriter* const bw,
++count;
}
}
if (count <= 2) {
int num_bits = 4;
// 0, 1 or 2 symbols to encode.
VP8LWriteBits(bw, 1, 1);
if (count == 0) {
VP8LWriteBits(bw, 3, 0);
ok = 1;
goto End;
}
while (symbols[count - 1] >= (1 << num_bits)) num_bits += 2;
VP8LWriteBits(bw, 3, (num_bits - 4) / 2 + 1);
if (count == 0) count = 1;
if (count <= 2 && symbols[0] < 256 && symbols[1] < 256) {
VP8LWriteBits(bw, 1, 1); // Small tree marker to encode 1 or 2 symbols.
VP8LWriteBits(bw, 1, count - 1);
for (i = 0; i < count; ++i) {
VP8LWriteBits(bw, num_bits, symbols[i]);
if (symbols[0] <= 1) {
VP8LWriteBits(bw, 1, 0); // Code bit for small (1 bit) symbol value.
VP8LWriteBits(bw, 1, symbols[0]);
} else {
VP8LWriteBits(bw, 1, 1);
VP8LWriteBits(bw, 8, symbols[0]);
}
if (count == 2) {
VP8LWriteBits(bw, 8, symbols[1]);
}
ok = 1;
goto End;