TS Analyze Perfect Streamer Toolkit v2.2 — TR 101 290

Partie du Perfect Streamer Toolkithttps://pstreamer.tv

Analyseur console de flux de transport MPEG-TS avec vérification de conformité ETSI TR 101 290 V1.4.1 et validation du modèle de buffer T-STD ISO/IEC 13818-1.

Lit du UDP multicast/unicast ou des fichiers TS, détecte automatiquement les PCR PID via PAT/PMT et émet un rapport détaillé ou résumé sur stdout.

Ce qui est vérifié

L’analyseur parcourt chaque paquet TS et signale les violations :

  • Priority 1 (décodabilité TS) : sync TS, perte de sync, présence et CRC PAT/PMT, compteur de continuité, présence des PID

  • Priority 2 (surveillance recommandée) : indicateur d’erreur de transport, erreurs CRC, répétition / précision / discontinuités PCR, intervalle PTS, présence CAT

  • Priority 3 (surveillance étendue) : intervalles NIT/SDT/EIT/TDT, PID non référencés, dépassement / sous-utilisation des buffers T-STD

En plus, sont émis :

  • Précision PCR à ±500 ns — régression sur les positions d’octet

  • Dérive PCR en ppm (mode live uniquement)

  • Modèle de buffer T-STD pour chaque flux élémentaire (mode live)

  • Validation des tailles des sections SI vis-à-vis des limites ISO/EN avec avertissements de compatibilité EIT-on-STB (>1024 o)

  • UDP IAT (inter-arrival time) — statistiques de jitter au niveau du datagramme (mode live uniquement)

Utilisation

ts_analyze [options] <input>

Entrées

Forme

Description

udp://239.1.1.1:1234

UDP multicast

udp://eth0@239.1.1.1:1234

UDP multicast sur l’interface spécifiée

udp://192.168.1.100:1234

UDP unicast

udp://lo@127.0.0.1:12655

UDP unicast sur loopback (source de test)

/path/to/file.ts

Fichier TS local

L’UDP encapsulé en RTP est détecté et déencapsulé automatiquement.

Options

Option

Description

Par défaut

-t, --time <sec>

Durée d’analyse en secondes

30

-s, --short

Rapport de synthèse court

-f, --full

Rapport détaillé complet

oui

-b, --bitrate <Mbps>

Indication du bitrate TS pour le mode fichier

38.8

-p, --pcr-pid <pid>

N’analyser qu’un PCR PID donné (décimal ou 0xHHHH)

automatique

-l, --pcr-limit <ms>

Limite d’erreur de répétition PCR en ms

40

--no-eit

Ignorer l’analyse EIT — P3.7..P3.10 sont signalées N/A ; la contribution EIT à P2.2 et au résumé des tailles SI est retirée

EIT activé

--no-nit

Ignorer l’analyse NIT — P3.1, P3.2 sont signalées N/A ; la contribution NIT à P2.2 et au résumé des tailles SI est retirée

NIT activé

--no-color

Désactiver les couleurs ANSI dans la sortie

couleurs activées

--xml

XML structuré sur stdout (sans stderr)

texte

-h, --help

Afficher l’aide

Exemples

# 30-секундная проверка TR 101 290 на multicast-потоке
ts_analyze -t 30 udp://239.10.10.1:1234

# краткая сводка, сохранение в лог (без цвета)
ts_analyze -s --no-color -t 60 udp://239.10.10.1:1234 > report.txt

# анализ TS-файла
ts_analyze -t 30 recording.ts

# анализ только одного PCR PID
ts_analyze -p 0x0100 -t 30 udp://239.10.10.1:1234

# машинно-читаемый XML для CI / мониторинга
ts_analyze --xml -t 30 udp://239.10.10.1:1234 > result.xml

# пропустить анализ EIT/NIT (например, для потоков, где их намеренно нет)
ts_analyze --no-eit --no-nit -t 30 udp://239.10.10.1:1234

Désactiver l’analyse EIT ou NIT

Dans certains flux, EIT ou NIT sont délibérément absents (réseaux fermés, sources de laboratoire, contribution OTT-only, etc.). Les vérifications P3 correspondantes du TR 101 290 produisent alors toujours un FAIL au verdict OVERALL — ce n’est que du bruit.

Utilisez --no-eit et/ou --no-nit pour désactiver ces vérifications :

Drapeau

Vérifications ignorées

Effets secondaires

--no-eit

P3.7 (EIT actual P/F), P3.8 (EIT other P/F), P3.9 (EIT actual schedule), P3.10 (EIT other schedule)

Les sections EIT ne sont pas assemblées ; leur contribution à P2.2 (CRC) et au résumé des tailles SI est nulle. L’avertissement de compatibilité EIT-on-STB est supprimé.

--no-nit

P3.1 (NIT actual), P3.2 (NIT other)

Les sections NIT ne sont pas assemblées, leur contribution à P2.2 (CRC) et au résumé des tailles SI est donc nulle.

Les vérifications ignorées apparaissent dans le rapport comme N/A avec la marque disabled (--no-eit) / disabled (--no-nit), et dans le XML comme applicable="false" result="N/A". Dans le rapport résumé, à la place du compteur d’erreurs, NIT=off / EIT=off est affiché.

Les drapeaux n’affectent que le traitement de l’EIT (PID 0x0012) et du NIT (PID 0x0010) — toutes les autres vérifications TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, dérive PCR, IAT) s’exécutent normalement.

Mode de sortie XML (--xml)

--xml force l’analyseur à émettre un unique document XML UTF-8 autonome sur stdout. Toutes les informations annexes (bannière, « Stream locked », « PCR PIDs discovered », progression seconde par seconde, résumé de capture, avertissement de durée trop courte) sont supprimées ; stderr reste vide, sauf en cas de panne réelle (entrée non ouvrable, pas de données PCR, flux trop court, interruption par signal). Les couleurs ANSI sont forcément désactivées.

Le code de sortie est identique à celui du mode texte : 0 pour OVERALL=PASS, 65 pour OVERALL=FAIL, plus les codes d’erreur / signaux standard (1, 2, 3, 130, 143).

Structure XML de premier niveau :

<?xml version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.2">
  <source>udp://239.1.1.1:5000</source>
  <timestamp>2026-04-30T12:00:00+0300</timestamp>
  <duration_s>30.00</duration_s>
  <packets total="..." null="..."/>
  <ts_bitrate_mbps>20.012</ts_bitrate_mbps>

  <programs>
    <program number="1" pmt_pid="0x0100" pcr_pid="0x0101">
      <es pid="0x0101" stream_type="0x1b" name="H.264/AVC"/>
      <es pid="0x0102" stream_type="0x03" name="MPEG-2 Audio"/>
    </program>
  </programs>

  <tr101290>
    <check id="1.1" name="TS Sync Byte Error" applicable="true" errors="0" result="PASS"/>
    ...
    <check id="2.3" name="PCR Repetition Error"
           applicable="true" errors="0" result="PASS" soft_violations="3"/>
    ...
    <check id="3.4" name="Unreferenced PIDs" applicable="true" count="2" result="INFO"/>
    ...
  </tr101290>

  <si_section_size oversize_total="0" eit_stb_warn_total="12">
    <table name="EIT_actual_pf" max_bytes="1380" std_limit="4096"
           oversize="0" eit_stb_warn="12" result="WARN_STB"/>
    ...
  </si_section_size>

  <iat datagrams="33252" intervals="33251" min_ms="0.002" max_ms="5.009"
       avg_ms="0.150" stddev_ms="0.295" p95_ms="0.872" p99_ms="1.076"
       max_jitter_ms="4.272" gap_threshold_ms="100.0" gaps_over_threshold="0"/>

  <pcr_pids>
    <pcr_pid value="0x0101" sid="1" pcr_count="1500" discontinuities="0"
             estimated_bitrate_mbps="18.750">
      <interval samples="1499" min_ms="19.812" max_ms="20.195"
                avg_ms="20.001" p95_ms="20.102"
                iso_hard_violations="0" tr_soft_violations="0"
                rec_violations="0" result="PASS"/>
      <accuracy samples="1499" min_ns="-148.3" max_ns="201.7" abs_max_ns="201.7"
                avg_ns="2.1" stddev_ns="45.6" p95_ns="102.3"
                violations="0" result="PASS"/>
      <drift measured="true" ppm="0.618" limit_ppm="30"
             verdict_mode="informational" result="PASS"/>
      <tstd overflows="0" underflows="0" max_fill_bytes="34218" result="PASS">
        <es_buffer es_pid="0x0101" stream_type="0x1b"
                   capacity_bytes="3000000" measuring="true"
                   es_bitrate_mbps="15.200" max_fill_bytes="34218"
                   overflows="0" underflows="0"/>
      </tstd>
    </pcr_pid>
  </pcr_pids>

  <unreferenced_pids count="2">
    <pid value="0x01ff"/>
    <pid value="0x0200"/>
  </unreferenced_pids>

  <overall result="PASS"/>
</ts_analyze>

Conventions clés :

  • Tous les PID sont formatés en 0xHHHH (hex à 4 chiffres avec préfixe 0x).

  • L’attribut result prend les valeurs PASS / FAIL / WARN / N/A / INFO / SKIP / ok / WARN_STB.

  • Pour les vérifications non applicables (mode fichier, absence de scrambling, etc.), l’élément apparaît néanmoins avec applicable="false" et result="N/A" afin que les consommateurs du schéma voient une forme stable.

  • <drift> porte verdict_mode="informational" pour 30 s T < 300 s et verdict_mode="hard" pour T 300 s ; result="SKIP" pour des exécutions inférieures à 30 s.

  • <iat> est absent pour les exécutions en mode fichier.

  • <overall> reflète la même porte que la ligne OVERALL du rapport texte et coïncide avec le code de sortie du processus.

La sortie est du XML bien formé (validable via xmllint --noout) ; on peut l’envoyer directement à XSLT, Python lxml, etc., sans adaptation de parsing.

Lecture du rapport

Couleurs des statuts

État

Couleur

Valeur

PASS / ok

vert

La vérification respecte le standard

WARN / WARNING / WARN(STB)

jaune

Violation légère, n’affecte pas OVERALL

FAIL / ERROR

rouge

Violation du standard, affecte OVERALL

INFO / NOTE / N/A

par défaut

Informatif uniquement

Utilisez --no-color lors de la redirection vers des fichiers de log ou des terminaux non-ANSI.

Durée minimale d’analyse

Durée

Couverture

Code de sortie

< 2 s

Insuffisant — analyse refusée

3 (erreur)

2–10 s

P1 + P2 fiables ; certaines vérifications P3 peuvent manquer de données

0 + WARN

10–30 s

P1 + P2 + la plupart des P3 ; TDT (30 s) peut manquer de données

0 + NOTE

≥ 30 s

Couverture complète de toutes les vérifications TR 101 290

0

La durée par défaut est de 30 secondes — suffisant pour une couverture complète du TR 101 290. Utilisez -t <sec> pour étendre (par ex. pour des tests de réception sur le drift PCR) ou raccourcir (vérifications smoke rapides).

Pendant l’analyse, l’analyseur met à jour chaque seconde un indicateur de progression d’une ligne sur stderr :

Progress: 47.3%  (14.2s / 30.0s, 330614 packets)

La ligne utilise un retour chariot (\r) pour rester sur une seule ligne dans un terminal ; redirigez stderr (2>/dev/null) pour la masquer.

Verdict de dérive PCR — fenêtre à deux niveaux

La tolérance de la fréquence d’horloge PCR selon ISO/IEC 13818-1 §2.4.2.1 et ETSI TR 101 290 est de ±30 ppm. La valeur de drift dans le rapport est obtenue par régression linéaire des secondes PCR cumulatives par rapport à l’horodatage d’arrivée selon l’horloge du banc ; l’erreur statistique décroît en 1 / T^(3/2), donc la fenêtre d’analyse doit être suffisamment longue pour que le bruit de mesure soit nettement inférieur à la limite de ±30 ppm.

L’analyseur conditionne donc le verdict de dérive à la durée d’analyse :

Fenêtre

Verdict si la dérive sort de la tolérance

Impact sur OVERALL

T < 30 s

skipped (le bruit domine la limite ±30 ppm)

aucun

30 s T < 300 s

WARN — informatif uniquement

aucun

T 300 s

FAIL

OVERALL = FAIL, exit 65

300 s est la fenêtre de tests de réception du DVB TR 101 297 — assez longue pour que même un chemin de livraison bursty/loopback soit moyenné en dessous de 1 ppm de bruit de mesure ; un résultat hors spécification reflète alors l’horloge de l’encoder, pas le réseau. Le rapport complet montre le niveau actuel sur la ligne Verdict mode du bloc PCR DRIFT.

Pour obtenir un verdict PASS/FAIL strict sur la dérive, lancer avec -t 300 ou plus.

Recommandations sur la qualité de la source (informatif ; les niveaux de verdict ne changent pas) :

Source

Fenêtre minimale pour ±5 ppm

Pour ±2 ppm

Acceptation

Multicast de diffusion (réseau CBR, jitter < 100 µs)

30 s

60 s

5 min

Réseau IP stable (jitter < 200 µs)

30 s

2 min

5–10 min

Loopback / émetteur en rafale (UDP unicast sur lo)

5 min

15 min

30 min

Étalonnage / mesure en laboratoire

30 min

1+ heure

Exemples :

# Быстрая проверка дрейфа PCR на реальном вещательном multicast (30 с)
ts_analyze -t 30 -s udp://239.1.1.1:5000

# Надёжная проверка на loopback-источнике (5 мин)
ts_analyze -t 300 -s udp://lo@127.0.0.1:12655

# Лабораторная приёмка (30 мин, полный отчёт в файл)
ts_analyze -t 1800 -f --no-color udp://239.1.1.1:5000 > acceptance.txt

Si le même flux est analysé sur plusieurs fenêtres courtes et que la valeur de dérive varie de plus de quelques ppm d’une fenêtre à l’autre, le goulet d’étranglement est le jitter de livraison (cadence d’envoi ou réseau) et non l’horloge de l’encodeur — agrandir la fenêtre.

Codes de sortie

Code

Valeur

0

Analyse terminée, OVERALL = PASS

1

Erreur d’argument ou d’entrée

2

Le flux ne contient pas de données PCR

3

Durée du flux inférieure au minimum de 2 s

65

Analyse terminée, OVERALL = FAIL — violation TR 101 290 / ISO 13818-1

130

Interrompu par SIGINT (Ctrl+C) — analyse annulée, aucun rapport produit

143

Interrompu par SIGTERM — analyse annulée, aucun rapport produit

65 correspond à EX_DATAERR de POSIX <sysexits.h> (« input data was incorrect »). À utiliser en CI / supervision comme porte de conformité du flux :

ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
    case $? in
        65)  echo "поток не соответствует — см. отчёт" >&2 ;;
        130) echo "прервано пользователем" >&2 ;;
        *)   echo "ошибка инструмента" >&2 ;;
    esac
}

Les codes 130/143 suivent la convention POSIX shell 128 + signal_number, donc $? après Ctrl+C correspond à ce que bash retourne pour tout processus tué par SIGINT/SIGTERM. En cas d’interruption, l’analyseur écrit une seule ligne sur stderr (Analysis interrupted by signal N no report produced.) et saute entièrement la génération du rapport.

Exemple de sortie

Rapport complet (extrait)

========================================================================
  MPEG-TS ANALYZER v2.2 — TR 101 290 FULL REPORT
========================================================================
  Source     : udp://239.1.1.1:5000
  Duration   : 30.00 s
  Packets    : 398936 total, 12045 null
  TS bitrate : 20.012 Mbit/s
------------------------------------------------------------------------

========================================================================
  TR 101 290 — PRIORITY 1 (TS decodability)
========================================================================
  |  1.1   TS Sync Byte Error            :        0 errors  PASS
  |  1.4   Continuity Count Error        :        0 errors  PASS
  |  1.6   PID Error (5s absence)        :        0 errors  PASS
  ...

========================================================================
  TR 101 290 — PRIORITY 2 (recommended monitoring)
========================================================================
  |  2.3   PCR Repetition Error          :        0 errors  PASS
  |  2.5   PCR Accuracy Error            :        0 errors  PASS
  ...

========================================================================
  OVERALL COMPLIANCE: PASS  — stream is TR 101 290 compliant
========================================================================

Rapport court

MPEG-TS Analyzer v2.2
TR 101 290 Summary | udp://239.1.1.1:5000 | 30.0s
----------------------------------------------------------------------------------------------------
  P1: sync=0 CC=0 PAT=0 PMT=0 PID=0  P2: TEI=0 CRC=0 PTS=0  P3: NIT=0 SDT=0 EIT=0 TDT=0 unref=2
  IAT: dgrams=33252 avg=0.150 ms max=5.009 ms p99=1.076 ms gaps>100ms=0
----------------------------------------------------------------------------------------------------
PCR PID       SID     Count     Intv max      Jitter max    Drift     Interval  Accuracy  T-STD
----------------------------------------------------------------------------------------------------
0x0101        1       1500      20.195 ms     76.4 ns       0ppm      PASS      PASS      PASS
----------------------------------------------------------------------------------------------------
OVERALL: PASS

Notes

  • Mode fichier : la dérive PCR, le modèle de buffer T-STD et l’UDP IAT ne sont pas mesurés — ils nécessitent une référence temps réel. Les autres vérifications fonctionnent dans les deux modes.

  • Un seul flux de transport : un MPTS ou SPTS est analysé à la fois.