code wiki / _hdl_build / nx_jpeg_rst_gate.nx
nx_jpeg_rst_gate.nx source
↩ module page · 191 lines · 9594 B
1// nx_jpeg_rst_gate.nx -- gate for JPEG restart-marker (DRI/RSTn) support, BOTH sides: jw_write_jpeg_ri
2// EMITS restart intervals and the baseline decoder CONSUMES them (nx_jpeg_decode -> walk_mcus_ri ->
3// _decoder_consume_rst). A synthetic round-trip alone cannot catch a shared wrong assumption (an encoder
4// and a decoder that BOTH forgot the DC-predictor reset still round-trip clean), so T7 decodes a REAL
5// third-party-encoded restart-marker JPEG (knowledge/photoreal_refs/lidia/lidia_nature_02.jpg, ~500 RSTn,
6// previously DECODE_FAIL rc=102 -- debt 1090) as the independent witness. T6 is the bite tooth: a
7// corrupted marker must FAIL the decode while the clean stream passes. Inherits nx_gate_verdict.
8// license_tier: ORIGINAL expect_exit: 0
9import "nx_syscalls.nx"
10import "nx_gate_verdict.nx"
11import "nx_h264_bitwriter.nx"
12import "nx_dct8.nx"
13import "nx_quant_table.nx"
14import "nx_zigzag.nx"
15import "nx_jpeg_huff_enc.nx"
16import "nx_jpeg_block_enc.nx"
17import "nx_jpeg_write.nx"
18import "nx_jpeg_ascii.nx"
19
20func rj_abs(v: i64) -> i64 { if v<0 { return 0-v } return v }
21func rj_u16(b: *u8, o: i64) -> i64 { return ((b[o] as i64)<<8) | (b[o+1] as i64) }
22
23func main() -> i64 {
24 let ctr: *i64 = gv_ctr()
25 gv_head("nx_jpeg_rst_gate -- DRI/RSTn restart intervals: emit + decode + real-web witness" as *u8)
26 let W: i64=64; let H: i64=16; let npx: i64=W*H
27
28 // DC ramp across MCUs so the predictor reset MATTERS: a decoder that skips the
29 // reset shifts every post-restart block's DC and T5's fidelity bound catches it.
30 let img: *i64=sys_mmap(npx*8) as *i64
31 var y: i64=0
32 while y<H { var x: i64=0; while x<W { var v: i64=x*3+y*4; if v>255 { v=255 } img[y*W+x]=v; x=x+1 } y=y+1 }
33
34 let dcB: *i64=sys_mmap(20*8) as *i64; let dcV: *i64=sys_mmap(20*8) as *i64
35 let acB: *i64=sys_mmap(20*8) as *i64; let acV: *i64=sys_mmap(200*8) as *i64
36 let ndc: i64=jhe_dc_bits(dcB); jhe_dc_val(dcV); let nac: i64=jhe_ac_bits(acB); jhe_ac_val(acV)
37 let dcCO: *i64=sys_mmap(256*8) as *i64; let dcSI: *i64=sys_mmap(256*8) as *i64
38 let acCO: *i64=sys_mmap(256*8) as *i64; let acSI: *i64=sys_mmap(256*8) as *i64
39 jhe_gen(dcB, dcV, ndc, dcCO, dcSI); jhe_gen(acB, acV, nac, acCO, acSI)
40 let qt: *i64=sys_mmap(64*8) as *i64; nx_qt_luma(qt, 50)
41 let to_zz: *i64=sys_mmap(64*8) as *i64; let from_zz: *i64=sys_mmap(64*8) as *i64; nx_zigzag_init(to_zz, from_zz)
42 let DM: *i64=sys_mmap(64*8) as *i64; nx_dct8_init(DM)
43 let scratch: *i64=sys_mmap(64*8) as *i64; let ti: *i64=sys_mmap(8*8) as *i64; let to: *i64=sys_mmap(8*8) as *i64
44
45 let out_p: *u8=sys_mmap(npx*4 + 8192)
46 let out_0: *u8=sys_mmap(npx*4 + 8192)
47 let out_r: *u8=sys_mmap(npx*4 + 8192)
48 let jlen_p: i64=jw_write_jpeg(out_p, W, H, qt, dcB, dcV, acB, acV, dcCO, dcSI, acCO, acSI, to_zz, from_zz, DM, scratch, ti, to, img)
49 let jlen_0: i64=jw_write_jpeg_ri(out_0, W, H, qt, dcB, dcV, acB, acV, dcCO, dcSI, acCO, acSI, to_zz, from_zz, DM, scratch, ti, to, img, 0)
50 let jlen_r: i64=jw_write_jpeg_ri(out_r, W, H, qt, dcB, dcV, acB, acV, dcCO, dcSI, acCO, acSI, to_zz, from_zz, DM, scratch, ti, to, img, 2)
51
52 // T1 ri=0 output is byte-identical to the proven jw_write_jpeg (zero-drift proof).
53 var t1: i64=0
54 if jlen_0==jlen_p { var same: i64=1; var ii: i64=0; while ii<jlen_p { if out_0[ii]!=out_p[ii] { same=0; ii=jlen_p } else { ii=ii+1 } } t1=same }
55 gv_check("T1 jw_write_jpeg_ri(ri=0) byte-identical to jw_write_jpeg" as *u8, t1, ctr)
56
57 // T2 the RST file carries a DRI segment with interval 2, before SOS.
58 var have_dri: i64=0; var dri_val: i64=0-1
59 var off: i64=2; var walking: i64=1
60 while walking==1 {
61 if off+4 > jlen_r { walking=0 } else {
62 if out_r[off]!=(0xFF as u8) { walking=0 } else {
63 let m: i64=out_r[off+1] as i64
64 if m==0xDA { walking=0 } else {
65 let seglen: i64=rj_u16(out_r, off+2)
66 if m==0xDD { have_dri=1; dri_val=rj_u16(out_r, off+4) }
67 off=off+2+seglen
68 }
69 }
70 }
71 }
72 var t2: i64=0; if have_dri==1 { if dri_val==2 { t2=1 } }
73 gv_check("T2 DRI segment present, interval=2" as *u8, t2, ctr)
74
75 // T3 exactly (16 MCUs / ri 2) - 1 = 7 restart markers, indices cycling D0..D6.
76 // Safe whole-file scan: stuffed data FF is always followed by 0x00, and no header
77 // in this fixture contains a literal FF payload byte, so FF D0..D7 IS a marker.
78 var nrst: i64=0; var seq_ok: i64=1; var expect: i64=0
79 var si: i64=2
80 while si+1 < jlen_r {
81 if out_r[si]==(0xFF as u8) {
82 let mm: i64=out_r[si+1] as i64
83 if mm>=0xD0 { if mm<=0xD7 {
84 if mm-0xD0 != expect { seq_ok=0 }
85 expect=expect+1; if expect==8 { expect=0 }
86 nrst=nrst+1
87 si=si+1
88 } }
89 }
90 si=si+1
91 }
92 gv_puts(" [rst-markers found=" as *u8); gv_num(nrst); gv_puts("]\n" as *u8)
93 var t3: i64=0; if nrst==7 { if seq_ok==1 { t3=1 } }
94 gv_check("T3 seven RSTn markers, indices cycle D0..D6" as *u8, t3, ctr)
95
96 // T4 the fixed decoder decodes the RST stream, correct dimensions.
97 let d1p: *i64=sys_mmap(8) as *i64; let d1w: *i64=sys_mmap(8) as *i64
98 let d1h: *i64=sys_mmap(8) as *i64; let d1s: *i64=sys_mmap(8) as *i64
99 let dl1: i64=nx_jpeg_decode_luma(out_r, jlen_r, d1p, d1w, d1h, d1s)
100 var t4: i64=0; if dl1==NX_JPEG_ASCII_OK { if d1w[0]==W { if d1h[0]==H { t4=1 } } }
101 gv_check("T4 decoder consumes RST stream, dims 64x16" as *u8, t4, ctr)
102
103 // T5 fidelity: RST decode matches the source within JPEG tolerance AND is
104 // pixel-identical to the no-RST decode (same coefficients, different framing).
105 var t5: i64=0
106 if t4==1 {
107 let d2p: *i64=sys_mmap(8) as *i64; let d2w: *i64=sys_mmap(8) as *i64
108 let d2h: *i64=sys_mmap(8) as *i64; let d2s: *i64=sys_mmap(8) as *i64
109 let dl2: i64=nx_jpeg_decode_luma(out_p, jlen_p, d2p, d2w, d2h, d2s)
110 if dl2==NX_JPEG_ASCII_OK {
111 let pr: *u8=d1p[0] as *u8; let sr: i64=d1s[0]
112 let pp: *u8=d2p[0] as *u8; let sp: i64=d2s[0]
113 var maxe: i64=0; var ident: i64=1
114 var yy: i64=0
115 while yy<H {
116 var xx: i64=0
117 while xx<W {
118 let av: i64=pr[yy*sr+xx] as i64
119 let bv: i64=pp[yy*sp+xx] as i64
120 if av!=bv { ident=0 }
121 let ev: i64=rj_abs(av-img[yy*W+xx])
122 if ev>maxe { maxe=ev }
123 xx=xx+1
124 }
125 yy=yy+1
126 }
127 gv_puts(" [rst-vs-source maxErr=" as *u8); gv_num(maxe)
128 gv_puts(" rst-vs-plain identical=" as *u8); gv_num(ident); gv_puts("]\n" as *u8)
129 if maxe<=40 { if ident==1 { t5=1 } }
130 }
131 }
132 gv_check("T5 fidelity: maxErr<=40 vs source, identical to no-RST decode" as *u8, t5, ctr)
133
134 // T6 BITE: corrupt the first restart marker -> decode must FAIL (fires on bad),
135 // while the clean RST stream decodes (silent on good).
136 let out_c: *u8=sys_mmap(npx*4 + 8192)
137 var ci: i64=0; while ci<jlen_r { out_c[ci]=out_r[ci]; ci=ci+1 }
138 var fpos: i64=0-1
139 var fi: i64=2
140 while fi+1 < jlen_r {
141 if fpos<0 { if out_c[fi]==(0xFF as u8) { if out_c[fi+1]==(0xD0 as u8) { fpos=fi } } }
142 fi=fi+1
143 }
144 var bite_bad: i64=0
145 if fpos>=0 {
146 out_c[fpos+1]=0xC3 as u8
147 let d3p: *i64=sys_mmap(8) as *i64; let d3w: *i64=sys_mmap(8) as *i64
148 let d3h: *i64=sys_mmap(8) as *i64; let d3s: *i64=sys_mmap(8) as *i64
149 let dl3: i64=nx_jpeg_decode_luma(out_c, jlen_r, d3p, d3w, d3h, d3s)
150 if dl3!=NX_JPEG_ASCII_OK { bite_bad=1 }
151 }
152 var bite_good: i64=0
153 if dl1!=NX_JPEG_ASCII_OK { bite_good=1 }
154 gv_bite("T6 corrupted-RST-marker refusal" as *u8, bite_bad, bite_good, ctr)
155
156 // T7 INDEPENDENT WITNESS: a real web JPEG with restart markers from a real
157 // third-party encoder, previously DECODE_FAIL rc=102. Decodes + has structure.
158 var t7: i64=0
159 var wit_w: i64=0; var wit_h: i64=0; var wit_spread: i64=0; var wit_rc: i64=0-1
160 let wbox: *i64=sys_mmap(16) as *i64
161 let wraw: *u8=sys_read_file("knowledge/photoreal_refs/lidia/lidia_nature_02.jpg" as *u8, wbox)
162 if wraw!=(0 as *u8) {
163 let d4p: *i64=sys_mmap(8) as *i64; let d4w: *i64=sys_mmap(8) as *i64
164 let d4h: *i64=sys_mmap(8) as *i64; let d4s: *i64=sys_mmap(8) as *i64
165 wit_rc=nx_jpeg_decode_luma(wraw, wbox[0], d4p, d4w, d4h, d4s)
166 if wit_rc==NX_JPEG_ASCII_OK {
167 wit_w=d4w[0]; wit_h=d4h[0]
168 let wpl: *u8=d4p[0] as *u8; let wst: i64=d4s[0]
169 var wmin: i64=255; var wmax: i64=0
170 var wi: i64=0
171 while wi < wit_w*wit_h {
172 let wy: i64=wi / wit_w
173 let wx: i64=wi % wit_w
174 let pv: i64=wpl[wy*wst+wx] as i64
175 if pv<wmin { wmin=pv }
176 if pv>wmax { wmax=pv }
177 wi=wi+97
178 }
179 wit_spread=wmax-wmin
180 if wit_w>0 { if wit_h>0 { if wit_spread>20 { t7=1 } } }
181 }
182 }
183 gv_puts(" [witness rc=" as *u8); gv_num(wit_rc)
184 gv_puts(" w=" as *u8); gv_num(wit_w); gv_puts(" h=" as *u8); gv_num(wit_h)
185 gv_puts(" spread=" as *u8); gv_num(wit_spread); gv_puts("]\n" as *u8)
186 gv_check("T7 real third-party RST JPEG decodes (debt-1090 witness)" as *u8, t7, ctr)
187
188 let rc: i64 = gv_verdict("JPEG-RST-GATE" as *u8, ctr, "restart intervals emit+decode, independent witness" as *u8)
189 sys_exit(rc)
190 return rc
191}