code wiki / (root) / nx_h264_nal_gate.nx

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}