code wiki / _hdl_build / nx_vcodec_t8blk_gate.nx
nx_vcodec_t8blk_gate.nx source
↩ module page · 192 lines · 8760 B
1import "nx_gate_base.nx"
2// nx_vcodec_t8blk_gate.nx -- REPRODUCE + LOCALIZE the field report "?t8=1 still blocky" (operator,
3// build 786 field test). PSNR-parity gates passed, so the artifact is PERCEPTUAL structure: measure the
4// 8-px-grid BLOCKINESS RATIO (boundary gradient energy / interior gradient energy x100, the deblock
5// gate's metric at the 8 grid) SEPARATELY on the LUMA and CHROMA planes of decoded frames, legacy stream
6// vs t8 stream, at call-ladder qps on (a) flat-gradient synthetic (banding-prone) and (b) the REAL held-out
7// frames. A t8 ratio well above legacy on some plane = the measured culprit. REPORT-ONLY diagnostics plus
8// hard checks that the tool works (decodes bit-exact). license_tier: ORIGINAL
9import "nx_syscalls.nx"
10import "nx_video_codec_wasm.nx"
11
12func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
13" as *u8); return ok }
14func gn(v: i64) -> i64 {
15 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
16 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}
17 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
18func 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 }
19func cpb(d: *u8, s: *u8, n: i64) -> i64 { var i: i64=0; while i<n { d[i]=s[i]; i=i+1 } return 0 }
20func absi(x: i64) -> i64 { if x<0 { return 0-x } return x }
21
22// blockiness at the g-px grid: (mean |step| across grid columns+rows) *100 / (mean |step| elsewhere)
23func blki(p: *u8, W: i64, H: i64, g: i64) -> i64 {
24 var bs: i64=0; var bn: i64=0; var isum: i64=0; var iN: i64=0
25 var y: i64=0
26 while y<H { var x: i64=1
27 while x<W { let d: i64=absi((p[y*W+x]&0xff)-(p[y*W+x-1]&0xff))
28 if (x % g)==0 { bs=bs+d; bn=bn+1 } else { isum=isum+d; iN=iN+1 } x=x+1 } y=y+1 }
29 var y2: i64=1
30 while y2<H { var x2: i64=0
31 while x2<W { let d2: i64=absi((p[y2*W+x2]&0xff)-(p[(y2-1)*W+x2]&0xff))
32 if (y2 % g)==0 { bs=bs+d2; bn=bn+1 } else { isum=isum+d2; iN=iN+1 } x2=x2+1 } y2=y2+1 }
33 if iN==0 { return 0 }
34 if isum==0 { return 999 }
35 return (bs*iN*100)/(isum*bn) }
36
37// smooth skin-like content: broad gradients + a soft blob; chroma gently varying (banding-prone everywhere)
38func fill_smooth(yuv: *u8, W: i64, H: i64, sh: i64) -> i64 {
39 let N: i64=W*H; let C2: i64=(W/2)*(H/2)
40 var r: i64=0
41 while r<H { var c: i64=0
42 while c<W {
43 var v: i64 = 70 + (c + sh)/6 + r/8
44 let dx: i64 = c - W/2
45 let dy: i64 = r - H/2
46 let d2: i64 = (dx*dx + dy*dy) / 900
47 if d2 < 40 { v = v + 40 - d2 }
48 if v<0{v=0} if v>255{v=255}
49 yuv[r*W+c]=v as u8; c=c+1 } r=r+1 }
50 var i: i64=0
51 while i<C2 { let cr: i64=i/(W/2); let cc: i64=i%(W/2)
52 yuv[N+i]=(110 + (cc+sh)/10 + cr/16) as u8
53 yuv[N+C2+i]=(140 - cc/12 - cr/20) as u8
54 i=i+1 }
55 return 0 }
56
57func seedctx(rctx: *i64, emode: i64, est: *i64, probs: *i64, rcbuf: *u8, t8c: *i64) -> i64 {
58 rctx[0]=emode; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64; rctx[4]=t8c as i64
59 rctx[5]=0; rctx[6]=0; rctx[7]=0; return 0 }
60
61// encode+decode a 4-frame chain (key+3P); measure plane blockiness on the LAST decoded frame.
62// kind 0 = legacy vv_enc, 1 = vv_enc_t8. out[0]=luma blk8, out[1]=chroma blk8, out[2]=exact frames.
63func run_blk(src: *u8, W: i64, H: i64, srcstride: i64, nsrc: i64, qp: i64, kind: i64, bufs: *i64, out: *i64) -> i64 {
64 let N: i64=W*H; let C2: i64=(W/2)*(H/2); let sz: i64=N+2*C2
65 let prevE: *u8 = bufs[0] as *u8
66 let reconE: *u8 = bufs[1] as *u8
67 let prevD: *u8 = bufs[2] as *u8
68 let reconD: *u8 = bufs[3] as *u8
69 let wire: *u8 = bufs[4] as *u8
70 let blk: *i64 = bufs[5] as *i64
71 let mv: *i64 = bufs[6] as *i64
72 let est: *i64 = bufs[7] as *i64
73 let probs: *i64 = bufs[8] as *i64
74 let rcbuf: *u8 = bufs[9] as *u8
75 let t8c: *i64 = bufs[10] as *i64
76 let rctx: *i64 = bufs[11] as *i64
77 var z: i64=0
78 while z<sz { prevE[z]=0 as u8; prevD[z]=0 as u8; z=z+1 }
79 var exact: i64=0
80 var f: i64=0
81 while f<4 {
82 var si: i64 = f
83 if si >= nsrc { si = nsrc - 1 }
84 let cur: *u8 = ((src as i64) + si*srcstride) as *u8
85 var key: i64=0
86 if f==0 { key=1 }
87 var nb: i64=0
88 if kind==1 { seedctx(rctx, 0, est, probs, rcbuf, t8c)
89 nb = vv_enc_t8(cur, prevE, reconE, W, H, qp, key, qp*188, wire, 4194304, blk, mv, rctx) }
90 else { nb = vv_enc(cur, prevE, reconE, W, H, qp, key, qp*188, wire, 4194304, blk, mv) }
91 if nb <= 0 { out[0]=0; out[1]=0; out[2]=exact; return 0-1 }
92 if kind==1 { seedctx(rctx, 0, est, probs, rcbuf, t8c)
93 vv_dec_t8(prevD, reconD, W, H, qp, wire, nb, blk, mv, rctx) }
94 else { vv_dec(prevD, reconD, W, H, qp, wire, nb, blk, mv) }
95 if eqb(reconD, reconE, sz)==1 { exact=exact+1 }
96 cpb(prevE, reconE, sz)
97 cpb(prevD, reconD, sz)
98 f=f+1
99 }
100 out[0] = blki(reconD, W, H, 8)
101 let cw: i64 = W/2
102 let ch: i64 = H/2
103 let up: *u8 = ((reconD as i64) + N) as *u8
104 let vp: *u8 = ((reconD as i64) + N + C2) as *u8
105 let bu: i64 = blki(up, cw, ch, 8)
106 let bv: i64 = blki(vp, cw, ch, 8)
107 var bc: i64 = bu
108 if bv > bc { bc = bv }
109 out[1] = bc
110 out[2] = exact
111 return 0 }
112
113func main() -> i64 {
114 gw("=== nx_vcodec_t8blk_gate: WHERE is the field blockiness? 8-grid ratio, legacy vs t8, per plane ===\n" as *u8)
115 let W: i64=256; let H: i64=192
116 let N: i64=W*H; let C2: i64=(W/2)*(H/2); let sz: i64=N+2*C2
117 let syn: *u8 = sys_mmap(4*sz + 64)
118 var f: i64=0
119 while f<4 { fill_smooth(((syn as i64)+f*sz) as *u8, W, H, f*3); f=f+1 }
120 let bufs: *i64 = sys_mmap(16*8) as *i64
121 bufs[0]=sys_mmap(sz+64) as i64
122 bufs[1]=sys_mmap(sz+64) as i64
123 bufs[2]=sys_mmap(sz+64) as i64
124 bufs[3]=sys_mmap(sz+64) as i64
125 bufs[4]=sys_mmap(4194304) as i64
126 bufs[5]=sys_mmap(512) as i64
127 bufs[6]=sys_mmap(128) as i64
128 bufs[7]=sys_mmap(64) as i64
129 bufs[8]=sys_mmap(32*8) as i64
130 bufs[9]=sys_mmap(1048576) as i64
131 bufs[10]=sys_mmap(5120) as i64
132 bufs[11]=sys_mmap(64) as i64
133 vc_t8_init(bufs[10] as *i64)
134 let oL: *i64=sys_mmap(32) as *i64
135 let oT: *i64=sys_mmap(32) as *i64
136 let qs: *i64=sys_mmap(32) as *i64
137 qs[0]=20; qs[1]=32; qs[2]=40
138 var pass: i64=0
139 var total: i64=0
140 gw(" SMOOTH synthetic 256x192 (skin/gradient class):\n" as *u8)
141 var qi: i64=0
142 while qi<3 {
143 run_blk(syn, W, H, sz, 4, qs[qi], 0, bufs, oL)
144 run_blk(syn, W, H, sz, 4, qs[qi], 1, bufs, oT)
145 gw(" qp=" as *u8); gn(qs[qi])
146 gw(" LUMA legacy=" as *u8); gn(oL[0]); gw(" t8=" as *u8); gn(oT[0])
147 gw(" CHROMA legacy=" as *u8); gn(oL[1]); gw(" t8=" as *u8); gn(oT[1])
148 gw(" exact=" as *u8); gn(oT[2]); gw("/4\n" as *u8)
149 total=total+1
150 if oT[2]==4 { pass=pass+1 }
151 qi=qi+1
152 }
153 // REAL frames (held-out) at the file geometry
154 let box: *i64=sys_mmap(16) as *i64
155 let yuv: *u8=sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/knowledge/staging/media/bframe_test_decoded.yuv" as *u8, box)
156 if (yuv as i64) != 0 {
157 let RW: i64=576
158 let RH: i64=1024
159 let rsz: i64=RW*RH + (RW*RH)/2
160 let rb: *i64=sys_mmap(16*8) as *i64
161 let rN: i64=RW*RH
162 let rfull: i64=rN + 2*((RW/2)*(RH/2))
163 rb[0]=sys_mmap(rfull+64) as i64
164 rb[1]=sys_mmap(rfull+64) as i64
165 rb[2]=sys_mmap(rfull+64) as i64
166 rb[3]=sys_mmap(rfull+64) as i64
167 rb[4]=bufs[4]
168 rb[5]=bufs[5]
169 rb[6]=bufs[6]
170 rb[7]=bufs[7]
171 rb[8]=bufs[8]
172 rb[9]=bufs[9]
173 rb[10]=bufs[10]
174 rb[11]=bufs[11]
175 gw(" REAL frames 8..11 576x1024:\n" as *u8)
176 qi=0
177 while qi<3 {
178 let base: *u8 = ((yuv as i64) + 8*rsz) as *u8
179 run_blk(base, RW, RH, rsz, 4, qs[qi], 0, rb, oL)
180 run_blk(base, RW, RH, rsz, 4, qs[qi], 1, rb, oT)
181 gw(" qp=" as *u8); gn(qs[qi])
182 gw(" LUMA legacy=" as *u8); gn(oL[0]); gw(" t8=" as *u8); gn(oT[0])
183 gw(" CHROMA legacy=" as *u8); gn(oL[1]); gw(" t8=" as *u8); gn(oT[1])
184 gw(" exact=" as *u8); gn(oT[2]); gw("/4\n" as *u8)
185 total=total+1
186 if oT[2]==4 { pass=pass+1 }
187 qi=qi+1
188 }
189 }
190 gw("T8BLK: " as *u8); gn(pass); gw("/" as *u8); gn(total)
191 if pass==total { gw(" decode-sane; READ the ratios above -- t8 >> legacy on a plane = the culprit\n" as *u8); return 0 }
192 gw(" RED (decode broken -- fix before reading ratios)\n" as *u8); return 1 }