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

Parte do Perfect Streamer Toolkit — https://meshwork.pstreamer.tv

Analisador de fluxo de transporte MPEG-TS de linha de comando, com verificação de conformidade com ETSI TR 101 290 V1.4.1 e validação do modelo de buffers T-STD da ISO/IEC 13818-1.

Lê UDP multicast/unicast ou arquivos TS, detecta automaticamente os PID de PCR por meio de PAT/PMT e imprime um relatório detalhado ou resumido em stdout.

A ferramenta faz parte do pacote pstreamer e, após a instalação, fica em /opt/pss/tools/ts_analyze — não é necessário instalar nada separadamente.

O que é verificado

O analisador percorre cada pacote TS e informa as violações:

  • Priority 1 (decodificabilidade do TS): sincronismo TS, perda de sincronismo, presença e CRC de PAT/PMT, contador de continuidade, presença de PID

  • Priority 2 (monitoramento recomendado): indicador de erro de transporte, erros de CRC, repetição / precisão / descontinuidades do PCR, intervalo de PTS, presença de CAT

  • Priority 3 (monitoramento estendido): intervalos de NIT/SDT/EIT/TDT, PIDs não referenciados, transbordamento / esvaziamento dos buffers T-STD

Adicionalmente, informa:

  • Precisão do PCR até ±500 ns — regressão sobre as posições de byte

  • Deriva do PCR em ppm (somente no modo live)

  • Modelo de buffers T-STD para cada fluxo elementar (modo live)

  • Validação dos tamanhos das seções SI em relação aos limites ISO/EN, com avisos de compatibilidade EIT-on-STB (>1024 B)

  • UDP IAT (inter-arrival time) — estatísticas de jitter no nível dos datagramas (somente no modo live)

Utilização

ts_analyze [options] <input>

Entradas

Forma

Descrição

udp://239.1.1.1:1234

UDP multicast

udp://eth0@239.1.1.1:1234

UDP multicast na interface especificada

udp://192.168.1.100:1234

UDP unicast

udp://lo@127.0.0.1:12655

UDP unicast em loopback (fonte de teste)

/path/to/file.ts

Arquivo TS local

O encapsulamento RTP sobre UDP é detectado e desempacotado automaticamente.

Opções

Opção

Descrição

Padrão

-t, --time <sec>

Duração da análise em segundos

30

-s, --short

Relatório-resumo final

–

-f, --full

Relatório completo detalhado

sim

-b, --bitrate <Mbps>

Sugestão de taxa de bits do TS para o modo de arquivo

38.8

-p, --pcr-pid <pid>

Analisar somente o PID de PCR indicado (decimal ou 0xHHHH)

automático

-l, --pcr-limit <ms>

Limite de erro de repetição do PCR em ms

40

--no-eit

Ignorar a análise da EIT — P3.7..P3.10 são exibidos como N/A, a contribuição da EIT para P2.2 / para o total dos tamanhos das seções é excluída

EIT ativado

--no-nit

Ignorar a análise da NIT — P3.1, P3.2 são exibidos como N/A, a contribuição da NIT para P2.2 / para o total dos tamanhos das seções é excluída

NIT ativado

--no-color

Desativar as cores ANSI na saída

cores ativadas

--xml

XML estruturado em stdout (sem stderr)

texto

-h, --help

Exibir a ajuda

–

Exemplos

# 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

Desativação da análise de EIT ou NIT

Em alguns fluxos, a EIT ou a NIT estão ausentes de propósito (redes fechadas, fontes de laboratório, entrega exclusivamente OTT etc.). Nesses fluxos, as verificações P3 correspondentes da TR 101 290 sempre dão FAIL na avaliação final OVERALL, e esse FAIL não significa nada.

Utilize --no-eit e/ou --no-nit para excluir essas verificações:

Sinalizador

Verificações ignoradas

Efeitos colaterais

--no-eit

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

As seções EIT não são coletadas, portanto a sua contribuição para P2.2 (CRC) e para o resumo dos tamanhos das seções SI é nula. O aviso de compatibilidade EIT-on-STB é suprimido.

--no-nit

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

As seções NIT não são coletadas, portanto a sua contribuição para P2.2 (CRC) e para o resumo dos tamanhos das seções SI é nula.

As verificações ignoradas aparecem no relatório como N/A com a marcação disabled (--no-eit) / disabled (--no-nit) e, no XML, como applicable="false" result="N/A". No relatório resumido, em vez do contador de erros, é exibido NIT=off / EIT=off.

Os sinalizadores afetam apenas o processamento da EIT (PID 0x0012) e da NIT (PID 0x0010) — todas as demais verificações da TR 101 290 (P1.x, P2.x, SDT, TDT, CAT, T-STD, deriva do PCR, IAT) são executadas normalmente.

Modo de saída XML (--xml)

Com --xml, o analisador emite em stdout um único documento XML UTF-8 autocontido. Todas as informações auxiliares (o banner, Stream locked, PCR PIDs discovered, o progresso a cada segundo, o resumo da captura, os avisos de duração curta) são suprimidas; o stderr permanece vazio, a menos que ocorra uma falha (não foi possível abrir a entrada, não há dados de PCR, o fluxo é curto demais, interrupção por sinal). As cores ANSI são desativadas à força.

O código de saída é o mesmo do modo texto: 0 para OVERALL=PASS, 65 para OVERALL=FAIL, além dos códigos padrão de erro / sinal (1, 2, 3, 130, 143).

Estrutura XML de nível superior:

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

Convenções principais:

  • Todos os PIDs são formatados como 0xHHHH (hex de 4 dígitos com o prefixo 0x).

  • O atributo result assume os valores PASS / FAIL / WARN / N/A / INFO / SKIP / ok / WARN_STB.

  • Para as verificações não aplicáveis (modo de arquivo, ausência de embaralhamento etc.), o elemento continua presente, com applicable="false" e result="N/A", para que os programas que analisam o XML sempre recebam a mesma estrutura.

  • <drift> contém verdict_mode="informational" para 30 s ≤ T < 300 s e verdict_mode="hard" para T ≥ 300 s; result="SKIP" para execuções com menos de 30 s.

  • <iat> está ausente nas execuções em modo de arquivo.

  • <overall> reflete o mesmo resultado final que a linha OVERALL do relatório em texto e coincide com o código de saída do processo.

A saída é um XML bem formado (well-formed), validado por xmllint --noout; envie-a diretamente a XSLT, ao lxml do Python etc., sem adaptações de parsing.

Leitura do relatório

Cores dos estados

Estado

Cor

Significado

PASS / ok

verde

A verificação está em conformidade com a norma

WARN / WARNING / WARN(STB)

amarelo

Violação leve, não afeta o OVERALL

FAIL / ERROR

vermelho

Violação da norma, afeta o OVERALL

INFO / NOTE / N/A

padrão

Apenas informativo

Utilize --no-color ao redirecionar para arquivos de log ou para terminais não ANSI.

Duração mínima da análise

Duração

Cobertura

Código de saída

< 2 s

Insuficiente — a análise é rejeitada

3 (erro)

2–10 s

P1 + P2 são confiáveis; algumas verificações P3 podem não dispor de dados suficientes

0 + WARN

10–30 s

P1 + P2 + a maior parte de P3; o TDT (30 s) pode não ser concluído a tempo

0 + NOTE

≥ 30 s

Cobertura completa de todas as verificações da TR 101 290

0

A duração padrão é de 30 segundos, suficiente para a cobertura completa da TR 101 290. Com a opção -t <sec>, a duração é aumentada (por exemplo, para testes de aceitação da deriva do PCR) ou reduzida (para verificações rápidas de smoke).

Durante a execução, o analisador atualiza a cada segundo um indicador de progresso de uma única linha em stderr:

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

A linha é redesenhada com o caractere carriage return (\r) e ocupa uma única linha no terminal; para suprimi-la, redirecione o stderr (2>/dev/null).

Veredito da deriva do PCR — janela de dois níveis

A tolerância do relógio do PCR conforme a ISO/IEC 13818-1 §2.4.2.1 e a ETSI TR 101 290 é de ±30 ppm. O valor da deriva apresentado no relatório é obtido por regressão linear dos segundos acumulados do PCR em relação ao instante de chegada medido pelo relógio da bancada; o erro estatístico decresce como 1 / T^(3/2), portanto a janela de análise deve ser longa o suficiente para que o ruído de medição fique abaixo do limite de ±30 ppm.

Por isso, o analisador condiciona o veredito da deriva à duração da análise:

Janela

Veredito quando a deriva excede a tolerância

Efeito sobre o OVERALL

T < 30 s

skipped (o ruído domina sobre o limite de ±30 ppm)

nenhum

30 s ≤ T < 300 s

WARN — apenas informativo

nenhum

T ≥ 300 s

FAIL

OVERALL = FAIL, exit 65

300 s é a janela de aceitação (valor definido pelo produto; a norma ETSI TR 101 290 não fixa os intervalos de medição). Ela é longa o suficiente para que, mesmo em um canal de entrega em rajadas/loopback, o ruído de medição seja promediado abaixo de 1 ppm e um resultado fora da tolerância reflita o relógio do codificador, e não a rede. O relatório completo mostra o nível atual na linha Verdict mode do bloco PCR DRIFT.

Para obter um veredito rígido PASS/FAIL sobre a deriva, execute com -t 300 ou mais.

Recomendações quanto à qualidade da fonte (informativas; não alteram os níveis de veredito):

Fonte

Janela mínima para ±5 ppm

Para ±2 ppm

Aceitação

Multicast de radiodifusão (rede CBR, jitter < 100 µs)

30 s

60 s

5 min

Rede IP estável (jitter < 200 µs)

30 s

2 min

5–10 min

Loopback / emissor em rajadas (UDP unicast em lo)

5 min

15 min

30 min

Calibração / medição laboratorial

—

30 min

1+ hora

Exemplos:

# 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

Se o mesmo fluxo for analisado em várias janelas curtas e o valor da deriva oscilar de uma janela para outra mais do que alguns ppm, a causa é o jitter de entrega (o ritmo de envio do emissor ou a rede), e não o relógio do codificador. Nesse caso, aumente a janela.

Códigos de saída

Código

Significado

0

Análise concluída, OVERALL = PASS

1

Erro de argumentos ou da entrada

2

Não há dados de PCR no fluxo

3

A duração do fluxo é inferior ao mínimo de 2 s, ou nenhum dado foi recebido (a fonte não está transmitindo, endereço incorreto, associação multicast não efetuada, firewall ou interface incorreta; o analisador imprime uma dica)

65

Análise concluída, OVERALL = FAIL — violação da TR 101 290 / ISO 13818-1

130

Interrompido por SIGINT (Ctrl+C) — a análise é cancelada, nenhum relatório é gerado

143

Interrompido por SIGTERM — a análise é cancelada, nenhum relatório é gerado

O código 65 corresponde a EX_DATAERR do POSIX <sysexits.h>: «os dados de entrada estão incorretos». Use-o em CI / monitoramento como critério de conformidade do fluxo:

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
}

Os códigos 130/143 seguem a regra do shell POSIX 128 + signal_number, portanto $? após Ctrl+C coincide com o que o bash retorna para qualquer processo encerrado pelo sinal SIGINT/SIGTERM. Ao ser interrompido, o analisador imprime uma única linha em stderr (Analysis interrupted by signal N — no report produced.) e não gera o relatório.

Exemplo de saída

Relatório completo (trecho)

========================================================================
  MPEG-TS ANALYZER v2.4 — TR 101 290 FULL REPORT
  Perfect Streamer Toolkit https://meshwork.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
========================================================================

Relatório resumido

MPEG-TS Analyzer v2.4 | Perfect Streamer Toolkit https://meshwork.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

Notas

  • Modo de arquivo: a deriva do PCR, o modelo de buffers T-STD e o UDP IAT não são medidos, porque exigem uma referência de tempo real. As demais verificações funcionam em ambos os modos.

  • Um único fluxo de transporte: é analisado um MPTS ou SPTS por vez.