MPTS · TSDuck · PSI/SI






Stream Manager mux skladá viacero SPTS streamov do jedného CBR MPTS výstupu (DVB/IPTV). Adaptive Hybrid Statmux umožňuje hybrid (CBR core + VBR balanced fill) encodéry s konštantným výstupom muxu.
Pri statmux-zapnutom muxi každý FFmpeg encoder beží capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>. VBV buffer = 2× max dáva ~2 s peak rezervy. Pre statmux dostane aj GOP offset (-force_key_frames) deterministicky podľa stream_id, aby I-frame peaky všetkých kanálov nekoincidovali.
tsp -I null (∞ NULL packety @ line rate) → -P merge tsp -I ip <stream> (prekryje reálne packety) → -P continuity (alarm o drop) → -P pcradjust --bitrate X (prepíše PCRs) → -P pcrverify --jitter-max 500µs → -P bitrate_monitor (alarm ±5%) → -P regulate --bitrate X --packet-burst 32 → -O ip <out> --packet-burst 7 --enforce-burst.
regulate plugin posiela presne mux.bitrate bit/s na drôt. Keď vstupy zaostávajú, NULL packets vyplnia. Keď peakujú, interný FIFO buffer (4096 packetov ≈ 0.3 s @ 19 Mbps) absorbuje. --enforce-burst zaručí 7 TS packetov per UDP datagram (1316 B, IPTV štandard).
Top-bar muxa zobrazuje 3 sumy s farebnou indikáciou. Pravidlá:
Σ avg ≤ 85 % mux.bitrate — priemerný cieľový bitrate všetkých kanálov plus audio. To je 'rozpočet' muxu. Statistická rezerva 15 % chráni pred koincidenciou peakov. Zelené ≤ 85 %, žlté ≤ 100 %, červené > 100 %.
Σ max ≤ 160 % mux.bitrate — peak ceiling súčet. Smie prekročiť kapacitu (to je point statmuxu — peaky málokedy koincidujú). Zelené ≤ 160 %, žlté ≤ 200 %, červené > 200 % (dropy pri sústavnom peake).
Σ min ≤ 50 % mux.bitrate — encoder floor súčet. Bezpečný floor zaisťuje že keď scéna je statická, encoder neklesne na zbytočne nízku kvalitu. Zelené ≤ 50 %, žlté ≤ 90 %, červené > 90 %.
Dostupný budget po PSI/SI/EIT: ~18.5 Mbps. Σ avg = 4 × 4.0 = 16 Mbps (86 % — žlté hraničné, zníž ešte). Σ max = 4 × 6.0 = 24 Mbps (130 % — zelené, OK). Σ min = 4 × 3.0 = 12 Mbps (65 % — žlté, OK). Cieľ: avg trafiť ~85 % budgetu, max ≤ 160 %.
Pri ≥ 10 alarmoch v 60s sa zobrazí flash notifikácia v Mux UI s odporúčaním znížiť bitrate. Auto-back-off NIE je aktívne — operátor rozhoduje.
-P bitrate_monitor --periodic 60 --min/max ±5% — alarm ak skutočný rate vypadne mimo ±5 % targetu. Znamená že regulate je hladný (vstup zomrel).
-P continuity — sleduje TS continuity counters. Loguje warning pri každom drope (over-subscription, FFmpeg padol, NIC jitter).
-P pcrverify --jitter-max 500000 — DVB povoľuje PCR jitter ≤ 500 µs. Alarm = pcradjust nestíha alebo zdroj má rozbité PCRs.
GOP coincidence — všetky encodery dávajú I-frame naraz, peak coincidencia. Riešenie: GOP offset (už zapnuté pre statmux, hash(stream_id) mod gop_size).
Loss-of-signal vstupu — jediný kanál čierny, mux pokračuje (vďaka -I null base). Trvanie ~3-8 s reštart FFmpegu.
Over-subscription (dlhotrvajúce peaky > kapacita) — kocky/audio stutter ~50-200 ms. Riešenie: zníž avg streamov o 5-10 % alebo zníž počet kanálov.
PCR drift — STB stutter každých pár sekúnd. Riešenie: pcradjust v pipeline (už je), kontrola pcrverify alarmov.
STB VBV underrun — STB stratí signál a re-acquire (~2-3 s). Riešenie: encoder bufsize = 2 × maxrate (už je), zníž maxrate.
--max-input-packets 4096 / --max-flushed-packets 4096 (interný FIFO ≈ 0.3 s @ 19 Mbps). --receive-buffer-size 16777216 (16 MB UDP rcv buffer per input). --packet-burst 32 (regulate) / 7 (output, IPTV štandard). --enforce-burst (každý UDP datagram presne 7 paketov).
Top-bar badge `📐 rec X.XM` ukazuje odporúčanú kapacitu muxu vypočítanú podľa centrálnej limitnej vety. Σ nezávislých VBR streamov sa približuje normálnemu rozdeleniu, takže Mux = μ_total + z·σ_total + margin. σ_i sa odhaduje z VBR rozsahu ako (max−min)/4 (predpoklad ±2σ). Margin = 10 % z μ_total kompenzuje PSI/SI overhead, encoder rate-control jitter a koreláciu medzi streamami.
Farba badge: 🟢 zelená = cap ≥ 99.7% odporúčania (konzervatívne) · 🟡 žltá = medzi 99% a 99.7% · 🔴 červená = cap < 99% (príliš málo, hrozí drop) · 🔵 modrá = cap nenastavený.
z-skóre podľa požadovaného pokrytia: 90% z=1.28 · 95% z=1.65 · 99% z=2.33 · 99.7% z=3.00 (default) · 99.99% z=3.72 (broadcast-grade). Tooltip badge ukazuje všetky úrovne; klik aplikuje 99.7% odporúčanie do mux.bitrate (potrebný reštart muxa).
σ_eff = σ_total × statmux_factor (statmux_factor = 0.7 keď je Statmux ON, inak 1.0)
Pre 1080p25 HD kanál: avg = 4000-5000 kbps, min = avg × 0.75 (~3000-3750), max = avg × 1.5 (~6000-7500). UI predvyplní min/max automaticky podľa avg. Statmux UI predvyplní avg z transcoder profilu streamu. SD kanál: avg = 2000-2500 kbps. UHD: avg = 12000-18000 kbps.
Adaptive Hybrid Statmux je runtime mechanizmus ktorý presunie nevyužitú kapacitu z core streamov (chránených, plný VBR) k balanced streamom (obetným). "Hybrid" lebo dva odlišné rate-control režimy bežia paralelne (CBR core fill + VBR balanced); "adaptive" lebo router rozhoduje raz za sekundu na základe HLS lookahead predikcie. Operátor označí streamy ako balanced cez pravý checkbox na karte, system ich automaticky preencoduje do troch tier-ov (HIGH/MED/MIN) a router atomicky prepína symlink podľa toho, koľko miesta zostáva v muxe po predikcii core špičky.
Mux capacity 38 Mbps
┌──────────────────────────────────────────────────────────────────┐
│█████████████████████████████████████████████████████░░░░░░░░░░░░│
└──────────────────────────────────────────────────────────────────┘
◀────── core_max (predikcia z 6 HLS segmentov) ──▶◀── balanced ──▶
per_balanced
= (cap − core_max
− SI overhead
− audio) / N
Príklad: cap=38000 core_max=29000 SI=200 audio_total=1280 N_balanced=2
remaining = 38000 − 29000 − 200 − 1280 = 7520 kbps
per_balanced_max = 7520 / 2 = 3760 kbps
clamp(3760, 500, 3000) = 3000 kbps ← strop pre balanced VBRBez Adaptive Hybrid Statmuxu treba mux dimenzovať na worst-case Σ max. S Adaptive Hybrid Statmuxom dimenzujeme okolo Σ avg + statistical buffer (broadcast korelácia ρ=0.15). Reálny gain ~5 Mbps na 38 Mbps mux, alebo +1 stream pri rovnakej cap.
Čistý CBR (kodér fixný)
VBR bez Statmuxu
Adaptívny Hybridný Statmux ON
Custom URL override na vstupe a Statmux sú vzájomne výlučné. Pri zapnutom Statmux-e sa balanced transcoder spolieha na lokálny encoder HLS pre kontrolu bitrate. Externé URL by tento control loop obišlo. UI to vynucuje obojsmerne — checkbox sa uzamkne pri konfliktnej kombinácii a v tooltipe vidíš ktorý stream blokuje.
┌─────────────────────────┐
│ Encoder (NVDEC→NVENC) │ ← UDP satelit
STREAM │ /dev/shm/stream_X/h264/│
│ → muxed.m3u8 + segments│
└────────────┬────────────┘
│
┌────────┴────────┐
│ │
role="core" role="balanced"
(chránený) (obetný)
│ │
│ ▼
│ ┌───────────────────────────┐
│ │ BalancedTranscoder │
│ │ ffmpeg p1 NVENC VBR │
│ │ -maxrate dynamic │ ← Adaptive Hybrid router
│ │ /dev/shm/stream_X_ │ 1 s tick (predict z 6
│ │ balanced/h264/...m3u8 │ HLS segmentov, atomický
│ └───────────┬───────────────┘ symlink swap HIGH/MED/MIN)
│ │
▼ ▼
┌─────────────────────────┐
│ ffmpeg-as-mux │ ← /dev/shm/mux_X/pipe.sh
│ -f mpegts pipe:1 │
│ -muxrate <cap> │
└────────────┬────────────┘
│ shell pipe
▼
┌─────────────────────────┐
│ tsp -I file - │
│ continuity → regulate │
│ → pcradjust → bitrate_ │
│ monitor │
│ -P nit -P sdt -P inject│
│ (DVB SI tables) │
└────────────┬────────────┘
│
▼ UDP multicast
239.x.x.x:1234Statistický zisk vzniká iba ak encodery majú širokú VBR rangu — keď je max ≈ avg, encoder je v podstate CBR a router nemá čo redistribuovať. Operátor by mal nastaviť `min/avg/max` per stream tak, aby Σmax bola dostatočne nad cap muxu (over-subscription = priestor pre statistical gain), ale Σavg pohodlne pod cap.
Príklad — 38 Mbps mux, 10 core HD + 2 balanced:
Pôvodný (CBR-locked): min=2000 avg=3000 max=4000
Σmax = 10×4000 + 2×7600 = 55200 kbps (1.45× cap — málo gain)
σ_per_stream = (4000−2000)/4 = 500 kbps (trivial — flat)
Σ statistical headroom ≈ 1.5 Mbps
Odporúčaný (širší VBR): min=1500 avg=3000 max=6000
Σmax = 10×6000 + 2×7600 = 75200 kbps (1.98× cap — healthy gain)
Σavg = 10×3000 + 2×3000 = 36000 kbps (95% cap — pohodlne)
Σmin = 10×1500 + 2×500 = 16000 kbps (42% cap — comfortable floor)
σ_per_stream = (6000−1500)/4 = 1125 kbps (significant)
Σ statistical headroom ≈ 4 Mbps
Reálny benefit: pri akcii core peakuje na 5−6 Mbps (HD detail), router
shedne balanced k MIN tier-u, total wire ostáva 38 Mbps.Odporúčaný rozsah pre core stream: • min ≈ avg × 0.5 (encoder môže klesnúť pri statických scénach) • avg = nominálny target podľa rozlíšenia (HD ≈ 3 Mbps, FullHD ≈ 5 Mbps, UHD ≈ 12 Mbps) • max ≈ avg × 2.0 (encoder môže peakovať pri akcii — sport, akčný film) Mux capacity guard (musí platiť): • Σ avg core + Σ avg balanced ≤ mux.bitrate × 0.85 (pohodlný target) • Σ max core + Σ max balanced ≤ mux.bitrate × 2.0 (over-subscription pre gain) • Σ min core + Σ min balanced ≤ mux.bitrate × 0.6 (worst-case floor) σ_per_stream = (max − min) / 4 (predpoklad ±2σ rozsahu) σ_total = √((1−ρ) · Σσ²ᵢ + ρ · (Σσᵢ)²) ρ = 0.15 broadcast typical σ_eff = σ_total × 0.7 (statmux factor pri ON) Mux_99.7% = μ_total + 3 · σ_eff (ukazuje top-bar 📐 rec)
Aspoň 1 balanced — bez balanced streamu nemá Adaptive Hybrid router čo squashnúť pri peaku, takže gain = 0
Hudobné a info kanály sú najlepší kandidáti — 90+ % tolerancia voči rate sheddingu
Sledovanie cez `[balance-router]` log entries — ukáže `core_max`, `remaining`, tier prepnutia pre každý 1 s tick
Ak `core_max > capacity` (CORE OVERPEAK warning v log), znížite počet core streamov alebo encoder maxrate
Pridaj streamy do muxu (priradenie kanálov ostáva manuálne)
Vypni / zapni Statmux na hornej lište karty muxu (žltý chip). Po zapnutí sa všetky encodery prepnú do VBR a reštartujú
Označ obetné streamy pravým oranžovým checkboxom — to sú zvyčajne hudobné/info kanály kde rate-shedding nie je viditeľné
Hotovo. Adaptive Hybrid router raz za sekundu číta predikciu z 6 HLS segmentov core streamov a atomicky prepína symlink balanced streamov na HIGH/MED/MIN tier
Viacero kanálov s premenlivým bitrate zdieľa jeden pevný transportný tok (MPTS). Bity sa dynamicky prerozdeľujú podľa zložitosti obsahu — náročná scéna dostane viac, statická menej — tak, aby kvalita bola vyrovnaná a súčet nikdy neprekročil kapacitu drôtu.
Trieda: closed-loop feedback statmux s C1 look-ahead (feedforward) nad VBR enkodérmi — princíp broadcast statmuxu, riadený zo zdrojovej komplexity.
UDP multicast SSM, per kanál
Enkodéry
zdrojová komplexita
Loopback
vlastná linka / stream
alokátor (Σ ≤ pool)
buffer
null padding → CBR
CBR drôt na cap
predikcia zložitej scény pred dipom
meraný drôt — kalibrácia
cieľový bitrate
Každý kanál ide po vlastnej linke až po mux (samostatný enkodér + loopback spojenie), kde sa všetky zlúčia do jednej MPTS multicast linky s presne pevným bitrate. Allocator beží ako centrálny mozog (1 GenServer / mux), tick ~0,85 s.
Alokátor kombinuje dva signály — predikciu zo zdrojovej komplexity (dopredu) a meraný drôt (spätne). Tým sa približuje broadcast statmuxom, ktoré poznajú cenu rámca pred enkódovaním.
C1 meria zložitosť obsahu na dekodéri — to predbieha výstup enkodéra o latenciu pipeline. Relatívna zmena komplexity (korelácia r≈0,92 s bitmi) sa premietne na cieľový bitrate v OBOCH smeroch PRED tým, než to enkodér vyrobí: stúpajúca scéna sa pre-alokuje (žiadny dip), klesajúca uvoľní bity skôr pre ostatných.
Presné per-stream bity emitované muxom (sender-side countery) kalibrujú prevod komplexita→bitrate a držia súčet presne na poole. Anchor pravdy — C1 predikcia nie je dokonalá (r 0,92), trailing drôt ju koriguje.
Nárok streamu je krytý tým, čo enkodér reálne vyrobí (× rezerva na špičky). Ľahký kanál nehromadí pásmo, ktoré nevie minúť — uvoľní ho hladným.
Cieľ nie je rovnaký bitrate, ale rovnaká kvalita — kontinuálny tlak presúva bity od kanálov s vysokou kvalitou (nízke QP) k tým s nízkou (vysoké QP).
Keď C1 ohlási pád kanála, jeho pásmo sa rozdá ostatným v tom istom ticku — stihnú nabehnúť skôr, než pád reálne príde na drôt.
Pool = cap N − réžia (PSI/EIT) − audio − rezerva (slider). Merané z drôtu, windowed-max proti burstom.
Per-stream nárok (demand) = doručiteľný drôt × C1 look-ahead (relatívna zmena komplexity) + vyrovnávací tlak kvality.
Proporčná alokácia poolu podľa nárokov, ohraničená [min, max] z video profilu; voľné pásmo ide hladným.
Cieľ na enkodér = alloc / kalibrácia (per-stream EMA meraný/cieľ); dispatch s prahom (Δ≥3 %/1 s) a slew-limitom proti churnu.
Buffer-hold servo drží hladinu fronty na ~1 s (pásmo), núdzový backstop pri preťažení; null padding dorovná zvyšok na CBR.
Výstup je presný CBR (constant bitrate) tok na nakonfigurovaný cap. Tri vrstvy to garantujú:
Send-queue drží stojacu hladinu ~1 s drôtu, ktorá pohltí sub-sekundové GOP dipy (medzi I-framami). Overené z nahrávky: 0,5–1 s pohltí 88–91 % dipov.
Keď je obsah pod cap, rozdiel sa doplní MPEG-TS null paketmi (PID 0x1FFF). Drôt tým VŽDY trafí cap — kompatibilné s DVB.
Egress je časovaný na presný cap (busy-spin ABSTIME), debt-clamp 12 ms zabráni catch-up burstom po krátkom stalle → žiadny PCR jitter, žiadne over-cap špičky.
Živý sklopený (stacked) graf reálneho drôtu — každý pás je jeden kanál, plynule tečie sprava. Dáta sú merané na drôte (tsp sonda + NIF countery), nie odhad.
Každý kanál má stabilnú farbu; hrúbka = jeho okamžitý bitrate. Réžia (PSI/EIT) je sivá na spodku, null padding biely so štruktúrou navrchu.
Prerušovaná čiara hore = nakonfigurovaný cap (strop drôtu). Obsah + null padding spolu vždy sedia pod ňou.
Biely bodkovaný pás navrchu = null padding (voľná kapacita). Čím tenší, tým plnšie využitý drôt; pri náročnom obsahu zmizne.
Červené značky na časovej osi = pretečenie send-queue (drop). V ustálenom stave 0; bursty len pri boote/floode.
Tlačidlá prepínajú časové okno okamžite (klientsky), aktívne má šedé pozadie. Graf akumuluje 30 min v prehliadači.
Hover ukáže per-kanál bitrate, QP a kvalitatívny index v danom čase (historická hodnota, nie live).
Aktuálna regulačná úroveň poolu (pool/(pool−trim)). >100 % = pretlak (plnenie buffera), <100 % = zárez.
Tolerančné pásmo nad cap — koľko necháme ako null rezervu. 0 = plníme presne N; kladné = väčšia rezerva (bezpečnejšie); záporné = mierny overfill.
Hlavička ukazuje util send-queue % a kumulatívne drops. Tlačidlo „clear drops" vynuluje počítadlo.
Spoločná GOP dĺžka pre všetky kanály v muxe (pri spustení sa uzamkne vo video profiloch). Wall-stagger rozloží I-framy v čase, aby sa nestretli.
Veľkosť VBV buffera enkodéra (ms). Menší sploští I-framy (vhodné pre pohybové kanály), väčší dá detailnejší I-frame. Default 850; per-stream override možný.
Každý kanál v muxe má kartu s názvom, PNR, aktuálnym a cieľovým bitrate a stavom:
Beží — kanál enkóduje a tečie na drôt.
Nábeh — enkodér štartuje / sa ustaľuje.
Vypnutý — kanál v muxe, ale nebeží (0 kbps).
Chyba — vstup stratený / enkodér spadol.
StatMux generuje plnú sadu povinných MPEG-TS / DVB tabuliek priamo v NIF muxe — žiadny externý SI inserter. Tabuľky sú rovnomerne časované do toku, aby STB vždy rýchlo nadobudol PSI/SI po preladení.
Tabuľka
PID
H.264/HEVC PSI info
Účel / zdroj
EIT (Event Information Table, PID 0x12) nie je statický — je plne napojený na EPG systém aplikácie. Operátor priradí každému kanálu v muxe EPG službu (eit_epg_service_id), a mux z nej generuje živé EIT priamo z naplánovaných udalostí.
min = spodný floor (statická scéna). Odporúčané avg × 0,5–0,75. Nastav dosť nízko, nech sa na pokojnom obsahu ušetrí pre ostatných.
avg = cieľová úroveň. Σ avg všetkých kanálov ≈ video pool (cap − réžia − audio).
max = strop (VBR rezerva na špičky/strihy). Odporúčané avg × 1,5. Nedávaj príliš tesne na avg — VBR potrebuje priestor na peaky.
Príklady (avg): SD 1,5–2,5M · HD 2,5–4M · FHD 4–6M · UHD 12–18M. Pre statmux drž rozumný rozptyl, aby sa pool dal prerozdeliť.
Robíme skutočný štatistický multiplex — dynamické prerozdeľovanie bitov medzi VBR kanálmi zdieľajúcimi pevný drôt, s vyrovnávaním kvality. Mechanicky sme blízko profesionálnym headend statmuxom (cap alignment, 1 s buffer, null padding, GOP/B-frames, floor override).
CBR drôt na cap · 1 s buffer · per-stream proporčná alokácia · C1 look-ahead feedforward · vyrovnávanie kvality · prediktívna redistribúcia · null padding · presný pacing.
Broadcast statmux používa encoder rate-distortion estimate (presná cena rámca, enkodér je otrok allocatora). My používame C1 zdrojovú komplexitu (r≈0,92) + VBR enkodér čo si sám volí QP — limit hardvéru, nie dizajnu. Trieda: feedback + look-ahead namiesto čistého feedforwardu.
Príznak
Príčina / riešenie
Diery / null špičky (5–7M) v grafe
Content dipy — buď GOP medzi I-framami (rieši 1 s buffer), alebo kolektívny content stall (rieši redistribúcia). C1 look-ahead ich výrazne zmenšil.
Drops > 0 stúpa
Send-queue preteká — content nad cap. Over rezervu (slider), util a či sa allocator nezasekol (tick beží). Bursty pri boote sú normálne.
Jeden kanál má trvalo nízky bitrate / vysoký QP
Buď statický obsah (správne — uvoľňuje pásmo), alebo príliš nízky max v profile. Skontroluj min/avg/max a reálnu zložitosť zdroja.
Graf trhá / ľavý okraj sa maže
Klientský problém — tvrdý refresh (Ctrl+Shift+R) pre nový JS bundle. Dáta tečú cez inkrementálny push, os = zvolený rozsah.
cap % / buffer sa nemení po zmene
LiveView re-render — tvrdý refresh. Hodnoty sa aktualizujú 1× za sekundu cez tracked assign.
SAT UDP SSM ─┐
├─ gst_encoder.py(K1) CBR ─ TCP127 ─┐ ZMQ complexity
(per ├─ gst_encoder.py(K2) CBR ─ TCP127 ─┤ ▲ │
kanál) └─ gst_encoder.py(Kn) CBR ─ TCP127 ─┤ │ ▼
▼ BalanceRouter
┌─────── NIF StatMux ───────┐ │ set_bitrate
│ per-input ring (drop-old) │◄─┘
│ 2-pass drén (A prio, V) │
│ allocator: w=cmplx×max │
│ ×headroom% (slider 78-90) │
│ stale-exclusion (>2s) │
│ NULL pad -> wire cap CBR │
│ PCR pass-through │
└────────────┬──────────────┘
▼
MPTS UDP multicast (CBR cap)gst_encoder.py per stream: SAT UDP SSM vstup → nvh264enc rc-mode=cbr. Bitrate riadi BalanceRouter cez set_bitrate. Komplexitu scény (SAD/px) hlási cez ZMQ do allocatora.
Per-input ring (TCP loopback z encodera), 2-pass drén (audio priorita, video full), proporčný allocator, NULL pad presne na wire cap (CBR), PCR pass-through z encodera.
Jedno MPTS (PAT/PMT/SDT generuje NIF) → UDP multicast na výstupný VLAN. Wire je striktne CBR na mux.bitrate (NULL stuffing).
Riadok 1: ⚠ (validačné problémy) · PNR · názov v rámčeku (farba = stav).
Riadok 2+: min·avg·max kbps · predicted complexity Δ low/med/high/peak · INPUT LOST · ⚙URL · encoder Mbps · SID · service_type.
Farba názvu = stav streamu:
Mbps
37 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ <= cap 37.0 Mbit (červená, wire CBR strop)
· · · · · · · · · · · · · · · · · <= voľný plac = NULL padding
·· sivá · čierne bodky · rezerva ·· (nevyužitá kapacita)
31 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ <= headroom 85% · 31.5 Mbit (oranžová,
▓▓▓▓ JOJ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ kam mieria encoder targety)
▒▒▒▒ Markíza ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
░░░░ TA3 ░░░░░░░░░░░░░░░░░░░░░░░░░░ <= klik na band -> expand karta
0 └──────────────────────────────────
čas -> 10m │ 1h │ 24h CC0 PCR0 BR0 OVF0Červená čiara „cap“: wire CBR strop (mux.bitrate) — sem doplní NULL.
Oranžová čiara „headroom N%“: = cap × headroom slidera / 100. Sem mieria encoder set_bitrate targety. Pohybuje sa so sliderom.
Šedý plac s čiernymi bodkami medzi obsahom a capom = NULL padding (nevyužitá rezerva). Veľa bodiek = veľa rezervy.
Klik na farebný band kanála → automaticky rozbalí príslušnú kartu kanála nižšie.
MuxEitAdapter prečíta udalosti z EPG systému per služba, poskladá DVB EIT sekcie (názov, čas, trvanie, popis, žáner) a packetizuje ich na PID 0x12. Verzie sekcií sa inkrementujú pri zmene EPG — STB chytí update.
EIT sa vkladá priamo v NIF muxe rovnomerne DO null priestoru (1 paket / N výstupných + p/f periodicky) — nahradil bursty externý tsp cascade. Peak/avg ≈ 1.1, žiadne vytlačenie contentu, cap drží.
Tabuľka 0x4E — práve bežiaca + nasledujúca udalosť. Injektuje sa každé ≤2 s pre okamžitú „now/next" currency na STB.
Mux periodicky regeneruje EIT .bin z EPG (~15 s) — zmena programu v EPG sa prejaví na drôte bez reštartu. Hlavička muxu ukazuje „EIT ✓" keď je aktívny.
Tabuľky 0x50/0x51 — kompletný program na hodiny/dni dopredu (segmenty). Rovnomerne rozliate do toku.
Ukazovateľ reálneho toku voči capu. Stred = cap (0). Marker vľavo (zelená) = rezerva (Σ content pod cap); vpravo (červená) = pretečenie. Live, hýbe sa každý tick.
-5 Mbps CAP 37000 kbps +5 Mbps
[#### zelená = rezerva ####│::: červená = nad cap :::]
^ -3200k
(Σ content ~3.2 Mbps pod cap = zdravá rezerva)
Nižšie (→78): väčšia NULL rezerva, bezpečnejšie, menej tesné využitie capu.
Vyššie (→90): tesnejšie využitie capu, menej NULL.
⚠ ≥88 %: slider sa zožltne — blízko stropu ring-overflow freeze. Hard-clamp 78–90 (nedá sa pustiť k 100 — ochrana proti zamrznutiu obrazu).
Asymetria: znižovanie spoľahlivo pridáva rezervu; zvyšovanie je limitované per-stream max_bps clampom (allocator nepretlačí kanál cez jeho max → bezpečné).
Riadi koľko z capu sa cieli encoderom: encoder target = budget × headroom% / 100 (oranžová čiara v grafe). Mení sa živo (efekt od ďalšieho 10 ms ticku), persistuje v SystemConfig.
Jeden kanál padne (crash encodera / strata signálu) ⇒ mux beží ďalej, ostatné kanály nedotknuté, wire drží cap (NULL absorbuje výpadok), CC=0 na preživších. Per-input ring thready sú nezávislé. Padnutý kanál sa ukáže červeným blikajúcim názvom + INPUT LOST badge; encoder sa supervízne reštartuje a kanál sa sám zotaví.
PCR aj PES PTS/DTS idú pass-through z encodera (jedna clock doména ⇒ koherentné, žiadny drift). Zvyškový PCR jitter ~desiatky ms je inherentný (10 ms output tick + UDP) — STB/VLC PLL ho toleruje, CC=0. Tvrdá DVB-S2 modulátor compliance je mimo aktuálneho IPTV use-case.
CAT — podmienený prístup (len pri scramblovaní / ECM).
EIT — informácie o udalostiach (EPG) — z EPG systému, viď nižšie.
NIT — sieťové info (network ID, názov, transport stream).
PAT — zoznam programov (mapuje PNR → PMT PID).
PMT — per program: video/audio/PCR PIDy, kodeky, descriptory.
SDT — názvy a poskytovatelia služieb (čo STB zobrazí v zozname).
TDT/TOT — čas a dátum + lokálny offset (STB hodiny).