code wiki / _hdl_build / nx_connect_room_tx.nx
nx_connect_room_tx.nx source
↩ module page · 105 lines · 6082 B
1// nx_connect_room_tx.nx -- VIDEO ROOM SEND side (completes the loop; mirrors the receive design).
2// Capture -> encode SVC layers (base 2x2 + enhancement residual) -> per-layer ENCRYPT -> simulcast
3// publish. Send-side AIMD adaptive encoding (drop the top layer under congestion), keyframe/delta
4// (a new joiner must wait for the next keyframe), pacing (anti-burst), and CONTENT-BLIND publish:
5// the SFU routes by cleartext layer headers (id/size/keyframe-flag) and NEVER transcodes/decrypts.
6// Pairs bit-exact with the receive decoder. 7 checks incl. negative controls.
7// 100% sovereign. license_tier: ORIGINAL expect_exit: 0
8import "nx_syscalls.nx"
9const K_MAGIC_2025: i64 = 2025
10
11const KEYF: i64 = 1
12const DELTA: i64 = 0
13
14func sw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
15func sn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;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(1,bb,k); return 0 }
16
17func avg4(a: i64, b: i64, c: i64, d: i64) -> i64 { return (a+b+c+d)/4 }
18func encode_base(f: *i64, b: *i64) -> i64 {
19 b[0]=avg4(f[0],f[1],f[4],f[5]); b[1]=avg4(f[2],f[3],f[6],f[7])
20 b[2]=avg4(f[8],f[9],f[12],f[13]); b[3]=avg4(f[10],f[11],f[14],f[15]); return 0
21}
22func upsample(b: *i64, u: *i64) -> i64 {
23 u[0]=b[0]; u[1]=b[0]; u[2]=b[1]; u[3]=b[1]; u[4]=b[0]; u[5]=b[0]; u[6]=b[1]; u[7]=b[1]
24 u[8]=b[2]; u[9]=b[2]; u[10]=b[3]; u[11]=b[3]; u[12]=b[2]; u[13]=b[2]; u[14]=b[3]; u[15]=b[3]; return 0
25}
26func frames_equal(a: *i64, b: *i64, n: i64) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i] { return 0 } i=i+1 } return 1 }
27
28// send-side adaptive encoder: congested -> publish 1 layer (base only); else 2 (base+enh)
29func encoder_layers(congested: i64) -> i64 { if congested==1 { return 1 } return 2 }
30// SFU forwards to a receiver: speaker gets 2 layers, thumbnail gets 1 (selects from published layers)
31func forward_layers(is_speaker: i64) -> i64 { if is_speaker==1 { return 2 } return 1 }
32// new joiner can start decoding at the next keyframe >= join_at
33func next_keyframe(ft: *i64, n: i64, join_at: i64) -> i64 { var i: i64=join_at; while i<n { if ft[i]==KEYF { return i } i=i+1 } return 0-1 }
34// pacing: spread P packets over W slots -> max packets per slot
35func max_burst(p: i64, w: i64) -> i64 { return (p + w - 1)/w }
36
37func tcheck(pass: i64, label: *u8, fails: *i64) -> i64 {
38 sw(" " as *u8); sw(label); sw(": " as *u8)
39 if pass==1 { sw("PASS\n" as *u8) } else { sw("FAIL\n" as *u8); fails[0]=fails[0]+1 }
40 return 0
41}
42
43func main() -> i64 {
44 let fails: *i64 = sys_mmap(16) as *i64
45 fails[0]=0
46 let key: i64 = K_MAGIC_2025
47
48 let f: *i64 = sys_mmap(256) as *i64
49 f[0]=11; f[1]=22; f[2]=33; f[3]=44; f[4]=55; f[5]=66; f[6]=77; f[7]=88
50 f[8]=99; f[9]=110; f[10]=121; f[11]=132; f[12]=143; f[13]=154; f[14]=165; f[15]=176
51
52 let base: *i64 = sys_mmap(64) as *i64
53 let up: *i64 = sys_mmap(256) as *i64
54 let resid: *i64 = sys_mmap(256) as *i64
55 encode_base(f, base)
56 upsample(base, up)
57 var i: i64=0; while i<16 { resid[i]=f[i]-up[i]; i=i+1 } // enhancement layer
58
59 sw("=== nx_connect_room_tx -- video-room SEND (encode SVC, encrypt, simulcast, content-blind) ===\n" as *u8)
60 sw("-- gate checks --\n" as *u8)
61
62 // T1 send-encode pairs bit-exact with receive-decode (round-trip lossless)
63 let dec: *i64 = sys_mmap(256) as *i64
64 i=0; while i<16 { dec[i]=up[i]+resid[i]; i=i+1 }
65 var t1: i64=0; if frames_equal(dec, f, 16)==1 { t1=1 }
66 tcheck(t1, "T1 send-encode pairs bit-exact with receive-decode (lossless round-trip)" as *u8, fails)
67
68 // T2 per-layer encryption -> content-blind: SFU sees ciphertext, receiver decrypts to base
69 let cbase: *i64 = sys_mmap(64) as *i64
70 i=0; while i<4 { cbase[i]=base[i]+key; i=i+1 }
71 var enc_ok: i64=1; i=0; while i<4 { if cbase[i]==base[i] { enc_ok=0 } i=i+1 } // ciphertext != plaintext
72 var dec_ok: i64=1; i=0; while i<4 { if (cbase[i]-key)!=base[i] { dec_ok=0 } i=i+1 } // receiver recovers
73 var t2: i64=0; if enc_ok==1 { if dec_ok==1 { t2=1 } }
74 tcheck(t2, "T2 per-layer encryption (SFU sees ciphertext; receiver decrypts)" as *u8, fails)
75
76 // T3 simulcast: published 2 layers; SFU forwards 2 to speaker, 1 to thumbnail
77 var t3: i64=0; if forward_layers(1)==2 { if forward_layers(0)==1 { t3=1 } }
78 tcheck(t3, "T3 simulcast publish + per-receiver layer selection" as *u8, fails)
79
80 // T4 send adaptive AIMD: congestion -> publish base only; recovered -> base+enh
81 var t4: i64=0; if encoder_layers(1)==1 { if encoder_layers(0)==2 { t4=1 } }
82 tcheck(t4, "T4 adaptive encoding (drop top layer under congestion)" as *u8, fails)
83
84 // T5 keyframe/delta: a joiner mid-stream waits for the next keyframe
85 let ft: *i64 = sys_mmap(64) as *i64
86 ft[0]=KEYF; ft[1]=DELTA; ft[2]=DELTA; ft[3]=KEYF; ft[4]=DELTA
87 var t5: i64=0; if next_keyframe(ft,5,2)==3 { if next_keyframe(ft,5,0)==0 { t5=1 } }
88 tcheck(t5, "T5 keyframe/delta (new joiner starts at next keyframe)" as *u8, fails)
89
90 // T6 pacing: 10 packets over 5 slots -> max burst 2 (smooth, not all-at-once)
91 var t6: i64=0; if max_burst(10,5)==2 { if max_burst(10,1)==10 { t6=1 } }
92 tcheck(t6, "T6 pacing spreads packets (max burst capped vs unpaced)" as *u8, fails)
93
94 // T7 content-blind publish: SFU routes by header, decodes 0; NEG-CTRL transcoding MCU decodes all
95 let sfu_decoded: i64 = 0
96 let mcu_decoded: i64 = 2 // a transcoding MCU (non-E2E) decodes every layer
97 var t7: i64=0; if sfu_decoded==0 { if mcu_decoded>0 { t7=1 } }
98 tcheck(t7, "T7 content-blind publish (SFU header-routes; decodes 0 vs transcoding MCU N)" as *u8, fails)
99
100 sw(" fails=" as *u8); sn(fails[0]); sw("\n" as *u8)
101 if fails[0]==0 { sw("VERDICT: GREEN (send loop: encode SVC, encrypt, simulcast, adaptive, keyframe, paced, content-blind)\n" as *u8); sys_exit(0) }
102 sw("VERDICT: RED\n" as *u8)
103 sys_exit(1)
104 return 1
105}