Skip to content

Captura SDI desde una tarjeta DekTec

Sapsan recibe la señal de un puerto SDI de una tarjeta DekTec. Quien captura la tarjeta no es el servidor mismo sino un proceso aparte, dektec_ingest — uno por puerto; sapsan lo lanza, lo supervisa y lee de él los cuadros ya listos.

La frontera entre procesos no es aquí un detalle de implementación sino un requisito: un fallo del SDK del fabricante de la tarjeta, enlazado dentro del servidor de medios, no se lleva un stream sino el servidor entero. La frontera cuesta un proceso por puerto y, a cambio, la compilación de sapsan no carga ni el SDK ni una capa C++.

Qué hace falta en la máquina

  • Una tarjeta DekTec y su driver. Probado en la DTA-2178 (HD y 12G hasta 3840×2160p50) y en la DTA-2174B (HD).
  • El paquete dektec-bridge — instala dektec_ingest y dektec_probe en el PATH. Sin él la entrada falla con la causa producer_unavailable y nombra el binario que buscaba, en vez de callar hasta el tiempo de espera.
  • Una licencia con soporte de SDI.

El directorio del socket (/run/sapsan/sdi) lo crea el servidor por su cuenta; la unidad de systemd le reserva /run/sapsan con RuntimeDirectory. La entrada no tiene parámetros de despliegue propios.

Configuración

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 Descripción
serial número de serie de la tarjeta. La tarjeta se direcciona justamente por él y no por su índice en el sistema: el índice cambia al cambiar tarjetas de sitio y al cambiar el orden de carga del driver
port número del puerto de la tarjeta, desde uno
pixel_format uyvy422 (8 bits, por defecto) o v210 (10 bits)
audio el mapa de pistas de audio, ver abajo. Una lista vacía es el valor por defecto del productor: una pista PCM estéreo del primer par
ad_marks pista de marcas SCTE-104 en bruto del VANC; activada por defecto
peer_timeout_ms cuánto esperar cuadros antes de dar la fuente por muerta; el mismo valor es la ventana de silencio del socket. Por defecto 30 000; cero significa el valor por defecto, no «esperar para siempre»

La unidad de propiedad es el par «número de serie y puerto»: la exclusividad del driver actúa sobre el puerto. Dos streams sobre un mismo par los rechaza la configuración, que nombra el stream que ocupa el puerto; puertos distintos de una misma tarjeta funcionan de forma independiente y no requieren coordinación.

No hay con qué reproducir el vídeo en bruto: HLS, DASH y el archivo quedarán vacíos mientras el stream no tenga pistas codificadas. Para obtenerlas, active el transcodificador.

Pistas de audio

La posición de una pista en la lista audio es su número en el stream (a1, a2, …). Cada pista se compone de los canales de audio SDI enumerados, y el orden de los canales en la lista es la disposición de canales de la pista.

Campo Descripción
channels números de los canales de audio SDI, desde uno, no más de 16 (ocho pares embebidos son el límite del SDI)
sample_type pcm (por defecto) o smpte337
lang idioma de la pista según ISO 639-2

El idioma se declara, no se deduce: el SDI no lleva descriptores de idioma, y el único que conoce el idioma es quien repartió los programas entre los pares. El tipo de audio también se declara y no se detecta a partir de los datos — un par que hoy lleva AC-3 y mañana silencio no debe cambiar la lista de pistas del stream.

Los programas de radio en pares vecinos se convierten en pistas del mismo stream, y se escuchan con el selector de pistas en la salida. En streams aparte no se convierten: una pista no tiene nombre propio, ni profundidad de almacenamiento propia, ni estadísticas propias.

El audio sin comprimir llega planar de 32 bits (s32p) y se decodifica con el número de canales declarado. Una pista más ancha que estéreo se acepta y se decodifica honestamente, pero el codificador la pliega a estéreo — es el límite actual del transcodificador. El audio multicanal llega entero solo dentro de la envoltura SMPTE 337, donde nadie toca el flujo de bits.

AC-3 y E-AC-3 por SMPTE 337

Una pista declarada como sample_type: smpte337 llega en cuadros ac3 o eac3 ya listos: la envoltura la quita el productor, y sapsan ni decodifica ni reempaqueta el audio. Solo se admite una variante: SMPTE 337 codificado en dos canales. Esa pista debe declarar exactamente dos canales o la configuración se rechaza.

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

Los huecos de una pista comprimida — silencio entre paquetes — son legítimos: la entrada no sintetiza silencio y no cuenta una pausa como error.

Datos auxiliares del VANC

La entrada analiza el paquete VANC de cada cuadro y reparte su contenido:

  • Teletexto y subtítulos OP-47 — a la cadena común de closed captions, por el mismo camino que el OP-47 de ST 2110.
  • Líneas de teletexto VBI — al mismo sitio, pero desde una fuente SD: en SD el teletexto viaja en una línea de borrado y no en un paquete ANC. Se ensambla con la misma función que el OP-47.
  • SCTE-104 — en una pista de aplicación aparte, como paquetes en bruto con la marca de tiempo del cuadro que los transporta. La entrada no los analiza y no los convierte en SCTE-35.
  • CDP (CEA-608/708) — se analiza y se cuenta con un contador, pero no se publica como pista: el portador de los closed captions en la cadena es el SEI de la salida codificada, y la inserción ahí todavía no está hecha. El contador existe para que «no hay closed captions en la señal» y «no hay dónde entregar los closed captions» no se vean iguales desde fuera.
  • Los demás pares DID/SDID — se cuentan con un contador, sin ensuciar el registro.

La pista de marcas existe desde el primer cuadro, vacía. Si apareciera con la llegada de la primera marca, el empaquetado se reinicializaría justo al principio del bloque publicitario; así funciona también el MPEG-TS, donde el PID de las marcas se declara en la tabla mucho antes del primer mensaje.

Fallos y recuperación

La vitalidad de la fuente, la conmutación a la reserva y el backoff de los reintentos son en esta entrada los mismos que en todos los demás protocolos — no monta una supervisión propia. Tiene dos observaciones propias: el silencio del socket y un «sin señal» persistente en los fotogramas.

Causa Qué ha pasado Qué hacer
no_signal en el puerto no hay señal detectable revisar el cable y la fuente
device_busy el driver denegó el puerto comprobar primero la dirección del puerto, después el propio proceso colgado y solo entonces buscar a un tercero que lo retenga
producer_unavailable dektec_ingest no se encuentra o no arranca instalar el paquete dektec-bridge
device_error el productor salió con un código distinto de cero sin significado propio: número de serie desconocido, puerto sin la capacidad necesaria, fallo al configurar el dispositivo la etapa la nombra el evento de arranque en el registro
producer_stuck el proceso no termina ni al cerrarse stdin ni con SIGKILL señal de una tarjeta atascada; se resuelve en el host
producer_killed al productor lo mató alguien desde fuera de sapsan — el OOM killer, systemd, una persona averiguar quién terminó el proceso en vez de arreglar el stream
protocol_error llegan datagramas pero ninguno se analiza las versiones de dektec-bridge y de sapsan divergieron; se despliegan juntas

Aquí no hay fallos irreparables: tras cualquiera de ellos la entrada intenta levantarse de nuevo, con un intervalo creciente entre intentos. Un servidor que arrancó antes que el driver de la tarjeta se levantará solo en cuanto aparezca el driver; un puerto ocupado se liberará, una tarjeta cambiada de sitio se encontrará.

Dos casos no cuentan como errores. Un cambio de estándar de vídeo es un reinicio normal del productor: la cadena se reinicializa para la nueva autodescripción de los cuadros y el contador de errores no crece. Un único cuadro malo — «tardío» o «duplicado» — no rompe el stream.

Caso aparte es la pérdida de señal en marcha. El productor entonces no sale: sigue entregando cuadros a su ritmo, repitiendo el último cuadro y silencio, y para la comprobación de vitalidad una fuente con el cable cortado se ve perfectamente sana. Por eso la entrada, al ver en los cuadros un nivel persistente de «sin señal», deja de entregar cuadros a la cadena — de lo contrario un cuadro congelado saldría al aire hasta que alguien interviniera. A partir de ahí trabaja la maquinaria común: la fuente se da por muerta, la reserva toma el relevo, el reintento levanta la captura de nuevo.

Contadores

La pregunta principal de las estadísticas de esta entrada es dónde exactamente está la degradación, y tres diagnósticos se distinguen por aritmética:

Observación Diagnóstico
se rompen los números de los datagramas transporte: la cola del productor o el socket
los números están intactos y se rompe el pts del vídeo la línea
el proceso salió con un código el productor

En la instantánea de la API v4 la entrada lleva tres magnitudes: sdi_line_state (el estado actual de la línea), sdi_producer_restarts_total (reinicios del productor) y sdi_boundary_loss_total (datagramas que no llegaron entre los procesos). Al lado va failure_cause: la causa de fallo actual de la tabla de arriba, que desaparece en cuanto el fallo se resuelve, a diferencia de los errors_* acumulativos.

En las métricas de Prometheus esas mismas magnitudes van con el prefijo stream_input_sdi_, y con ellas el material para revisar un incidente: datagramas truncados y no analizados, referencias corruptas a fotogramas, pares VANC desconocidos, contadores de CDP y el desglose por causa del propio productor. La pareja diagnóstica para la que existen los dos contadores: sdi_producer_datagram_dropped_total frente a sdi_boundary_loss_total — si coinciden, la pérdida está en la cola del productor; si la nuestra es mayor, en el socket mismo.

El detalle ampliado se abre con la opción de contadores extendidos, ver Estadísticas.

Qué no hace la entrada

  • No entrega señal hacia la tarjeta. La entrada solo recibe; el sentido contrario — la salida SDI — todavía no está hecho en sapsan.
  • No decodifica AC-3 ni Dolby E a PCM.
  • No convierte SCTE-104 en SCTE-35 ni entrega marcas en TS/HLS/DASH.
  • No publica una pista de closed captions CEA-608/708.
  • No trabaja con tarjetas que no sean DekTec.
  • No vigila la salud de la tarjeta: la temperatura, las revoluciones y la distribución de los puertos las toma el proceso aparte dektec_probe, y quien las muestra es el sistema de gestión — en instalaciones con mcaster, la sección «Tarjetas de captura».

Qué sigue