code wiki / _hdl_build / nx_vcodec_rc_frame_gate.nx

nx_vcodec_rc_frame_gate.nx source

↩ module page · 57 lines · 3880 B

1import "nx_gate_base.nx" 2// nx_vcodec_rc_frame_gate.nx -- END-TO-END range-coded FRAME proof (task #31): encode a full frame (all 3 3// planes, DCT+AQ+deblock) through vv_enc_rc, decode through vv_dec_rc, assert the decoded recon == the 4// encoder recon BIT-EXACT, and measure the byte size vs the CAVLC vv_enc. GREEN + smaller = the range coder 5// is integrated correctly at the frame level and earns the wasm build + live deploy. license_tier: ORIGINAL 6import "nx_syscalls.nx" 7import "nx_video_codec_wasm.nx" 8 9func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 10" as *u8); return ok } 11func gn(v: i64) -> i64 { 12 let b: *u8=sys_mmap(28); var m: i64=v; if m<0{sys_write(1,"-" as *u8,1);m=0-m} 13 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} 14 var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 } 15func 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 } 16func vfill(yuv: *u8, W: i64, H: i64, sh: i64) -> i64 { 17 let N: i64=W*H; let C: i64=(W/2)*(H/2) 18 var r: i64=0 19 while r<H { var c: i64=0 20 while c<W { let s: i64=c+sh; var v: i64=(s+r)*2+30+((s*r)%13)*5; if s>W/2 { v=v+40 } if v<0{v=0} if v>255{v=255}; yuv[r*W+c]=v as u8; c=c+1 } r=r+1 } 21 var i: i64=N; while i<N+2*C { yuv[i]=120 as u8; i=i+1 } return 0 } 22 23func run(W: i64, H: i64, qp: i64, key: i64, seedprev: i64, p: *i64, t: *i64) -> i64 { 24 let N: i64=W*H; let C: i64=(W/2)*(H/2); let sz: i64=N+2*C 25 let cur: *u8=sys_mmap(sz); let prevE: *u8=sys_mmap(sz); let prevD: *u8=sys_mmap(sz) 26 let reconC: *u8=sys_mmap(sz); let reconR: *u8=sys_mmap(sz); let reconD: *u8=sys_mmap(sz) 27 let blk: *i64=sys_mmap(512) as *i64; let mv: *i64=sys_mmap(128) as *i64 28 let outC: *u8=sys_mmap(262144); let outR: *u8=sys_mmap(262144) 29 let est: *i64=sys_mmap(8*8) as *i64; let probs: *i64=sys_mmap(16*8) as *i64; let rcbuf: *u8=sys_mmap(262144) 30 let rctx: *i64=sys_mmap(8*8) as *i64 31 var z: i64=0; while z<sz { if seedprev==1 { prevE[z]=((z*5+3)&255) as u8; prevD[z]=((z*5+3)&255) as u8 } else { prevE[z]=0 as u8; prevD[z]=0 as u8 } z=z+1 } 32 vfill(cur, W, H, seedprev*4) 33 // CAVLC baseline 34 let cb: i64 = vv_enc(cur, prevE, reconC, W, H, qp, key, 6016, outC, 262144, blk, mv) 35 // RANGE encode (reset rctx each frame: [1, est, probs, rcbuf]) 36 rctx[0]=1; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64 37 let rb: i64 = vv_enc_rc(cur, prevE, reconR, W, H, qp, key, 6016, outR, 262144, blk, mv, rctx) 38 if rb <= 0 { gw(" vv_enc_rc FAILED\n" as *u8); t[0]=t[0]+1; return 0 } 39 // RANGE decode 40 rctx[0]=1; rctx[1]=est as i64; rctx[2]=probs as i64; rctx[3]=rcbuf as i64 41 vv_dec_rc(prevD, reconD, W, H, qp, outR, rb, blk, mv, rctx) 42 let ok: i64 = eqb(reconD, reconR, sz) 43 t[0]=t[0]+1; if ok==1 { p[0]=p[0]+1 } 44 gw(" " as *u8); gn(W); gw("x" as *u8); gn(H); if key==1 { gw(" KEY " as *u8) } else { gw(" P " as *u8) } 45 gw("CAVLC=" as *u8); gn(cb); gw("B range=" as *u8); gn(rb); gw("B (" as *u8); gn(rb*100/cb); gw("%) decode=" as *u8) 46 if ok==1 { gw("BIT-EXACT\n" as *u8) } else { gw("MISMATCH\n" as *u8) } 47 return 0 } 48 49func main() -> i64 { 50 gw("=== nx_vcodec_rc_frame_gate: range-coded FULL FRAME vs CAVLC, end-to-end ===\n" as *u8) 51 let p: *i64=sys_mmap(16) as *i64; let t: *i64=sys_mmap(16) as *i64 52 run(128, 96, 20, 1, 0, p, t) // keyframe 53 run(256, 192, 20, 1, 0, p, t) // bigger keyframe 54 run(256, 192, 20, 0, 1, p, t) // P-frame (motion vs a real prev) 55 gw("RC-FRAME: " as *u8); gn(p[0]); gw("/" as *u8); gn(t[0]) 56 if p[0]==t[0] { gw(" GREEN -- range-coded frames decode bit-exact + smaller -> integrate to wasm + deploy\n" as *u8); return 0 } 57 gw(" RED\n" as *u8); return 1 }