code wiki / (root) / nx_h264_mvpred_gate.nx

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}