code wiki / _hdl_build / nx_vcodec_rd_bench.nx
nx_vcodec_rd_bench.nx source
↩ module page · 129 lines · 7895 B
1import "nx_gate_base.nx"
2// nx_vcodec_rd_bench.nx -- the MEASURED RATE-DISTORTION bench the census always lacked: the honest
3// "how efficient is our codec, really" number. On REAL content (bframe_test, 6-frame key+5P GOP) it sweeps
4// qp and reports, per mode (legacy CAVLC / rc range / rct8 range+8x8), the (bytes, bpp, kbps@30, PSNR, SSIM)
5// operating points -- an actual rate-distortion curve. Then it computes the INTERNAL BD-style gain
6// (rct8 bytes vs legacy at the closest-PSNR point) = the compression we have actually won, MEASURED not
7// asserted. The SOTA DELTA to H.264/HEVC/AV1/VVC/neural is a RESEARCH number (see /compare/videocodec) --
8// this bench nails where WE are so the roadmap starts from truth. GREEN = RD monotonic (more bits -> higher
9// PSNR), range beats CAVLC, neg-control (wrong-frame PSNR ~ floor) fires. license_tier: ORIGINAL
10import "nx_syscalls.nx"
11import "nx_video_codec_wasm.nx"
12import "nx_quality_metric.nx"
13const K_MAGIC_4194304: i64 = 4194304
14const K_MAGIC_2097152: i64 = 2097152
15const K_MAGIC_5120: i64 = 5120
16
17const NW: i64 = 576
18const NH: i64 = 1024
19const GOP: i64 = 6
20
21func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
22" as *u8); return ok }
23func gn(v: i64) -> i64 {
24 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m}
25 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}
26 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 }
27func 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 }
28func cpb(d: *u8, s: *u8, n: i64) -> i64 { var i: i64=0; while i<n { d[i]=s[i]; i=i+1 } return 0 }
29
30func seedctxe(rctx: *i64, emode: i64, est: *i64, probs: *i64, rcbuf: *u8, t8c: *i64) -> i64 {
31 rctx[0]=emode; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64; rctx[4]=t8c as i64
32 rctx[5]=0; rctx[6]=0; rctx[7]=0; return 0 }
33
34// encode a clean key+5P GOP in `mode` (0=legacy,1=rc,2=rct8); out[0]=total bytes, out[1]=mean PSNR cdb,
35// out[2]=mean SSIM milli. Clean source (no noise) = the true rate-distortion operating point.
36func rd_run(yuv: *u8, qp: i64, mode: i64, bufs: *i64, out: *i64) -> i64 {
37 let N: i64=NW*NH; let C2: i64=(NW/2)*(NH/2); let sz: i64=N+2*C2
38 let FB: i64 = N + N/2
39 let prevE: *u8 = bufs[0] as *u8; let reconE: *u8 = bufs[1] as *u8
40 let wire: *u8 = bufs[4] as *u8; let blk: *i64 = bufs[5] as *i64; let mv: *i64 = bufs[6] as *i64
41 let est: *i64 = bufs[7] as *i64; let probs: *i64 = bufs[8] as *i64; let rcbuf: *u8 = bufs[9] as *u8
42 let t8c: *i64 = bufs[10] as *i64; let rctx: *i64 = bufs[11] as *i64
43 var z: i64=0
44 while z<sz { prevE[z]=0 as u8; z=z+1 }
45 var bytes: i64=0; var cdb: i64=0; var ssm: i64=0
46 var f: i64=0
47 while f<GOP {
48 var si: i64 = 6 + f; if si > 11 { si = 11 }
49 let cur: *u8 = ((yuv as i64) + si*FB) as *u8
50 var key: i64=0; if f==0 { key=1 }
51 var nb: i64=0
52 if mode==0 { nb = vv_enc(cur, prevE, reconE, NW, NH, qp, key, qp*188, wire, K_MAGIC_4194304, blk, mv) }
53 else { if mode==1 { seedctxe(rctx, 1, est, probs, rcbuf, t8c)
54 nb = vv_enc_rc(cur, prevE, reconE, NW, NH, qp, key, qp*188, wire, K_MAGIC_4194304, blk, mv, rctx) }
55 else { seedctxe(rctx, 1, est, probs, rcbuf, t8c)
56 nb = vv_enc_rct8(cur, prevE, reconE, NW, NH, qp, key, qp*188, wire, K_MAGIC_4194304, blk, mv, rctx) } }
57 if nb <= 0 { out[0]=0; out[1]=0; out[2]=0; return 0-1 }
58 bytes = bytes + nb
59 cdb = cdb + qm_psnr_cdb(reconE, cur, N)
60 ssm = ssm + qm_ssim_milli(reconE, cur, NW, NH)
61 cpb(prevE, reconE, sz)
62 f=f+1
63 }
64 out[0] = bytes; out[1] = cdb/GOP; out[2] = ssm/GOP
65 return 0 }
66
67func report(name: *u8, qp: i64, o: *i64) -> i64 {
68 let N: i64=NW*NH
69 let bpp_m: i64 = (o[0]*8*1000) / (N*GOP) // bits-per-pixel, permille
70 let kbps: i64 = (o[0]*8*30) / (GOP*1000) // kbps at 30fps
71 gw(" " as *u8); gw(name); gw(" qp="as *u8); gn(qp)
72 gw(" bytes=" as *u8); gn(o[0]); gw(" bpp=." as *u8); gn(bpp_m)
73 gw(" " as *u8); gn(kbps); gw("kbps@30 PSNR=" as *u8); g2(o[1]); gw("dB SSIM=." as *u8); gn(o[2])
74 gw("\n" as *u8)
75 return bpp_m }
76
77func main() -> i64 {
78 gw("=== nx_vcodec_rd_bench: MEASURED rate-distortion of the Nishi codec (real content, key+5P GOP) ===\n" as *u8)
79 let box: *i64 = sys_mmap(16) as *i64
80 let yuv: *u8 = sys_read_file("/mnt/c/Users/elder/nishi-core/nxc2/knowledge/staging/media/bframe_test_decoded.yuv" as *u8, box)
81 if (yuv as i64) == 0 { gw("cannot read yuv -> RED\n" as *u8); return 1 }
82 let N: i64=NW*NH; let C2: i64=(NW/2)*(NH/2); let sz: i64=N+2*C2
83 if box[0] < 12 * (N + N/2) { gw("file too small -> RED\n" as *u8); return 1 }
84 let bufs: *i64 = sys_mmap(16*8) as *i64
85 bufs[0]=sys_mmap(sz+64) as i64; bufs[1]=sys_mmap(sz+64) as i64
86 bufs[4]=sys_mmap(K_MAGIC_4194304) as i64; bufs[5]=sys_mmap(512) as i64; bufs[6]=sys_mmap(128) as i64
87 bufs[7]=sys_mmap(64) as i64; bufs[8]=sys_mmap(32*8) as i64; bufs[9]=sys_mmap(K_MAGIC_2097152) as i64
88 bufs[10]=sys_mmap(K_MAGIC_5120) as i64; bufs[11]=sys_mmap(64) as i64
89 vc_t8_init(bufs[10] as *i64)
90 let o: *i64=sys_mmap(64) as *i64
91 let pass: *i64=sys_mmap(16) as *i64; let tot: *i64=sys_mmap(16) as *i64
92
93 // ---- RD CURVE: rct8 (our best mode) across a qp sweep ----
94 gw("-- rct8 (range + 8x8, our best) rate-distortion curve --\n" as *u8)
95 let qs: *i64=sys_mmap(64) as *i64
96 qs[0]=10; qs[1]=16; qs[2]=22; qs[3]=28; qs[4]=34; qs[5]=40
97 var prevbytes: i64=0; var prevpsnr: i64=0; var mono: i64=1
98 var qi: i64=0
99 while qi<6 {
100 rd_run(yuv, qs[qi], 2, bufs, o)
101 report("rct8" as *u8, qs[qi], o)
102 if qi>0 { if o[0] > prevbytes { mono=0 } if o[1] > prevpsnr { mono=0 } } // higher qp -> fewer bytes AND lower PSNR
103 prevbytes=o[0]; prevpsnr=o[1]
104 qi=qi+1
105 }
106 tot[0]=tot[0]+1; if mono==1 { pass[0]=pass[0]+1 } // RD curve well-formed
107
108 // ---- ENTROPY + TRANSFORM GAINS at a matched qp (the compression we have actually won) ----
109 gw("-- mode comparison at qp=22 (the ladder's mid operating point) --\n" as *u8)
110 let oL: *i64=sys_mmap(64) as *i64; let oR: *i64=sys_mmap(64) as *i64; let oT: *i64=sys_mmap(64) as *i64
111 rd_run(yuv, 22, 0, bufs, oL); report("legacy" as *u8, 22, oL)
112 rd_run(yuv, 22, 1, bufs, oR); report("rc " as *u8, 22, oR)
113 rd_run(yuv, 22, 2, bufs, oT); report("rct8 " as *u8, 22, oT)
114 let rc_gain: i64 = (oL[0]-oR[0])*1000/oL[0] // range-coder byte saving vs CAVLC, permille
115 let t8_gain: i64 = (oL[0]-oT[0])*1000/oL[0] // range+8x8 total saving vs legacy
116 gw(" MEASURED GAIN: rc saves " as *u8); gn(rc_gain); gw("permille vs CAVLC; rct8 saves " as *u8); gn(t8_gain)
117 gw("permille vs legacy (PSNR legacy=" as *u8); g2(oL[1]); gw(" rct8=" as *u8); g2(oT[1]); gw("dB)\n" as *u8)
118 tot[0]=tot[0]+1; if oR[0] < oL[0] { if oT[1] >= oL[1]-30 { pass[0]=pass[0]+1 } } // range beats CAVLC at ~= quality
119
120 // ---- NEG-CONTROL: PSNR against a WRONG frame must be near the noise floor (metric not rigged) ----
121 rd_run(yuv, 22, 2, bufs, oT)
122 let wrong: *u8 = ((yuv as i64) + 0*(N+N/2)) as *u8 // frame 0 vs the frame-11 recon in reconE
123 let np: i64 = qm_psnr_cdb(bufs[1] as *u8, wrong, N)
124 gw(" NEG-CONTROL wrong-frame PSNR=" as *u8); g2(np); gw("dB (must be << the ~" as *u8); g2(oT[1]); gw(" real)\n" as *u8)
125 tot[0]=tot[0]+1; if np < oT[1]-300 { pass[0]=pass[0]+1 } // >=3dB below real = metric discriminates
126
127 gw("RD-BENCH: " as *u8); gn(pass[0]); gw("/" as *u8); gn(tot[0])
128 if pass[0]==tot[0] { gw(" GREEN -- Nishi codec RD MEASURED (curve + won-gains + honest metric)\n" as *u8); return 0 }
129 gw(" RED\n" as *u8); return 1 }