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}