code wiki / _hdl_build / nx_cam_poster_gate.nx
nx_cam_poster_gate.nx source
↩ module page · 80 lines · 3488 B
1import "nx_gate_gn.nx"
2// nx_cam_poster_gate.nx -- END-TO-END referee for the CAVLC cam-poster pipeline.
3// Forks _offc/nx_cam_poster.elf on a REAL CAVLC recording (argv[1]) and validates the produced JPEG:
4// T1 child rc==0 (decode full_sync + poster written)
5// T2 JPEG framing: starts FFD8 (SOI), ends FFD9 (EOI)
6// T3 non-trivial size (a real encoded frame, not an empty stub)
7// GREEN iff all three. This is a TRUE end-to-end gate: TS demux -> CAVLC decode -> YUV -> RGB -> JPEG.
8// Run: nx_cam_poster_gate <cavlc.ts> [out.jpg] (cwd = nishihost so _offc/ + knowledge/ resolve)
9// license_tier: ORIGINAL
10import "nx_syscalls.nx"
11
12func gnum(logfd: i64, v: i64) -> i64 {
13 let b: *u8 = sys_mmap(28)
14 var m: i64 = v
15 if m < 0 { m = 0 - m }
16 let t: *u8 = sys_mmap(28)
17 var k: i64 = 0
18 if m == 0 { t[0] = 48 as u8; k = 1 }
19 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
20 var i: i64 = 0
21 while i < k { b[i] = t[k-1-i]; i = i + 1 }
22 sys_write(1, b, k)
23 if logfd > 0 { sys_write(logfd, b, k) }
24 return 0
25}
26func gp(logfd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); if logfd > 0 { sys_write(logfd, s, n) } return 0 }
27
28func run_child(path: *u8, a1: *u8, a2: *u8) -> i64 {
29 let pid: i64 = sys_fork()
30 if pid == 0 {
31 let av: *i64 = sys_mmap(8 * 4) as *i64
32 av[0] = path as i64; av[1] = a1 as i64; av[2] = a2 as i64; av[3] = 0
33 let envp: *i64 = sys_mmap(8 * 2) as *i64
34 envp[0] = "PATH=/usr/bin:/bin\x00" as *u8 as i64; envp[1] = 0
35 sys_execve(path, av, envp)
36 sys_exit(127)
37 }
38 let st: *i64 = sys_mmap(16) as *i64
39 sys_wait4(pid, st, 0)
40 let sig: i64 = st[0] & 0x7f
41 if sig != 0 { return 128 + sig }
42 return (st[0] >> 8) & 0xff
43}
44
45func main(argc: i64, argv: *i64) -> i64 {
46 if argc < 2 { gp(0, "usage: nx_cam_poster_gate <cavlc.ts> [out.jpg]\n\x00" as *u8); return 2 }
47 let rec: *u8 = argv[1] as *u8
48 var outp: *u8 = "knowledge/status/cam_poster_gate.jpg\x00" as *u8
49 if argc >= 3 { outp = argv[2] as *u8 }
50 let logfd: i64 = sys_openat_append("knowledge/status/cam_poster_gate.log\x00" as *u8, 0x1a4)
51 gp(logfd, "CAM-POSTER-GATE (end-to-end TS->CAVLC->YUV->RGB->JPEG)\n\x00" as *u8)
52
53 let rc: i64 = run_child("/volume1/homes/elderwesto/nishihost/buildroot/_offc/nx_cam_poster.elf\x00" as *u8, rec, outp)
54
55 let szp: *i64 = sys_mmap(16) as *i64
56 let jb: *u8 = sys_read_file(outp, szp)
57 var jlen: i64 = 0
58 var t2: i64 = 0
59 if (jb as i64) != 0 {
60 jlen = szp[0]
61 if jlen > 4 { if jb[0] == (0xff as u8) { if jb[1] == (0xd8 as u8) { if jb[jlen-2] == (0xff as u8) { if jb[jlen-1] == (0xd9 as u8) { t2 = 1 } } } } }
62 }
63 var t1: i64 = 0
64 if rc == 0 { t1 = 1 }
65 var t3: i64 = 0
66 if jlen > 1000 { t3 = 1 }
67
68 gp(logfd, " child_rc=\x00" as *u8); gnum(logfd, rc); gp(logfd, " jpeg_bytes=\x00" as *u8); gnum(logfd, jlen)
69 gp(logfd, " T1_rc0=\x00" as *u8); gnum(logfd, t1); gp(logfd, " T2_framing=\x00" as *u8); gnum(logfd, t2); gp(logfd, " T3_size=\x00" as *u8); gnum(logfd, t3); gp(logfd, "\n\x00" as *u8)
70 if t1 == 1 { if t2 == 1 { if t3 == 1 {
71 gp(logfd, "CAM-POSTER-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8)
72 if logfd > 0 { sys_close(logfd) }
73 sys_exit(0)
74 return 0
75 } } }
76 gp(logfd, "CAM-POSTER-GATE result=FAIL verdict=RED\n\x00" as *u8)
77 if logfd > 0 { sys_close(logfd) }
78 sys_exit(1)
79 return 1
80}