code wiki / _hdl_build / nx_vcodec_quarter_gate.nx
nx_vcodec_quarter_gate.nx source
↩ module page · 64 lines · 3655 B
1// nx_vcodec_quarter_gate.nx -- proves QUARTER-pel motion is realized INSIDE the codec: a frame shifted by exactly
2// 0.25px is encoded inter, round-trips BIT-EXACT, and the codec's quarter-pel predictor matches a shift that half-pel
3// (only 0 / 0.5) structurally cannot -- the in-codec H.264/VP9 motion-precision win past half-pel.
4import "nx_syscalls.nx"
5import "nx_gate_emit_lib.nx"
6import "nx_vcodec.nx"
7
8func g_abs(v: i64) -> i64 { if v < 0 { return 0 - v } return v }
9func frame_equal(a: *u8, b: *u8, n: i64) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i] { return 0 } i=i+1 } return 1 }
10func frame_maxerr(a: *u8, b: *u8, n: i64) -> i64 { var m: i64=0; var i: i64=0; while i<n { let e: i64=g_abs((a[i] as i64)-(b[i] as i64)); if e>m { m=e } i=i+1 } return m }
11// one-MB residual SAD of f vs ref sampled at quarter offset (qx,qy)
12func mb_sad(f: *u8, ref: *u8, W: i64, qx: i64, qy: i64) -> i64 {
13 var s: i64=0; var ry: i64=0
14 while ry < 16 { var rx: i64=0
15 while rx < 16 { s = s + g_abs((f[ry*W+rx] as i64) - qp_pixel(ref, W, rx, ry, qx, qy)); rx=rx+1 } ry=ry+1 }
16 return s
17}
18
19func main() -> i64 {
20 g_puts("nx_vcodec quarter-pel gate (0.25px motion realized IN the codec, BIT-EXACT)\n" as *u8)
21 var pass: i64 = 0; var total: i64 = 0
22 let W: i64 = 48; let H: i64 = 32; let N: i64 = W*H
23 let QP: i64 = 12; let SAD_THRESH: i64 = 64
24
25 let f0: *u8 = sys_mmap(N) as *u8
26 let f1: *u8 = sys_mmap(N) as *u8
27 let recon0: *u8 = sys_mmap(N) as *u8
28 let enc1: *u8 = sys_mmap(N) as *u8
29 let dec1: *u8 = sys_mmap(N) as *u8
30 let stream: *u8 = sys_mmap(8192) as *u8
31 let blk: *i64 = sys_mmap(16*8) as *i64
32 let mv: *i64 = sys_mmap(2*8) as *i64
33
34 var y: i64 = 0
35 while y < H { var x: i64 = 0
36 while x < W { f0[y*W+x] = (40 + ((x*11 + y*7) % 120)) as u8; x = x + 1 } y = y + 1 }
37 // f1 = f0 shifted +0.25px in x (== qp_pixel at qx=1)
38 y = 0
39 while y < H { var x: i64 = 0
40 while x < W - 1 { f1[y*W+x] = (((3*(f0[y*W+x] as i64) + (f0[y*W+(x+1)] as i64) + 2) / 4)) as u8; x = x + 1 }
41 f1[y*W + (W-1)] = f0[y*W + (W-1)]; y = y + 1 }
42
43 vc_enc_frame_packed(f0, recon0, recon0, W, H, QP, 1, SAD_THRESH, stream, blk, mv)
44 vc_dec_frame_packed(recon0, recon0, W, H, QP, stream, blk, mv)
45 let bits: i64 = vc_enc_frame_packed(f1, recon0, enc1, W, H, QP, 0, SAD_THRESH, stream, blk, mv)
46 vc_dec_frame_packed(recon0, dec1, W, H, QP, stream, blk, mv)
47
48 let eq: i64 = frame_equal(enc1, dec1, N)
49 let q: i64 = frame_maxerr(enc1, f1, N)
50 let int_sad: i64 = mb_sad(f1, recon0, W, 0, 0)
51 let half_sad: i64 = mb_sad(f1, recon0, W, 2, 0)
52 let qtr_sad: i64 = mb_sad(f1, recon0, W, 1, 0)
53
54 g_puts(" [measure] 0.25px-shift inter stream=" as *u8); g_pn((bits+7)/8); g_puts(" B recon max-err=" as *u8); g_pn(q); g_puts("\n" as *u8)
55 g_puts(" [measure] one MB residual SAD: integer=" as *u8); g_pn(int_sad); g_puts(" half=" as *u8); g_pn(half_sad); g_puts(" quarter=" as *u8); g_pn(qtr_sad); g_puts("\n" as *u8)
56
57 pass = pass + g_check("0.25px-shift frame round-trips BIT-EXACT through the codec (decoder == encoder)" as *u8, eq); total=total+1
58 pass = pass + g_check("reconstruction faithful (max-err <= 16)" as *u8, q <= 16); total=total+1
59 pass = pass + g_check("codec's quarter-pel matches a 0.25 shift half-pel CANNOT (quarter << half)" as *u8, qtr_sad * 4 < half_sad); total=total+1
60
61 g_puts("---- vcodec quarter gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8)
62 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
63 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1
64}