Skip to content

Captura SDI de uma placa DekTec

O Sapsan recebe o sinal de uma porta SDI de uma placa DekTec. Quem captura a placa não é o próprio servidor, e sim um processo à parte, o dektec_ingest — um por porta; o sapsan o inicia, o supervisiona e lê dele os quadros prontos.

A fronteira entre processos aqui não é um detalhe de implementação, e sim um requisito: uma falha do SDK do fabricante da placa, ligado dentro do servidor de mídia, leva embora não um stream, mas o servidor inteiro. A fronteira custa um processo por porta e, em troca, a compilação do sapsan não carrega nem o SDK nem uma camada C++.

O que é preciso na máquina

  • Uma placa DekTec e o seu driver. Testado na DTA-2178 (HD e 12G até 3840×2160p50) e na DTA-2174B (HD).
  • O pacote dektec-bridge — ele instala o dektec_ingest e o dektec_probe no PATH. Sem ele a entrada falha com a causa producer_unavailable e nomeia o binário que procurava, em vez de calar até o tempo limite.
  • Uma licença com suporte a SDI.

O diretório do socket (/run/sapsan/sdi) o servidor cria por conta própria; a unidade do systemd reserva /run/sapsan para isso com RuntimeDirectory. A entrada não tem parâmetros de implantação próprios.

Configuração

streams:
  - name: tv1
    inputs:
      - dektec:
          serial: 2174223653
          port: 1
          pixel_format: v210
          audio:
            - channels: [1, 2]
              lang: rus
            - channels: [5, 6]
              lang: eng
Parâmetro Descrição
serial número de série da placa. A placa é endereçada justamente por ele, e não pelo índice no sistema: o índice muda quando as placas são trocadas de lugar e quando muda a ordem de carga do driver
port número da porta da placa, a partir de um
pixel_format uyvy422 (8 bits, padrão) ou v210 (10 bits)
audio o mapa de trilhas de áudio, ver abaixo. Uma lista vazia é o padrão do produtor: uma trilha PCM estéreo do primeiro par
ad_marks trilha de marcas SCTE-104 brutas do VANC; ativada por padrão
peer_timeout_ms quanto esperar por quadros antes de dar a fonte por morta; o mesmo valor é a janela de silêncio do socket. Por padrão 30.000; zero significa o padrão, e não «esperar para sempre»

A unidade de posse é o par «número de série e porta»: a exclusividade do driver vale para a porta. Dois streams sobre o mesmo par são rejeitados pela configuração, que nomeia o stream que ocupa a porta; portas diferentes de uma mesma placa funcionam de forma independente e não exigem coordenação.

Não há com que reproduzir o vídeo bruto: HLS, DASH e o arquivo ficarão vazios enquanto o stream não tiver trilhas codificadas. Para obtê-las, ative o transcodificador.

Trilhas de áudio

A posição de uma trilha na lista audio é o seu número no stream (a1, a2, …). Cada trilha é montada a partir dos canais de áudio SDI enumerados, e a ordem dos canais na lista é a disposição de canais da trilha.

Campo Descrição
channels números dos canais de áudio SDI, a partir de um, no máximo 16 (oito pares embarcados são o limite do SDI)
sample_type pcm (padrão) ou smpte337
lang idioma da trilha conforme ISO 639-2

O idioma é declarado, não deduzido: o SDI não carrega descritores de idioma, e o único que sabe o idioma é quem distribuiu os programas pelos pares. O tipo de áudio também é declarado e não é detectado pelos dados — um par que hoje leva AC-3 e amanhã silêncio não deve mudar a lista de trilhas do stream.

Programas de rádio em pares vizinhos viram trilhas do mesmo stream, e podem ser ouvidos com o seletor de trilhas na saída. Em streams separados eles não se transformam: uma trilha não tem nome próprio, nem profundidade de armazenamento própria, nem estatísticas próprias.

O áudio não comprimido chega planar de 32 bits (s32p) e é decodificado com o número de canais declarado. Uma trilha mais larga que estéreo é aceita e decodificada honestamente, mas o codificador a dobra para estéreo — esse é o limite atual do transcodificador. O áudio multicanal chega inteiro apenas dentro do invólucro SMPTE 337, onde ninguém toca no fluxo de bits.

AC-3 e E-AC-3 por SMPTE 337

Uma trilha declarada como sample_type: smpte337 chega em quadros ac3 ou eac3 prontos: o invólucro é retirado pelo produtor, e o sapsan não decodifica nem reempacota o áudio. Só há suporte a uma variante: SMPTE 337 codificado em dois canais. Essa trilha deve declarar exatamente dois canais, ou a configuração é rejeitada.

audio:
  - channels: [1, 2]
    lang: rus
  - channels: [3, 4]
    sample_type: smpte337
    lang: rus

As lacunas de uma trilha comprimida — silêncio entre pacotes — são legítimas: a entrada não sintetiza silêncio e não conta uma pausa como erro.

Dados auxiliares do VANC

A entrada analisa o pacote VANC de cada quadro e distribui o seu conteúdo:

  • Teletexto e legendas OP-47 — para a cadeia comum de closed captions, pelo mesmo caminho que o OP-47 do ST 2110.
  • Linhas de teletexto VBI — para o mesmo lugar, mas de uma fonte SD: em SD o teletexto viaja numa linha de apagamento, e não num pacote ANC. É montado pela mesma função que o OP-47.
  • SCTE-104 — numa trilha de aplicação à parte, como pacotes brutos com a marca de tempo do quadro que os transporta. A entrada não os analisa e não os converte em SCTE-35.
  • CDP (CEA-608/708) — é analisado e contado por um contador, mas não é publicado como trilha: o portador dos closed captions na cadeia é o SEI da saída codificada, e a inserção ali ainda não foi feita. O contador existe para que «não há closed captions no sinal» e «não há onde entregar os closed captions» não pareçam iguais de fora.
  • Os demais pares DID/SDID — são contados por um contador, sem sujar o log.

A trilha de marcas existe desde o primeiro quadro, vazia. Se aparecesse com a chegada da primeira marca, o empacotamento se reinicializaria bem no começo do bloco publicitário; o MPEG-TS funciona do mesmo jeito, com o PID das marcas declarado na tabela muito antes da primeira mensagem.

Falhas e recuperação

A vivacidade da fonte, a comutação para a reserva e o backoff das retentativas nesta entrada são os mesmos de todos os outros protocolos — ela não monta uma supervisão própria. Ela tem duas observações próprias: o silêncio do socket e um «sem sinal» persistente nos quadros.

Causa O que aconteceu O que fazer
no_signal na porta não há sinal detectável verificar o cabo e a fonte
device_busy o driver negou a porta verificar primeiro a direção da porta, depois o próprio processo travado e só então procurar um terceiro que a retenha
producer_unavailable o dektec_ingest não foi encontrado ou não inicia instalar o pacote dektec-bridge
device_error o produtor saiu com um código diferente de zero sem significado próprio: número de série desconhecido, porta sem a capacidade necessária, falha ao configurar o dispositivo a etapa é nomeada pelo evento de inicialização no log
producer_stuck o processo não termina nem ao fechar o stdin nem com SIGKILL sinal de uma placa travada; resolve-se no host
producer_killed o produtor foi morto por alguém de fora do sapsan — o OOM killer, o systemd, uma pessoa descobrir quem encerrou o processo, em vez de consertar o stream
protocol_error chegam datagramas, mas nenhum é analisado as versões do dektec-bridge e do sapsan divergiram; elas são implantadas juntas

Aqui não há falhas irreparáveis: depois de qualquer uma delas a entrada tenta se levantar de novo, com um intervalo crescente entre as tentativas. Um servidor que iniciou antes do driver da placa se levantará sozinho assim que o driver aparecer; uma porta ocupada será liberada, uma placa trocada de lugar será encontrada.

Dois casos não contam como erros. Uma troca de padrão de vídeo é um reinício normal do produtor: a cadeia se reinicializa para a nova autodescrição dos quadros e o contador de erros não cresce. Um único quadro ruim — «atrasado» ou «duplicado» — não rompe o stream.

Caso à parte é a perda de sinal em andamento. O produtor então não sai: ele continua entregando quadros no ritmo, repetindo o último quadro e silêncio, e para a verificação de vivacidade uma fonte com o cabo cortado parece perfeitamente saudável. Por isso a entrada, ao ver nos quadros um nível persistente de «sem sinal», para de entregar quadros à cadeia — do contrário um quadro congelado iria ao ar até que alguém interviesse. Daí em diante trabalha a maquinaria comum: a fonte é dada por morta, a reserva assume, a retentativa levanta a captura de novo.

Contadores

A pergunta principal das estatísticas desta entrada é onde exatamente está a degradação, e três diagnósticos se distinguem pela aritmética:

Observação Diagnóstico
os números dos datagramas se rompem transporte: a fila do produtor ou o socket
os números estão intactos e o pts do vídeo se rompe a linha
o processo saiu com um código o produtor

No instantâneo da API v4 a entrada leva três grandezas: sdi_line_state (o estado atual da linha), sdi_producer_restarts_total (reinícios do produtor) e sdi_boundary_loss_total (datagramas que não chegaram entre os processos). Ao lado vai failure_cause: a causa de falha atual da tabela acima, que desaparece assim que a falha é resolvida, ao contrário dos errors_* cumulativos.

Nas métricas do Prometheus as mesmas grandezas vão com o prefixo stream_input_sdi_, e com elas o material para revisar um incidente: datagramas truncados e não analisados, referências corrompidas a quadros, pares VANC desconhecidos, contadores de CDP e a divisão por causa do próprio produtor. O par diagnóstico para o qual os dois contadores existem: sdi_producer_datagram_dropped_total contra sdi_boundary_loss_total — se batem, a perda está na fila do produtor; se a nossa é maior, no próprio socket.

O detalhamento estendido é liberado pela opção de contadores estendidos, ver Estatísticas.

O que a entrada não faz

  • Não entrega sinal para a placa. A entrada apenas recebe; o sentido contrário — a saída SDI — ainda não foi feito no sapsan.
  • Não decodifica AC-3 nem Dolby E para PCM.
  • Não converte SCTE-104 em SCTE-35 e não entrega marcas em TS/HLS/DASH.
  • Não publica uma trilha de closed captions CEA-608/708.
  • Não trabalha com placas que não sejam DekTec.
  • Não vigia a saúde da placa: a temperatura, as rotações e a distribuição das portas são coletadas pelo processo à parte dektec_probe, e quem as mostra é o sistema de gerenciamento — em instalações com mcaster, a seção «Placas de captura».

O que vem a seguir