Muxer — Statistical Multiplex

TSDuck-based MPEG Transport Stream multiplexer with full PSI/SI support

Multiplexor MPTS & Statmux Hibrid Adaptiv

Flux Manager mux assembles multiplu SPTS streams into unu CBR MPTS iesire (DVB/IPTV). Adaptive Hybrid Statmux combines a CBR core fill with VBR balanced encoders for constant mux output.

1. Codificator layer (FFmpeg per stream)

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

2. Stratul Mux (flux tsp TSDuck)

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

3. Iesire layer (UDP)

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

Buget Muxer

Mux varf bar shows 3 sums with color status. Rules:

Σ avg ≤ 85 % mux.bitrate — medic tinta suma across toti channels plus audio. That is the mux 'budget'. The 15 % statistical reserve protects against peak coincidence. Green ≤ 85 %, amber ≤ 100 %, red > 100 %.

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

Σ min ≤ 50 % mux.bitrate — codificator floor sum. A safe floor ensures that on still scenes the codificator doesn't drop catre needlessly low quality. Green ≤ 50 %, amber ≤ 90 %, red > 90 %.

Exemplu: 4 canale HD într-un mux DVB-T de 19 Mbps

Disponibil budget dupa PSI/SI/EIT: ~18.5 Mbps. Σ avg = 4 × 4.0 = 16 Mbps (86 % — amber borderline, lower further). Σ max = 4 × 6.0 = 24 Mbps (130 % — green, OK). Σ min = 4 × 3.0 = 12 Mbps (65 % — amber, OK). Target: avg ~85 % of budget, max ≤ 160 %.

Diagnostics și alarme

On ≥ 10 alarms in 60s a flash notificare appears in the Mux UI recommending a viteza de transfer reduction. Auto-back-off is NOT activ — the operator decides.

-P bitrate_monitor --periodic 60 --min/max ±5% — alarmă dacă rata reală se abate de la ±5 % față de țintă. Indică faptul că regulația este înfometată (sursa a murit).

-P continuity — tracks TS continuity counters. Jurnale a avertisment 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 sau sursa has broken PCRs.

Erori Muxer

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

Intrare loss-of-signal — singular canal goes black, mux continues (thanks catre -I null base). Durata ~3-8 s for FFmpeg restart.

Over-subscription (sustained peaks > capacity) — blocks/audio stutter ~50-200 ms. Fix: lower flux avg by 5-10 % sau inlatura a channel.

PCR drift — STB stutter every cateva seconds. Fix: pcradjust in the pipeline (already there), watch pcrverify alarms.

STB VBV underrun — STB loses sync si re-acquires (~2-3 s). Fix: codificator bufsize = 2 × maxrate (already), lower maxrate.

Parametri flux tsp (mux_worker.ex)

--max-input-packets 4096 / --max-flushed-packets 4096 (FIFO intern ≈ 0,3 s @ 19 Mbps). --receive-buffer-size 16777216 (buffer UDP de recepție de 16 MB per intrare). --packet-burst 32 (regulare) / 7 (ieșire, standard IPTV). --enforce-burst (fiecare datagramă UDP conține exact 7 pachete).

Recomandare Muxer

Top-bar badge `📐 rec X.XM` shows the recommended mux capacitate derived din the central limit theorem. The suma of independent VBR streams approaches a normal distribution, so Mux = μ_total + z·σ_total + margin. σ_i is estimated din each input's VBR range as (max−min)/4 (assuming the range covers ±2σ). The margin = 10% of μ_total compensates for PSI/SI overhead, codificator rate-control jitter, si flux correlation that pure CLT under-estimates.

Badge color: 🟢 green = cap ≥ 99.7% rec (conservative) · 🟡 amber = intre 99% si 99.7% · 🔴 red = cap < 99% (under-provisioned, risk of drops) · 🔵 blue = cap unset.

z-score per coverage target: 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). The badge tooltip lists toti levels; clicking applies the 99.7% recommendation catre mux.bitrate (mux restarts required).

σ_eff = σ_total × statmux_factor (statmux_factor = 0.7 when Statmux is ON, else 1.0)

Recommended values per canal (HD H.264)

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

Statmux Muxer

Adaptive Hybrid Statmux is a runtime mechanism that shifts unused capacitate din core streams (protected, plin VBR) catre balanced streams (sacrificial). "Hybrid" because doi distinct rate-control regimes run side by side (CBR core fill + VBR balanced); "adaptive" because the router re-evaluates once per secunda din an HLS-lookahead prediction. The operator marks streams as balanced via the right-side checkbox; the system pre-encodes them into trei tiers (HIGH/MED/MIN) si the router atomically swaps the symlink based on remaining headroom dupa predicting core peaks.

Capacitate — how viteza de transfer is divided

Mux capacitate 38 Mbps ┌──────────────────────────────────────────────────────────────────┐ │█████████████████████████████████████████████████████░░░░░░░░░░░░│ └──────────────────────────────────────────────────────────────────┘ ◀────── core_max (predicted din 6 HLS segments) ─▶◀── balanced ──▶ per_balanced = (cap − core_max − SI overhead − audio) / 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

Câștig practic (10 fluxuri × 3 Mbps medie, 4 Mbps maxim)

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

CBR pur (encoder fix)

VBR fără Statmux

Statmux Hibrid Adaptiv ACTIVAT

Exclusivitate URL ↔ Statmux

Personalizat URL intrare override si Statmux are mutually exclusive. With Statmux on, the balanced transcodificator relies on the local codificator HLS catre control bitrate. An extern URL would bypass that control loop. The UI enforces this both ways — the checkbox locks when there is a conflicting combination, si the tooltip shows which flux is blocking.

Pipeline (encoder → balanced transcodificator → mux ffmpeg → tsp)

┌─────────────────────────┐ │ Codificator (NVDEC→NVENC) │ ← UDP satellite STREAM │ /dev/shm/stream_X/h264/│ │ → muxed.m3u8 + segments│ └────────────┬────────────┘ │ ┌────────┴────────┐ │ │ role="core" role="balanced" (protected) (sacrificial) │ │ │ ▼ │ ┌───────────────────────────┐ │ │ BalancedTranscoder │ │ │ ffmpeg p1 NVENC VBR │ │ │ -maxrate dynamic │ ← Adaptive Hybrid router │ │ /dev/shm/stream_X_ │ 1 s tick (predicts din │ │ 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 fisier - │ │ continuity → regulate │ │ → pcradjust → bitrate_ │ │ monitorizare │ │ -P nit -P sdt -P inject│ │ (DVB SI tables) │ └────────────┬────────────┘ │ ▼ UDP multicast 239.x.x.x:1234

Dimensionarea minimului/mediei/maximului VBR pentru statmux

Statistical gain only happens when encoders have a wide VBR range — when max ≈ avg the codificator is effectively CBR si the router has nothing catre redistribute. Configureaza `min/avg/max` per flux so Σmax is comfortably deasupra the mux cap (over-subscription = headroom for statistical gain) while Σavg sits comfortably sub it.

Worked example — 38 Mbps mux, 10 HD core + 2 balanced: Vechi (CBR-locked): min=2000 avg=3000 max=4000 Σmax = 10×4000 + 2×7600 = 55200 kbps (1.45× cap — small gain) σ_per_stream = (4000−2000)/4 = 500 kbps (trivial — flat) Σ statistical headroom ≈ 1.5 Mbps Recommended (wide 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 — comfortable) Σmin = 10×1500 + 2×500 = 16000 kbps (42% cap — comfortable floor) σ_per_stream = (6000−1500)/4 = 1125 kbps (significant) Σ statistical headroom ≈ 4 Mbps Real benefit: on action scenes core peaks at 5−6 Mbps (HD detail), the router sheds balanced catre MIN tier, total wire stays at 38 Mbps.

Recommended range per core stream: • min ≈ avg × 0.5 (encoder may drop on still scenes) • avg = nominal tinta by rezolutie (HD ≈ 3 Mbps, FullHD ≈ 5 Mbps, UHD ≈ 12 Mbps) • max ≈ avg × 2.0 (encoder may peak on action — sport, action film) Mux capacitate guards (must hold): • Σ avg core + Σ avg balanced ≤ mux.bitrate × 0.85 (comfortable target) • Σ max core + Σ max balanced ≤ mux.bitrate × 2.0 (over-subscription gain) • Σ min core + Σ min balanced ≤ mux.bitrate × 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)

Sfaturi și depanare

At cel mai putin 1 balanced flux — without unu the Adaptive Hybrid router has nothing catre squash during peaks, so gain = 0

Music si informatie channels are the best candidates — 90 %+ tolerance catre rate shedding

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

If `core_max > capacity` (CORE OVERPEAK avertisment in log), reduce core flux numar sau lower codificator maxrate

Flux de lucru al operatorului

Adauga streams catre the mux (channel assignment stays manual)

Comuta Statmux on the mux antet (yellow chip). When enabled, toti encoders schimbare catre VBR si restarts

Marcați fluxurile sacrificiale prin caseta de selectare portocalie din dreapta — de obicei canale muzicale/informaționale unde reducerea ratei este invizibilă

Done. The Adaptive Hybrid router reads a 6-segment HLS prediction din core streams every 1 s si atomically swaps the balanced symlink intre HIGH/MED/MIN tiers

Statmux

The mux runs on a native C NIF (single-host, replaced the vechi gst_mux.py). Each canal has its own CBR encoder; the NIF demultiplexes them, statistically allocates viteza de transfer by scene complexity, pads with NULL packets catre a fixed wire cap, si emits unu MPTS UDP multicast. This ajutor describes the curent UI: chart, headroom slider, diff gauge, canal cards.

Clasă: statmux cu feedback în buclă închisă cu look-ahead C1 (feedforward) peste encodere VBR — principiul statmux broadcast, condus din complexitatea sursei.

Arhitectură și flux de date

Architecture diagram

UDP multicast SSM, per canal

Codificator

complexitate sursă

Ciclu

linie proprie / stream

Alocator

Buffer

padding null → CBR

Fir CBR la cap

anticipare scenă complexă înainte de scădere

fir măsurat — calibrare

bitrate țintă

Fiecare canal rulează pe propria linie până la mux (encoder separat + conexiune loopback), unde toate se unesc într-o singură linie multicast MPTS la un bitrate fix exact. Alocatorul este creierul central (1 GenServer per mux), tick ~0,85 s.

Brain: feedback + look-ahead C1

Alocatorul combină două semnale — o predicție din complexitatea sursei (înainte) și firul măsurat (înapoi). Aceasta se apropie de statmux-urile broadcast care cunosc costul unui cadru înainte de encodare.

C1 măsoară complexitatea conținutului la decodor — ceea ce precede ieșirea encoderului cu latența pipeline-ului. Schimbarea relativă de complexitate (corelație r≈0,92 cu biți) este aplicată la bitrateul țintă în AMBELE direcții ÎNAINTE ca encoderul să îl producă: o scenă în creștere este pre-alocată (fără scădere), una în scădere eliberează biți devreme pentru ceilalți.

Fir măsurat (feedback)

Biții exacți emișuiți per stream de multiplexor (contoare pe partea expeditorului) calibrează maparea complexitate→bitrate și mențin suma exact la pool. Ancoră reală — predicția C1 nu este perfectă (r 0,92), firul de urmărire o corectează.

deliver_t

Revendicarea unui stream este susținută de ceea ce produce efectiv encoderul (× marja de vârf). Un canal ușor nu poate acapara lățime de bandă pe care nu o poate consuma — o eliberează pentru cel care are nevoie.

Calitate egalizată

Scopul nu este egalitatea bitrateului, ci egalitatea calității — presiunea continuă mută biți de la canalele de calitate ridicată (QP scăzut) spre cele de calitate scăzută (QP ridicat).

Redistribuire predictivă

Când C1 semnalează că un canal scade, lățimea sa de bandă este transferată celorlalți în același tick — aceștia cresc înainte ca scăderea să ajungă efectiv pe fir.

Per-channel weight = complexity_q12 × max_bps (action scene + higher max ⇒ mai mult bits).

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

×headroom % (slider) on the codificator tinta → Σ real codificator < wire cap ⇒ rings drain gol ⇒ clean video.

Stale-exclusion: a dead intrare (no receive > 2 s) is dropped din the splitter — its share goes catre direct channels, nu wasted; re-included automatically on recovery.

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

Fir CBR: buffer + padding null + temporizare

Ieșirea este un stream CBR exact la cap-ul configurat. Trei straturi îl garantează:

Buffer permanent ~1 s

Coada de trimitere menține un nivel permanent de ~1 s din fir care absoarbe scăderile GOP sub-secundă (între I-frame-uri). Verificat din înregistrare: 0,5–1 s absoarbe 88–91% din scăderi.

Padding null

Când conținutul este sub cap, diferența este completată cu pachete null MPEG-TS (PID 0x1FFF). Firul ajunge ÎNTOTDEAUNA la cap — conform DVB.

Temporizare exactă

Ieșirea este temporizată exact la cap (busy-spin ABSTIME); o clemă de datorie 12 ms previne burst-urile de recuperare după o pauză scurtă → fără jitter PCR, fără vârfuri peste cap.

Viteza de transfer grafic (main)

Stacked area — each canal has its colour (matching its card below). Σ of toti + NULL pad = wire cap. Schimbare the ora fereastra 10m / 1h / 24h; pills urmatorul catre it = eveniment counts (CC / PCR / BR / OVF) for the selected window.

Benzi colorate

Fiecare canal are o culoare stabilă; grosimea = bitrateul său instantaneu. Overhead-ul (PSI/EIT) este gri în jos, padding-ul null este texturat alb în sus.

Linia Cap / Max

Linia punctată de sus = cap configurat (plafonul firului). Conținut + padding null împreună se află mereu sub acesta.

Banda null

Banda albă punctată de sus = padding null (capacitate liberă). Cu cât este mai subțire, cu atât firul este mai plin; dispare la conținut solicitant.

Marcaje drop

Marcajele roșii pe cronologie = depășire coadă de trimitere (drop). Zero în stare stabilă; burst-uri doar la pornire/suprasarcină.

Interval (30s–30m)

Butoanele comută fereastra de timp instant (client-side), cea activă are fundal gri. Graficul acumulează 30 min în browser.

tip_t

Hover afișează bitrateul per canal, QP și indicele de calitate în acel moment (valoare istorică, nu live).

cap_t

Nivelul curent de reglare pool (pool/(pool−trim)). >100% = suprapresiune (umple buffer-ul), <100% = triming.

Rezervă (slider)

Banda de toleranță deasupra cap-ului — cât să se păstreze ca rezervă null. 0 = umple exact N; pozitiv = rezervă mai mare (mai sigur); negativ = ușoară supraîncărcare.

Buffer (drop-uri)

Antetul arată % utilizare coadă de trimitere și drop-urile cumulative. Butonul "clear drops" resetează contorul.

gop_t

Lungimea GOP comună pentru toate canalele din mux (blocată în profilurile video la pornire). Eșalonarea în timp distribuie I-frame-urile astfel încât să nu colizioneze.

vbv_t

Dimensiunea buffer-ului VBV al encoderului (ms). Mai mic aplatizează I-frame-urile (bun pentru canale cu mișcare), mai mare oferă un I-frame mai detaliat. Implicit 850; suprascrierea per stream este posibilă.

Canal cards (Programs)

The section antet has a 'Collapse / Extinde all' toggle. Extinde a card by clicking it sau clicking its colour band in the chart. The stanga coloured strip with checkbox = canal membership in the mux.

dark = in executie OK

orange = se incepe / restarting

grey + dimmed = down/error si checkbox OFF (intentionally dezactivat — nu alarm)

red + BLINKING = FAULT — canal is in the mux (checkbox ON) but the flux is down/error

Tabele PSI/SI (set DVB complet)

StatMux generează setul complet de tabele MPEG-TS / DVB obligatorii direct în mux-ul NIF — fără insertor SI extern. Tabelele sunt temporizate uniform în stream, astfel că un STB achiziționează rapid PSI/SI după resintonizare.

Tabel

psi h_pid

psi h_int

Scop / sursă

EIT ↔ EPG: integrare completă

EIT (Event Information Table, PID 0x12) nu este static — este complet conectat la sistemul EPG al aplicației. Operatorul atribuie fiecărui canal din mux un serviciu EPG (eit_epg_service_id), iar mux-ul generează EIT live din evenimentele programate.

Sizing / recommendations

mux.bitrate = 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-stream min/avg/max in Flux → Transcodificator profile (auto-syncs catre mux_input). Action/sport 8–10 M, news/talking head 1–2 M, min niciodata < 800 k.

The headroom slider is a quick direct lever of reserve vs. tightness — nu restart.

Relație cu statmux-urile broadcast

Facem multiplexare statistică reală — redistribuire dinamică a biților între canale VBR care partajează un fir fix, cu egalizarea calității. Mecanic suntem aproape de statmux-urile profesionale de headend (aliniere cap, buffer 1 s, padding null, GOP/B-frame-uri, suprascrierea floor-ului).

Ce avem

Fir CBR la cap · buffer 1 s · alocare proporțională per stream · feedforward look-ahead C1 · egalizare calitate · redistribuire predictivă · padding null · pacing exact.

Unde diferim

Un statmux broadcast utilizează estimarea rate-distortion a encoderului (costul exact al cadrului, encoderul este sclav alocatorului). Noi utilizăm complexitatea sursei C1 (r≈0,92) + un encoder VBR care alege propriul QP — o limitare hardware, nu de design. Clasă: feedback + look-ahead în loc de feedforward pur.

Antet TS

ts h_sym

ts h_fix

Canal red si blinking

In the mux (checkbox ON) but flux down/error → check the source/encoder of that stream. Self-recovers once restored.

Lots of NULL / large grey area

Calm content sau low headroom — normal (statmux gain). For tighter utilization raise the headroom slider sau per-stream max_bps.

Picture freezes / glitches

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

Dupa restarts streams=0 / toti NULL

Mux started inainte the encoders — self-heal automatically reaches 12 within ~30 s (1 s tick retry). Nu manual action.

Diff gauge stuck at 0 / grafic gol

Nu direct samples (mux oprit sau encoders nu running) — check both the mux si flux status.

Arhitectură

Diagramă ASCII

enc_b

nif_b

out_b

Rândul 1

Rândul 2

Stări carduri

Diagramă ASCII

Red 'cap' line: wire CBR ceiling (mux.bitrate) — NULL fills up catre here.

Orange 'headroom N%' line: = cap × headroom slider / 100. Codificator set_bitrate targets aim here. Moves with the slider.

Grey area with black dots intre content si cap = NULL padding (unused reserve). Mai mult dots = mai mult reserve.

L4

Program

MuxEitAdapter citește evenimentele din sistemul EPG per serviciu, construiește secțiuni DVB EIT (nume, oră, durată, descriere, gen) și le pachetizează pe PID 0x12. Versiunile secțiunilor se incrementează la schimbarea EPG — STB-ul preia actualizarea.

EIT este injectat direct în mux-ul NIF, uniform ÎN spațiul null (1 pachet / N ieșiri + p/f periodic) — înlocuind cascada tsp externă cu burst-uri. Peak/avg ≈ 1,1, fără evacuare conținut, cap-ul ținut.

Tabel 0x4E — evenimentul în curs + următorul. Injectat la fiecare ≤2 s pentru actualitate instantă "acum/următor" pe STB.

Mux-ul regenerează periodic EIT .bin din EPG (~15 s) — o schimbare de program EPG ajunge pe fir fără repornire. Antetul mux-ului afișează "EIT ✓" când este activ.

Tabele 0x50/0x51 — programul complet cu ore/zile înainte (segmente). Distribuit uniform în stream.

Indicator

Introducere

Indicator ASCII

Antete

HR b1

Higher (→90): tighter cap utilization, mai putin NULL.

HR b3

HR b4

Controls how much of the cap the encoders target: codificator tinta = budget × headroom% / 100 (orange line in the chart). Changes direct (effect din the urmatorul 10 ms tick), persisted in SystemConfig.

ISO 13818-1

ISO 13818-1 corp

PCR

PCR corp

CAT — acces condiționat (doar la scrambling / ECM).

EIT — informații despre evenimente (EPG) — din sistemul EPG, vezi mai jos.

NIT — informații rețea (ID rețea, nume, transport stream).

PAT — lista programelor (mapează PNR → PID PMT).

PMT — per program: PID-uri video/audio/PCR, codecuri, descriptori.

SDT — nume servicii și furnizori (ceea ce STB-ul afișează în listă).

TDT/TOT — oră și dată + decalaj local (ceasul STB-ului).

TSDuck Plugins Used

merge
regulate
pat
pmt
sdt
nit
eitinject
timeref
bitrate_monitor
continuity
psimerge
count