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}