Files
cuframes-composer/src/CMakeLists.txt
T
gx 17261377cb Phase 7 task #190: Frigate→cfc-grid overlay через MQTT subscribe
Robust pattern из docs/RESEARCH-frigate-overlay-integration.md:
композитор сам подписывается на frigate/events, парсит JSON, рисует
bounding rectangles в управляемый overlay-список с TTL. Никаких
sidecar'ов — root cause "перестало обновляться" в старом
cuda-grid-controller'е был именно two-hop ZMQ + state leak.

Содержимое:

- include/cuframes_composer/overlay.h — новый тип CFC_OVERLAY_DETECTION_BOXES
  + cfc_overlay_detbox_config_t (camera_key, detect_w/h, cell rect,
  thickness, color, TTL stale_ms) + API _create / _upsert / _end /
  _camera_key.
- src/overlay.c — реализация: массив 16 active детектов под mutex,
  draw как 4 fill_nv12 на каждый valid box (TTL фильтрация по now-update).
  Coordinate mapping detect→cell в момент draw — layout switch безопасен.
- include/cuframes_composer/frigate_mqtt.h + src/frigate_mqtt.c — MQTT
  subscriber на libmosquitto. Parses Frigate event JSON через json-c
  (after.camera, after.id, after.box, after.label). Lookup overlay по
  camera_key. Mosquitto reconnect_delay_set 1s→30s exp backoff,
  disconnect log rate-limited (раз в 30 сек).
- examples/grid_record.c — CLI флаги --frigate-mqtt host[:port],
  --frigate-topic frigate/events, --detection-cell key,camera,dx,dy,
  dw,dh,detect_w,detect_h. По одному --detection-cell создаётся overlay
  + регистрируется в MQTT subscriber.
- src/CMakeLists.txt — добавлен frigate_mqtt.c.

Параллельная подготовка на Frigate стороне:
- Frigate config /home/claude/cctv/frigate-config/config.yml — добавлен
  parking_overview.objects.filters.{car,person,bicycle,motorcycle}.
  required_zones=[canopy,parking_zone,private_area]. Это фильтрация
  на tracker уровне (review.required_zones влиял только на Frigate
  Review system). После: ~2 события/сутки реально с parking, вместо
  1000+ от проезжей части.

Live-test:
- Synthetic mosquitto_pub frigate/events с box [200,200,400,360]
  в detect 640×480 → cfc-grid render'ит зелёную рамку в parking cell
  правильной геометрии (300,225, 300×180 в 1920×1080 output).
- TTL 8 сек — рамка пропадает если update не пришёл.
- restarts=0, 12650 кадров stable 25 fps — frigate_mqtt thread
  не блокирует video.

Image gx/cuframes-composer:0.7 deployed.

Чеклист защиты от "перестало обновляться" (из research §6.4):
 MQTT auto-reconnect через mosquitto built-in backoff
 TTL независим от end event (страховка от потери MQTT)
 State полностью в composer-процессе (один источник истины)
 Mapping coords в момент draw (layout switch safe)
 Frigate-фильтр на источнике (objects.filters.required_zones)
 Health-метрики (frigate_mqtt_connected, events_received) — TODO
2026-06-03 15:28:52 +01:00

95 lines
3.5 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Основная библиотека композитора — `libcuframes_composer.so`. Содержит:
# - source.c подписка к cuframes публишеру + state machine
# - nvenc_loader.c dlopen libnvidia-encode.so + загрузка API таблицы
# - nvenc.c обвязка вокруг NVENC SDK (init/encode/teardown)
# - composer.c Phase 2: multi-source grid композитор
# - cugrid/cugrid.cu Phase 2: CUDA kernels (resize, fill) для NV12 grid'а
#
# Дальше по фазам:
# Phase 3: overlay.c, png_decode.c, text_render.c, rtsp_publisher.c, rtp_h264.c
# Phase 4: control_zmq.c
# Phase 5: health_mqtt.c
set(COMPOSER_SOURCES_C
source.c
nvenc_loader.c
nvenc.c
composer.c
overlay.c
control.c
health.c
writer.c
audio.c
frigate_mqtt.c
)
set(COMPOSER_SOURCES_CU
cugrid/cugrid.cu
)
add_library(cuframes_composer SHARED ${COMPOSER_SOURCES_C} ${COMPOSER_SOURCES_CU})
add_library(cuframes_composer_static STATIC ${COMPOSER_SOURCES_C} ${COMPOSER_SOURCES_CU})
foreach(target cuframes_composer cuframes_composer_static)
target_include_directories(${target}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${NVCODEC_HEADERS_DIR}
)
target_compile_features(${target} PRIVATE c_std_11)
# C-only флаги (для CUDA свои дефолты, -Wpedantic не подходит для .cu).
target_compile_options(${target} PRIVATE
$<$<COMPILE_LANGUAGE:C>:-Wall>
$<$<COMPILE_LANGUAGE:C>:-Wextra>
$<$<COMPILE_LANGUAGE:C>:-Wpedantic>
$<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Debug>>:-O0>
$<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Debug>>:-g3>
$<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Release>>:-O2>
$<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Release>>:-g>
)
target_link_libraries(${target}
PUBLIC
cuframes_static # из third_party/cuframes
CUDA::cudart
CUDA::cuda_driver
Threads::Threads
${LIBDL_LIBRARY} # для dlopen libnvidia-encode.so
PNG::PNG # для PNG overlay'ев (Phase 3b)
Freetype::Freetype # для text overlay'ев (Phase 3c)
${LIBZMQ_LIBRARY} # для control plane (Phase 4a)
${LIBJSONC_LIBRARY} # для control plane JSON (Phase 4a)
${LIBMOSQUITTO_LIBRARY} # для MQTT health (Phase 4b)
PkgConfig::LIBAV # для mpegts writer (Phase 7)
rt
)
target_include_directories(${target} PRIVATE
${LIBZMQ_INCLUDE_DIR}
${LIBJSONC_INCLUDE_DIR}
${LIBMOSQUITTO_INCLUDE_DIR}
)
# CUDA properties.
set_target_properties(${target} PROPERTIES
CUDA_SEPARABLE_COMPILATION OFF
)
endforeach()
set_target_properties(cuframes_composer PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION 0
)
# Install rules
include(GNUInstallDirs)
install(TARGETS cuframes_composer cuframes_composer_static
EXPORT cuframesComposerTargets
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/cuframes_composer
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING PATTERN "*.h"
)