Skip to content

Commit 174544c

Browse files
committed
Fix commit 63fdd08
1 parent 8360cdf commit 174544c

2 files changed

Lines changed: 63 additions & 8 deletions

File tree

src/entropy/HuffmanDecoder.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,14 @@ bool HuffmanDecoder::decodeChunk(kanzi::byte block[], uint count)
219219
if ((szBits0 > maxFragBits) || (szBits1 > maxFragBits) || (szBits2 > maxFragBits) || (szBits3 > maxFragBits))
220220
return false;
221221

222-
int idx0 = 0 * fragStride;
223-
int idx1 = 1 * fragStride;
224-
int idx2 = 2 * fragStride;
225-
int idx3 = 3 * fragStride;
222+
const int base0 = 0 * fragStride;
223+
const int base1 = 1 * fragStride;
224+
const int base2 = 2 * fragStride;
225+
const int base3 = 3 * fragStride;
226+
int idx0 = base0;
227+
int idx1 = base1;
228+
int idx2 = base2;
229+
int idx3 = base3;
226230

227231
// Read all compressed data from bitstream
228232
_bitstream.readBits(&_buffer[idx0], szBits0);
@@ -333,10 +337,13 @@ bool HuffmanDecoder::decodeChunk(kanzi::byte block[], uint count)
333337
for (uint i = count4; i < count; i++)
334338
block[i] = kanzi::byte(_bitstream.readBits(8));
335339

336-
return ((idx0 << 3) - (bits0 + DECODING_BATCH_SIZE) == szBits0) &&
337-
((idx1 << 3) - (bits1 + DECODING_BATCH_SIZE) == szBits1) &&
338-
((idx2 << 3) - (bits2 + DECODING_BATCH_SIZE) == szBits2) &&
339-
((idx3 << 3) - (bits3 + DECODING_BATCH_SIZE) == szBits3);
340+
const int used0 = ((idx0 - base0) << 3) - (bits0 + DECODING_BATCH_SIZE);
341+
const int used1 = ((idx1 - base1) << 3) - (bits1 + DECODING_BATCH_SIZE);
342+
const int used2 = ((idx2 - base2) << 3) - (bits2 + DECODING_BATCH_SIZE);
343+
const int used3 = ((idx3 - base3) << 3) - (bits3 + DECODING_BATCH_SIZE);
344+
345+
return (used0 == szBits0) && (used1 == szBits1) &&
346+
(used2 == szBits2) && (used3 == szBits3);
340347
}
341348

342349
int HuffmanDecoder::decodeV5(kanzi::byte block[], uint blkptr, uint count)

src/test/TestEntropyCodec.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,53 @@ int testDeclaredPayloadConsumption()
255255
return 0;
256256
}
257257

258+
int testHuffmanFragmentedRoundTrip()
259+
{
260+
cout << endl
261+
<< "=== Huffman fragmented round-trip test ===" << endl;
262+
const uint size = 1 << 20;
263+
vector<kanzi::byte> values(size);
264+
vector<kanzi::byte> decoded(size, kanzi::byte(0));
265+
uint32 state = 0x12345678;
266+
267+
for (uint i = 0; i < size; i++) {
268+
state = (state * 1103515245U) + 12345U;
269+
values[i] = kanzi::byte(state >> 24);
270+
}
271+
272+
stringbuf buffer;
273+
iostream ios(&buffer);
274+
DefaultOutputBitStream obs(ios, 1 << 15);
275+
HuffmanEncoder encoder(obs);
276+
277+
if (encoder.encode(&values[0], 0, size) != int(size)) {
278+
cout << "Encoding error in Huffman fragmented round-trip test" << endl;
279+
return 1;
280+
}
281+
282+
encoder.dispose();
283+
obs.close();
284+
ios.rdbuf()->pubseekpos(0);
285+
DefaultInputBitStream ibs(ios, 1 << 15);
286+
HuffmanDecoder decoder(ibs);
287+
288+
if (decoder.decode(&decoded[0], 0, size) != int(size)) {
289+
cout << "Decoding error in Huffman fragmented round-trip test" << endl;
290+
return 1;
291+
}
292+
293+
decoder.dispose();
294+
ibs.close();
295+
296+
if (memcmp(&values[0], &decoded[0], size) != 0) {
297+
cout << "Mismatch in Huffman fragmented round-trip test" << endl;
298+
return 1;
299+
}
300+
301+
cout << "Huffman fragmented round-trip test passed" << endl;
302+
return 0;
303+
}
304+
258305
class ConstantPredictor FINAL : public Predictor
259306
{
260307
public:
@@ -614,6 +661,7 @@ int TestEntropyCodec_main(int argc, const char* argv[])
614661
try {
615662
res |= testBinaryEntropyBufferGrowth();
616663
res |= testDeclaredPayloadConsumption();
664+
res |= testHuffmanFragmentedRoundTrip();
617665
vector<string> codecs;
618666
bool doPerf = true;
619667

0 commit comments

Comments
 (0)