code wiki / _hdl_build / nx_apng_decode_gate.nx
nx_apng_decode_gate.nx source
↩ module page · 91 lines · 4445 B
1// nx_apng_decode_gate.nx -- prove animated-media INGEST (roadmap R1): encode known frames -> decode -> BIT-EXACT
2// recovery (the encoder/decoder invert), and decode a REAL APNG we shipped (synth_wolfwalk.png) -> right frame
3// count + dims. This is "ingest video/gif/image -> frames", the front door of video->pose->motion. expect_exit:0
4// license_tier: ORIGINAL
5import "nx_syscalls.nx"
6import "nx_apng.nx"
7import "nx_apng_decode.nx"
8
9func hw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func pn(v: i64) -> i64 { let b: *u8=sys_mmap(32) as *u8; var x: i64=v; var ng: i64=0; if x<0{ng=1;x=0-x} var i: i64=31; if x==0{b[i]=48 as u8;i=i-1} while x>0{b[i]=(48+x%10) as u8;x=x/10;i=i-1} if ng==1{b[i]=45 as u8;i=i-1} sys_write(1,(b as i64+i+1) as *u8,31-i); return 0 }
11
12const TW: i64 = 8
13const TH: i64 = 8
14const TN: i64 = 5
15
16func main() -> i64 {
17 hw("=== nx_apng_decode_gate -- ingest animated PNG -> frames (R1) ===\n" as *u8)
18 var fails: i64 = 0
19
20 // T1: encode 5 known solid-color frames -> decode -> bit-exact
21 let fb: *i64 = sys_mmap(TW * TH * 8) as *i64
22 let ap: *u8 = sys_mmap(2 * 1024 * 1024)
23 let seq: *i64 = sys_mmap(8) as *i64; seq[0] = 0
24 var o: i64 = apng_open(ap, TW, TH, TN)
25 var f: i64 = 0
26 while f < TN {
27 let col: i64 = (f * 40) + 80 * 256 + 200 * 65536 // R=f*40 G=80 B=200
28 var q: i64 = 0
29 while q < TW * TH { fb[q] = col; q = q + 1 }
30 var first: i64 = 0; if f == 0 { first = 1 }
31 o = apng_frame(ap, o, seq, fb, TW, TH, 6, first)
32 f = f + 1
33 }
34 o = apng_close(ap, o)
35 hw(" encoded "); pn(TN); hw(" frames -> "); pn(o); hw(" bytes APNG\n" as *u8)
36
37 let frames: *i64 = sys_mmap(TN * TW * TH * 8) as *i64
38 let wh: *i64 = sys_mmap(8 * 8) as *i64
39 let nf: i64 = apng_decode(ap, o, frames, wh, TN)
40 hw(" decoded nframes="); pn(nf); hw(" w="); pn(wh[0]); hw(" h="); pn(wh[1]); hw("\n" as *u8)
41 var exact: i64 = 1
42 if nf != TN { exact = 0 }
43 if wh[0] != TW { exact = 0 }
44 if wh[1] != TH { exact = 0 }
45 if exact == 1 {
46 f = 0
47 while f < TN {
48 let want: i64 = (f * 40) + 80 * 256 + 200 * 65536
49 let base: i64 = (frames as i64) + f * TW * TH * 8
50 var q: i64 = 0
51 while q < TW * TH {
52 let gp: *i64 = (base + q * 8) as *i64
53 if gp[0] != want { exact = 0; q = TW * TH }
54 q = q + 1
55 }
56 f = f + 1
57 }
58 }
59 if exact == 1 { hw("T1 PASS BIT-EXACT round-trip (encode -> decode recovers every pixel of all 5 frames)\n" as *u8) }
60 else { fails = fails + 1; hw("T1 FAIL round-trip not exact\n" as *u8) }
61
62 // T2: decode a REAL shipped APNG -- synth_wolfwalk.png (8 frames, 144x96)
63 let lp: *i64 = sys_mmap(16) as *i64
64 let raw: *u8 = sys_read_file("knowledge/synth_wolfwalk.png" as *u8, lp)
65 if (raw as i64) == 0 { fails = fails + 1; hw("T2 FAIL cannot read synth_wolfwalk.png\n" as *u8) }
66 else {
67 let rframes: *i64 = sys_mmap(8 * 144 * 96 * 8) as *i64
68 let rwh: *i64 = sys_mmap(8 * 8) as *i64
69 let rnf: i64 = apng_decode(raw, lp[0], rframes, rwh, 8)
70 hw(" synth_wolfwalk.png -> nframes="); pn(rnf); hw(" w="); pn(rwh[0]); hw(" h="); pn(rwh[1]); hw("\n" as *u8)
71 // spot-check the decode is non-degenerate: frame 0 and frame 4 differ somewhere (it's a walking wolf)
72 var moved: i64 = 0
73 if rnf >= 8 {
74 let b0: i64 = (rframes as i64)
75 let b4: i64 = (rframes as i64) + 4 * rwh[0] * rwh[1] * 8
76 var q: i64 = 0
77 while q < rwh[0] * rwh[1] { let p0: *i64=(b0+q*8) as *i64; let p4: *i64=(b4+q*8) as *i64; if p0[0]!=p4[0] { moved = moved + 1 } q = q + 1 }
78 }
79 var t2: i64 = 1
80 if rnf != 8 { t2 = 0 }
81 if rwh[0] != 144 { t2 = 0 }
82 if rwh[1] != 96 { t2 = 0 }
83 if moved < 50 { t2 = 0 }
84 if t2 == 1 { hw("T2 PASS real APNG decoded (8 frames 144x96; frame0!=frame4 in "); pn(moved); hw(" px = real motion recovered)\n" as *u8) }
85 else { fails = fails + 1; hw("T2 FAIL real decode (nf="); pn(rnf); hw(" moved="); pn(moved); hw(")\n" as *u8) }
86 }
87
88 if fails == 0 { hw("APNG-DECODE-GATE 2/2 GREEN -- animated PNG INGEST works (bit-exact + real file); R1 front door up\n" as *u8); sys_exit(0); return 0 }
89 hw("APNG-DECODE-GATE RED fails="); pn(fails); hw("\n" as *u8)
90 sys_exit(1); return 1
91}