diff --git a/lib/jpegli/bitstream.cc b/lib/jpegli/bitstream.cc index d9016d50..20e1c506 100644 --- a/lib/jpegli/bitstream.cc +++ b/lib/jpegli/bitstream.cc @@ -192,10 +192,12 @@ void EncodeDHT(j_compress_ptr cinfo, size_t offset, size_t num) { for (size_t i = 0; i < num; ++i) { const JHUFF_TBL& table = m->huffman_tables[offset + i]; if (table.sent_table) continue; - marker_len += kJpegHuffmanMaxBitLength + 1; for (size_t j = 0; j <= kJpegHuffmanMaxBitLength; ++j) { marker_len += table.bits[j]; } + // Special case: empty DHT markerAdd commentMore actions + if (marker_len == 2) break; + marker_len += kJpegHuffmanMaxBitLength + 1; } std::vector data(marker_len + 2); size_t pos = 0; @@ -210,6 +212,8 @@ void EncodeDHT(j_compress_ptr cinfo, size_t offset, size_t num) { for (size_t i = 0; i <= kJpegHuffmanMaxBitLength; ++i) { total_count += table.bits[i]; } + // Special case: empty DHT marker + if (total_count == 0) break; data[pos++] = m->slot_id_map[offset + t]; for (size_t i = 1; i <= kJpegHuffmanMaxBitLength; ++i) { data[pos++] = table.bits[i]; diff --git a/lib/jpegli/decode_marker.cc b/lib/jpegli/decode_marker.cc index 171942b3..33190c0e 100644 --- a/lib/jpegli/decode_marker.cc +++ b/lib/jpegli/decode_marker.cc @@ -284,9 +284,8 @@ void ProcessSOS(j_decompress_ptr cinfo, const uint8_t* data, size_t len) { // and solt_id of Huffman code being read. void ProcessDHT(j_decompress_ptr cinfo, const uint8_t* data, size_t len) { size_t pos = 2; - if (pos == len) { - JPEGLI_ERROR("DHT marker: no Huffman table found"); - } + // Empty DHT marker. + if (pos == len) return; while (pos < len) { JPEG_VERIFY_LEN(1 + kJpegHuffmanMaxBitLength); // The index of the Huffman code in the current set of Huffman codes. For AC