cmake_minimum_required(VERSION 3.16)
project(framecache C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -O2")

# ── libmicrohttpd ────────────────────────────────────────────────────
find_library(MHD_LIB microhttpd REQUIRED)
find_path(MHD_INCLUDE microhttpd.h REQUIRED)
include_directories(${MHD_INCLUDE})

# ── framecache server ────────────────────────────────────────────────
add_executable(framecache
    src/framecache.c
    src/slot.c
    src/registry.c
)
target_link_libraries(framecache ${MHD_LIB} rt pthread)

# ── fc_client static library (used by bridges + test) ───────────────
add_library(fc_client STATIC
    client/fc_client.c
    src/slot.c       # client needs fc_slot_shm_size / fc_frame_at
)
target_include_directories(fc_client PUBLIC src client)
target_link_libraries(fc_client rt pthread)

# ── net_ingest — network source (RTMP/SRT) → framecache slot ─────────
# Spawned by node-agent when a network recorder starts.
# Decodes the network stream to raw UYVY422 via ffmpeg and writes frames
# into a framecache slot, giving capture-manager the same fc_pipe consumer
# interface as SDI sources.
add_executable(net_ingest
    src/net_ingest.c
    src/slot.c
)
target_include_directories(net_ingest PRIVATE src)
target_link_libraries(net_ingest rt pthread)
install(TARGETS net_ingest DESTINATION bin)

# ── fc_pipe — slot → stdout adapter (used by capture-manager.js) ─────
# Spawned by capture-manager as a child process; writes raw UYVY422
# frames from a framecache slot to stdout so ffmpeg reads them as
# rawvideo pipe input. Multiple fc_pipe instances on the same slot
# each get an independent cursor — zero-copy fan-out.
add_executable(fc_pipe
    client/fc_pipe.c
)
target_link_libraries(fc_pipe fc_client)
target_include_directories(fc_pipe PRIVATE src client)

# ── test consumer (dev utility) ──────────────────────────────────────
if(BUILD_TESTS)
    add_executable(fc_test_consumer
        client/fc_test_consumer.c
    )
    target_link_libraries(fc_test_consumer fc_client)
    target_include_directories(fc_test_consumer PRIVATE src client)
endif()

install(TARGETS framecache fc_pipe DESTINATION bin)
install(FILES client/fc_client.h src/slot.h DESTINATION include/framecache)
install(TARGETS fc_client DESTINATION lib)
