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

Fait partie du Perfect Streamer Toolkithttps://pstreamer.tv

Analyseur de flux de transport MPEG-TS en ligne de commande, avec contrôle de conformité ETSI TR 101 290 V1.4.1 et validation du modèle de tampons T-STD ISO/IEC 13818-1.

Lit des flux UDP multicast/unicast ou des fichiers TS, détecte automatiquement les PID PCR via PAT/PMT et affiche un rapport détaillé ou abrégé sur stdout.

L’outil fait partie du paquet pstreamer et, une fois celui-ci installé, se trouve dans /opt/pss/tools/ts_analyze — aucune installation distincte n’est nécessaire.

Contrôles effectués

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

  • Priority 1 (décodabilité du TS) : synchronisation TS, perte de synchronisation, présence et CRC des 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 des PCR, intervalle PTS, présence de la CAT

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

Il fournit en outre :

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

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

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

  • Validation des tailles de sections SI par rapport aux limites ISO/EN, avec avertissements de compatibilité EIT-on-STB (>1024 octets)

  • UDP IAT (inter-arrival time) — statistiques de gigue au niveau des datagrammes (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 indiqué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’encapsulation RTP de l’UDP est détectée et retirée automatiquement.

Options

Option

Description

Par défaut

-t, --time <sec>

Durée de l’analyse en secondes

30

-s, --short

Rapport de synthèse abrégé

-f, --full

Rapport détaillé complet

oui

-b, --bitrate <Mbps>

Indication du débit TS pour le mode fichier

38.8

-p, --pcr-pid <pid>

N’analyser que le PID PCR indiqué (décimal ou 0xHHHH)

auto

-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 indiqués comme N/A, la contribution de l’EIT à P2.2 / au total des tailles de sections est exclue

EIT activé

--no-nit

Ignorer l’analyse NIT — P3.1, P3.2 sont indiqués comme N/A, la contribution de la NIT à P2.2 / au total des tailles de sections est exclue

NIT activée

--no-color

Désactiver les couleurs ANSI en sortie

couleurs activées

--xml

XML structuré sur stdout (sans stderr)

texte

-h, --help

Afficher l’aide

Exemples

# 30-second TR 101 290 check on a multicast stream
ts_analyze -t 30 udp://239.10.10.1:1234

# short summary, save to log (no color)
ts_analyze -s --no-color -t 60 udp://239.10.10.1:1234 > report.txt

# analyze a TS file
ts_analyze -t 30 recording.ts

# analyze only a single PCR PID
ts_analyze -p 0x0100 -t 30 udp://239.10.10.1:1234

# machine-readable XML for CI / monitoring
ts_analyze --xml -t 30 udp://239.10.10.1:1234 > result.xml

# skip EIT/NIT analysis (e.g. for streams where they are intentionally absent)
ts_analyze --no-eit --no-nit -t 30 udp://239.10.10.1:1234

Désactivation de l’analyse EIT ou NIT

Dans certains flux, l’EIT ou la NIT sont volontairement absentes (réseaux fermés, sources de laboratoire, diffusion OTT uniquement, etc.). Les contrôles P3 correspondants de la TR 101 290 donnent alors systématiquement FAIL au verdict global OVERALL — ce n’est que du bruit.

Utilisez --no-eit et/ou --no-nit pour exclure ces contrôles :

Drapeau

Contrôles ignorés

Effets de bord

--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 collectées ; leur contribution à P2.2 (CRC) et au récapitulatif des tailles de sections SI est donc 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 collectées ; leur contribution à P2.2 (CRC) et au récapitulatif des tailles de sections SI est donc nulle.

Les contrôles ignorés apparaissent dans le rapport sous la forme N/A avec la mention disabled (--no-eit) / disabled (--no-nit), et en XML sous la forme applicable="false" result="N/A". Dans le rapport abrégé, NIT=off / EIT=off s’affiche à la place du compteur d’erreurs.

Ces drapeaux n’affectent que le traitement de l’EIT (PID 0x0012) et de la NIT (PID 0x0010) — tous les autres contrôles TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, dérive PCR, IAT) sont effectués normalement.

Mode de sortie XML (--xml)

--xml fait produire à l’analyseur un document XML UTF-8 unique et autonome sur stdout. Toutes les informations de service (bannière, « Stream locked », « PCR PIDs discovered », progression seconde par seconde, récapitulatif de capture, avertissements de durée insuffisante) sont supprimées ; stderr reste vide, sauf en cas de défaillance réelle (entrée impossible à ouvrir, absence de données PCR, flux trop court, interruption par un signal). Les couleurs ANSI sont désactivées de force.

Le code de sortie est le même qu’en mode texte : 0 pour OVERALL=PASS, 65 pour OVERALL=FAIL, plus les codes d’erreur / de signal standard (1, 2, 3, 130, 143).

Structure XML de premier niveau :

<?xml version="1.0" encoding="UTF-8"?>
<ts_analyze version="2.3">
  <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 principales :

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

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

  • Pour les contrôles non applicables (mode fichier, absence d’embrouillage, etc.), l’élément reste présent, 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 les exécutions de moins de 30 s.

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

  • <overall> reflète le même verdict global que la ligne OVERALL du rapport texte et correspond au code de sortie du processus.

La sortie est du XML bien formé (well-formed) (validé par xmllint --noout) ; transmettez-la directement à XSLT, à Python lxml, etc., sans adaptation de l’analyse syntaxique.

Lecture du rapport

Couleurs des statuts

Statut

Couleur

Signification

PASS / ok

vert

Le contrôle est conforme à la norme

WARN / WARNING / WARN(STB)

jaune

Violation souple, sans effet sur OVERALL

FAIL / ERROR

rouge

Violation de la norme, avec effet sur OVERALL

INFO / NOTE / N/A

par défaut

À titre informatif uniquement

Utilisez --no-color lors d’une redirection vers des fichiers journaux ou vers des terminaux non ANSI.

Durée d’analyse minimale

Durée

Couverture

Code de sortie

< 2 s

Insuffisant — l’analyse est rejetée

3 (erreur)

2–10 s

P1 + P2 fiables ; certains contrôles P3 peuvent manquer de données

0 + WARN

10–30 s

P1 + P2 + la plupart des P3 ; la TDT (30 s) peut ne pas être atteinte à temps

0 + NOTE

≥ 30 s

Couverture complète de tous les contrôles TR 101 290

0

La durée par défaut est de 30 secondes, ce qui suffit à une couverture complète de la TR 101 290. Utilisez -t <sec> pour l’allonger (par exemple pour des essais de recette portant sur la dérive PCR) ou la raccourcir (contrôles rapides de type smoke test).

Pendant son exécution, l’analyseur met à jour chaque seconde un indicateur de progression sur une seule ligne, sur stderr :

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

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

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

La tolérance d’horloge PCR définie par ISO/IEC 13818-1 §2.4.2.1 et ETSI TR 101 290 est de ±30 ppm. La valeur de dérive du rapport est obtenue par régression linéaire des secondes PCR cumulées par rapport à l’instant d’arrivée mesuré sur l’horloge du banc ; l’erreur statistique décroît en 1 / T^(3/2), la fenêtre d’analyse doit donc être assez longue pour que le bruit de mesure reste sous la limite de ±30 ppm.

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

Fenêtre

Verdict lorsque la dérive dépasse la tolérance

Effet sur OVERALL

T < 30 s

skipped (le bruit domine par rapport à la limite de ±30 ppm)

aucun

30 s T < 300 s

WARN — à titre informatif uniquement

aucun

T 300 s

FAIL

OVERALL = FAIL, exit 65

300 s est la fenêtre de recette (valeur propre au produit ; la norme ETSI TR 101 290 ne normalise pas les intervalles de mesure) — assez longue pour que même un canal de livraison en rafales ou en loopback soit moyenné sous 1 ppm de bruit de mesure et pour qu’un dépassement de la tolérance traduise l’oscillateur d’horloge de l’encodeur et non le réseau. Le rapport complet indique le niveau courant à la ligne Verdict mode du bloc PCR DRIFT.

Pour obtenir un verdict PASS/FAIL ferme sur la dérive, lancez l’analyse avec -t 300 ou plus.

Recommandations selon la qualité de la source (à titre informatif ; elles ne modifient pas les niveaux de verdict) :

Source

Fenêtre minimale pour ±5 ppm

Pour ±2 ppm

Recette

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

30 s

60 s

5 min

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

30 s

2 min

5–10 min

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

5 min

15 min

30 min

Étalonnage / mesure en laboratoire

30 min

1 h et plus

Exemples :

# Quick PCR drift check on a real broadcast multicast (30 s)
ts_analyze -t 30 -s udp://239.1.1.1:5000

# Reliable check on a loopback source (5 min)
ts_analyze -t 300 -s udp://lo@127.0.0.1:12655

# Lab acceptance (30 min, full report to file)
ts_analyze -t 1800 -f --no-color udp://239.1.1.1:5000 > acceptance.txt

Si un 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 facteur limitant est la gigue de livraison (cadence d’émission de la source ou réseau) et non l’oscillateur d’horloge de l’encodeur — allongez la fenêtre.

Codes de sortie

Code

Signification

0

Analyse terminée, OVERALL = PASS

1

Erreur d’arguments ou d’entrée

2

Aucune donnée PCR dans le flux

3

La durée du flux est inférieure au minimum de 2 s, ou aucune donnée n’a été reçue du tout (source qui n’émet pas, adresse erronée, adhésion multicast non effectuée, pare-feu ou interface incorrecte — l’analyseur affiche une indication)

65

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

130

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

143

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

65 correspond à EX_DATAERR de POSIX <sysexits.h> : « les données d’entrée sont incorrectes ». Utilisez-le en intégration continue ou en supervision pour conditionner la validation à la conformité du flux :

ts_analyze -s -t 60 udp://239.1.1.1:5000 || {
    case $? in
        65)  echo "stream does not conform — see report" >&2 ;;
        130) echo "interrupted by user" >&2 ;;
        *)   echo "tool error" >&2 ;;
    esac
}

Les codes 130/143 suivent la convention du shell POSIX 128 + signal_number ; ainsi, $? après Ctrl+C correspond à ce que bash renvoie 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 n’effectue pas du tout la génération du rapport.

Exemple de sortie

Rapport complet (extrait)

========================================================================
  MPEG-TS ANALYZER v2.3 — TR 101 290 FULL REPORT
  Perfect Streamer Toolkit https://pstreamer.tv
========================================================================
  Source     : udp://239.1.1.1:5000
  Timestamp  : 2026-04-30 12:00:00
  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                  :        0           PASS
  |  1.4   Continuity Count              :        0           PASS
  |  1.6   PID Absence (5s)              :        0           PASS
  ...

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

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

Rapport abrégé

MPEG-TS Analyzer v2.3 | Perfect Streamer Toolkit https://pstreamer.tv
TR 101 290 Summary | udp://239.1.1.1:5000 | 30.0s | 2026-04-30 12:00:00
----------------------------------------------------------------------------------------------------
  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 stddev=0.295 ms p99=1.076 ms gaps>100.000 ms=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

Remarques

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

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