dragonflight/services/capture/decklink-bridge/CMakeLists.txt

52 lines
1.8 KiB
Text
Raw Normal View History

feat(framecache): phase 3 — decklink-bridge writes to shm - services/capture/decklink-bridge/main.cpp: new C++ DeckLink bridge - IDeckLinkInputCallback (VideoInputFrameArrived) writes UYVY422 frames to framecache slot via fc_writer_write() - VideoInputFormatChanged reopens slot with new resolution/fps - bmdVideoInputEnableFormatDetection: auto-detects signal format - bmdFormat8BitYUV (UYVY422) — same pixel format as deltacast-bridge - Audio written from callback to named FIFO (same pattern as deltacast) - Silence thread keeps audio FIFO open between sessions - slot_id: decklink-<NODE_ID>-<device_idx> - Format JSON emitted on first frame (includes slot_id) - LEGACY_FIFO compile flag mirrors deltacast-bridge - --devices csv, --fc-url, --audio-pipe-dir, --signal-timeout args - services/capture/decklink-bridge/CMakeLists.txt: - Reuses fc_writer.c from deltacast-bridge (shared writer module) - Links rt + dl + pthread; DeckLink SDK via dlopen at runtime - LEGACY_FIFO option - services/capture/Dockerfile: - New decklink-bridge-builder stage (g++ + DeckLink SDK headers) - Copies decklink-bridge binary to /usr/local/bin/decklink-bridge - services/node-agent/index.js: - FC_URL + FC_NODE_ID constants (from env vars, passed to all bridges) - startDecklinkBridge(deviceIndices) / stopDecklinkBridge() functions mirror deltacast bridge lifecycle management - deltacast startDeltacastBridge: adds --fc-url arg + NODE_ID env - sidecar start: injects FC_URL into all sidecar envs; sets IpcMode=host for deltacast + blackmagic sidecars; starts decklink-bridge for sdi/ blackmagic source types; injects FC_SLOT_ID from fmt JSON - sidecar stop: stopDecklinkBridge() when last blackmagic sidecar stops
2026-06-03 11:25:25 -04:00
cmake_minimum_required(VERSION 3.16)
project(decklink-bridge CXX C)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2")
# Path to DeckLink SDK headers (services/capture/sdk/)
set(DECKLINK_SDK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../sdk"
CACHE PATH "Path to Blackmagic DeckLink SDK headers")
# Path to Deltacast bridge (for fc_writer.h/c — shared writer module)
set(DELTACAST_BRIDGE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../deltacast-bridge"
CACHE PATH "Path to deltacast-bridge (contains fc_writer.h/c)")
# Legacy FIFO fallback option (mirrors deltacast-bridge option)
option(LEGACY_FIFO "Use named FIFOs instead of framecache shm" OFF)
# ── decklink-bridge executable ────────────────────────────────────────
add_executable(decklink-bridge
main.cpp
${DELTACAST_BRIDGE_DIR}/fc_writer.c # shared framecache writer
)
if(LEGACY_FIFO)
target_compile_definitions(decklink-bridge PRIVATE LEGACY_FIFO=1)
message(STATUS "decklink-bridge: LEGACY_FIFO mode enabled")
else()
message(STATUS "decklink-bridge: framecache shm mode enabled")
endif()
target_include_directories(decklink-bridge PRIVATE
${DECKLINK_SDK_DIR}
${DELTACAST_BRIDGE_DIR} # fc_writer.h
)
target_link_libraries(decklink-bridge PRIVATE
pthread
rt # shm_open, sem_open
dl # dlopen (used by DeckLinkAPIDispatch.cpp on Linux)
)
# DeckLink driver is linked at runtime via dlopen (no link-time .so needed).
# The SDK's DeckLinkAPIDispatch.cpp handles the dynamic loading.
set_target_properties(decklink-bridge PROPERTIES
INSTALL_RPATH "/usr/local/lib"
BUILD_WITH_INSTALL_RPATH TRUE
)
install(TARGETS decklink-bridge DESTINATION bin)