nx_timeline_gate.nx source
↩ module page · 96 lines · 4077 B
1// nx_timeline_gate.nx -- REFEREE for R4b (nx_timeline schedule).
2// Q=16384. Case A: 2 clips len[5,5], window[2] -> overlap crossfade.
3// expect 8 frames: A0,A1,A2 ; xfade(A3,B0)@Q/3, xfade(A4,B1)@2Q/3 ; B2,B3,B4
4// Case B: 2 clips len[5,5], window[0] -> hard cut, 10 straight frames, no blend.
5// Asserts the full schedule by record. Every value PRINTED. Exit 0/1.
6// Sovereign: nx_syscalls + nx_timeline. license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_timeline.nx"
9
10func gp(logfd: i64, s: *u8) -> i64 {
11 var n: i64 = 0
12 while s[n] != (0 as u8) { n = n + 1 }
13 sys_write(1, s, n)
14 if logfd > 0 { sys_write(logfd, s, n) }
15 return 0
16}
17func gn(logfd: i64, v: i64) -> i64 {
18 let bb: *u8 = sys_mmap(28)
19 var m: i64 = v
20 if m < 0 { sys_write(1, "-\x00" as *u8, 1); if logfd > 0 { sys_write(logfd, "-\x00" as *u8, 1) } m = 0 - m }
21 let t: *u8 = sys_mmap(28)
22 var k: i64 = 0
23 if m == 0 { t[0] = 48 as u8; k = 1 }
24 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
25 var i: i64 = 0
26 while i < k { bb[i] = t[k - 1 - i]; i = i + 1 }
27 sys_write(1, bb, k)
28 if logfd > 0 { sys_write(logfd, bb, k) }
29 return 0
30}
31func rec_eq(recs: *i64, i: i64, mode: i64, sa: i64, fa: i64, sb: i64, fb: i64, pr: i64) -> i64 {
32 if recs[i * 6 + 0] != mode { return 0 }
33 if recs[i * 6 + 1] != sa { return 0 }
34 if recs[i * 6 + 2] != fa { return 0 }
35 if recs[i * 6 + 3] != sb { return 0 }
36 if recs[i * 6 + 4] != fb { return 0 }
37 if recs[i * 6 + 5] != pr { return 0 }
38 return 1
39}
40func dump(logfd: i64, recs: *i64, n: i64) -> i64 {
41 var i: i64 = 0
42 while i < n {
43 gp(logfd, " [\x00" as *u8); gn(logfd, i); gp(logfd, "] mode=\x00" as *u8); gn(logfd, recs[i*6+0])
44 gp(logfd, " A=\x00" as *u8); gn(logfd, recs[i*6+1]); gp(logfd, ":\x00" as *u8); gn(logfd, recs[i*6+2])
45 gp(logfd, " B=\x00" as *u8); gn(logfd, recs[i*6+3]); gp(logfd, ":\x00" as *u8); gn(logfd, recs[i*6+4])
46 gp(logfd, " prog=\x00" as *u8); gn(logfd, recs[i*6+5]); gp(logfd, "\n\x00" as *u8)
47 i = i + 1
48 }
49 return 0
50}
51
52func main() -> i64 {
53 let logfd: i64 = sys_openat_append("knowledge/status/timeline_gate.log\x00" as *u8, 0x1a4)
54 gp(logfd, "TIMELINE-GATE R4b (clip schedule)\n\x00" as *u8)
55 let Q: i64 = 16384
56 let lens: *i64 = sys_mmap(64) as *i64
57 let wins: *i64 = sys_mmap(64) as *i64
58 let recs: *i64 = sys_mmap(64 * 6 * 8) as *i64
59
60 // Case A: crossfade window 2
61 lens[0] = 5; lens[1] = 5; wins[0] = 2
62 let nA: i64 = nx_timeline_plan(lens, 2, wins, Q, recs, 64)
63 gp(logfd, " CASE A len[5,5] win[2] -> frames=\x00" as *u8); gn(logfd, nA); gp(logfd, "\n\x00" as *u8)
64 dump(logfd, recs, nA)
65 var ok: i64 = 1
66 if nA != 8 { ok = 0 }
67 if rec_eq(recs, 0, 0, 0, 0, 0, 0, 0) != 1 { ok = 0 }
68 if rec_eq(recs, 2, 0, 0, 2, 0, 0, 0) != 1 { ok = 0 }
69 if rec_eq(recs, 3, 1, 0, 3, 1, 0, Q / 3) != 1 { ok = 0 }
70 if rec_eq(recs, 4, 1, 0, 4, 1, 1, 2 * Q / 3) != 1 { ok = 0 }
71 if rec_eq(recs, 5, 0, 1, 2, 0, 0, 0) != 1 { ok = 0 }
72 if rec_eq(recs, 7, 0, 1, 4, 0, 0, 0) != 1 { ok = 0 }
73
74 // Case B: hard cut
75 lens[0] = 5; lens[1] = 5; wins[0] = 0
76 let nB: i64 = nx_timeline_plan(lens, 2, wins, Q, recs, 64)
77 gp(logfd, " CASE B len[5,5] win[0] -> frames=\x00" as *u8); gn(logfd, nB); gp(logfd, "\n\x00" as *u8)
78 if nB != 10 { ok = 0 }
79 if rec_eq(recs, 4, 0, 0, 4, 0, 0, 0) != 1 { ok = 0 } // last A frame, straight
80 if rec_eq(recs, 5, 0, 1, 0, 0, 0, 0) != 1 { ok = 0 } // first B frame, straight (no blend)
81 var anyblend: i64 = 0
82 var z: i64 = 0
83 while z < nB { if recs[z * 6 + 0] == 1 { anyblend = 1 } z = z + 1 }
84 if anyblend != 0 { ok = 0 } // hard cut has zero blends
85
86 if ok == 1 {
87 gp(logfd, "TIMELINE-GATE result=ALL-PASS verdict=GREEN\n\x00" as *u8)
88 if logfd > 0 { sys_close(logfd) }
89 sys_exit(0)
90 return 0
91 }
92 gp(logfd, "TIMELINE-GATE result=FAIL verdict=RED\n\x00" as *u8)
93 if logfd > 0 { sys_close(logfd) }
94 sys_exit(1)
95 return 1
96}