code wiki / _hdl_build / nx_vcodec_nf_gate.nx
nx_vcodec_nf_gate.nx source
↩ module page · 151 lines · 7337 B
1import "nx_gate_base.nx"
2// nx_vcodec_nf_gate.nx -- ENCODER-SIGNALED IN-LOOP RESTORATION proof (neural rung 2). The blind static
3// display filter measurably failed held-out transfer (v1 -12.6dB gain-ambiguity; v2/v3 still negative
4// under scene shift) -- so the shipped design signals the trained filter per frame ONLY where the encoder
5// MEASURED a strict SSE win against the source (AV1-loop-restoration principle). This gate proves, on the
6// HELD-OUT frames 8..11 (full YUV420, the vv wire path both entropy modes, qp {12,20,32}):
7// (1) nf streams decode BIT-EXACT (in-loop filter symmetric across enc/dec)
8// (2) NEVER-HURT: the nf chain's luma PSNR >= the nf-off chain's - 2 cdB on every config,
9// and mean gain >= 0 overall
10// (3) the feature actually FIRES somewhere (else it is dormant, reported honestly)
11// license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_video_codec_wasm.nx"
14import "nx_vcodec_nf_table.nx"
15import "nx_quality_metric.nx"
16
17const GW_: i64 = 576
18const GH_: i64 = 1024
19const HOLD0: i64 = 8
20const HOLDN: i64 = 4
21
22func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
23" as *u8); return ok }
24func gn(v: i64) -> i64 {
25 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
26 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}
27 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
28func 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 }
29func cpb(d: *u8, s: *u8, n: i64) -> i64 { var i: i64=0; while i<n { d[i]=s[i]; i=i+1 } return 0 }
30
31func seedctx(rctx: *i64, emode: i64, est: *i64, probs: *i64, rcbuf: *u8, t8c: *i64, tbl: *i64, scr: *u8) -> i64 {
32 rctx[0]=emode; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64; rctx[4]=t8c as i64; rctx[5]=0
33 rctx[6]=tbl as i64; rctx[7]=scr as i64; return 0 }
34
35// one held-out chain at (emode, qp) with nf on (tbl/scr nonzero) or off (0,0).
36// out[0]=mean luma PSNR cdb, out[1]=frames bit-exact, out[2]=nf fires (from Y-stream bit)
37func nf_chain(yuv: *u8, emode: i64, qp: i64, tbl: *i64, scr: *u8, bufs: *i64, out: *i64) -> i64 {
38 let N: i64 = GW_ * GH_
39 let C2: i64 = (GW_/2) * (GH_/2)
40 let sz: i64 = N + 2*C2
41 let prevE: *u8 = bufs[0] as *u8
42 let reconE: *u8 = bufs[1] as *u8
43 let prevD: *u8 = bufs[2] as *u8
44 let reconD: *u8 = bufs[3] as *u8
45 let wire: *u8 = bufs[4] as *u8
46 let blk: *i64 = bufs[5] as *i64
47 let mv: *i64 = bufs[6] as *i64
48 let est: *i64 = bufs[7] as *i64
49 let probs: *i64 = bufs[8] as *i64
50 let rcbuf: *u8 = bufs[9] as *u8
51 let t8c: *i64 = bufs[10] as *i64
52 let rctx: *i64 = bufs[11] as *i64
53 var z: i64 = 0
54 while z < sz { prevE[z] = 0 as u8; prevD[z] = 0 as u8; z = z + 1 }
55 var cdb: i64 = 0
56 var exact: i64 = 0
57 var fires: i64 = 0
58 var f: i64 = 0
59 while f < HOLDN {
60 let cur: *u8 = ((yuv as i64) + (HOLD0 + f) * (N + N/2)) as *u8
61 var key: i64 = 0
62 if f == 0 { key = 1 }
63 seedctx(rctx, emode, est, probs, rcbuf, t8c, tbl, scr)
64 var nb: i64 = 0
65 if emode == 1 { nb = vv_enc_rct8(cur, prevE, reconE, GW_, GH_, qp, key, qp*188, wire, 4194304, blk, mv, rctx) }
66 else { nb = vv_enc_t8(cur, prevE, reconE, GW_, GH_, qp, key, qp*188, wire, 4194304, blk, mv, rctx) }
67 if nb <= 0 { out[0]=0; out[1]=exact; out[2]=fires; return 0 - 1 }
68 var nfb: i64 = 1
69 if emode == 1 { nfb = 17 }
70 fires = fires + nx_br_get(((wire as i64) + 12) as *u8, nfb, 1)
71 seedctx(rctx, emode, est, probs, rcbuf, t8c, tbl, scr)
72 var rc: i64 = 0
73 if emode == 1 { rc = vv_dec_rct8(prevD, reconD, GW_, GH_, qp, wire, nb, blk, mv, rctx) }
74 else { rc = vv_dec_t8(prevD, reconD, GW_, GH_, qp, wire, nb, blk, mv, rctx) }
75 if rc == 0 { if eqb(reconD, reconE, sz) == 1 { exact = exact + 1 } }
76 cdb = cdb + qm_psnr_cdb(reconE, cur, N)
77 cpb(prevE, reconE, sz)
78 cpb(prevD, reconD, sz)
79 f = f + 1
80 }
81 out[0] = cdb / HOLDN
82 out[1] = exact
83 out[2] = fires
84 return 0
85}
86
87func main() -> i64 {
88 gw("=== nx_vcodec_nf_gate v2: ENCODER-SIGNALED in-loop restoration, held-out frames 8..11 ===\n" as *u8)
89 let box: *i64 = sys_mmap(16) as *i64
90 let yuv: *u8 = sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/knowledge/staging/media/bframe_test_decoded.yuv" as *u8, box)
91 if (yuv as i64) == 0 { gw("cannot read yuv -> RED\n" as *u8); return 1 }
92 let N: i64 = GW_ * GH_
93 if box[0] < 12 * (N + N/2) { gw("file too small -> RED\n" as *u8); return 1 }
94 let tbl: *i64 = sys_mmap(VC_NF_TBL * 8) as *i64
95 vc_nf_load(tbl)
96 let scr: *u8 = sys_mmap(N + 64)
97 let sz: i64 = N + 2 * ((GW_/2)*(GH_/2))
98 let bufs: *i64 = sys_mmap(16*8) as *i64
99 bufs[0] = sys_mmap(sz + 64) as i64
100 bufs[1] = sys_mmap(sz + 64) as i64
101 bufs[2] = sys_mmap(sz + 64) as i64
102 bufs[3] = sys_mmap(sz + 64) as i64
103 bufs[4] = sys_mmap(4194304) as i64
104 bufs[5] = sys_mmap(512) as i64
105 bufs[6] = sys_mmap(128) as i64
106 bufs[7] = sys_mmap(64) as i64
107 bufs[8] = sys_mmap(32*8) as i64
108 bufs[9] = sys_mmap(1048576) as i64
109 bufs[10] = sys_mmap(5120) as i64
110 bufs[11] = sys_mmap(64) as i64
111 vc_t8_init(bufs[10] as *i64)
112 let ob: *i64 = sys_mmap(32) as *i64
113 let on: *i64 = sys_mmap(32) as *i64
114 let qs: *i64 = sys_mmap(32) as *i64
115 qs[0] = 12; qs[1] = 20; qs[2] = 32
116 var pass: i64 = 0
117 var total: i64 = 0
118 var gainsum: i64 = 0
119 var firesum: i64 = 0
120 var cfgs: i64 = 0
121 var qi: i64 = 0
122 while qi < 3 {
123 var md: i64 = 0
124 while md < 2 {
125 nf_chain(yuv, md, qs[qi], 0 as *i64, 0 as *u8, bufs, ob) // baseline: nf off
126 nf_chain(yuv, md, qs[qi], tbl, scr, bufs, on) // nf on (encoder-signaled)
127 let gain: i64 = on[0] - ob[0]
128 gainsum = gainsum + gain
129 firesum = firesum + on[2]
130 cfgs = cfgs + 1
131 gw(" emode=" as *u8); gn(md); gw(" qp=" as *u8); gn(qs[qi])
132 gw(" off=" as *u8); gn(ob[0]/100); gw("." as *u8); gn(ob[0]%100)
133 gw("dB nf=" as *u8); gn(on[0]/100); gw("." as *u8); gn(on[0]%100)
134 gw("dB gain=" as *u8); gn(gain); gw("cdB fires=" as *u8); gn(on[2]); gw("/4 exact=" as *u8); gn(on[1]); gw("/4\n" as *u8)
135 total = total + 1
136 if on[1] == HOLDN { pass = pass + 1 } // in-loop symmetry: every nf frame bit-exact
137 total = total + 1
138 if gain >= 0 - 2 { pass = pass + 1 } // never-hurt per config
139 md = md + 1
140 }
141 qi = qi + 1
142 }
143 total = total + 1
144 let meangain: i64 = gainsum / cfgs
145 gw(" MEAN GAIN=" as *u8); gn(meangain); gw("cdB total fires=" as *u8); gn(firesum); gw("\n" as *u8)
146 if meangain >= 0 { pass = pass + 1 }
147 total = total + 1
148 if firesum >= 1 { pass = pass + 1 } else { gw(" (feature DORMANT on held-out -- honest, but nothing to ship)\n" as *u8) }
149 gw("NF2: " as *u8); gn(pass); gw("/" as *u8); gn(total)
150 if pass == total { gw(" GREEN -- encoder-signaled restoration: bit-exact, never hurts, actually fires\n" as *u8); return 0 }
151 gw(" RED\n" as *u8); return 1 }