×

⊳ Muxer

MPTS · TSDuck · PSI/SI

MPTS Multiplexor & Adaptívny Hybridný Statmux

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.

Architektúra enkódera

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.

2. Mux vrstva (TSDuck tsp pipeline)

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.

3. Output vrstva (UDP)

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).

Doporučené dimenzovanie (Σ min / avg / max vs mux.bitrate)

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 %.

Príklad: 4 HD kanály v 19 Mbps DVB-T muxe

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 %.

Diagnostika & alarmy

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.

Glitche & ich príčiny

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.

Parametre tsp pipeline (mux_worker.ex)

--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).

Empirický výpočet kapacity (CLT)

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)

Doporučené hodnoty per kanál (HD H.264)

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.

Adaptívny Hybridný Statmux

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.

Kapacita — ako sa rozdeľuje bitrate

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 VBR

Praktický gain (10 streamov × 3 Mbps avg, max 4 Mbps)

Bez 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

URL ↔ Statmux exkluzivita

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.

Pipeline (kodér → vyvážený transkodér → mux ffmpeg → tsp)

┌─────────────────────────┐
          │  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:1234

Sizing core VBR min/avg/max pre statmux

Statistický 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)

Tipy & troubleshooting

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

Operátorský workflow

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

StatMux — natívny štatistický multiplex

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.

Architektúra a tok dát

Architecture diagram

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.

Mozog: feedback + C1 look-ahead

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.

Meraný drôt (feedback)

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.

Doručiteľnosť

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.

Vyrovnaná kvalita

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).

Prediktívna redistribúcia

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.

CBR drôt: buffer + null padding + pacing

Výstup je presný CBR (constant bitrate) tok na nakonfigurovaný cap. Tri vrstvy to garantujú:

Stojaci buffer ~1 s

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.

Null padding

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.

Presný pacing

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.

Graf výstupu (river)

Ž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.

Farebné pásy

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.

Cap / Max čiara

Prerušovaná čiara hore = nakonfigurovaný cap (strop drôtu). Obsah + null padding spolu vždy sedia pod ňou.

Null pásmo

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.

Drop značky

Červené značky na časovej osi = pretečenie send-queue (drop). V ustálenom stave 0; bursty len pri boote/floode.

Rozsah (30s–30m)

Tlačidlá prepínajú časové okno okamžite (klientsky), aktívne má šedé pozadie. Graf akumuluje 30 min v prehliadači.

Tip

Hover ukáže per-kanál bitrate, QP a kvalitatívny index v danom čase (historická hodnota, nie live).

cap %

Aktuálna regulačná úroveň poolu (pool/(pool−trim)). >100 % = pretlak (plnenie buffera), <100 % = zárez.

Rezerva (slider)

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.

Buffer (dropy)

Hlavička ukazuje util send-queue % a kumulatívne drops. Tlačidlo „clear drops" vynuluje počítadlo.

GOP

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 buffra

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ý.

Stream karty a stavy

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.

PSI/SI tabuľky (kompletná DVB sada)

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 ↔ EPG: kompletná integrácia

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í.

Dimenzovanie kanálov (min / avg / max)

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ť.

Vzťah ku broadcast statmuxom

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).

Čo máme

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.

Kde sa líšime

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.

Riešenie problémov

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.

Architektúra (end-to-end)

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.

Rozvrh

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.

Diff gauge (nad grafom)

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)

Headroom slider (78–90 %, predvolené 85)

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.

Strata signálu / pád kanála (izolácia)

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 / časovanie

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).