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

50 lines
1.6 KiB
Text
Raw Normal View History

cmake_minimum_required(VERSION 3.16)
project(deltacast-bridge C)
set(CMAKE_C_STANDARD 17)
set(SDK_ROOT "/sdk" CACHE PATH "Path to extracted VideoMaster SDK")
# Legacy FIFO mode — set LEGACY_FIFO=ON to disable framecache shm writes
# and fall back to the original named-FIFO path.
option(LEGACY_FIFO "Use named FIFOs instead of framecache shm" OFF)
feat(deltacast): replace per-port bridges with shared multi-port daemon The old architecture spawned one deltacast-capture per recorder port; each called VHD_OpenBoardHandle, triggering a BufMngr.c:781 OOB fault in the delta_x300 kernel driver whenever two opens raced. Fix: a single deltacast-bridge daemon opens the board once, opens RX streams for all requested ports concurrently, and writes each port's video/audio to named FIFOs (/dev/shm/deltacast/video-<N>.fifo, /dev/shm/deltacast/audio-<N>.fifo). Capture sidecars read from those FIFOs directly — no board handle, no race, no flock. Changes: services/capture/deltacast-bridge/main.c - Complete rewrite: --ports csv arg, board opened once, one video+audio thread pair per port, FIFO paths per port, format JSON emitted per port on signal lock, SIGTERM clean shutdown. - flock/serialize logic removed (no longer needed). - --port single-port compat alias retained. services/capture/deltacast-bridge/CMakeLists.txt - Rename target deltacast-capture -> deltacast-bridge. - POST_BUILD symlink deltacast-capture -> deltacast-bridge for compat. services/capture/src/capture-manager.js - deltacast _buildInputArgs: remove bridge spawn; wait up to 30s for FIFOs to exist (bridge may be starting); return rawvideo + s16le FIFO inputArgs. bridgeProcess=null. - audioMap: keyed on sourceType instead of bridgeProcess (both inputs are always present for deltacast). - Remove readFirstStderrLine helper (no longer needed). - Remove bridgeProcess.stdout.pipe / processes.bridge stop signal. services/node-agent/index.js - Add import spawn for bridge daemon management. - Add startDeltacastBridge / stopDeltacastBridge: host-process lifecycle for the shared bridge, ref-counted by sidecar count. - handleSidecarStart: on deltacast, increment counter + start bridge; decrement on container create/start failure. - handleSidecarStop: decrement counter; stop bridge when last sidecar. - _containerSourceType map tracks containerId->sourceType for stop. - Old acquireDcLock mutex retained but no longer called.
2026-06-01 20:21:52 -04:00
# Primary binary: deltacast-bridge (shared multi-port daemon)
add_executable(deltacast-bridge main.c fc_writer.c)
if(LEGACY_FIFO)
target_compile_definitions(deltacast-bridge PRIVATE LEGACY_FIFO=1)
message(STATUS "deltacast-bridge: LEGACY_FIFO mode enabled (shm disabled)")
else()
message(STATUS "deltacast-bridge: framecache shm mode enabled")
endif()
feat(deltacast): replace per-port bridges with shared multi-port daemon The old architecture spawned one deltacast-capture per recorder port; each called VHD_OpenBoardHandle, triggering a BufMngr.c:781 OOB fault in the delta_x300 kernel driver whenever two opens raced. Fix: a single deltacast-bridge daemon opens the board once, opens RX streams for all requested ports concurrently, and writes each port's video/audio to named FIFOs (/dev/shm/deltacast/video-<N>.fifo, /dev/shm/deltacast/audio-<N>.fifo). Capture sidecars read from those FIFOs directly — no board handle, no race, no flock. Changes: services/capture/deltacast-bridge/main.c - Complete rewrite: --ports csv arg, board opened once, one video+audio thread pair per port, FIFO paths per port, format JSON emitted per port on signal lock, SIGTERM clean shutdown. - flock/serialize logic removed (no longer needed). - --port single-port compat alias retained. services/capture/deltacast-bridge/CMakeLists.txt - Rename target deltacast-capture -> deltacast-bridge. - POST_BUILD symlink deltacast-capture -> deltacast-bridge for compat. services/capture/src/capture-manager.js - deltacast _buildInputArgs: remove bridge spawn; wait up to 30s for FIFOs to exist (bridge may be starting); return rawvideo + s16le FIFO inputArgs. bridgeProcess=null. - audioMap: keyed on sourceType instead of bridgeProcess (both inputs are always present for deltacast). - Remove readFirstStderrLine helper (no longer needed). - Remove bridgeProcess.stdout.pipe / processes.bridge stop signal. services/node-agent/index.js - Add import spawn for bridge daemon management. - Add startDeltacastBridge / stopDeltacastBridge: host-process lifecycle for the shared bridge, ref-counted by sidecar count. - handleSidecarStart: on deltacast, increment counter + start bridge; decrement on container create/start failure. - handleSidecarStop: decrement counter; stop bridge when last sidecar. - _containerSourceType map tracks containerId->sourceType for stop. - Old acquireDcLock mutex retained but no longer called.
2026-06-01 20:21:52 -04:00
target_include_directories(deltacast-bridge PRIVATE
${SDK_ROOT}/include/videomaster
)
feat(deltacast): replace per-port bridges with shared multi-port daemon The old architecture spawned one deltacast-capture per recorder port; each called VHD_OpenBoardHandle, triggering a BufMngr.c:781 OOB fault in the delta_x300 kernel driver whenever two opens raced. Fix: a single deltacast-bridge daemon opens the board once, opens RX streams for all requested ports concurrently, and writes each port's video/audio to named FIFOs (/dev/shm/deltacast/video-<N>.fifo, /dev/shm/deltacast/audio-<N>.fifo). Capture sidecars read from those FIFOs directly — no board handle, no race, no flock. Changes: services/capture/deltacast-bridge/main.c - Complete rewrite: --ports csv arg, board opened once, one video+audio thread pair per port, FIFO paths per port, format JSON emitted per port on signal lock, SIGTERM clean shutdown. - flock/serialize logic removed (no longer needed). - --port single-port compat alias retained. services/capture/deltacast-bridge/CMakeLists.txt - Rename target deltacast-capture -> deltacast-bridge. - POST_BUILD symlink deltacast-capture -> deltacast-bridge for compat. services/capture/src/capture-manager.js - deltacast _buildInputArgs: remove bridge spawn; wait up to 30s for FIFOs to exist (bridge may be starting); return rawvideo + s16le FIFO inputArgs. bridgeProcess=null. - audioMap: keyed on sourceType instead of bridgeProcess (both inputs are always present for deltacast). - Remove readFirstStderrLine helper (no longer needed). - Remove bridgeProcess.stdout.pipe / processes.bridge stop signal. services/node-agent/index.js - Add import spawn for bridge daemon management. - Add startDeltacastBridge / stopDeltacastBridge: host-process lifecycle for the shared bridge, ref-counted by sidecar count. - handleSidecarStart: on deltacast, increment counter + start bridge; decrement on container create/start failure. - handleSidecarStop: decrement counter; stop bridge when last sidecar. - _containerSourceType map tracks containerId->sourceType for stop. - Old acquireDcLock mutex retained but no longer called.
2026-06-01 20:21:52 -04:00
target_link_directories(deltacast-bridge PRIVATE
${SDK_ROOT}/lib
)
feat(deltacast): replace per-port bridges with shared multi-port daemon The old architecture spawned one deltacast-capture per recorder port; each called VHD_OpenBoardHandle, triggering a BufMngr.c:781 OOB fault in the delta_x300 kernel driver whenever two opens raced. Fix: a single deltacast-bridge daemon opens the board once, opens RX streams for all requested ports concurrently, and writes each port's video/audio to named FIFOs (/dev/shm/deltacast/video-<N>.fifo, /dev/shm/deltacast/audio-<N>.fifo). Capture sidecars read from those FIFOs directly — no board handle, no race, no flock. Changes: services/capture/deltacast-bridge/main.c - Complete rewrite: --ports csv arg, board opened once, one video+audio thread pair per port, FIFO paths per port, format JSON emitted per port on signal lock, SIGTERM clean shutdown. - flock/serialize logic removed (no longer needed). - --port single-port compat alias retained. services/capture/deltacast-bridge/CMakeLists.txt - Rename target deltacast-capture -> deltacast-bridge. - POST_BUILD symlink deltacast-capture -> deltacast-bridge for compat. services/capture/src/capture-manager.js - deltacast _buildInputArgs: remove bridge spawn; wait up to 30s for FIFOs to exist (bridge may be starting); return rawvideo + s16le FIFO inputArgs. bridgeProcess=null. - audioMap: keyed on sourceType instead of bridgeProcess (both inputs are always present for deltacast). - Remove readFirstStderrLine helper (no longer needed). - Remove bridgeProcess.stdout.pipe / processes.bridge stop signal. services/node-agent/index.js - Add import spawn for bridge daemon management. - Add startDeltacastBridge / stopDeltacastBridge: host-process lifecycle for the shared bridge, ref-counted by sidecar count. - handleSidecarStart: on deltacast, increment counter + start bridge; decrement on container create/start failure. - handleSidecarStop: decrement counter; stop bridge when last sidecar. - _containerSourceType map tracks containerId->sourceType for stop. - Old acquireDcLock mutex retained but no longer called.
2026-06-01 20:21:52 -04:00
target_link_libraries(deltacast-bridge PRIVATE
videomasterhd
videomasterhd_audio
pthread
rt # shm_open, sem_open
)
# Embed the SDK RPATH so the binary finds the .so at runtime
feat(deltacast): replace per-port bridges with shared multi-port daemon The old architecture spawned one deltacast-capture per recorder port; each called VHD_OpenBoardHandle, triggering a BufMngr.c:781 OOB fault in the delta_x300 kernel driver whenever two opens raced. Fix: a single deltacast-bridge daemon opens the board once, opens RX streams for all requested ports concurrently, and writes each port's video/audio to named FIFOs (/dev/shm/deltacast/video-<N>.fifo, /dev/shm/deltacast/audio-<N>.fifo). Capture sidecars read from those FIFOs directly — no board handle, no race, no flock. Changes: services/capture/deltacast-bridge/main.c - Complete rewrite: --ports csv arg, board opened once, one video+audio thread pair per port, FIFO paths per port, format JSON emitted per port on signal lock, SIGTERM clean shutdown. - flock/serialize logic removed (no longer needed). - --port single-port compat alias retained. services/capture/deltacast-bridge/CMakeLists.txt - Rename target deltacast-capture -> deltacast-bridge. - POST_BUILD symlink deltacast-capture -> deltacast-bridge for compat. services/capture/src/capture-manager.js - deltacast _buildInputArgs: remove bridge spawn; wait up to 30s for FIFOs to exist (bridge may be starting); return rawvideo + s16le FIFO inputArgs. bridgeProcess=null. - audioMap: keyed on sourceType instead of bridgeProcess (both inputs are always present for deltacast). - Remove readFirstStderrLine helper (no longer needed). - Remove bridgeProcess.stdout.pipe / processes.bridge stop signal. services/node-agent/index.js - Add import spawn for bridge daemon management. - Add startDeltacastBridge / stopDeltacastBridge: host-process lifecycle for the shared bridge, ref-counted by sidecar count. - handleSidecarStart: on deltacast, increment counter + start bridge; decrement on container create/start failure. - handleSidecarStop: decrement counter; stop bridge when last sidecar. - _containerSourceType map tracks containerId->sourceType for stop. - Old acquireDcLock mutex retained but no longer called.
2026-06-01 20:21:52 -04:00
set_target_properties(deltacast-bridge PROPERTIES
INSTALL_RPATH "/usr/local/lib/deltacast"
BUILD_WITH_INSTALL_RPATH TRUE
feat(deltacast): replace per-port bridges with shared multi-port daemon The old architecture spawned one deltacast-capture per recorder port; each called VHD_OpenBoardHandle, triggering a BufMngr.c:781 OOB fault in the delta_x300 kernel driver whenever two opens raced. Fix: a single deltacast-bridge daemon opens the board once, opens RX streams for all requested ports concurrently, and writes each port's video/audio to named FIFOs (/dev/shm/deltacast/video-<N>.fifo, /dev/shm/deltacast/audio-<N>.fifo). Capture sidecars read from those FIFOs directly — no board handle, no race, no flock. Changes: services/capture/deltacast-bridge/main.c - Complete rewrite: --ports csv arg, board opened once, one video+audio thread pair per port, FIFO paths per port, format JSON emitted per port on signal lock, SIGTERM clean shutdown. - flock/serialize logic removed (no longer needed). - --port single-port compat alias retained. services/capture/deltacast-bridge/CMakeLists.txt - Rename target deltacast-capture -> deltacast-bridge. - POST_BUILD symlink deltacast-capture -> deltacast-bridge for compat. services/capture/src/capture-manager.js - deltacast _buildInputArgs: remove bridge spawn; wait up to 30s for FIFOs to exist (bridge may be starting); return rawvideo + s16le FIFO inputArgs. bridgeProcess=null. - audioMap: keyed on sourceType instead of bridgeProcess (both inputs are always present for deltacast). - Remove readFirstStderrLine helper (no longer needed). - Remove bridgeProcess.stdout.pipe / processes.bridge stop signal. services/node-agent/index.js - Add import spawn for bridge daemon management. - Add startDeltacastBridge / stopDeltacastBridge: host-process lifecycle for the shared bridge, ref-counted by sidecar count. - handleSidecarStart: on deltacast, increment counter + start bridge; decrement on container create/start failure. - handleSidecarStop: decrement counter; stop bridge when last sidecar. - _containerSourceType map tracks containerId->sourceType for stop. - Old acquireDcLock mutex retained but no longer called.
2026-06-01 20:21:52 -04:00
)
# Compat symlink: deltacast-capture -> deltacast-bridge
# (node-agent and any legacy scripts that reference the old name still work)
add_custom_command(TARGET deltacast-bridge POST_BUILD
COMMAND ${CMAKE_COMMAND} -E create_symlink
$<TARGET_FILE:deltacast-bridge>
$<TARGET_FILE_DIR:deltacast-bridge>/deltacast-capture
COMMENT "Creating deltacast-capture compat symlink"
)