tools: add sigcheck.c — per-port SDI signal scanner

This commit is contained in:
Zac Gaetano 2026-06-01 19:41:54 -04:00
parent cad1e52c38
commit d66d4bea80

82
tools/sigcheck.c Normal file
View file

@ -0,0 +1,82 @@
/* tools/sigcheck.c — per-port SDI signal scanner, run on host with SDK installed */
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include "videomaster/VideoMasterHD_Core.h"
#include "videomaster/VideoMasterHD_Sdi.h"
static ULONG rx_types[8] = {
VHD_ST_RX0,VHD_ST_RX1,VHD_ST_RX2,VHD_ST_RX3,
VHD_ST_RX4,VHD_ST_RX5,VHD_ST_RX6,VHD_ST_RX7
};
int main(void) {
ULONG dll, nb;
if (VHD_GetApiInfo(&dll,&nb)!=VHDERR_NOERROR||nb==0) { fprintf(stderr,"no boards\n"); return 1; }
HANDLE board;
if (VHD_OpenBoardHandle(0,&board,NULL,0)!=VHDERR_NOERROR) { fprintf(stderr,"board open fail\n"); return 1; }
printf("Port | Result\n");
printf("-----|-------\n");
for (int p = 0; p < 8; p++) {
HANDLE stream = NULL;
ULONG r = VHD_OpenStreamHandle(board, rx_types[p],
VHD_SDI_STPROC_DISJOINED_VIDEO,
NULL, &stream, NULL);
if (r != VHDERR_NOERROR) {
printf(" %d | OPEN_FAIL rc=%lu\n", p, r);
fflush(stdout);
continue;
}
VHD_SetStreamProperty(stream, VHD_CORE_SP_TRANSFER_SCHEME, VHD_TRANSFER_SLAVED);
VHD_SetStreamProperty(stream, VHD_CORE_SP_BUFFERQUEUE_DEPTH, 4);
if (VHD_StartStream(stream) != VHDERR_NOERROR) {
VHD_CloseStreamHandle(stream);
printf(" %d | START_FAIL\n", p);
fflush(stdout);
continue;
}
ULONG std = (ULONG)NB_VHD_VIDEOSTANDARDS;
ULONG clk = VHD_CLOCKDIV_1;
struct timespec deadline, now;
clock_gettime(CLOCK_MONOTONIC, &deadline);
deadline.tv_sec += 4;
while (1) {
clock_gettime(CLOCK_MONOTONIC, &now);
if (now.tv_sec>deadline.tv_sec || (now.tv_sec==deadline.tv_sec && now.tv_nsec>=deadline.tv_nsec)) break;
VHD_GetStreamProperty(stream, VHD_SDI_SP_VIDEO_STANDARD, &std);
if (std != (ULONG)NB_VHD_VIDEOSTANDARDS) break;
struct timespec ts = {0, 100000000L};
nanosleep(&ts, NULL);
}
VHD_GetStreamProperty(stream, VHD_SDI_SP_CLOCK_DIVISOR, &clk);
VHD_StopStream(stream);
VHD_CloseStreamHandle(stream);
if (std == (ULONG)NB_VHD_VIDEOSTANDARDS) {
printf(" %d | NO SIGNAL\n", p);
} else {
int ntsc = (clk == VHD_CLOCKDIV_1001);
int w=1920,h=1080,fn=30,fd=1;
switch(std) {
case VHD_VIDEOSTD_S274M_1080p_60Hz: fn=ntsc?60000:60;fd=ntsc?1001:1; break;
case VHD_VIDEOSTD_S274M_1080p_50Hz: fn=50;fd=1; break;
case VHD_VIDEOSTD_S274M_1080p_30Hz: fn=ntsc?30000:30;fd=ntsc?1001:1; break;
case VHD_VIDEOSTD_S274M_1080p_25Hz: fn=25;fd=1; break;
case VHD_VIDEOSTD_S274M_1080p_24Hz: fn=ntsc?24000:24;fd=ntsc?1001:1; break;
case VHD_VIDEOSTD_S274M_1080i_60Hz: fn=ntsc?30000:30;fd=ntsc?1001:1; break;
case VHD_VIDEOSTD_S274M_1080i_50Hz: fn=25;fd=1; break;
case VHD_VIDEOSTD_S296M_720p_60Hz: w=1280;h=720;fn=ntsc?60000:60;fd=ntsc?1001:1; break;
case VHD_VIDEOSTD_S296M_720p_50Hz: w=1280;h=720;fn=50;fd=1; break;
default: break;
}
printf(" %d | SIGNAL std=%lu %dx%d %d/%d\n", p, std, w, h, fn, fd);
}
fflush(stdout);
usleep(200000);
}
VHD_CloseBoardHandle(board);
return 0;
}