From 6e13b4b5509223f9b02883185136157e708b8ec1 Mon Sep 17 00:00:00 2001 From: Mattias Iko Mattsson <859123+matmat@users.noreply.github.com> Date: Sun, 21 Apr 2024 01:15:52 +0200 Subject: [PATCH] jpeg: Add parsing of DHT parameters --- format/jpeg/jpeg.go | 23 ++++++++++++++ format/jpeg/testdata/4x4.fqtest | 54 +++++++++++++++++++++++++++++---- 2 files changed, 71 insertions(+), 6 deletions(-) diff --git a/format/jpeg/jpeg.go b/format/jpeg/jpeg.go index c0425cdb..05dd3b32 100644 --- a/format/jpeg/jpeg.go +++ b/format/jpeg/jpeg.go @@ -262,6 +262,29 @@ func jpegDecode(d *decode.D) any { } }) }) + case DHT: + lH := int64(d.FieldU16("lh")) + d.FramedFn(lH*8-16, func(d *decode.D) { + d.FieldArray("hs", func(d *decode.D) { + for d.NotEnd() { + d.FieldStruct("h", func(d *decode.D) { + d.FieldU4("tc") + d.FieldU4("th") + hK := uint64(0) + hV := uint64(0) + d.FieldArrayLoop("l", func() bool { return hK < 16 }, func(d *decode.D) { + hV += d.FieldU8("l") + hK++ + }) + hK = 0 + d.FieldArrayLoop("v", func() bool { return hK < hV }, func(d *decode.D) { + d.FieldU8("v") + hK++ + }) + }) + } + }) + }) case RST0, RST1, RST2, RST3, RST4, RST5, RST6, RST7: inECD = true case TEM: diff --git a/format/jpeg/testdata/4x4.fqtest b/format/jpeg/testdata/4x4.fqtest index b8a88ee1..d277c31e 100644 --- a/format/jpeg/testdata/4x4.fqtest +++ b/format/jpeg/testdata/4x4.fqtest @@ -109,15 +109,57 @@ $ fq -d jpeg dv 4x4.jpg | | | [4]{}: marker 0x66-0x7c (22) 0x60| ff | . | prefix: raw bits (valid) 0x66-0x67 (1) 0x60| c4 | . | code: "dht" (196) (Define Huffman table(s)) 0x67-0x68 (1) -0x60| 00 14 | .. | length: 20 0x68-0x6a (2) -0x60| 00 01 00 00 00 00| ......| data: raw bits 0x6a-0x7c (18) -0x70|00 00 00 00 00 00 00 00 00 00 00 08 |............ | +0x60| 00 14 | .. | lh: 20 0x68-0x6a (2) + | | | hs[0:1]: 0x6a-0x7c (18) + | | | [0]{}: h 0x6a-0x7c (18) +0x60| 00 | . | tc: 0 0x6a-0x6a.4 (0.4) +0x60| 00 | . | th: 0 0x6a.4-0x6b (0.4) + | | | l[0:16]: 0x6b-0x7b (16) +0x60| 01 | . | [0]: 1 l 0x6b-0x6c (1) +0x60| 00 | . | [1]: 0 l 0x6c-0x6d (1) +0x60| 00 | . | [2]: 0 l 0x6d-0x6e (1) +0x60| 00 | . | [3]: 0 l 0x6e-0x6f (1) +0x60| 00| .| [4]: 0 l 0x6f-0x70 (1) +0x70|00 |. | [5]: 0 l 0x70-0x71 (1) +0x70| 00 | . | [6]: 0 l 0x71-0x72 (1) +0x70| 00 | . | [7]: 0 l 0x72-0x73 (1) +0x70| 00 | . | [8]: 0 l 0x73-0x74 (1) +0x70| 00 | . | [9]: 0 l 0x74-0x75 (1) +0x70| 00 | . | [10]: 0 l 0x75-0x76 (1) +0x70| 00 | . | [11]: 0 l 0x76-0x77 (1) +0x70| 00 | . | [12]: 0 l 0x77-0x78 (1) +0x70| 00 | . | [13]: 0 l 0x78-0x79 (1) +0x70| 00 | . | [14]: 0 l 0x79-0x7a (1) +0x70| 00 | . | [15]: 0 l 0x7a-0x7b (1) + | | | v[0:1]: 0x7b-0x7c (1) +0x70| 08 | . | [0]: 8 v 0x7b-0x7c (1) | | | [5]{}: marker 0x7c-0x92 (22) 0x70| ff | . | prefix: raw bits (valid) 0x7c-0x7d (1) 0x70| c4 | . | code: "dht" (196) (Define Huffman table(s)) 0x7d-0x7e (1) -0x70| 00 14| ..| length: 20 0x7e-0x80 (2) -0x80|10 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00|................| data: raw bits 0x80-0x92 (18) -0x90|00 00 |.. | +0x70| 00 14| ..| lh: 20 0x7e-0x80 (2) + | | | hs[0:1]: 0x80-0x92 (18) + | | | [0]{}: h 0x80-0x92 (18) +0x80|10 |. | tc: 1 0x80-0x80.4 (0.4) +0x80|10 |. | th: 0 0x80.4-0x81 (0.4) + | | | l[0:16]: 0x81-0x91 (16) +0x80| 01 | . | [0]: 1 l 0x81-0x82 (1) +0x80| 00 | . | [1]: 0 l 0x82-0x83 (1) +0x80| 00 | . | [2]: 0 l 0x83-0x84 (1) +0x80| 00 | . | [3]: 0 l 0x84-0x85 (1) +0x80| 00 | . | [4]: 0 l 0x85-0x86 (1) +0x80| 00 | . | [5]: 0 l 0x86-0x87 (1) +0x80| 00 | . | [6]: 0 l 0x87-0x88 (1) +0x80| 00 | . | [7]: 0 l 0x88-0x89 (1) +0x80| 00 | . | [8]: 0 l 0x89-0x8a (1) +0x80| 00 | . | [9]: 0 l 0x8a-0x8b (1) +0x80| 00 | . | [10]: 0 l 0x8b-0x8c (1) +0x80| 00 | . | [11]: 0 l 0x8c-0x8d (1) +0x80| 00 | . | [12]: 0 l 0x8d-0x8e (1) +0x80| 00 | . | [13]: 0 l 0x8e-0x8f (1) +0x80| 00| .| [14]: 0 l 0x8f-0x90 (1) +0x90|00 |. | [15]: 0 l 0x90-0x91 (1) + | | | v[0:1]: 0x91-0x92 (1) +0x90| 00 | . | [0]: 0 v 0x91-0x92 (1) | | | [6]{}: marker 0x92-0x9c (10) 0x90| ff | . | prefix: raw bits (valid) 0x92-0x93 (1) 0x90| da | . | code: "sos" (218) (Start of scan) 0x93-0x94 (1)