nx_h264_mvpred_gate.nx source
↩ module page · 78 lines · 3362 B
1// nx_h264_mvpred_gate.nx -- gate MV prediction (8.4.1.3). Hand-computed KATs.
2// Exit 0/1. Log knowledge/status/h264_mvpred_gate.log. license_tier: ORIGINAL
3import "nx_syscalls.nx"
4import "nx_h264_mvpred.nx"
5
6func gp(fd: i64, s: *u8) -> i64 {
7 var n: i64 = 0
8 while s[n] != (0 as u8) { n = n + 1 }
9 sys_write(1, s, n); if fd > 0 { sys_write(fd, s, n) }
10 return 0
11}
12func gn(fd: i64, v: i64) -> i64 {
13 let bb: *u8 = sys_mmap(28); var m: i64 = v
14 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if fd > 0 { sys_write(fd, "-\x00" as *u8, 1) } m = 0 - m }
15 let t: *u8 = sys_mmap(28); var k: i64 = 0
16 if m == 0 { t[0] = 48 as u8; k = 1 }
17 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
18 var i: i64 = 0
19 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
20 sys_write(1, bb, k); if fd > 0 { sys_write(fd, bb, k) }
21 return 0
22}
23func chk(fd: i64, name: *u8, ox: i64, oy: i64, ex: i64, ey: i64, ok: *i64) -> i64 {
24 gp(fd, " \x00" as *u8); gp(fd, name); gp(fd, " -> (\x00" as *u8); gn(fd, ox); gp(fd, ",\x00" as *u8); gn(fd, oy)
25 gp(fd, ") expect (\x00" as *u8); gn(fd, ex); gp(fd, ",\x00" as *u8); gn(fd, ey); gp(fd, ")\n\x00" as *u8)
26 if ox != ex { ok[0] = 0 }
27 if oy != ey { ok[0] = 0 }
28 return 0
29}
30
31func main() -> i64 {
32 let fd: i64 = sys_openat_append("knowledge/status/h264_mvpred_gate.log\x00" as *u8, 0x1a4)
33 gp(fd, "H264-MVPRED-GATE\n\x00" as *u8)
34 let okp: *i64 = sys_mmap(8) as *i64
35 okp[0] = 1
36 let o: *i64 = sys_mmap(16) as *i64
37
38 // 1. median, all ref match: mvA(3,3) mvB(1,7) mvC(5,1), ref all 0, refIdx 0 -> median (3,3)
39 nx_h264_mvp(3,3,0, 1,7,0, 5,1,0, 0, o)
40 chk(fd, "median-3match\x00" as *u8, o[0], o[1], 3, 3, okp)
41
42 // 2. single match: refA=1 refB=0 refC=1, refIdx=0 -> mvp = mvB (8,2)
43 nx_h264_mvp(1,1,1, 8,2,0, 9,9,1, 0, o)
44 chk(fd, "single-match-B\x00" as *u8, o[0], o[1], 8, 2, okp)
45
46 // 3. B,C unavailable (ref -1), A available ref 0, mvA(9,-4), refIdx 0 -> mvp = mvA
47 nx_h264_mvp(9,0-4,0, 0,0,0-1, 0,0,0-1, 0, o)
48 chk(fd, "BC-unavail->A\x00" as *u8, o[0], o[1], 9, 0-4, okp)
49
50 // 4. median with negatives: mvA(-2,5) mvB(4,-1) mvC(1,1) all ref 0 -> (1,1)
51 nx_h264_mvp(0-2,5,0, 4,0-1,0, 1,1,0, 0, o)
52 chk(fd, "median-neg\x00" as *u8, o[0], o[1], 1, 1, okp)
53
54 // 5. no match (all ref 2, refIdx 0) -> median of (3,3)(1,7)(5,1) = (3,3)
55 nx_h264_mvp(3,3,2, 1,7,2, 5,1,2, 0, o)
56 chk(fd, "no-match->median\x00" as *u8, o[0], o[1], 3, 3, okp)
57
58 // 6. directional 16x8 part0: refB==refIdx -> mvB(7,7) (median would be 0)
59 nx_h264_mvp_directional(1, 0, 0,0,1, 7,7,0, 0,0,1, 0, o)
60 chk(fd, "dir-16x8-p0->B\x00" as *u8, o[0], o[1], 7, 7, okp)
61 // 7. directional 16x8 part1: refA==refIdx -> mvA(7,7)
62 nx_h264_mvp_directional(1, 1, 7,7,0, 0,0,1, 0,0,1, 0, o)
63 chk(fd, "dir-16x8-p1->A\x00" as *u8, o[0], o[1], 7, 7, okp)
64 // 8. directional 8x16 part1: refC==refIdx -> mvC(6,6)
65 nx_h264_mvp_directional(2, 1, 0,0,1, 0,0,1, 6,6,0, 0, o)
66 chk(fd, "dir-8x16-p1->C\x00" as *u8, o[0], o[1], 6, 6, okp)
67
68 if okp[0] == 1 {
69 gp(fd, "H264-MVPRED-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8)
70 if fd > 0 { sys_close(fd) }
71 sys_exit(0)
72 return 0
73 }
74 gp(fd, "H264-MVPRED-GATE result=FAIL verdict=RED\n\x00" as *u8)
75 if fd > 0 { sys_close(fd) }
76 sys_exit(1)
77 return 1
78}