code wiki / _hdl_build / nx_vcodec_sigwire_gate.nx
nx_vcodec_sigwire_gate.nx source
↩ module page · 96 lines · 5737 B
1import "nx_gate_base.nx"
2// nx_vcodec_sigwire_gate.nx -- proves the SIG-MAP coder WIRED INTO THE FULL CODEC (emode bit5, vcv-6).
3// Encodes a real key+5P GOP through vv_enc_rct8/vv_dec_rct8 twice: baseline (rctx0=1, range run-length) vs
4// sig-map (rctx0=33, bit5). Asserts: (1) sig-map decode is BIT-EXACT (enc recon == dec recon, every frame),
5// (2) sig-map bytes < baseline bytes (the measured win, full-frame this time not just coeff blocks),
6// (3) PSNR identical (sig-map re-codes the SAME coefficients -> same recon). This is the go/no-go for the
7// vcv-6 client wiring + deploy. license_tier: ORIGINAL
8import "nx_syscalls.nx"
9import "nx_video_codec_wasm.nx"
10import "nx_quality_metric.nx"
11
12const NW: i64 = 576
13const NH: i64 = 1024
14
15func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
16" as *u8); return ok }
17func gn(v: i64) -> i64 {
18 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
19 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}
20 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
21func g2(v: i64) -> i64 { gn(v/100); gw("." as *u8); let f: i64=v%100; if f<10{gw("0" as *u8)} gn(f); return 0 }
22func eqb(a: *u8, b: *u8, n: i64) -> i64 { var i: i64=0; while i<n { if (a[i]&0xff)!=(b[i]&0xff) { return 0 } i=i+1 } return 1 }
23func cpb(d: *u8, s: *u8, n: i64) -> i64 { var i: i64=0; while i<n { d[i]=s[i]; i=i+1 } return 0 }
24
25func seedc(rctx: *i64, mode: i64, est: *i64, probs: *i64, rcbuf: *u8, t8c: *i64) -> i64 {
26 rctx[0]=mode; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64; rctx[4]=t8c as i64
27 rctx[5]=0; rctx[6]=0; rctx[7]=0; return 0 }
28
29// key+5P GOP at mode (1=baseline rct8, 33=bit5 sigmap). out[0]=total bytes, out[1]=exact frames, out[2]=mean luma PSNR cdb
30func run_gop(yuv: *u8, qp: i64, mode: i64, bufs: *i64, out: *i64) -> i64 {
31 let N: i64=NW*NH; let C2: i64=(NW/2)*(NH/2); let sz: i64=N+2*C2; let FB: i64=N+N/2
32 let prevE: *u8=bufs[0] as *u8; let reconE: *u8=bufs[1] as *u8
33 let prevD: *u8=bufs[2] as *u8; let reconD: *u8=bufs[3] as *u8
34 let wire: *u8=bufs[4] as *u8; let blk: *i64=bufs[5] as *i64; let mv: *i64=bufs[6] as *i64
35 let est: *i64=bufs[7] as *i64; let probs: *i64=bufs[8] as *i64; let rcbuf: *u8=bufs[9] as *u8
36 let t8c: *i64=bufs[10] as *i64; let rctx: *i64=bufs[11] as *i64
37 var z: i64=0; while z<sz { prevE[z]=0 as u8; prevD[z]=0 as u8; z=z+1 }
38 var bytes: i64=0; var exact: i64=0; var cdb: i64=0
39 var f: i64=0
40 while f < 6 {
41 var si: i64 = 6+f; if si>11 { si=11 }
42 let cur: *u8 = ((yuv as i64) + si*FB) as *u8
43 var key: i64=0; if f==0 { key=1 }
44 seedc(rctx, mode, est, probs, rcbuf, t8c)
45 let nb: i64 = vv_enc_rct8(cur, prevE, reconE, NW, NH, qp, key, qp*188, wire, 4194304, blk, mv, rctx)
46 if nb <= 0 { out[0]=0; out[1]=exact; out[2]=0; return 0-1 }
47 seedc(rctx, mode, est, probs, rcbuf, t8c)
48 vv_dec_rct8(prevD, reconD, NW, NH, qp, wire, nb, blk, mv, rctx)
49 if eqb(reconD, reconE, sz)==1 { exact=exact+1 }
50 bytes=bytes+nb
51 cdb=cdb+qm_psnr_cdb(reconE, cur, N)
52 cpb(prevE, reconE, sz); cpb(prevD, reconD, sz)
53 f=f+1
54 }
55 out[0]=bytes; out[1]=exact; out[2]=cdb/6
56 return 0 }
57
58func main() -> i64 {
59 gw("=== nx_vcodec_sigwire_gate: sig-map coder WIRED (emode bit5, vcv-6) vs baseline rct8, real GOP ===\n" as *u8)
60 let box: *i64 = sys_mmap(16) as *i64
61 let yuv: *u8 = sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/knowledge/staging/media/bframe_test_decoded.yuv" as *u8, box)
62 if (yuv as i64) == 0 { gw("cannot read yuv -> RED\n" as *u8); return 1 }
63 let N: i64=NW*NH; let C2: i64=(NW/2)*(NH/2); let sz: i64=N+2*C2
64 if box[0] < 12*(N+N/2) { gw("file too small -> RED\n" as *u8); return 1 }
65 let bufs: *i64 = sys_mmap(16*8) as *i64
66 bufs[0]=sys_mmap(sz+64) as i64; bufs[1]=sys_mmap(sz+64) as i64
67 bufs[2]=sys_mmap(sz+64) as i64; bufs[3]=sys_mmap(sz+64) as i64
68 bufs[4]=sys_mmap(4194304) as i64; bufs[5]=sys_mmap(512) as i64; bufs[6]=sys_mmap(128) as i64
69 bufs[7]=sys_mmap(64) as i64; bufs[8]=sys_mmap(32*8) as i64; bufs[9]=sys_mmap(2097152) as i64
70 bufs[10]=sys_mmap(5120) as i64; bufs[11]=sys_mmap(64) as i64
71 vc_t8_init(bufs[10] as *i64)
72 let oB: *i64=sys_mmap(64) as *i64; let oS: *i64=sys_mmap(64) as *i64
73 let qs: *i64=sys_mmap(32) as *i64; qs[0]=22; qs[1]=28; qs[2]=34
74 var pass: i64=0; var tot: i64=0
75 var allexact: i64=1; var allsmaller: i64=1; var allpsnr: i64=1
76 var qi: i64=0
77 while qi < 3 {
78 let qp: i64 = qs[qi]
79 run_gop(yuv, qp, 1, bufs, oB) // baseline rct8
80 run_gop(yuv, qp, 33, bufs, oS) // bit5 sig-map
81 let sv: i64 = (oB[0]-oS[0])*1000/oB[0]
82 gw(" qp=" as *u8); gn(qp)
83 gw(" baseline=" as *u8); gn(oB[0]); gw("B sigmap=" as *u8); gn(oS[0])
84 gw("B saved=" as *u8); gn(sv); gw("permille exact=" as *u8); gn(oS[1])
85 gw("/6 PSNR base=" as *u8); g2(oB[2]); gw(" sig=" as *u8); g2(oS[2]); gw("dB\n" as *u8)
86 if oS[1] != 6 { allexact=0 }
87 if oS[0] >= oB[0] { allsmaller=0 }
88 if oS[2] < oB[2]-2 { allpsnr=0 } // PSNR within 0.02 dB (should be identical)
89 qi=qi+1
90 }
91 tot=tot+1; if allexact==1 { pass=pass+1 }
92 tot=tot+1; if allsmaller==1 { pass=pass+1 }
93 tot=tot+1; if allpsnr==1 { pass=pass+1 }
94 gw("SIGWIRE: " as *u8); gn(pass); gw("/" as *u8); gn(tot)
95 if pass==tot { gw(" GREEN -- sig-map coder wired bit-exact, smaller, same quality (vcv-6 ready to ship)\n" as *u8); return 0 }
96 gw(" RED\n" as *u8); return 1 }