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 }