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 odektec_ingeste odektec_probenoPATH. Sem ele a entrada falha com a causaproducer_unavailablee 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¶
- Transcodificação — o vídeo bruto da placa não é reproduzível
- Fontes reserva
- Gravação no arquivo