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 }