code wiki / _hdl_build / nx_vcodec_t8noise_gate.nx
nx_vcodec_t8noise_gate.nx source
↩ module page · 172 lines · 8016 B
1import "nx_gate_base.nx"
2// nx_vcodec_t8noise_gate.nx -- the FIELD-REPRESENTATIVE t8 gate (rounds 1-4 taught that synthetic stripes
3// and clean stills pass while real calls look blocky). Field conditions reproduced: REAL frames (held-out
4// 8..11) + per-frame TEMPORAL CAMERA NOISE (deterministic LCG, +-3, reseeded per frame like a sensor) at
5// the qps the live ladder actually runs (vvQp of the rung table = ~24..33; it NEVER goes below ~22 in
6// normal operation). Measures, t8 stream vs legacy stream, over a key+5P chain:
7// (1) 8-px-grid blockiness ratio per plane on the LAST recon (the structure the eye reported)
8// (2) luma PSNR vs the noisy source
9// (3) bit-exact decode
10// GREEN iff every frame decodes bit-exact AND t8 blockiness <= legacy*110% on BOTH planes at every qp AND
11// t8 PSNR >= legacy - 50 cdb. This is the bar t8 must clear BEFORE another field test. license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_video_codec_wasm.nx"
14import "nx_quality_metric.nx"
15import "nx_gate_verdict.nx"
16
17const NW: i64 = 576
18const NH: i64 = 1024
19
20func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
21" as *u8); return ok }
22func gn(v: i64) -> i64 {
23 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
24 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}
25 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
26func 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 }
27func cpb(d: *u8, s: *u8, n: i64) -> i64 { var i: i64=0; while i<n { d[i]=s[i]; i=i+1 } return 0 }
28func absi(x: i64) -> i64 { if x<0 { return 0-x } return x }
29
30func blki(p: *u8, W: i64, H: i64, g: i64) -> i64 {
31 var bs: i64=0; var bn: i64=0; var isum: i64=0; var iN: i64=0
32 var y: i64=0
33 while y<H { var x: i64=1
34 while x<W { let d: i64=absi((p[y*W+x]&0xff)-(p[y*W+x-1]&0xff))
35 if (x % g)==0 { bs=bs+d; bn=bn+1 } else { isum=isum+d; iN=iN+1 } x=x+1 } y=y+1 }
36 var y2: i64=1
37 while y2<H { var x2: i64=0
38 while x2<W { let d2: i64=absi((p[y2*W+x2]&0xff)-(p[(y2-1)*W+x2]&0xff))
39 if (y2 % g)==0 { bs=bs+d2; bn=bn+1 } else { isum=isum+d2; iN=iN+1 } x2=x2+1 } y2=y2+1 }
40 if iN==0 { return 0 }
41 if isum==0 { return 999 }
42 return (bs*iN*100)/(isum*bn) }
43
44// add deterministic temporal sensor noise (+-3) to a full YUV frame; LCG reseeded per frame index
45func addnoise(dst: *u8, src: *u8, sz: i64, fseed: i64) -> i64 {
46 var s: i64 = fseed*2654435761 + 12345
47 var i: i64 = 0
48 while i < sz {
49 s = (s * 1103515245 + 12345) & 0x7fffffff
50 var v: i64 = (dst as i64) * 0 // keep shape simple
51 v = (src[i] & 0xff) + ((s >> 16) % 7) - 3
52 if v < 0 { v = 0 }
53 if v > 255 { v = 255 }
54 dst[i] = v as u8
55 i = i + 1
56 }
57 return 0 }
58
59func seedctx(rctx: *i64, est: *i64, probs: *i64, rcbuf: *u8, t8c: *i64) -> i64 {
60 rctx[0]=0; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64; rctx[4]=t8c as i64
61 rctx[5]=0; rctx[6]=0; rctx[7]=0; return 0 }
62
63// key+5P chain on noisy real frames; kind 0=legacy 1=t8.
64// out[0]=luma blk8, out[1]=chroma blk8 (max of U/V), out[2]=exact frames, out[3]=mean luma PSNR cdb
65func run_noise(yuv: *u8, qp: i64, kind: i64, bufs: *i64, out: *i64) -> i64 {
66 let N: i64=NW*NH; let C2: i64=(NW/2)*(NH/2); let sz: i64=N+2*C2
67 let FB: i64 = N + N/2
68 let cur: *u8 = bufs[12] as *u8
69 let prevE: *u8 = bufs[0] as *u8
70 let reconE: *u8 = bufs[1] as *u8
71 let prevD: *u8 = bufs[2] as *u8
72 let reconD: *u8 = bufs[3] as *u8
73 let wire: *u8 = bufs[4] as *u8
74 let blk: *i64 = bufs[5] as *i64
75 let mv: *i64 = bufs[6] as *i64
76 let est: *i64 = bufs[7] as *i64
77 let probs: *i64 = bufs[8] as *i64
78 let rcbuf: *u8 = bufs[9] as *u8
79 let t8c: *i64 = bufs[10] as *i64
80 let rctx: *i64 = bufs[11] as *i64
81 var z: i64=0
82 while z<sz { prevE[z]=0 as u8; prevD[z]=0 as u8; z=z+1 }
83 var exact: i64=0
84 var cdb: i64=0
85 var f: i64=0
86 while f<6 {
87 var si: i64 = 8 + f
88 if si > 11 { si = 11 } // hold on the last real frame (noise still moves)
89 let srcf: *u8 = ((yuv as i64) + si*FB) as *u8
90 addnoise(cur, srcf, sz, f)
91 var key: i64=0
92 if f==0 { key=1 }
93 var nb: i64=0
94 if kind==1 { seedctx(rctx, est, probs, rcbuf, t8c)
95 nb = vv_enc_t8(cur, prevE, reconE, NW, NH, qp, key, qp*188, wire, 4194304, blk, mv, rctx) }
96 else { nb = vv_enc(cur, prevE, reconE, NW, NH, qp, key, qp*188, wire, 4194304, blk, mv) }
97 if nb <= 0 { out[0]=0; out[1]=0; out[2]=exact; out[3]=0; return 0-1 }
98 if kind==1 { seedctx(rctx, est, probs, rcbuf, t8c)
99 vv_dec_t8(prevD, reconD, NW, NH, qp, wire, nb, blk, mv, rctx) }
100 else { vv_dec(prevD, reconD, NW, NH, qp, wire, nb, blk, mv) }
101 if eqb(reconD, reconE, sz)==1 { exact=exact+1 }
102 cdb = cdb + qm_psnr_cdb(reconD, cur, N)
103 cpb(prevE, reconE, sz)
104 cpb(prevD, reconD, sz)
105 f=f+1
106 }
107 out[0] = blki(reconD, NW, NH, 8)
108 let up: *u8 = ((reconD as i64) + N) as *u8
109 let vp: *u8 = ((reconD as i64) + N + C2) as *u8
110 let bu: i64 = blki(up, NW/2, NH/2, 8)
111 let bv: i64 = blki(vp, NW/2, NH/2, 8)
112 var bc: i64 = bu
113 if bv > bc { bc = bv }
114 out[1] = bc
115 out[2] = exact
116 out[3] = cdb / 6
117 return 0 }
118
119func main() -> i64 {
120 gw("=== nx_vcodec_t8noise_gate: REAL frames + temporal camera noise at LADDER qp, t8 vs legacy ===\n" as *u8)
121 let box: *i64 = sys_mmap(16) as *i64
122 let yuv: *u8 = sys_read_file("knowledge/staging/media/bframe_test_decoded.yuv" as *u8, box)
123 if (yuv as i64) == 0 { gw("cannot read yuv -> RED\n" as *u8); return 1 }
124 let N: i64=NW*NH; let C2: i64=(NW/2)*(NH/2); let sz: i64=N+2*C2
125 if box[0] < 12 * (N + N/2) { gw("file too small -> RED\n" as *u8); return 1 }
126 let bufs: *i64 = sys_mmap(16*8) as *i64
127 bufs[0]=sys_mmap(sz+64) as i64
128 bufs[1]=sys_mmap(sz+64) as i64
129 bufs[2]=sys_mmap(sz+64) as i64
130 bufs[3]=sys_mmap(sz+64) as i64
131 bufs[4]=sys_mmap(4194304) as i64
132 bufs[5]=sys_mmap(512) as i64
133 bufs[6]=sys_mmap(128) as i64
134 bufs[7]=sys_mmap(64) as i64
135 bufs[8]=sys_mmap(32*8) as i64
136 bufs[9]=sys_mmap(2097152) as i64
137 bufs[10]=sys_mmap(5120) as i64
138 bufs[11]=sys_mmap(64) as i64
139 bufs[12]=sys_mmap(sz+64) as i64
140 vc_t8_init(bufs[10] as *i64)
141 let oL: *i64=sys_mmap(64) as *i64
142 let oT: *i64=sys_mmap(64) as *i64
143 let qs: *i64=sys_mmap(32) as *i64
144 qs[0]=24; qs[1]=28; qs[2]=33
145 var pass: i64=0
146 var total: i64=0
147 var qi: i64=0
148 while qi<3 {
149 run_noise(yuv, qs[qi], 0, bufs, oL)
150 run_noise(yuv, qs[qi], 1, bufs, oT)
151 gw(" qp=" as *u8); gn(qs[qi])
152 gw(" LUMA blk8 legacy=" as *u8); gn(oL[0]); gw(" t8=" as *u8); gn(oT[0])
153 gw(" CHROMA legacy=" as *u8); gn(oL[1]); gw(" t8=" as *u8); gn(oT[1])
154 gw(" PSNR legacy=" as *u8); gn(oL[3]/100); gw("." as *u8); gn(oL[3]%100)
155 gw(" t8=" as *u8); gn(oT[3]/100); gw("." as *u8); gn(oT[3]%100)
156 gw("dB exact=" as *u8); gn(oT[2]); gw("/6\n" as *u8)
157 total=total+1
158 if oT[2]==6 { pass=pass+1 }
159 total=total+1
160 if oT[0] <= (oL[0]*110)/100 { pass=pass+1 }
161 total=total+1
162 if oT[1] <= (oL[1]*110)/100 { pass=pass+1 }
163 total=total+1
164 if oT[3] >= oL[3] - 50 { pass=pass+1 }
165 qi=qi+1
166 }
167 gw("T8NOISE: " as *u8); gn(pass); gw("/" as *u8); gn(total)
168 if pass==total { gw(" GREEN -- t8 holds legacy structure + quality under FIELD conditions\n" as *u8) } else { gw(" RED -- t8 must clear this before the next field test\n" as *u8) }
169 let ctr: *i64 = gv_ctr()
170 ctr[0] = pass
171 ctr[1] = total
172 return gv_verdict("T8NOISE-GATE" as *u8, ctr, "t8 holds legacy structure + quality under field noise at ladder qp" as *u8) }