code wiki / _hdl_build / nx_room_jitterbuf.nx
nx_room_jitterbuf.nx source
↩ module page · 107 lines · 5494 B
1// nx_room_jitterbuf.nx -- X-ROOM (overseas-grade): sovereign DETERMINISTIC ADAPTIVE
2// JITTER BUFFER. After loss (handled by nx_room_fec), JITTER is the other killer of
3// intercontinental calls: packets over a long-haul path arrive with variable delay,
4// so a fixed buffer is either too small (late packets dropped = choppy) or too big
5// (constant added latency). This sizes the buffer from MEASURED jitter, causally.
6//
7// MODEL: r[i] = packet i's arrival delay RELATIVE to its ideal playout slot (ms),
8// anchored at packet 0 (clock-offset-free). A packet is ON-TIME iff r[i] <= target
9// depth chosen from PAST jitter (env = peak-hold with linear decay): target =
10// clamp(env+margin, min, max). Late packets are counted (they'd be concealed).
11// latency cost = the buffer depth (target); loss = #late.
12//
13// EXCEED axis (honest) vs Zoom/WebRTC/Teams jitter buffers: a deterministic,
14// audit-replayable depth controller that PARETO-DOMINATES fixed buffers on the same
15// trace -- fewer late-losses than a fixed-SMALL buffer AND lower average latency than
16// a fixed-LARGE buffer that achieves the same loss. Sovereign, integer-exact.
17//
18// main() is the SELF-VALIDATING GATE. Evidence -> knowledge/status/room_jitterbuf.log.
19// HONEST SCOPE: causal depth control on a relative-delay trace; full RFC3550 inter-
20// arrival estimator + playout-clock resync = deeper rung. license_tier: ORIGINAL
21import "nx_syscalls.nx"
22
23const JB_LOG: *u8 = "knowledge/status/room_jitterbuf.log"
24
25func jw(fd: i64, s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(fd, s, n); return 0 }
26func jwn(fd: i64, v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;k=1}; while m>0 {t[k]=(48+(m%10)) as u8; m=m/10; k=k+1}; var i: i64=0; while i<k {bb[i]=t[k-1-i]; i=i+1}; sys_write(fd, bb, k); return 0 }
27
28// run the trace r[0..N). fixed_target>=0 -> a FIXED buffer of that depth; <0 -> ADAPTIVE
29// (env peak-hold with linear decay). out[0]=late count, out[1]=sum of per-packet depth.
30func jb_run(r: *i64, N: i64, fixed_target: i64, margin: i64, mind: i64, maxd: i64, decay: i64, out: *i64) -> i64 {
31 var env: i64 = 0
32 var late: i64 = 0
33 var sumt: i64 = 0
34 var i: i64 = 0
35 while i < N {
36 var tgt: i64 = 0
37 if fixed_target >= 0 { tgt = fixed_target }
38 else {
39 tgt = env + margin
40 if tgt < mind { tgt = mind }
41 if tgt > maxd { tgt = maxd }
42 }
43 sumt = sumt + tgt
44 if r[i] > tgt { late = late + 1 } // arrived after its playout deadline -> concealed
45 if r[i] > env { env = r[i] } // learn AFTER the decision (causal)
46 else { env = env - decay; if env < 0 { env = 0 } }
47 i = i + 1
48 }
49 out[0] = late
50 out[1] = sumt
51 return 0
52}
53
54func main() -> i64 {
55 let N: i64 = 20
56 let r: *i64 = sys_mmap(8 * N) as *i64
57 // overseas-style trace: calm baseline 5ms with periodic jitter SPIKES to 45ms.
58 var i: i64 = 0
59 while i < N { r[i] = 5; i = i + 1 }
60 r[5] = 45; r[10] = 45; r[15] = 45
61 let out: *i64 = sys_mmap(8 * 2) as *i64
62 var ok: i64 = 1
63
64 let MARGIN: i64 = 10
65 let MIND: i64 = 15
66 let MAXD: i64 = 60
67 let DECAY: i64 = 2
68
69 // adaptive
70 jb_run(r, N, 0 - 1, MARGIN, MIND, MAXD, DECAY, out)
71 let late_a: i64 = out[0]
72 let avg_a: i64 = out[1] / N
73 // fixed-SMALL (depth = MIND)
74 jb_run(r, N, MIND, MARGIN, MIND, MAXD, DECAY, out)
75 let late_s: i64 = out[0]
76 // fixed-LARGE (depth = MAXD)
77 jb_run(r, N, MAXD, MARGIN, MIND, MAXD, DECAY, out)
78 let late_l: i64 = out[0]
79 let avg_l: i64 = out[1] / N
80
81 if late_l != 0 { ok = 0 } // sanity: the large buffer catches every packet
82 if late_s <= late_a { ok = 0 } // adaptive loses FEWER than the small buffer (loss win)
83 if avg_a >= avg_l { ok = 0 } // adaptive cheaper latency than the large buffer (latency win)
84 if late_a > 1 { ok = 0 } // adaptive near-optimal loss (only the first learning spike)
85
86 // tamper / neg-control: collapse the env decay (huge) -> adaptation is neutralized,
87 // the buffer can't hold near recent peaks, so late-loss rises toward the small buffer.
88 jb_run(r, N, 0 - 1, MARGIN, MIND, MAXD, 1000, out)
89 let late_t: i64 = out[0]
90 if late_t <= late_a { ok = 0 } // killing adaptation MUST worsen loss (env is load-bearing)
91
92 jw(1, "ROOMJBGATE late_adaptive=" as *u8); jwn(1, late_a); jw(1, " late_fixedsmall=" as *u8); jwn(1, late_s)
93 jw(1, " late_fixedlarge=" as *u8); jwn(1, late_l); jw(1, " avg_lat_adaptive=" as *u8); jwn(1, avg_a)
94 jw(1, " avg_lat_large=" as *u8); jwn(1, avg_l); jw(1, " late_noadapt=" as *u8); jwn(1, late_t)
95 if ok == 1 { jw(1, " verdict=GREEN\n" as *u8) } else { jw(1, " verdict=RED\n" as *u8) }
96
97 let lf: i64 = sys_openat_append(JB_LOG, 420)
98 if lf >= 0 {
99 jw(lf, "ROOMJBGATE late_adaptive=" as *u8); jwn(lf, late_a); jw(lf, " late_fixedsmall=" as *u8); jwn(lf, late_s)
100 jw(lf, " late_fixedlarge=" as *u8); jwn(lf, late_l); jw(lf, " avg_lat_adaptive=" as *u8); jwn(lf, avg_a)
101 jw(lf, " avg_lat_large=" as *u8); jwn(lf, avg_l); jw(lf, " late_noadapt=" as *u8); jwn(lf, late_t)
102 if ok == 1 { jw(lf, " verdict=GREEN\n" as *u8) } else { jw(lf, " verdict=RED\n" as *u8) }
103 sys_close(lf)
104 }
105 if ok == 1 { sys_exit(0) } else { sys_exit(1) }
106 return 0
107}