×

⊳ Muxer

MPTS · TSDuck · PSI/SI

MPTS Multiplexeris ir Adaptyvus Hibridinis Statmux

Srauto valdytojas mux assembles multiple SPTS srautai into one CBR MPTS išvestis (DVB/IPTV). Adaptive Hybrid Statmux combines a CBR core fill with VBR balanced encoders for konstanta mux išvestis.

1. Encoder layer (FFmpeg per srautas)

When the parent mux has statmux enabled, each FFmpeg encoder runs capped-VBR: -b:v <avg> -minrate <min> -maxrate <max> -bufsize <max×2>. VBV buffer = 2× max gives ~2 s peak headroom. Statmux srautai also get a deterministic GOP offset (-force_key_frames) per stream_id so I-kadras peaks don't coincide across channels.

2. Mux sluoksnis (TSDuck tsp vamzdynas)

tsp -I null (∞ NULL packets @ line rate) → -P merge tsp -I ip <srautas> (overlays real packets) → -P continuity (drop alarm) → -P pcradjust --bitų greitis X (rewrites PCRs) → -P pcrverify --jitter-max 500µs → -P bitrate_monitor (rate alarm ±5%) → -P regulate --bitų greitis X --packet-burst 32 → -O ip <out> --packet-burst 7 --enforce-burst.

3. Išvestis layer (UDP)

regulate plugin emits exactly mux.bitų greitis bps on the wire. Inputs lagging → NULL packets fill the gap. Inputs peaking → internal FIFO buferis (4096 packets ≈ 0.3 s @ 19 Mbps) absorbs. --enforce-burst forces 7 TS packets per UDP datagram (1316 B, IPTV standard).

Recommended sizing (Σ min / avg / max vs mux.bitų greitis)

Mux top bar shows 3 sums with color būsena. Taisyklės:

Σ avg ≤ 85 % mux.bitų greitis — average target sum across visi channels plus garsas. That is the mux 'budget'. The 15 % statistical reserve protects against peak coincidence. Green ≤ 85 %, amber ≤ 100 %, red > 100 %.

Σ max ≤ 160 % mux.bitų greitis — peak ceiling sum. Allowed to exceed talpa (that's the point of statmux — peaks rarely coincide). Green ≤ 160 %, amber ≤ 200 %, red > 200 % (drops on sustained peak).

Σ min ≤ 50 % mux.bitų greitis — encoder floor sum. A safe floor ensures that on still scenes the encoder doesn't drop to needlessly low kokybė. Green ≤ 50 %, amber ≤ 90 %, red > 90 %.

Pavyzdys: 4 HD kanalai 19 Mbps DVB-T muxe

Prieinamas biudžetas po PSI/SI/EIT: ~18,5 Mbps. Σ vid = 4 × 4,0 = 16 Mbps (86 % — ambros riba, mažinkite toliau). Σ maks = 4 × 6,0 = 24 Mbps (130 % — žalia, gerai). Σ min = 4 × 3,0 = 12 Mbps (65 % — ambros, gerai). Tikslas: vid ~85 % biudžeto, maks ≤ 160 %.

Diagnostika ir įspėjimai

On ≥ 10 alarms in 60s a flash pranešimas appears in the Mux UI recommending a bitų greitis reduction. Auto-back-off is NOT aktyvu — the operator decides.

-P bitrate_monitor --periodic 60 --min/max ±5% — alarm if actual rate strays beyond ±5 % of target. Means regulate is starved (įvestis died).

-P continuity — tracks TS continuity counters. Logs a įspėjimas on every drop (over-subscription, FFmpeg crash, NIC jitter).

-P pcrverify --jitter-max 500000 — DVB allows PCR jitter ≤ 500 µs. Alarm = pcradjust can't keep up or šaltinis has broken PCRs.

Sugedimai ir jų priežastys

GOP coincidence — visi encoders emit I-frames simultaneously, peak coincidence. Fix: GOP offset (already on for statmux, heš(stream_id) mod gop_size).

Įvesties praradimas-of-signal — single kanalas goes black, mux continues (thanks to -I null base). Duration ~3-8 s for FFmpeg restart.

Over-subscription (sustained peaks > talpa) — blocks/garsas stutter ~50-200 ms. Fix: lower srautas avg by 5-10 % or pašalinti a kanalas.

PCR drift — STB stutter every few sekundės. Fix: pcradjust in the pipeline (already there), watch pcrverify alarms.

STB VBV nepakankamumas — STB praranda sinchronizaciją ir ją atkuria (~2-3 s). Pataisa: koduoklio buf. dydis = 2 × maks greitis (jau padaryta), mažinkite maks greitį.

tsp vamzdyno parametrai (mux_worker.ex)

--max-įvestis-packets 4096 / --max-flushed-packets 4096 (internal FIFO ≈ 0.3 s @ 19 Mbps). --receive-buffer-dydis 16777216 (16 MB UDP rcv buffer per įvestis). --packet-burst 32 (regulate) / 7 (išvestis, IPTV standard). --enforce-burst (every UDP datagram is exactly 7 packets).

Empirical talpa calculation (CLT)

Top-bar badge `📐 rec X.XM` shows the recommended mux talpa derived from the central limitas theorem. The sum of independent VBR srautai approaches a normal distribution, so Mux = μ_total + z·σ_total + margin. σ_i is estimated from each įvestis's VBR range as (max−min)/4 (assuming the range covers ±2σ). The margin = 10% of μ_total compensates for PSI/SI overhead, encoder rate-control jitter, and srautas correlation that pure CLT under-estimates.

Ženklo spalva: 🟢 žalia = limitas ≥ 99,7 % rekomendacijos (konservatyvu) · 🟡 ambros = tarp 99 % ir 99,7 % · 🔴 raudona = limitas < 99 % (nepriteklius, praradimo rizika) · 🔵 mėlyna = limitas nenustatytas.

z-score per coverage target: 90% z=1.28 · 95% z=1.65 · 99% z=2.33 · 99.7% z=3.00 (numatytasis) · 99.99% z=3.72 (broadcast-grade). The badge tooltip lists visi levels; clicking applies the 99.7% recommendation to mux.bitų greitis (mux restart required).

σ_eff = σ_total × statmux_factor (statmux_factor = 0,7 kai Statmux ĮJUNGTAS, kitaip 1,0)

Recommended values per kanalas (HD H.264)

1080p25 HD kanalas: avg = 4000-5000 kbps, min = avg × 0.75 (~3000-3750), max = avg × 1.5 (~6000-7500). UI auto-fills min/max from avg. Statmux UI auto-fills avg from the srautas's transcoder profile. SD kanalas: avg = 2000-2500 kbps. UHD: avg = 12000-18000 kbps.

Adaptyvus Hibridinis Statmux

Adaptive Hybrid Statmux is a runtime mechanism that shifts unused talpa from core srautai (protected, full VBR) to balanced srautai (sacrificial). "Hybrid" because two distinct rate-control regimes run side by side (CBR core fill + VBR balanced); "adaptive" because the router re-evaluates once per second from an HLS-lookahead prediction. The operator marks srautai as balanced via the right-side checkbox; the system pre-encodes them into three tiers (HIGH/MED/MIN) and the router atomically swaps the symlink based on remaining headroom after predicting core peaks.

Talpa — how bitų greitis is divided

Mux talpa 38 Mbps
  ┌──────────────────────────────────────────────────────────────────┐
  │█████████████████████████████████████████████████████░░░░░░░░░░░░│
  └──────────────────────────────────────────────────────────────────┘
   ◀────── core_max (predicted from 6 HLS segments) ─▶◀── balanced ──▶
                                                       per_balanced
                                                       = (cap − core_max
                                                          − SI overhead
                                                          − garsas) / N

  Example: 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  ← ceiling for balanced VBR

Practical gain (10 srautai × 3 Mbps avg, 4 Mbps max)

Without Adaptive Hybrid Statmux you must dydis the mux for the worst-case Σ max. With Adaptive Hybrid Statmux you dydis around Σ avg + a statistical buffer (broadcast correlation ρ=0.15). Real gain ~5 Mbps on a 38 Mbps mux, or +1 srautas at the same cap.

Grynas CBR (fiksuotas koduoklis)

VBR be Statmux

Adaptyvus Hibridinis Statmux ĮJUNGTAS

URL ↔ Statmux išskirtinumas

Pasirinktinis URL įvestis override and Statmux are mutually exclusive. With Statmux on, the balanced transcoder relies on the local encoder HLS to control bitų greitis. An external URL would bypass that control loop. The UI enforces this both ways — the checkbox locks when there is a conflicting combination, and the tooltip shows which srautas is blocking.

Vamzdynas (koduoiklis → subalansuotas transkoduoiklis → mux ffmpeg → tsp)

┌─────────────────────────┐
          │  Encoder (NVDEC→NVENC)  │ ← UDP satellite
   STREAM │  /dev/shm/stream_X/h264/│
          │  → muxed.m3u8 + segments│
          └────────────┬────────────┘
                       │
              ┌────────┴────────┐
              │                 │
        vaidmuo="core"        vaidmuo="balanced"
        (protected)        (sacrificial)
              │                 │
              │                 ▼
              │     ┌───────────────────────────┐
              │     │  BalancedTranscoder       │
              │     │  ffmpeg p1 NVENC VBR      │
              │     │  -maxrate dynamic         │ ← Adaptive Hybrid router
              │     │  /dev/shm/stream_X_       │   1 s tick (predicts from
              │     │   balanced/h264/...m3u8   │   6 HLS segments, atomic
              │     └───────────┬───────────────┘   symlink swap HIGH/MED/MIN)
              │                 │
              ▼                 ▼
          ┌─────────────────────────┐
          │  ffmpeg-as-mux          │ ← /dev/shm/mux_X/pipe.sh
          │  -f mpegts pipe:1       │
          │  -muxrate <cap>         │
          └────────────┬────────────┘
                       │ shell pipe
                       ▼
          ┌─────────────────────────┐
          │  tsp -I failas -          │
          │  continuity → regulate  │
          │  → pcradjust → bitrate_ │
          │     monitor             │
          │  -P nit -P sdt -P inject│
          │     (DVB SI tables)     │
          └────────────┬────────────┘
                       │
                       ▼ UDP daugiaadresinis siuntimas
                  239.x.x.x:1234

Pagrindinio VBR min/vid/maks dydžio nustatymas statmux

Statistical gain only happens when encoders have a wide VBR range — when max ≈ avg the encoder is effectively CBR and the router has nothing to redistribute. Konfigūruoti `min/avg/max` per srautas so Σmax is comfortably above the mux cap (over-subscription = headroom for statistical gain) while Σavg sits comfortably below it.

Pavyzdys — 38 Mbps mux, 10 HD pagrindiniai + 2 subalansuoti:

  Senas (CBR užrakintas):       min=2000  vid=3000  maks=4000
     Σmaks = 10×4000 + 2×7600 = 55200 kbps  (1,45× limitas — mažas padidėjimas)
     σ_per_stream = (4000−2000)/4 = 500 kbps  (niekinis — plokščias)
     Σ statistinė atsarga ≈ 1,5 Mbps

  Rekomenduojamas (platus VBR): min=1500  vid=3000  maks=6000
     Σmaks = 10×6000 + 2×7600 = 75200 kbps  (1,98× limitas — sveikas padidėjimas)
     Σvid = 10×3000 + 2×3000 =  36000 kbps  (95 % limitas — patogu)
     Σmin = 10×1500 + 2×500  =  16000 kbps  (42 % limitas — patogi bazė)
     σ_per_stream = (6000−1500)/4 = 1125 kbps  (reikšmingas)
     Σ statistinė atsarga ≈ 4 Mbps

  Tikras pranašumas: veiksmo scenose pagrindiniai kanalai pasiekia 5–6 Mbps (HD detalės),
  maršruto valdiklis sumažina subalansuotus iki MIN lygio, bendras srautas išlieka 38 Mbps.
Recommended range per core srautas:

  • min  ≈ avg × 0.5  (encoder may drop on still scenes)
  • avg  = nominal target by skiriamoji geba (HD ≈ 3 Mbps, FullHD ≈ 5 Mbps, UHD ≈ 12 Mbps)
  • max  ≈ avg × 2.0  (encoder may peak on action — sport, action film)

Mux talpa guards (must hold):

  • Σ avg core + Σ avg balanced  ≤  mux.bitų greitis × 0.85   (comfortable target)
  • Σ max core + Σ max balanced  ≤  mux.bitų greitis × 2.0    (over-subscription gain)
  • Σ min core + Σ min balanced  ≤  mux.bitų greitis × 0.6    (worst-case floor)

σ_per_stream = (max − min) / 4  (assumes ±2σ range)
σ_total = √((1−ρ) · Σσ²ᵢ + ρ · (Σσᵢ)²)   ρ = 0.15 broadcast typical
σ_eff = σ_total × 0.7                     (statmux factor when ON)
Mux_99.7% = μ_total + 3 · σ_eff           (shown in top-bar 📐 rec)

Patarimai ir trikčių šalinimas

At least 1 balanced srautas — without one the Adaptive Hybrid router has nothing to squash during peaks, so gain = 0

Music and informacija channels are the best candidates — 90 %+ tolerance to rate shedding

Track via `[balanso-router]` žurnalas entries — shows `core_max`, `remaining`, tier transitions for each 1 s tick

If `core_max > talpa` (CORE OVERPEAK įspėjimas in žurnalas), reduce core srautas count or lower encoder maxrate

Operatoriaus darbo eiga

Pridėti srautai to the mux (kanalas assignment stays manual)

Toggle Statmux on the mux antraštė (yellow chip). When enabled, visi encoders switch to VBR and restart

Mark sacrificial srautai via the right-side orange checkbox — typically music/informacija channels where rate-shedding is invisible

Atlikta. The Adaptive Hybrid router reads a 6-segment HLS prediction from core srautai every 1 s and atomically swaps the balanced symlink between HIGH/MED/MIN tiers

StatMux — natūralus statistinis multiplexavimas

The mux runs on a native C NIF (single-host, replaced the old gst_mux.py). Each kanalas has its own CBR encoder; the NIF demultiplexes them, statistically allocates bitų greitis by scene complexity, pads with NULL packets to a fixed wire cap, and emits one MPTS UDP daugiaadresinis siuntimas. This pagalba describes the dabartinis UI: chart, headroom slider, diff gauge, kanalas cards.

Klase: uzdaro ciklo grizztamojo rysio statmux su C1 isankstine perziura (tiesioginis perdavimas) per VBR koderius — transliavimo statmux principas, valdomas is saltinio sudEtingumo.

Architektura ir duomenu srautas

Architecture diagram

UDP daugiaadresinis SSM, kiekvienam kanalui

Koderiai

saltinio sudEtingumas

Grizztamoji jungtis

sava linija / srautas

paskirstytojas (Sigma <= telkinys)

buferis

nulinis uzpildymas -> CBR

CBR laidas prie apribojimo

numatyti sudEtinga scena pries nuosmuki

ismatuotas laidas — kalibravimas

tikslinis bitu greitis

Kiekvienas kanalas eina savo linija iki mux (atskiras koderis + grizztamoji jungtis), kur visi susijungia i viena MPTS daugiaadresio siuntimo linija tiksliai fiksuotu bitu greicio. Paskirstytojas yra centrinis smegenys (1 GenServer vienam mux), ciklas ~0,85 s.

Smegenys: grizztamasis rysys + C1 isankstine perziura

Paskirstytojas derina du signalus — prognoze is saltinio sudEtingumo (tiesioginis) ir ismatuota laida (atgalinis). Tai arteja prie transliavimo statmux, kurie zino kadro kaina pries kodavima.

C1 matuoja turinio sudEtinguma dekoderyje — kuris lenkia kodavimo irenginio isvesties vamzdyno latencija. Santykinis sudEtingumo pokytis (koreliacija r apie 0,92 su bitais) taikomas tiksliniam bitu greiciui ABIEM kryptimis PRIES tai, kai kodavimo irenginys ji pagamina.

Ismatuotas laidas (grizztamasis rysys)

Tikslus per srauta mux issiusti bitai (siuntejo puses skaitikliai) kalibruoja sudEtingumo -> bitu greicio atvaizdavima ir tiksliai islaiko suma prie telkinio. Tiikrosios vertes inkaras — C1 prognoze nera tobula (r 0,92), einamojo laido taisymas ja koreguoja.

Pristatymo galimybe

Srauto pretenzija pagrista tuo, ka kodavimo irenginys is tiesu gamina (x smailes rezervas). Lengvas kanalas negali kaupti pralaidumo, kurio negali isleisti — jis atlaisvina ji alkaniems.

Subalansuota kokybe

Tikslas nera vienodas bitu greitis, o vienoda kokybe — nuolatinis spaudimas perkelia bitus nuo auktos kokybees kanaluu (zemas QP) link zemos kokybees (auktas QP).

Prognozuojamas perskirstymas is naujo

Kai C1 signalizuoja kanalo kritima, jo pralaidumas perduodamas kitiems per ta pati cikla — jie pakyla pries kritimui pasiekiant laida.

Per-kanalas svoris = complexity_q12 × max_bps (action scene + higher max ⇒ more bits).

Per-srautas budget = global budget × svoris / Σweights, clamp [min_bps, max_bps], recomputed every 10 ms.

×headroom % (slider) on the encoder target → Σ real encoder < wire cap ⇒ rings drain empty ⇒ clean vaizdo įrašas.

Stale-exclusion: a dead įvestis (no receive > 2 s) is dropped from the splitter — its share goes to live channels, not wasted; re-included automatically on recovery.

NULL pad fills the difference to the wire cap (strictly CBR). Encoder feedback: ZMQ complexity → BalanceRouter → set_bitrate.

CBR laidas: buferis + nulinis uzpildymas + tempas

Isvestis yra tikslus CBR srautas sukonfiguuruotu apribojimu. Trys sluoksniai tai garantuoja:

Pastovus buferis ~1 s

Siuntimo eile islaiko ~1 s laido pastovu lygi, kuris absorbuoja sub-sekundines GOP nyktukas (tarp I-kadru). Patikrinta is iraso: 0,5-1 s absorbuoja 88-91% nuosmukiu.

Nulinis uzpildymas

Kai turinys yra zemiau apribojimo, skirtumas uzpildomas MPEG-TS nuliniais paketais (PID 0x1FFF). Laidas taip VISADA pasiekia apribojima — suderinamas su DVB.

Tikslus tempas

Isvestis tempiama tiksliu apribojimu (uzimtas ciklas ABSTIME); 12 ms skolos apkarpymas neleidzia sugauti papliupu po trumpo sustabdymo -> jokio PCR triuksmo.

Bitų greitis chart (main)

Stacked area — each kanalas has its colour (matching its card below). Σ of visi + NULL pad = wire cap. Switch the laikas window 10m / 1h / 24h; pills kitas to it = event counts (CC / PCR / BR / OVF) for the selected window.

Spalvotos juostos

Kiekvienas kanalas turi stabilia spalva; storis = jo momentinis bitu greitis. PridEtines sanaudos (PSI/EIT) yra pilkos apaccioje, nulinis uzpildas yra tekstuuruotas baltas virsuje.

Apribojimo / maks. linija

Punktyrine linija virsuje = sukonfiguuruotas apribojimas (laido virsutine riba). Turinys + nulinis uzpildas kartu visada yra zemiau jos.

Nuline juosta

Tascuota balta juosta virsuje = nulinis uzpildas (laisva talpa). Kuo ji plonesnE, tuo pilnesnis laidas; ji dingsta ant reiklesscio turinio.

Praradimuu zymos

Raudonos zymos laiko juostoje = siuntimo eiles perpildymas (praradimas). Nulis stabilioje busenoje; papliupai tik paleidimo metu.

Diapazonas (30s-30m)

Mygtukai akimirksmiu pakeicia laiko langa (kliento puse), aktyvus turi pilka fona. Grafikas kaupia 30 min narsykleje.

Patarimas

Uzvedus pele rodomas kanaluu bitu greitis, QP ir kokybees indeksas tuo momentu (istorine verte, ne tiesiogine).

aprib. %

Dabartinis telkinio reguliavimo lygis (telkinys/(telkinys-apkarpymas)). >100% = per didelis spaudimas (pildomas buferis), <100% = apkarpymas.

Rezervas (slankiklis)

Tolerancijos juosta virs apribojimo — kiek palikti kaip nulini rezerva. 0 = pildoma tiksliai N; teigiamas = didesnis rezervas (saugesnE); neigiamas = siek tiek per daug.

Buferis (praradimai)

Antraste rodomas siuntimo eiles naudojimas % ir sukaupti praradimai. Mygtukas 'isvalyti praradimus' atstatytoja skaitikli.

GOP

Bendras GOP ilgis visiems kanalams mux (uzrakintas i vaizdo profilius paleidziant). Sienu pasislinkimas isskleidzia I-kadrus laike, kad jie nesusikrystuju.

VBV

Kodavimo VBV buferio dydis (ms). Mazesnis sulygina I-kadrus (gerai judesio kanalams), didesnis suteikia detalesni I-kadra. Numatytasis 850; galimas perrasymas kiekvienam srautui.

Kanalas cards (Programs)

The section antraštė has a 'Collapse / Expand visi' toggle. Expand a card by clicking it or clicking its colour band in the chart. The left coloured strip with checkbox = kanalas membership in the mux.

dark = veikia OK

orange = pradedama / restarting

grey + dimmed = down/klaida and checkbox OFF (intentionally disabled — no alarm)

red + BLINKING = FAULT — kanalas is in the mux (checkbox ON) but the srautas is down/klaida

PSI/SI lenteles (pilnas DVB rinkinys)

StatMux generuoja pilna privalomujj MPEG-TS / DVB lenteliu rinkini tiesiogiai NIF mux — jokio isiorinio SI iterpiklio. Lentelee tolygiai laikomos sraute, todEl STB visada greitai gauna PSI/SI po persijungimo.

Lentele

PID

Intervalas

Paskirtis / saltinis

EIT <-> EPG: pilna integracija

EIT (ivykiu informacijos lentele, PID 0x12) nera statine — ji visiskai sujungta su programos EPG sistema. Operatorius kiekvienam kanalui mux priskiria EPG paslauga (eit_epg_service_id), o mux generuoja gyva EIT is suplanuotu ivykiu.

Sizing / recommendations

mux.bitų greitis = wire CBR cap (typ. 37 Mbps for 12 SD/HD channels).

Σ avg ≲ cap (comfortable target) · Σ max oversubscribed 1.5–2× cap (that is the point of statmux — peaks rarely coincide) · Σ min = worst-case floor.

Set per-srautas min/avg/max in Srautas → Transcoder profile (auto-syncs to mux_input). Action/sport 8–10 M, news/talking head 1–2 M, min never < 800 k.

The headroom slider is a quick live lever of reserve vs. tightness — no restart.

Rysys su transliavimo statmux

Mes atliekame tikra statistini multipleksavima — dinaminji bitu perskirstyma per VBR kanalus, dalijancies fiksuota laida, su kokybees sulyginimu. Mechaniniu poziuriu esame artimi profesionaliems priekines galvutes statmux.

Ka turime

CBR laidas prie apribojimo · 1 s buferis · proporcinis paskirstymas per srauta · C1 isankstine tiesiogine perziura · kokybes sulyginimas · prognozinis perskirstymas · nulinis uzpildymas · tikslus tempas.

Kur skiriames

Transliavimo statmux naudoja kodavimo irenginio greicio-iskraipymo ivertinima. Mes naudojame C1 saltinio sudEtinguma (r apie 0,92) + VBR koderis, kuris pasirenka savo QP — aparatines irangos apribojimas, ne dizaino.

Sprendimo būdai

Simptomai

Priežastis / sprendimas

Kanalas red and blinking

In the mux (checkbox ON) but srautas down/klaida → patikrinti the šaltinis/encoder of that srautas. Self-recovers once restored.

Lots of NULL / large grey area

Calm content or low headroom — normal (statmux gain). For tighter naudojimas raise the headroom slider or per-srautas max_bps.

Picture freezes / glitches

Headroom too high (rings not draining) → lower the slider to 80–82 %. Watch the diff gauge / NULL.

After restart srautai=0 / visi NULL

Mux started before the encoders — self-heal automatically reaches 12 within ~30 s (1 s tick bandyk dar kartą). No manual action.

Diff gauge stuck at 0 / chart empty

No live samples (mux sustabdyta or encoders not veikia) — patikrinti both the mux and srautas būsena.

Architektūra (nuo pradžios iki pabaigos)

SAT UDP SSM ─┐
             ├─ gst_encoder.py(K1)  CBR ─ TCP127 ─┐        ZMQ complexity
   (per      ├─ gst_encoder.py(K2)  CBR ─ TCP127 ─┤            ▲   │
   chan)     └─ gst_encoder.py(Kn)  CBR ─ TCP127 ─┤            │   ▼
                                                  ▼     BalanceRouter
                                   ┌─────── NIF StatMux ───────┐  │ set_bitrate
                                   │ per-įvestis ring (drop-old) │◄─┘
                                   │ 2-pass drain (A prio, V)  │
                                   │ allocator: w=cmplx×max    │
                                   │ ×headroom% (slider 78-90) │
                                   │ stale-exclusion (>2s)     │
                                   │ NULL pad -> wire cap CBR  │
                                   │ PCR pass-through          │
                                   └────────────┬──────────────┘
                                                ▼
                                   MPTS  UDP daugiaadresinis siuntimas (CBR cap)

gst_encoder.py per srautas: SAT UDP SSM įvestis → nvh264enc rc-mode=cbr. Bitų greitis is driven by BalanceRouter via set_bitrate. Scene complexity (SAD/px) reported over ZMQ to the allocator.

Per-įvestis ring (TCP loopback from encoder), 2-pass drain (garsas prioritetas, vaizdo įrašas full), proportional allocator, NULL pad exactly to wire cap (CBR), PCR pass-through from encoder.

One MPTS (PAT/PMT/SDT generated by NIF) → UDP daugiaadresinis siuntimas on the išvestis VLAN. Wire is strictly CBR at mux.bitų greitis (NULL stuffing).

Eilutė 1: ⚠ (validation issues) · PNR · pavadinimas in a frame (colour = state).

Eilutė 2+: min·avg·max kbps · predicted complexity Δ low/med/high/peak · INPUT LOST · ⚙URL · encoder Mbps · SID · service_type.

Pavadinimas colour = srautas state:

Mbps
 37 ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌  <= cap 37.0 Mbit (red, wire CBR ceiling)
    · · · · · · · · · · · · · · · · ·     <= free space = NULL padding
    ·· grey · black dots · reserve ··       (unused talpa)
 31 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  <= headroom 85% · 31.5 Mbit (orange,
    ▓▓▓▓ JOJ ▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓     encoder targets aim here)
    ▒▒▒▒ Markíza ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
    ░░░░ TA3 ░░░░░░░░░░░░░░░░░░░░░░░░░░  <= click band -> expand card
  0 └──────────────────────────────────
        laikas ->           10m │ 1h │ 24h     CC0 PCR0 BR0 OVF0

Red 'cap' line: wire CBR ceiling (mux.bitų greitis) — NULL fills up to here.

Oranžinė linija 'headroom N%': = cap × headroom slankiklis / 100. Koduoklio nustatytas set_bitrate tikslas nukreiptas čia. Keičiasi kartu su slankikliu.

Pilka sritis su juodais taškais tarp turinio ir cap = NULL papildymas (nenaudojama atsarga). Daugiau taškų = daugiau atsargos.

Click a kanalas's colour band → automatically expands that kanalas's card below.

Tvarkarascis

MuxEitAdapter skaito ivykius is EPG sistemos kiekvienai paslaugai, kuria DVB EIT skyrius (pavadinimas, laikas, trukme, aprasimas, zanras) ir paketuoja juos PID 0x12. Skyriuu versijos dideja keiciantis EPG — STB paima naujinima.

EIT iterpiamas tiesiogiai NIF mux, tolygiai i nulinie erdve (1 paketas / N isvestis + p/f periodiskai) — pakeiciant trkciojanta isoritini tsp kaskadini. Smaile/vidurkis apie 1,1, jokio turinio isstuomo.

Lentele 0x4E — dabartinis vykdomas + kitas ivykis. Iterpiama kas <=2 s, kad STB butu rodoma aktuali informacija 'dabar/kitas'.

Mux periodiskai regeneruoja EIT .bin is EPG (~15 s) — EPG tvarkarascio pasikeitimas pasiekia laida be paleidimo is naujo. Mux antraste rodoma 'EIT v' kai aktyvus.

Lentelee 0x50/0x51 — pilnas valandu/dienu i prieki tvarkarascis (segmentai). Tolygiai isskleidzztas sraute.

Diferencijos matuoklis (virš diagramos)

Faktinio srauto ir cap rodiklis. Centras = cap (0). Žymeklis kairėje (žalia) = atsarga (Σ turinys mažiau nei cap); dešinėje (raudona) = perteklius. Gyvas, keičiasi kiekviename žingsnyje.

-5 Mbps CAP 37000 kbps +5 Mbps

[#### žalia = atsarga ####│::: raudona = virš cap :::]

^ -3200k

(Σ turinys ~3.2 Mbps mažiau nei cap = sveika atsarga)

Headroom slider (78–90 %, numatytasis 85)

Lower (→78): more NULL reserve, safer, less tight cap naudojimas.

Higher (→90): tighter cap naudojimas, less NULL.

⚠ ≥88 %: slider turns yellow — uždaryti to the ring-overflow freeze ceiling. Hard-clamp 78–90 (cannot reach 100 — guard against frozen vaizdo įrašas).

Asymmetry: lowering reliably adds reserve; raising is limited by per-srautas max_bps clamp (allocator won't push a kanalas past its max → safe).

Controls how much of the cap the encoders target: encoder target = budget × headroom% / 100 (orange line in the chart). Changes live (effect from the kitas 10 ms tick), persisted in SystemConfig.

Signal loss / kanalas failure (isolation)

One kanalas fails (encoder crash / signal loss) ⇒ the mux keeps veikia, other channels unaffected, wire holds the cap (NULL absorbs the outage), CC=0 on survivors. Per-įvestis ring threads are independent. The nepavyko kanalas shows a red blinking pavadinimas + INPUT LOST badge; the encoder is supervised-restarted and the kanalas self-recovers.

PCR / laiko nustatymas

PCR and PES PTS/DTS are pass-through from the encoder (single clock sritis ⇒ coherent, no drift). Residual PCR jitter ~tens of ms is inherent (10 ms išvestis tick + UDP) — STB/VLC PLL tolerates it, CC=0. Hard DVB-S2 modulator compliance is out of scope for the dabartinis IPTV use case.

CAT — salygine prieiga (tik kai sifruojama / ECM).

EIT — ivykiu informacija (EPG) — is EPG sistemos, zr. toliau.

NIT — tinklo informacija (tinklo ID, pavadinimas, transporto srautas).

PAT — programu sarasas (susieja PNR -> PMT PID).

PMT — kiekvienai programai: vaizdo/garso/PCR PID, kodekai, deskriptoriai.

SDT — paslauguu pavadinimai ir teikeejai (ka STB rodo sarase).

TDT/TOT — laikas ir data + vietinis poslinkis (STB laikrodis).