Skip to content

Monitoramento da fonte SDI

media.probe.sdi

O Sapsan monitora a fonte SDI durante a captura: verifica o estado do sinal, a sequência de quadros e o timecode e contabiliza os erros informados pelo driver da placa. Isso permite distinguir problemas da fonte e do cabo, mudanças de padrão de vídeo e perdas no caminho entre a placa e o pipeline de mídia.

A página Captura SDI descreve a conexão e a captura. Esta página trata do diagnóstico de uma entrada já configurada. A análise ocorre no pipeline em operação; não é necessário um processo separado que abra a mesma porta da placa.

O que é verificado em cada quadro

O driver entrega ao Sapsan o quadro de vídeo e os dados associados. A entrada compara esses dados com o estado da captura:

  • Estado da linha — se há sinal e se ele corresponde ao formato da captura. O estado atual é verificado continuamente; assim, uma notificação perdida de recuperação do sinal não deve manter a entrada no estado anterior.
  • Sequência de quadros — lacunas nos números dos buffers da placa indicam quadros perdidos antes de chegarem ao Sapsan. A lacuna também é considerada nas linhas do tempo de vídeo e áudio.
  • CRC das linhas SDI — os erros dos metadados dos quadros são somados quando a placa e o driver oferecem essa verificação.
  • Timecode ATC — com timecode ativado, são verificadas a validade da hora do dia e a coerência de seu avanço com a sequência de quadros.
  • Dados auxiliares — são contabilizados os pacotes VANC reconhecidos e os erros no processamento dos dados suportados. As possibilidades de extração são descritas em captura SDI.

O recebimento de buffers da placa, por si só, não comprova a presença de um sinal útil. Se o cabo for desconectado, o driver pode continuar entregando quadros com um indicador de erro. O Sapsan considera esse indicador para que a entrada não pareça estar funcionando apenas porque o número de quadros continua aumentando.

Estado da linha e recuperação

A entrada V4L2 atual produz três estados:

  • ok — o quadro recebido não apresenta indicador de erro de linha. Isso não avalia o conteúdo da imagem ou do áudio.
  • no_signal — o driver informa a ausência de sinal.
  • wrong_standard — há sinal, mas o quadro está marcado com erro em relação ao formato atual da captura.

Para evitar reações a mudanças breves, a entrada espera 500 ms de estado de erro contínuo antes de interromper o envio de quadros ao pipeline de mídia. Se wrong_standard persistir por 2 segundos, a captura é reaberta. Um evento de mudança de sinal enviado pelo driver pode provocar um reinício antes disso quando o padrão é detectado automaticamente.

Na ausência de quadros, a captura é reiniciada após peer_timeout_ms. Durante a detecção automática do formato, a entrada já mostra no_signal enquanto espera pelo sinal; se ele não aparecer dentro desse prazo, a tentativa de abertura termina em falha. Quando standard é definido explicitamente, essa etapa de espera é ignorada. O padrão de peer_timeout_ms é 30 000 ms. O mecanismo geral de LSI gerencia novas tentativas e a comutação para a reserva; seu tempo de comutação não é igual à espera de 500 ms.

As mudanças de padrão e os reinícios de captura são contabilizados separadamente das falhas da fonte. Um aumento do contador de reinícios após a troca de sinal em um roteador exige uma interpretação diferente de um aumento causado pela ausência de quadros.

Verificação da linha do tempo e do timecode

A linha do tempo de vídeo é construída a partir da sequência de quadros e da taxa fracionária exata do formato. A linha do tempo de áudio considera o número de amostras. Com timecode ativado, a entrada analisa o ATC e pode associar ambas as linhas do tempo ao horário da fonte. A data vem do relógio do servidor, pois o ATC contém a hora do dia.

Exemplo de configuração pela API do central:

streams:
  - name: studio
    inputs:
      - sdi:
          device: /dev/v4l/by-path/pci-0000:5e:00.0-video-index0
          timecode: true
          peer_timeout_ms: 30000

timecode é ativado por padrão. Com false, a captura continua funcionando, mas o ATC não controla a linha do tempo e essas verificações de timecode não são executadas.

A associação exige um timecode válido:

  • Hora do dia — a diferença em relação ao relógio do servidor não pode ultrapassar 30 segundos. O relógio do servidor deve estar sincronizado; um contador desde o início do material ou um timecode em outro fuso horário pode ser rejeitado.
  • Taxa fracionária — 29,97 e 59,94 exigem drop-frame; o timecode a 23,98 não é usado nessa associação.
  • Sequência — o timecode deve avançar de forma coerente com os quadros. Um desvio isolado não altera a linha do tempo; um novo deslocamento estável durante aproximadamente um segundo de quadros provoca uma nova associação.

Antes da primeira associação bem-sucedida, é usada uma linha do tempo sem ATC, posteriormente alinhada ao relógio do servidor. Após a associação, a ausência do timecode ou sua rejeição na verificação preserva o deslocamento anterior. Uma nova associação informa ao pipeline de mídia uma descontinuidade na linha do tempo para que o empacotamento posterior considere a mudança de horário.

Contador de timecode Significado
timecode_missing Quadros sem ATC após uma associação bem-sucedida. Antes da associação, a ausência permanente de ATC não incrementa esse contador.
timecode_rejected Timecode inválido ou incoerente: valor corrompido, modo de taxa inadequado, congelamento ou diferença instável.
timecode_untrusted Timecode fora da janela de confiança em relação ao relógio do servidor.
timecode_jumps Novas associações a um novo deslocamento estável.

Estatísticas pela API

Consulte as estatísticas detalhadas no streamer que captura o SDI:

curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
  http://streamer:8080/streamer/api-v4/streams/stats/studio \
  | jq '{name, inputs: [(.inputs // [])[] | select(.protocol == "sdi")], input}'

inputs é a lista de fontes. As seguintes informações estão disponíveis para uma fonte SDI:

Campo Como interpretar
current, status, failure_cause, error Se a fonte está selecionada, seu estado geral e o motivo da falha.
sdi_line_state Estado da linha como string; o valor ok pode ser omitido no JSON.
sdi_producer_restarts_total Reinícios acumulados da captura. O nome histórico producer não significa um processo separado de captura.
sdi_boundary_loss_total Perdas identificadas por lacunas nos números dos buffers da placa.
sdi_capture Formato de captura aceito pelo driver, antes da transcodificação.

sdi_capture contém as dimensões do quadro, o FourCC numérico pixel_format, o número de bytes por linha stride e a taxa de quadros completos fps_num / fps_den. O campo opcional video_bytes_per_second estima o tráfego mínimo de vídeo por DMA em bytes por segundo, sem áudio nem sobrecarga de PCIe.

Na seção input do stream, o campo sdi_datagrams_total conta os quadros recebidos do dispositivo. Apesar do nome, não é uma contagem de datagramas de rede. Campos zerados podem estar ausentes. A ausência de uma seção de estatísticas não deve ser interpretada como uma medição realizada sem erros.

As estatísticas compactas do central contêm o estado das fontes, mas não substituem a resposta detalhada do streamer. O CRC e todos os contadores de timecode não são apresentados na API em um único objeto input.sdi; para eles, use a exportação de métricas.

Métricas e medições de tempo

A exportação do streamer está disponível em /streamer/api-v4/live-metrics, com autenticação. A disponibilidade da exportação e dos detalhes depende da licença de contadores.

curl -fsS -u "$ADMIN_USER:$ADMIN_PASSWORD" \
  http://streamer:8080/streamer/api-v4/live-metrics \
  | rg '^stream_input_sdi_.*stream="studio"'
Série Prometheus Significado
stream_input_sdi_line_state Estado atual: 0 — ok, 1 — no_signal, 2 — wrong_standard.
stream_input_sdi_datagrams_total Quadros recebidos do dispositivo.
stream_input_sdi_boundary_loss_total Quadros perdidos segundo os números dos buffers.
stream_input_sdi_crc_errors_total Erros de CRC das linhas informados pela placa.
stream_input_sdi_producer_restarts_total Todos os reinícios da captura.
stream_input_sdi_producer_restarts_wrong_standard_total Reinícios por padrão ou evento de mudança de sinal.
stream_input_sdi_producer_restarts_silence_total Reinícios por ausência de quadros do dispositivo.
stream_input_sdi_timecode_missing_total ATC ausente após a associação.
stream_input_sdi_timecode_rejected_total ATC rejeitado.
stream_input_sdi_timecode_untrusted_total ATC fora da janela de confiança do relógio.
stream_input_sdi_timecode_jumps_total Novas associações da linha do tempo pelo ATC.

O vocabulário geral de estados da linha também contém late, duplicate e invalid; a entrada V4L2 atual não os detecta como três tipos independentes de defeito do sinal. Para alguns contadores, a série aparece apenas após um evento; portanto, sua ausência não comprova que a placa ofereça suporte à verificação.

Além disso, o monitor geral da linha do tempo compara o horário de chegada da mídia com o DTS antes do alinhamento dos timestamps. As estatísticas do stream contêm os campos source_timing_offset_ms e source_timing_jitter_ms, além dos limites source_timing_offset_min_ms / source_timing_offset_max_ms. source_timing_offset_ms mostra o deslocamento atual; o jitter e os limites do deslocamento se referem à janela de um minuto concluída. source_timing_input e source_timing_window_started_at indicam a fonte e o início da janela.

Essas medições ajudam a identificar mudanças de atraso e irregularidades na chegada da mídia ao pipeline de software. Elas não medem o jitter elétrico do SDI. A verificação quadro a quadro também não significa que a API forneça o histórico de cada timestamp: são disponibilizados o estado e os resultados agregados.

Como interpretar os resultados

Observação O que verificar
no_signal A fonte, o cabo, as conexões e a entrada selecionada da placa.
Aumentam os reinícios por padrão Trocas de fonte, o formato detectado automaticamente e o standard definido explicitamente.
Aumentam os reinícios por ausência de quadros O driver e a operação da captura; compare os eventos com os logs do servidor.
Aumenta boundary_loss Perdas identificadas pelos números dos buffers: a carga do servidor e a capacidade do pipeline de receber os quadros da placa a tempo. O contador, por si só, não determina a causa das perdas.
Aumenta crc_errors A integridade do sinal de entrada segundo os dados da placa. O valor zero não confirma a ausência de erros se a placa não informar CRC.
Aumenta timecode_untrusted A sincronização do relógio do servidor e a finalidade do timecode da fonte.
Aumentam timecode_rejected ou timecode_jumps A configuração e a estabilidade do gerador ATC e as trocas de fonte.

Compare o aumento dos contadores ao longo de um intervalo, e não apenas o valor acumulado. Relacione o estado da linha ao recebimento real de quadros: zero perdas com a entrada parada não significa um sinal em boas condições.

O diagnóstico depende dos dados fornecidos pelo driver. Os indicadores descritos não medem o jitter elétrico do SDI, a amplitude nem o diagrama de olho. Essas medições exigem um analisador físico de sinal. O controle de ATC também não verifica congelamento da imagem nem silêncio no áudio.

Para captura de alta velocidade, considere separadamente os requisitos de 12G-SDI para o servidor e a memória. O formato de captura e as perdas do lado da placa devem ser avaliados antes da transcodificação: reduzir o bitrate de saída não reduz o volume de dados não comprimidos da entrada.