code wiki / _hdl_build / nx_jpeg_block_enc_gate.nx
nx_jpeg_block_enc_gate.nx source
↩ module page · 132 lines · 7964 B
1// nx_jpeg_block_enc_gate.nx -- SOVEREIGN gate for J2 (JPEG baseline block entropy coder). Proves the
2// FULL per-block JPEG chain end-to-end with no python / no 3rd party: pixels -> level-shift -> 2D DCT-II
3// (nx_dct8) -> quantize (nx_quant_table Annex-K luma @ quality 50) -> zigzag (nx_zigzag) -> DC-diff +
4// AC-RLE Huffman (nx_jpeg_block_enc/J1) -> [decode] -> dequant -> IDCT -> reconstruct.
5// T1 the quantized coeffs round-trip bit-exact through the entropy coder
6// T2 reconstruction is faithful (measured error)
7// T3 the block compresses below raw 64 bytes
8// T4 DC differential works across TWO chained blocks
9// T5 a flat block reconstructs near-exact
10// T6 liar-kill: a corrupted stream diverges
11// GREEN iff 6/6. knowledge/status/jpeg_block_enc_gate.log. license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_gate_emit_lib.nx"
14import "nx_h264_bitwriter.nx"
15import "nx_dct8.nx"
16import "nx_quant_table.nx"
17import "nx_zigzag.nx"
18import "nx_jpeg_huff_enc.nx"
19import "nx_jpeg_block_enc.nx"
20
21func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
22func g_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
23func g_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
24func iabs(v: i64) -> i64 { if v<0 { return 0-v } return v }
25func qrnd(v: i64, q: i64) -> i64 { if v>=0 { return (v + q/2)/q } return 0 - (((0-v) + q/2)/q) }
26func eq64(a: *i64, b: *i64) -> i64 { var i: i64=0; while i<64 { if a[i]!=b[i] { return 0 } i=i+1 } return 1 }
27
28func forward_block(block: *i64, DM: *i64, scratch: *i64, ti: *i64, to: *i64, qt: *i64, to_zz: *i64, zz: *i64) -> i64 {
29 let sh: *i64=sys_mmap(64*8) as *i64
30 var i: i64=0; while i<64 { sh[i]=block[i]-128; i=i+1 }
31 let co: *i64=sys_mmap(64*8) as *i64
32 nx_dct8_forward_2d(DM, sh, co, scratch, ti, to)
33 let q: *i64=sys_mmap(64*8) as *i64
34 i=0; while i<64 { q[i]=qrnd(co[i], qt[i]); i=i+1 }
35 nx_zigzag_scan(q, to_zz, zz)
36 return 0
37}
38func inverse_block(zz: *i64, DM: *i64, scratch: *i64, ti: *i64, to: *i64, qt: *i64, from_zz: *i64, recon: *i64) -> i64 {
39 let q: *i64=sys_mmap(64*8) as *i64
40 nx_zigzag_unscan(zz, from_zz, q)
41 let co: *i64=sys_mmap(64*8) as *i64
42 var i: i64=0; while i<64 { co[i]=q[i]*qt[i]; i=i+1 }
43 let rsh: *i64=sys_mmap(64*8) as *i64
44 nx_dct8_inverse_2d(DM, co, rsh, scratch, ti, to)
45 i=0; while i<64 { var p: i64=rsh[i]+128; if p<0 { p=0 } if p>255 { p=255 } recon[i]=p; i=i+1 }
46 return 0
47}
48func maxerr(a: *i64, b: *i64) -> i64 { var m: i64=0; var i: i64=0; while i<64 { let e: i64=iabs(a[i]-b[i]); if e>m { m=e } i=i+1 } return m }
49
50func main() -> i64 {
51 g_puts("=== JPEG BLOCK ENC GATE: full per-block JPEG chain, round-trip (sovereign) ===\n" as *u8)
52 // huffman tables
53 let dcB: *i64=sys_mmap(20*8) as *i64; let dcV: *i64=sys_mmap(20*8) as *i64
54 let acB: *i64=sys_mmap(20*8) as *i64; let acV: *i64=sys_mmap(200*8) as *i64
55 let ndc: i64=jhe_dc_bits(dcB); jhe_dc_val(dcV); let nac: i64=jhe_ac_bits(acB); jhe_ac_val(acV)
56 let dcCO: *i64=sys_mmap(256*8) as *i64; let dcSI: *i64=sys_mmap(256*8) as *i64
57 let acCO: *i64=sys_mmap(256*8) as *i64; let acSI: *i64=sys_mmap(256*8) as *i64
58 jhe_gen(dcB, dcV, ndc, dcCO, dcSI); jhe_gen(acB, acV, nac, acCO, acSI)
59 // quant table @ quality 50, zigzag, DCT matrix
60 let qt: *i64=sys_mmap(64*8) as *i64; nx_qt_luma(qt, 50)
61 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)
62 let DM: *i64=sys_mmap(64*8) as *i64; nx_dct8_init(DM)
63 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
64
65 // block A: gradient
66 let A: *i64=sys_mmap(64*8) as *i64
67 var r: i64=0
68 while r<8 { var c: i64=0; while c<8 { A[r*8+c]=(r+c)*16; c=c+1 } r=r+1 }
69 let zzA: *i64=sys_mmap(64*8) as *i64
70 forward_block(A, DM, scratch, ti, to, qt, to_zz, zzA)
71 let buf: *u8=sys_mmap(512)
72 let bw: *BitWriter=sys_mmap(64) as *BitWriter; bw_init(bw, buf, 512)
73 jbe_encode_block(bw, dcCO, dcSI, acCO, acSI, zzA, 0)
74 let encbytes: i64=(bw_total_bits(bw)+7)/8
75 let pos: *i64=sys_mmap(8) as *i64; pos[0]=0
76 let zzA2: *i64=sys_mmap(64*8) as *i64
77 jbe_decode_block(buf, pos, dcCO, dcSI, acCO, acSI, 0, zzA2)
78 var t1: i64=0; if eq64(zzA, zzA2)==1 { t1=1 }
79 let reconA: *i64=sys_mmap(64*8) as *i64
80 inverse_block(zzA2, DM, scratch, ti, to, qt, from_zz, reconA)
81 let meA: i64=maxerr(A, reconA)
82
83 // block B: flat 200
84 let B: *i64=sys_mmap(64*8) as *i64
85 var i: i64=0; while i<64 { B[i]=200; i=i+1 }
86 let zzB: *i64=sys_mmap(64*8) as *i64
87 forward_block(B, DM, scratch, ti, to, qt, to_zz, zzB)
88
89 // T4: two-block chained stream A then B, decode both tracking prevdc
90 let buf2: *u8=sys_mmap(512)
91 let bw2: *BitWriter=sys_mmap(64) as *BitWriter; bw_init(bw2, buf2, 512)
92 let dcA: i64=jbe_encode_block(bw2, dcCO, dcSI, acCO, acSI, zzA, 0)
93 jbe_encode_block(bw2, dcCO, dcSI, acCO, acSI, zzB, dcA)
94 let pos2: *i64=sys_mmap(8) as *i64; pos2[0]=0
95 let zzA3: *i64=sys_mmap(64*8) as *i64; let zzB3: *i64=sys_mmap(64*8) as *i64
96 let dcA3: i64=jbe_decode_block(buf2, pos2, dcCO, dcSI, acCO, acSI, 0, zzA3)
97 jbe_decode_block(buf2, pos2, dcCO, dcSI, acCO, acSI, dcA3, zzB3)
98 var t4: i64=0; if eq64(zzA, zzA3)==1 { if eq64(zzB, zzB3)==1 { t4=1 } }
99 let reconB: *i64=sys_mmap(64*8) as *i64
100 inverse_block(zzB3, DM, scratch, ti, to, qt, from_zz, reconB)
101 let meB: i64=maxerr(B, reconB)
102
103 // T6 liar-kill: corrupt the standalone A stream's bit 0 -> DC must mis-decode
104 let bufc: *u8=sys_mmap(512)
105 i=0; while i<512 { bufc[i]=buf[i]; i=i+1 }
106 let b0: i64=bufc[0] as i64
107 if b0>=128 { bufc[0]=(b0-128) as u8 } else { bufc[0]=(b0+128) as u8 }
108 let posc: *i64=sys_mmap(8) as *i64; posc[0]=0
109 let zzC: *i64=sys_mmap(64*8) as *i64
110 jbe_decode_block(bufc, posc, dcCO, dcSI, acCO, acSI, 0, zzC)
111 var t6: i64=0; if zzC[0]!=zzA[0] { t6=1 }
112
113 g_puts("-- block A grad: enc=" as *u8); g_num(encbytes); g_puts("/64B maxErr=" as *u8); g_num(meA)
114 g_puts(" block B flat: maxErr=" as *u8); g_num(meB); g_puts("\n" as *u8)
115
116 var pass: i64=0; let rows: i64=6
117 pass=pass+g_check(" T1 A: quantized coeffs round-trip bit-exact thru entropy" as *u8, t1)
118 var t2: i64=0; if meA <= 24 { t2=1 }
119 pass=pass+g_check(" T2 A: reconstruction faithful (maxErr<=24)" as *u8, t2)
120 var t3: i64=0; if encbytes < 64 { t3=1 }
121 pass=pass+g_check(" T3 A: compresses below raw 64 bytes" as *u8, t3)
122 pass=pass+g_check(" T4 DC differential across TWO chained blocks" as *u8, t4)
123 var t5: i64=0; if meB <= 4 { t5=1 }
124 pass=pass+g_check(" T5 B: flat block near-exact (maxErr<=4)" as *u8, t5)
125 pass=pass+g_check(" T6 liar-kill: corrupted stream diverges" as *u8, t6)
126
127 g_puts("----\nJBLK rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass); g_puts("\n" as *u8)
128 let lg: i64=sys_openat_append("knowledge/status/jpeg_block_enc_gate.log" as *u8, 0x1a4)
129 if lg>=0 { g_w(lg, "JBLK rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass); g_w(lg, " encA=" as *u8); g_wn(lg, encbytes); g_w(lg, " maxErrA=" as *u8); g_wn(lg, meA); if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) } sys_close(lg) }
130 if pass==rows { g_puts("JBLK GREEN (sovereign JPEG per-block encode chain proven, round-trip)\n" as *u8); sys_exit(0); return 0 }
131 g_puts("JBLK RED\n" as *u8); sys_exit(1); return 1
132}