diff --git a/tools/sigcheck.c b/tools/sigcheck.c new file mode 100644 index 0000000..642bab8 --- /dev/null +++ b/tools/sigcheck.c @@ -0,0 +1,82 @@ +/* tools/sigcheck.c — per-port SDI signal scanner, run on host with SDK installed */ +#include +#include +#include +#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; +}