- 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
51 lines
1.8 KiB
CMake
51 lines
1.8 KiB
CMake
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)
|