nx_mp4_stbl_gate.nx source
↩ module page · 111 lines · 5291 B
1// nx_mp4_stbl_gate.nx -- REFEREE for the MP4 sample-table reader (rung 1).
2// Synthesizes a byte-exact MP4 with a full video stbl using a cursor builder:
3// ftyp + moov{ trak{ mdia{ hdlr(vide) + minf{ stbl{
4// stsd(entry fourCC=avc1) + stsz(size=0,count=3,[100,120,90]) + stco(1) }}}}}
5// Asserts nx_mp4_video_info reports codec=H264, frames=3, chunks=1.
6// Also a VP9 variant -> codec=VP9. Every value PRINTED. Exit 0/1.
7// Sovereign: nx_syscalls + nx_mp4_demux + nx_mp4_stbl. license_tier: ORIGINAL
8import "nx_syscalls.nx"
9import "nx_mp4_demux.nx"
10import "nx_mp4_stbl.nx"
11
12func gp(logfd: i64, s: *u8) -> i64 {
13 var n: i64 = 0
14 while s[n] != (0 as u8) { n = n + 1 }
15 sys_write(1, s, n)
16 if logfd > 0 { sys_write(logfd, s, n) }
17 return 0
18}
19func gn(logfd: i64, v: i64) -> i64 {
20 let bb: *u8 = sys_mmap(28)
21 var m: i64 = v
22 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if logfd > 0 { sys_write(logfd, "-\x00" as *u8, 1) } m = 0 - m }
23 let t: *u8 = sys_mmap(28)
24 var k: i64 = 0
25 if m == 0 { t[0] = 48 as u8; k = 1 }
26 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
27 var i: i64 = 0
28 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
29 sys_write(1, bb, k)
30 if logfd > 0 { sys_write(logfd, bb, k) }
31 return 0
32}
33func wbe32(b: *u8, o: i64, v: i64) -> i64 {
34 b[o] = ((v / 16777216) % 256) as u8; b[o + 1] = ((v / 65536) % 256) as u8
35 b[o + 2] = ((v / 256) % 256) as u8; b[o + 3] = (v % 256) as u8
36 return 0
37}
38func wt4(b: *u8, o: i64, s: *u8) -> i64 { b[o] = s[0]; b[o + 1] = s[1]; b[o + 2] = s[2]; b[o + 3] = s[3]; return 0 }
39
40// cursor box open: reserve 8-byte header, set type, advance; return header offset
41func bopen(b: *u8, cur: *i64, ty: *u8) -> i64 { let o: i64 = cur[0]; wt4(b, o + 4, ty); cur[0] = o + 8; return o }
42func bclose(b: *u8, cur: *i64, hdr: i64) -> i64 { wbe32(b, hdr, cur[0] - hdr); return 0 }
43func w32(b: *u8, cur: *i64, v: i64) -> i64 { wbe32(b, cur[0], v); cur[0] = cur[0] + 4; return 0 }
44func wty(b: *u8, cur: *i64, s: *u8) -> i64 { wt4(b, cur[0], s); cur[0] = cur[0] + 4; return 0 }
45
46// build a full MP4 with a video stbl carrying the given codec fourCC; returns len
47func build(b: *u8, codec: *u8) -> i64 {
48 let cur: *i64 = sys_mmap(16) as *i64
49 cur[0] = 0
50 let hf: i64 = bopen(b, cur, "ftyp\x00" as *u8); wty(b, cur, "isom\x00" as *u8); w32(b, cur, 0); wty(b, cur, "isom\x00" as *u8); bclose(b, cur, hf)
51 let hm: i64 = bopen(b, cur, "moov\x00" as *u8)
52 let ht: i64 = bopen(b, cur, "trak\x00" as *u8)
53 let hd: i64 = bopen(b, cur, "mdia\x00" as *u8)
54 let hh: i64 = bopen(b, cur, "hdlr\x00" as *u8)
55 w32(b, cur, 0); w32(b, cur, 0); wty(b, cur, "vide\x00" as *u8); w32(b, cur, 0); w32(b, cur, 0); w32(b, cur, 0)
56 bclose(b, cur, hh)
57 let hi: i64 = bopen(b, cur, "minf\x00" as *u8)
58 let hs: i64 = bopen(b, cur, "stbl\x00" as *u8)
59 let hsd: i64 = bopen(b, cur, "stsd\x00" as *u8)
60 w32(b, cur, 0); w32(b, cur, 1) // ver/flags, entry_count
61 w32(b, cur, 16); wty(b, cur, codec); w32(b, cur, 0); w32(b, cur, 0) // entry: size, fourCC, filler
62 bclose(b, cur, hsd)
63 let hsz: i64 = bopen(b, cur, "stsz\x00" as *u8)
64 w32(b, cur, 0); w32(b, cur, 0); w32(b, cur, 3); w32(b, cur, 100); w32(b, cur, 120); w32(b, cur, 90)
65 bclose(b, cur, hsz)
66 let hco: i64 = bopen(b, cur, "stco\x00" as *u8)
67 w32(b, cur, 0); w32(b, cur, 1); w32(b, cur, 99999)
68 bclose(b, cur, hco)
69 bclose(b, cur, hs); bclose(b, cur, hi); bclose(b, cur, hd); bclose(b, cur, ht); bclose(b, cur, hm)
70 return cur[0]
71}
72
73func main() -> i64 {
74 let logfd: i64 = sys_openat_append("knowledge/status/mp4_stbl_gate.log\x00" as *u8, 0x1a4)
75 gp(logfd, "MP4-STBL-GATE (sample-table / codec id, rung1)\n\x00" as *u8)
76
77 let h264: *u8 = sys_mmap(512)
78 let lh: i64 = build(h264, "avc1\x00" as *u8)
79 let vp9: *u8 = sys_mmap(512)
80 let lv: i64 = build(vp9, "vp09\x00" as *u8)
81
82 let o1: *i64 = sys_mmap(64) as *i64
83 let o2: *i64 = sys_mmap(64) as *i64
84 let f1: i64 = nx_mp4_video_info(h264, lh, o1)
85 let f2: i64 = nx_mp4_video_info(vp9, lv, o2)
86
87 gp(logfd, " H264 file(\x00" as *u8); gn(logfd, lh); gp(logfd, "B): found=\x00" as *u8); gn(logfd, f1)
88 gp(logfd, " codec=\x00" as *u8); gn(logfd, o1[0]); gp(logfd, " frames=\x00" as *u8); gn(logfd, o1[1])
89 gp(logfd, " samp_size=\x00" as *u8); gn(logfd, o1[2]); gp(logfd, " chunks=\x00" as *u8); gn(logfd, o1[3]); gp(logfd, "\n\x00" as *u8)
90 gp(logfd, " VP9 file: codec=\x00" as *u8); gn(logfd, o2[0]); gp(logfd, " (1=H264 3=VP9)\n\x00" as *u8)
91
92 var ok: i64 = 1
93 if f1 != 1 { ok = 0 }
94 if o1[0] != NX_CODEC_H264 { ok = 0 } // codec named correctly
95 if o1[1] != 3 { ok = 0 } // 3 frames
96 if o1[2] != 0 { ok = 0 } // per-sample size table (size field 0)
97 if o1[3] != 1 { ok = 0 } // 1 chunk
98 if f2 != 1 { ok = 0 }
99 if o2[0] != NX_CODEC_VP9 { ok = 0 } // VP9 variant classified
100
101 if ok == 1 {
102 gp(logfd, "MP4-STBL-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8)
103 if logfd > 0 { sys_close(logfd) }
104 sys_exit(0)
105 return 0
106 }
107 gp(logfd, "MP4-STBL-GATE result=FAIL verdict=RED\n\x00" as *u8)
108 if logfd > 0 { sys_close(logfd) }
109 sys_exit(1)
110 return 1
111}