From 5cf53f594cca44fd072db5cab93188005e41e470 Mon Sep 17 00:00:00 2001 From: jesse Date: Wed, 4 Jun 2025 10:01:39 +0800 Subject: [PATCH 1/2] allow empty DHT marker --- lib/jpegli/bitstream.cc | 6 +++++- lib/jpegli/decode_marker.cc | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) 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..250d5e9e 100644 --- a/lib/jpegli/decode_marker.cc +++ b/lib/jpegli/decode_marker.cc @@ -284,8 +284,9 @@ 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; + // Empty DHT marker. if (pos == len) { - JPEGLI_ERROR("DHT marker: no Huffman table found"); + return ; } while (pos < len) { JPEG_VERIFY_LEN(1 + kJpegHuffmanMaxBitLength); From 5c40bd0d8664a0aee6aa48d892b0ce09fb854f35 Mon Sep 17 00:00:00 2001 From: jesse Date: Wed, 4 Jun 2025 10:14:16 +0800 Subject: [PATCH 2/2] fix styling --- lib/jpegli/decode_marker.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/jpegli/decode_marker.cc b/lib/jpegli/decode_marker.cc index 250d5e9e..33190c0e 100644 --- a/lib/jpegli/decode_marker.cc +++ b/lib/jpegli/decode_marker.cc @@ -285,9 +285,7 @@ void ProcessSOS(j_decompress_ptr cinfo, const uint8_t* data, size_t len) { void ProcessDHT(j_decompress_ptr cinfo, const uint8_t* data, size_t len) { size_t pos = 2; // Empty DHT marker. - if (pos == len) { - return ; - } + 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