code wiki / (root) / nx_h264_idct_gate.nx

nx_h264_idct_gate.nx source

↩ module page · 109 lines · 4091 B

1// nx_h264_idct_gate.nx -- REFEREE for the H.264 4x4 inverse transform (rung 5-core). 2// Hand-computed exact vectors (verified against spec 8.5.12.2): 3// DC only: coeff[0]=256, rest 0 -> every output sample = (256+32)>>6 = 4. 4// AC [0][1]=64, rest 0 -> every row = [1,1,0,-1] (exercises butterfly + the 5// NEGATIVE arithmetic-shift: -64+32=-32, asr(-32,6) = -1). 6// zero block -> all 0. 7// add_clip: pred[100,100,100,100] + res[50,-200,300,0] -> [150,0,255,100]. 8// Every value PRINTED. stdout + knowledge/status/h264_idct_gate.log. Exit 0/1. 9// Sovereign: nx_syscalls + nx_h264_idct. license_tier: ORIGINAL 10import "nx_syscalls.nx" 11import "nx_h264_idct.nx" 12 13func gp(logfd: i64, s: *u8) -> i64 { 14 var n: i64 = 0 15 while s[n] != (0 as u8) { n = n + 1 } 16 sys_write(1, s, n) 17 if logfd > 0 { sys_write(logfd, s, n) } 18 return 0 19} 20func gn(logfd: i64, v: i64) -> i64 { 21 let bb: *u8 = sys_mmap(28) 22 var m: i64 = v 23 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if logfd > 0 { sys_write(logfd, "-\x00" as *u8, 1) } m = 0 - m } 24 let t: *u8 = sys_mmap(28) 25 var k: i64 = 0 26 if m == 0 { t[0] = 48 as u8; k = 1 } 27 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 28 var i: i64 = 0 29 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 30 sys_write(1, bb, k) 31 if logfd > 0 { sys_write(logfd, bb, k) } 32 return 0 33} 34func zero16(d: *i64) -> i64 { var i: i64 = 0; while i < 16 { d[i] = 0; i = i + 1 } return 0 } 35func dump16(logfd: i64, d: *i64) -> i64 { 36 var i: i64 = 0 37 while i < 16 { gn(logfd, d[i]); gp(logfd, " \x00" as *u8); i = i + 1 } 38 gp(logfd, "\n\x00" as *u8) 39 return 0 40} 41 42func main() -> i64 { 43 let logfd: i64 = sys_openat_append("knowledge/status/h264_idct_gate.log\x00" as *u8, 0x1a4) 44 gp(logfd, "H264-IDCT-GATE (rung 5-core inverse transform)\n\x00" as *u8) 45 46 let d: *i64 = sys_mmap(16 * 8) as *i64 47 48 // DC 49 zero16(d); d[0] = 256 50 nx_idct4x4(d) 51 gp(logfd, " DC256: \x00" as *u8); dump16(logfd, d) 52 var dc_ok: i64 = 1 53 var i: i64 = 0 54 while i < 16 { if d[i] != 4 { dc_ok = 0 } i = i + 1 } 55 56 // AC [0][1]=64 57 zero16(d); d[1] = 64 58 nx_idct4x4(d) 59 gp(logfd, " AC64 : \x00" as *u8); dump16(logfd, d) 60 var ac_ok: i64 = 1 61 var r: i64 = 0 62 while r < 4 { 63 if d[r * 4 + 0] != 1 { ac_ok = 0 } 64 if d[r * 4 + 1] != 1 { ac_ok = 0 } 65 if d[r * 4 + 2] != 0 { ac_ok = 0 } 66 if d[r * 4 + 3] != 0 - 1 { ac_ok = 0 } 67 r = r + 1 68 } 69 70 // zero 71 zero16(d) 72 nx_idct4x4(d) 73 var z_ok: i64 = 1 74 i = 0 75 while i < 16 { if d[i] != 0 { z_ok = 0 } i = i + 1 } 76 77 // add_clip 78 let pred: *u8 = sys_mmap(8) 79 pred[0] = 100 as u8; pred[1] = 100 as u8; pred[2] = 100 as u8; pred[3] = 100 as u8 80 let res: *i64 = sys_mmap(8 * 8) as *i64 81 res[0] = 50; res[1] = 0 - 200; res[2] = 300; res[3] = 0 82 let outp: *u8 = sys_mmap(8) 83 nx_idct_add_clip(pred, res, outp, 4) 84 gp(logfd, " add_clip: \x00" as *u8); gn(logfd, outp[0] as i64); gp(logfd, " \x00" as *u8); gn(logfd, outp[1] as i64); gp(logfd, " \x00" as *u8); gn(logfd, outp[2] as i64); gp(logfd, " \x00" as *u8); gn(logfd, outp[3] as i64); gp(logfd, "\n\x00" as *u8) 85 var clip_ok: i64 = 1 86 if (outp[0] as i64) != 150 { clip_ok = 0 } 87 if (outp[1] as i64) != 0 { clip_ok = 0 } 88 if (outp[2] as i64) != 255 { clip_ok = 0 } 89 if (outp[3] as i64) != 100 { clip_ok = 0 } 90 91 gp(logfd, " dc_ok=\x00" as *u8); gn(logfd, dc_ok); gp(logfd, " ac_ok=\x00" as *u8); gn(logfd, ac_ok); gp(logfd, " z_ok=\x00" as *u8); gn(logfd, z_ok); gp(logfd, " clip_ok=\x00" as *u8); gn(logfd, clip_ok); gp(logfd, "\n\x00" as *u8) 92 93 var ok: i64 = 1 94 if dc_ok != 1 { ok = 0 } 95 if ac_ok != 1 { ok = 0 } 96 if z_ok != 1 { ok = 0 } 97 if clip_ok != 1 { ok = 0 } 98 99 if ok == 1 { 100 gp(logfd, "H264-IDCT-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8) 101 if logfd > 0 { sys_close(logfd) } 102 sys_exit(0) 103 return 0 104 } 105 gp(logfd, "H264-IDCT-GATE result=FAIL verdict=RED\n\x00" as *u8) 106 if logfd > 0 { sys_close(logfd) } 107 sys_exit(1) 108 return 1 109}