code wiki / (root) / nx_h264_fdct_gate.nx

nx_h264_fdct_gate.nx source

↩ module page · 64 lines · 4035 B

1// nx_h264_fdct_gate.nx -- SOVEREIGN gate for the H.264 forward transform + quant (the encoder core, R6). 2// Proof = CROSS-VALIDATION against the already-proven decode-side inverse: residual X --fdct--> --fquant(qp)--> 3// levels --nx_h264_dequant--> --nx_idct4x4--> X'. If the forward pair matches the spec (and the inverse), X' 4// reconstructs X within the quantization error. Plus a known-vector: a FLAT residual must transform to DC-only. 5// Every number PRINTED (no overclaim). GREEN iff flat->DC-only AND the fine-quant (qp6) round-trip is faithful. 6// license_tier: ORIGINAL 7import "nx_syscalls.nx" 8import "nx_h264_fdct.nx" 9import "nx_h264_dequant.nx" 10import "nx_h264_idct.nx" 11import "nx_h264_zigzag.nx" // inverse zigzag, to round-trip the forward 12 13func g_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 14func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; 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}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 15func iabs(v: i64) -> i64 { if v<0 { return 0-v } return v } 16 17// one round-trip at qp -> returns maxErr; prints qp/maxErr/nonzero-levels. 18func rt(X: *i64, qp: i64) -> i64 { 19 let Y: *i64=sys_mmap(16*8) as *i64; var i: i64=0; while i<16 { Y[i]=X[i]; i=i+1 } 20 nx_h264_fdct4x4(Y) 21 let Z: *i64=sys_mmap(16*8) as *i64; nx_h264_fquant4x4(Y, qp, Z) 22 let W: *i64=sys_mmap(16*8) as *i64; nx_h264_dequant4x4(Z, qp, W) 23 nx_idct4x4(W) 24 var maxe: i64=0; var nnz: i64=0; i=0 25 while i<16 { let e: i64=iabs(W[i]-X[i]); if e>maxe{maxe=e} if Z[i]!=0{nnz=nnz+1} i=i+1 } 26 g_puts(" qp="); g_num(qp); g_puts(" maxErr="); g_num(maxe); g_puts(" nonzero_levels="); g_num(nnz); g_puts("/16\n") 27 return maxe 28} 29 30func main() -> i64 { 31 g_puts("=== H264 FDCT/FQUANT GATE: forward transform+quant cross-validated vs the proven inverse ===\n") 32 33 // T1: flat residual all=8 -> forward transform -> DC=128, every AC = 0 34 let F: *i64=sys_mmap(16*8) as *i64; var i: i64=0; while i<16 { F[i]=8; i=i+1 } 35 nx_h264_fdct4x4(F) 36 var flatok: i64=1; if F[0]!=128 { flatok=0 } i=1; while i<16 { if F[i]!=0 { flatok=0 } i=i+1 } 37 g_puts(" T1 flat[8] -> DC="); g_num(F[0]); g_puts(" (expect 128) + AC all zero: "); if flatok==1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 38 39 // T2: round-trip a smooth residual at several qp (fine -> coarse) 40 let X: *i64=sys_mmap(16*8) as *i64; i=0 41 while i<16 { let r: i64=i/4; let c: i64=i%4; X[i]=(r+c)*6 - 18; i=i+1 } // smooth, range -18..+18 42 g_puts(" T2 round-trip (fdct -> fquant -> dequant -> idct), smooth residual:\n" as *u8) 43 let e6: i64=rt(X, 6) 44 let e16: i64=rt(X, 16) 45 let e28: i64=rt(X, 28) 46 var rtok: i64=1; if e6 > 6 { rtok=0 } 47 48 // T3: forward zigzag round-trips with the inverse (raster -> scan -> raster') 49 let RA: *i64=sys_mmap(16*8) as *i64; i=0; while i<16 { RA[i]=i*3 - 20; i=i+1 } 50 let SC: *i64=sys_mmap(16*8) as *i64; nx_h264_fwd_zigzag4x4(RA, SC) 51 let RB: *i64=sys_mmap(16*8) as *i64; nx_h264_inv_zigzag4x4(SC, RB) 52 var zzok: i64=1; i=0; while i<16 { if RB[i]!=RA[i] { zzok=0 } i=i+1 } 53 g_puts(" T3 forward-zigzag round-trip (raster->scan->raster): " as *u8); if zzok==1 { g_puts("PASS\n" as *u8) } else { g_puts("FAIL\n" as *u8) } 54 55 g_puts("----\n" as *u8) 56 var pass: i64=0 57 if flatok==1 { pass=pass+1 } 58 if rtok==1 { pass=pass+1 } 59 if zzok==1 { pass=pass+1 } 60 g_puts("H264FDCT flat_DC=" as *u8); if flatok==1 { g_puts("ok" as *u8) } else { g_puts("BAD" as *u8) } 61 g_puts(" qp6_maxErr=" as *u8); g_num(e6); g_puts(" (faithful<=6) qp16=" as *u8); g_num(e16); g_puts(" qp28=" as *u8); g_num(e28); g_puts("\n" as *u8) 62 if pass==3 { g_puts("H264FDCT GREEN (forward transform+quant round-trips the inverse; forward zigzag round-trips)\n" as *u8); sys_exit(0); return 0 } 63 g_puts("H264FDCT RED\n" as *u8); sys_exit(1); return 1 64}