nx_h264_nal_gate.nx source
↩ module page · 95 lines · 4398 B
1// nx_h264_nal_gate.nx -- REFEREE for the H.264 NAL splitter (rung 2b).
2// AVCC (len_size=4): [3][67 42 00][2][68 CE][4][65 88 84 00]
3// -> 3 NALs, types [7=SPS,8=PPS,5=IDR], payload offsets [4,11,17]
4// Annex B: 00 00 01 67 42 00 00 00 01 65 88 00 -> 2 NALs, types [7,5]
5// header decode: 0x67->type7/ref3, 0x68->8, 0x65->5, 0x41->1/ref2
6// Every value PRINTED. stdout + knowledge/status/h264_nal_gate.log. Exit 0/1.
7// Sovereign: nx_syscalls + nx_h264_nal. license_tier: ORIGINAL
8import "nx_syscalls.nx"
9import "nx_h264_nal.nx"
10
11func gp(logfd: i64, s: *u8) -> i64 {
12 var n: i64 = 0
13 while s[n] != (0 as u8) { n = n + 1 }
14 sys_write(1, s, n)
15 if logfd > 0 { sys_write(logfd, s, n) }
16 return 0
17}
18func gn(logfd: i64, v: i64) -> i64 {
19 let bb: *u8 = sys_mmap(28)
20 var m: i64 = v
21 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if logfd > 0 { sys_write(logfd, "-\x00" as *u8, 1) } m = 0 - m }
22 let t: *u8 = sys_mmap(28)
23 var k: i64 = 0
24 if m == 0 { t[0] = 48 as u8; k = 1 }
25 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
26 var i: i64 = 0
27 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
28 sys_write(1, bb, k)
29 if logfd > 0 { sys_write(logfd, bb, k) }
30 return 0
31}
32
33func main() -> i64 {
34 let logfd: i64 = sys_openat_append("knowledge/status/h264_nal_gate.log\x00" as *u8, 0x1a4)
35 gp(logfd, "H264-NAL-GATE (rung 2b NAL splitter)\n\x00" as *u8)
36
37 // AVCC buffer, len_size=4
38 let av: *u8 = sys_mmap(64)
39 av[0]=0 as u8; av[1]=0 as u8; av[2]=0 as u8; av[3]=3 as u8; av[4]=0x67 as u8; av[5]=0x42 as u8; av[6]=0 as u8
40 av[7]=0 as u8; av[8]=0 as u8; av[9]=0 as u8; av[10]=2 as u8; av[11]=0x68 as u8; av[12]=0xCE as u8
41 av[13]=0 as u8; av[14]=0 as u8; av[15]=0 as u8; av[16]=4 as u8; av[17]=0x65 as u8; av[18]=0x88 as u8; av[19]=0x84 as u8; av[20]=0 as u8
42 let offs: *i64 = sys_mmap(64 * 8) as *i64
43 let types: *i64 = sys_mmap(64 * 8) as *i64
44 let cA: i64 = nx_nal_split_avcc(av, 0, 21, 4, offs, types, 64)
45 gp(logfd, " AVCC count=\x00" as *u8); gn(logfd, cA); gp(logfd, " types=[\x00" as *u8); gn(logfd, types[0]); gp(logfd, ",\x00" as *u8); gn(logfd, types[1]); gp(logfd, ",\x00" as *u8); gn(logfd, types[2]); gp(logfd, "] offs=[\x00" as *u8); gn(logfd, offs[0]); gp(logfd, ",\x00" as *u8); gn(logfd, offs[1]); gp(logfd, ",\x00" as *u8); gn(logfd, offs[2]); gp(logfd, "]\n\x00" as *u8)
46
47 // Annex B buffer
48 let ab: *u8 = sys_mmap(64)
49 ab[0]=0 as u8; ab[1]=0 as u8; ab[2]=1 as u8; ab[3]=0x67 as u8; ab[4]=0x42 as u8; ab[5]=0 as u8
50 ab[6]=0 as u8; ab[7]=0 as u8; ab[8]=1 as u8; ab[9]=0x65 as u8; ab[10]=0x88 as u8; ab[11]=0 as u8
51 let offs2: *i64 = sys_mmap(64 * 8) as *i64
52 let types2: *i64 = sys_mmap(64 * 8) as *i64
53 let cB: i64 = nx_nal_split_annexb(ab, 0, 12, offs2, types2, 64)
54 gp(logfd, " AnnexB count=\x00" as *u8); gn(logfd, cB); gp(logfd, " types=[\x00" as *u8); gn(logfd, types2[0]); gp(logfd, ",\x00" as *u8); gn(logfd, types2[1]); gp(logfd, "]\n\x00" as *u8)
55
56 // header decode
57 let t67: i64 = nx_nal_type(0x67)
58 let r67: i64 = nx_nal_ref_idc(0x67)
59 let t68: i64 = nx_nal_type(0x68)
60 let t65: i64 = nx_nal_type(0x65)
61 let t41: i64 = nx_nal_type(0x41)
62 let r41: i64 = nx_nal_ref_idc(0x41)
63 gp(logfd, " hdr: 0x67->type\x00" as *u8); gn(logfd, t67); gp(logfd, "/ref\x00" as *u8); gn(logfd, r67)
64 gp(logfd, " 0x68->\x00" as *u8); gn(logfd, t68); gp(logfd, " 0x65->\x00" as *u8); gn(logfd, t65)
65 gp(logfd, " 0x41->\x00" as *u8); gn(logfd, t41); gp(logfd, "/ref\x00" as *u8); gn(logfd, r41); gp(logfd, "\n\x00" as *u8)
66
67 var ok: i64 = 1
68 if cA != 3 { ok = 0 }
69 if types[0] != 7 { ok = 0 }
70 if types[1] != 8 { ok = 0 }
71 if types[2] != 5 { ok = 0 }
72 if offs[0] != 4 { ok = 0 }
73 if offs[1] != 11 { ok = 0 }
74 if offs[2] != 17 { ok = 0 }
75 if cB != 2 { ok = 0 }
76 if types2[0] != 7 { ok = 0 }
77 if types2[1] != 5 { ok = 0 }
78 if t67 != 7 { ok = 0 }
79 if r67 != 3 { ok = 0 }
80 if t68 != 8 { ok = 0 }
81 if t65 != 5 { ok = 0 }
82 if t41 != 1 { ok = 0 }
83 if r41 != 2 { ok = 0 }
84
85 if ok == 1 {
86 gp(logfd, "H264-NAL-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8)
87 if logfd > 0 { sys_close(logfd) }
88 sys_exit(0)
89 return 0
90 }
91 gp(logfd, "H264-NAL-GATE result=FAIL verdict=RED\n\x00" as *u8)
92 if logfd > 0 { sys_close(logfd) }
93 sys_exit(1)
94 return 1
95}