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}