code wiki / (root) / nx_h264_sps_gate.nx

nx_h264_sps_gate.nx source

↩ module page · 83 lines · 3896 B

1// nx_h264_sps_gate.nx -- REFEREE for the H.264 SPS parser (rung 3). 2// REAL worked example (Cardinal Peak): SPS NAL 67 42 00 0a f8 41 a2. 3// RBSP (after 0x67 header) = 42 00 0a f8 41 a2 -> 4// profile_idc=66 (Baseline), level_idc=10, pic_width_in_mbs_minus1=7, 5// pic_height_in_map_units_minus1=5, frame_mbs_only=1 -> 128 x 96. 6// Plus RBSP de-emulation KAT: 00 00 03 01 00 00 03 02 -> 00 00 01 00 00 02 (len6). 7// Every value PRINTED. stdout + knowledge/status/h264_sps_gate.log. Exit 0/1. 8// Sovereign: nx_syscalls + nx_h264_bits + nx_h264_sps. license_tier: ORIGINAL 9import "nx_syscalls.nx" 10import "nx_h264_bits.nx" 11import "nx_h264_sps.nx" 12 13func gp(logfd: i64, s: *u8) -> i64 { 14 var n: i64 = 0 15 while s[n] != (0 as u8) { n = n + 1 } 16 sys_write(1, s, n) 17 if logfd > 0 { sys_write(logfd, s, n) } 18 return 0 19} 20func gn(logfd: i64, v: i64) -> i64 { 21 let bb: *u8 = sys_mmap(28) 22 var m: i64 = v 23 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if logfd > 0 { sys_write(logfd, "-\x00" as *u8, 1) } m = 0 - m } 24 let t: *u8 = sys_mmap(28) 25 var k: i64 = 0 26 if m == 0 { t[0] = 48 as u8; k = 1 } 27 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 28 var i: i64 = 0 29 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 30 sys_write(1, bb, k) 31 if logfd > 0 { sys_write(logfd, bb, k) } 32 return 0 33} 34 35func main() -> i64 { 36 let logfd: i64 = sys_openat_append("knowledge/status/h264_sps_gate.log\x00" as *u8, 0x1a4) 37 gp(logfd, "H264-SPS-GATE (rung 3, real worked example)\n\x00" as *u8) 38 39 // de-emulation KAT 40 let esc: *u8 = sys_mmap(16) 41 esc[0]=0 as u8; esc[1]=0 as u8; esc[2]=3 as u8; esc[3]=1 as u8; esc[4]=0 as u8; esc[5]=0 as u8; esc[6]=3 as u8; esc[7]=2 as u8 42 let dst: *u8 = sys_mmap(16) 43 let dl: i64 = nx_h264_unescape_rbsp(esc, 8, dst) 44 gp(logfd, " unescape len=\x00" as *u8); gn(logfd, dl) 45 gp(logfd, " [\x00" as *u8); gn(logfd, dst[0] as i64); gp(logfd, ",\x00" as *u8); gn(logfd, dst[1] as i64); gp(logfd, ",\x00" as *u8); gn(logfd, dst[2] as i64); gp(logfd, ",\x00" as *u8); gn(logfd, dst[3] as i64); gp(logfd, ",\x00" as *u8); gn(logfd, dst[4] as i64); gp(logfd, ",\x00" as *u8); gn(logfd, dst[5] as i64); gp(logfd, "]\n\x00" as *u8) 46 47 // SPS RBSP (NAL header 0x67 stripped) 48 let sps: *u8 = sys_mmap(16) 49 sps[0]=0x42 as u8; sps[1]=0x00 as u8; sps[2]=0x0a as u8; sps[3]=0xf8 as u8; sps[4]=0x41 as u8; sps[5]=0xa2 as u8 50 let out: *i64 = sys_mmap(128) as *i64 51 nx_h264_parse_sps(sps, 6, out) 52 gp(logfd, " SPS profile=\x00" as *u8); gn(logfd, out[0]); gp(logfd, " level=\x00" as *u8); gn(logfd, out[1]) 53 gp(logfd, " w_mbs_m1=\x00" as *u8); gn(logfd, out[4]); gp(logfd, " h_map_m1=\x00" as *u8); gn(logfd, out[5]) 54 gp(logfd, " frame_mbs_only=\x00" as *u8); gn(logfd, out[6]) 55 gp(logfd, " -> \x00" as *u8); gn(logfd, out[2]); gp(logfd, "x\x00" as *u8); gn(logfd, out[3]); gp(logfd, "\n\x00" as *u8) 56 57 var ok: i64 = 1 58 if dl != 6 { ok = 0 } 59 if (dst[0] as i64) != 0 { ok = 0 } 60 if (dst[1] as i64) != 0 { ok = 0 } 61 if (dst[2] as i64) != 1 { ok = 0 } 62 if (dst[3] as i64) != 0 { ok = 0 } 63 if (dst[4] as i64) != 0 { ok = 0 } 64 if (dst[5] as i64) != 2 { ok = 0 } 65 if out[0] != 66 { ok = 0 } // Baseline 66 if out[1] != 10 { ok = 0 } // level 1.0 67 if out[4] != 7 { ok = 0 } // pic_width_in_mbs_minus1 68 if out[5] != 5 { ok = 0 } // pic_height_in_map_units_minus1 69 if out[6] != 1 { ok = 0 } // frame_mbs_only 70 if out[2] != 128 { ok = 0 } // width 71 if out[3] != 96 { ok = 0 } // height 72 73 if ok == 1 { 74 gp(logfd, "H264-SPS-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8) 75 if logfd > 0 { sys_close(logfd) } 76 sys_exit(0) 77 return 0 78 } 79 gp(logfd, "H264-SPS-GATE result=FAIL verdict=RED\n\x00" as *u8) 80 if logfd > 0 { sys_close(logfd) } 81 sys_exit(1) 82 return 1 83}