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

Parte do Perfect Streamer Toolkithttps://pstreamer.tv

Analisador em console de fluxos de transporte MPEG-TS com verificação de conformidade ETSI TR 101 290 V1.4.1 e validação do modelo de buffers T-STD ISO/IEC 13818-1.

UDP multicast/unicast ou arquivos TS, detecta automaticamente os PCR PIDs via PAT/PMT e emite um relatório detalhado ou breve no stdout.

O que é verificado

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

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

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

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

Adicionalmente, emite:

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

  • Drift de PCR em ppm (apenas 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 do datagrama (apenas modo live)

Uso

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 indicada

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

UDP encapsulado em RTP é detectado e desencapsulado automaticamente.

Opções

Opção

Descrição

Padrão

-t, --time <sec>

Duração da análise em segundos

30

-s, --short

Relatório resumido breve

-f, --full

Relatório detalhado completo

sim

-b, --bitrate <Mbps>

Dica de bitrate TS para o modo de arquivo

38.8

-p, --pcr-pid <pid>

Analisar apenas o PCR PID especificado (decimal ou 0xHHHH)

automático

-l, --pcr-limit <ms>

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

40

--no-eit

Pular a análise de EIT — P3.7..P3.10 aparecem como N/A; a contribuição do EIT para P2.2 e o resumo de tamanhos SI é excluída

EIT habilitado

--no-nit

Pular a análise de NIT — P3.1, P3.2 aparecem como N/A; a contribuição do NIT para P2.2 e o resumo de tamanhos SI é excluída

NIT habilitado

--no-color

Desativar cores ANSI na saída

cores ativadas

--xml

XML estruturado no stdout (sem stderr)

texto

-h, --help

Mostrar ajuda

Exemplos

# 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

Desativar a análise de EIT ou NIT

Em alguns fluxos, o EIT ou NIT são intencionalmente omitidos (redes fechadas, fontes laboratoriais, contribuição OTT-only etc.). Nesse caso, as verificações P3 correspondentes do TR 101 290 sempre falharão na conclusão OVERALL — isso é apenas ruído.

Use --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 montadas; sua contribuição para P2.2 (CRC) e o resumo de tamanhos SI é zero. 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 montadas; sua contribuição para P2.2 (CRC) e para o resumo de tamanhos SI é zero.

As verificações puladas aparecem no relatório como N/A com a marca 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, são exibidos NIT=off / EIT=off.

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

Modo de saída XML (--xml)

--xml faz o analisador emitir um único documento XML UTF-8 autossuficiente em stdout. Toda a informação de serviço (banner, «Stream locked», «PCR PIDs discovered», progresso por segundo, resumo da captura, avisos sobre duração curta) é suprimida; stderr permanece vazio a menos que ocorra uma falha real (não foi possível abrir a entrada, sem dados de PCR, fluxo demasiado curto, interrupção por sinal). As cores ANSI são forçadamente desativadas.

O código de saída é o mesmo do modo texto: 0 em OVERALL=PASS, 65 em OVERALL=FAIL, mais os códigos padrão de erro/sinais (1, 2, 3, 130, 143).

Estrutura XML de nível superior:

<?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>

Convenções principais:

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

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

  • Para verificações não aplicáveis (modo arquivo, ausência de scrambling etc.), o elemento ainda assim aparece com applicable="false" e result="N/A" para que os consumidores do esquema vejam um formato estável.

  • <drift> leva verdict_mode="informational" para 30 s T < 300 s e verdict_mode="hard" para T 300 s; result="SKIP" para execuções menores que 30 s.

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

  • <overall> reflete o mesmo gate da linha OVERALL no relatório de texto e coincide com o código de saída do processo.

A saída é XML bem formado (validado com xmllint --noout); pode ser enviada diretamente para XSLT, Python lxml etc. sem ajustes de parsing.

Leitura do relatório

Cores de status

Estado

Cor

Valor

PASS / ok

verde

A verificação satisfaz o padrão

WARN / WARNING / WARN(STB)

amarelo

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

FAIL / ERROR

vermelho

Violação do padrão, afeta o OVERALL

INFO / NOTE / N/A

por padrão

Apenas informativo

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

Duração mínima da análise

Duração

Cobertura

Código de saída

< 2 s

Insuficiente — análise recusada

3 (erro)

2–10 s

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

0 + WARN

10–30 s

P1 + P2 + a maioria dos P3; TDT (30 s) pode não ter dados

0 + NOTE

≥ 30 s

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

0

A duração padrão é de 30 segundos — suficiente para cobertura completa do TR 101 290. Use -t <sec> para aumentar (por exemplo, para testes de aceitação por drift de PCR) ou reduzir (verificações smoke rápidas).

Durante o trabalho, o analisador atualiza a cada segundo um indicador de progresso de uma linha no stderr:

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

A linha usa carriage-return (\r) para permanecer em uma única linha no terminal; redirecione stderr (2>/dev/null) para ocultá-la.

Veredito do drift do PCR — janela de dois níveis

A tolerância da frequência do relógio PCR conforme ISO/IEC 13818-1 §2.4.2.1 e ETSI TR 101 290 é de ±30 ppm. O valor de drift no relatório é obtido por regressão linear dos segundos cumulativos de PCR em relação ao tempo de chegada pelo relógio do equipamento; 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 bem abaixo do limite de ±30 ppm.

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

Janela

Veredito se o drift sair do limite

Impacto no OVERALL

T < 30 s

skipped (o ruído domina 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 testes de aceitação do DVB TR 101 297 — longa o suficiente para que mesmo uma entrega bursty/loopback fique abaixo de 1 ppm de ruído de medição, de modo que um resultado fora de especificação reflita o oscilador do encoder, 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 PASS/FAIL rígido do drift, execute com -t 300 ou mais.

Recomendações sobre a qualidade da fonte (informativo; os níveis do veredito não mudam):

Fonte

Janela mínima para ±5 ppm

Para ±2 ppm

Aceitação

Multicast broadcast (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 em laboratório

30 min

1+ hora

Exemplos:

# Быстрая проверка дрейфа 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

Se o mesmo fluxo for analisado em várias janelas curtas e o valor do drift variar mais do que alguns ppm entre janelas, o gargalo é o jitter de entrega (ritmo de envio do emissor ou da rede), não o relógio do codificador — aumente a janela.

Códigos de saída

Código

Valor

0

Análise concluída, OVERALL = PASS

1

Erro de argumento ou entrada

2

O fluxo não contém dados de PCR

3

Duração do fluxo abaixo do mínimo de 2 s

65

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

130

Interrompido por SIGINT (Ctrl+C) — análise abortada, sem relatório

143

Interrompido por SIGTERM — análise abortada, sem relatório

65 é EX_DATAERR do POSIX <sysexits.h>: «input data was incorrect». Use-o em CI/monitoramento como gate de conformidade do fluxo:

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

Os códigos 130/143 seguem a convenção POSIX shell 128 + signal_number, então $? após Ctrl+C coincide com o que o bash retorna para qualquer processo encerrado por SIGINT/SIGTERM. Em caso de interrupção, o analisador imprime uma linha em stderr (Analysis interrupted by signal N no report produced.) e pula totalmente a geração do relatório.

Exemplo de saída

Relatório completo (trecho)

========================================================================
  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
========================================================================

Relatório breve

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

Notas

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

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