OrangePi3588Media/plugins/CMakeLists.txt

548 lines
23 KiB
CMake

set(RK_PLUGIN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/plugins)
option(RK3588_ENABLE_FFMPEG "Enable FFmpeg-based RTSP input" OFF)
option(RK3588_ENABLE_MPP "Enable Rockchip MPP decode/encode" OFF)
option(RK3588_ENABLE_ZLMEDIAKIT "Enable embedded ZLMediaKit RTSP server" OFF)
option(RK3588_ENABLE_RGA "Enable Rockchip RGA hardware acceleration" OFF)
option(RK3588_ENABLE_RKNN "Enable RKNN NPU inference" OFF)
find_package(SQLite3 QUIET)
set(RK_RGA_ROOT "${RK_RKNN_ROOT}/examples/3rdparty/rga/RK3588" CACHE PATH "Path to RGA library")
set(RK_RGA_INCLUDE_DIR "${RK_RGA_ROOT}/include" CACHE PATH "RGA include directory")
set(RK_RGA_LIB_DIR "${RK_RGA_ROOT}/lib/Linux/aarch64" CACHE PATH "RGA library directory")
set(RK_ZLMEDIAKIT_ROOT "${RK_RKNN_ROOT}/examples/3rdparty/zlmediakit" CACHE PATH "Path to ZLMediaKit mk_api bundle")
set(RK_ZLMEDIAKIT_INCLUDE_DIR "${RK_ZLMEDIAKIT_ROOT}/include" CACHE PATH "ZLMediaKit mk_api include directory")
set(RK_ZLMEDIAKIT_LIB_DIR "${RK_ZLMEDIAKIT_ROOT}/aarch64" CACHE PATH "ZLMediaKit mk_api library directory")
set(RK_ZLMK_API_LIB_PATH "" CACHE FILEPATH "Absolute path to libmk_api.so")
if(RK3588_ENABLE_FFMPEG)
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavformat libavcodec libavutil)
endif()
if(RK3588_ENABLE_MPP)
# Priority: 1) user-provided path, 2) self-built, 3) system library
# Note: rknpu2 prebuilt paths removed because they contain broken symlinks
if(RK_MPP_LIB_PATH)
find_library(RK_MPP_LIB rockchip_mpp
HINTS ${RK_MPP_LIB_PATH}
NO_DEFAULT_PATH
)
endif()
if(NOT RK_MPP_LIB)
find_library(RK_MPP_LIB rockchip_mpp
HINTS
${RK_MPP_ROOT}/build
${RK_MPP_ROOT}/lib
NO_DEFAULT_PATH
)
endif()
if(NOT RK_MPP_LIB)
# Search system default paths (e.g., /usr/lib/aarch64-linux-gnu/)
find_library(RK_MPP_LIB rockchip_mpp)
endif()
if(NOT RK_MPP_LIB)
message(WARNING "MPP enabled but rockchip_mpp library not found; disable RK3588_ENABLE_MPP or set RK_MPP_LIB_PATH")
else()
message(STATUS "Found rockchip_mpp: ${RK_MPP_LIB}")
endif()
endif()
if(RK3588_ENABLE_ZLMEDIAKIT)
if(RK_ZLMK_API_LIB_PATH)
set(RK_ZLMK_API_LIB "${RK_ZLMK_API_LIB_PATH}")
else()
find_library(RK_ZLMK_API_LIB mk_api
HINTS
${RK_ZLMEDIAKIT_LIB_DIR}
NO_DEFAULT_PATH
)
if(NOT RK_ZLMK_API_LIB)
find_library(RK_ZLMK_API_LIB mk_api)
endif()
endif()
if(NOT RK_ZLMK_API_LIB)
message(WARNING "ZLMediaKit enabled but mk_api library not found; set RK_ZLMK_API_LIB_PATH or RK_ZLMEDIAKIT_LIB_DIR")
endif()
endif()
if(RK3588_ENABLE_RGA)
# Use system librga by default (rknpu2 prebuilt may contain broken symlinks)
find_library(RK_RGA_LIB rga)
if(NOT RK_RGA_LIB)
message(WARNING "RGA enabled but librga not found; disable RK3588_ENABLE_RGA or install librga-dev")
else()
message(STATUS "Found librga: ${RK_RGA_LIB}")
endif()
endif()
if(RK3588_ENABLE_RKNN)
find_library(RK_RKNN_LIB rknnrt
HINTS
${RKNN_RUNTIME_LIB_DIR}
${RK_RKNN_ROOT}/runtime/RK3588/Linux/librknn_api/aarch64
NO_DEFAULT_PATH
)
if(NOT RK_RKNN_LIB)
find_library(RK_RKNN_LIB rknnrt)
endif()
if(NOT RK_RKNN_LIB)
message(WARNING "RKNN enabled but librknnrt not found; disable RK3588_ENABLE_RKNN or set RKNN_RUNTIME_LIB_DIR")
endif()
endif()
# AiScheduler shared library for NPU resource management
add_library(ai_scheduler SHARED ${CMAKE_SOURCE_DIR}/src/ai_scheduler.cpp)
target_include_directories(ai_scheduler PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_scheduler PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_RKNN AND RK_RKNN_LIB)
target_compile_definitions(ai_scheduler PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_scheduler PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_scheduler PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_scheduler PROPERTIES
OUTPUT_NAME "ai_scheduler"
ARCHIVE_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
if(WIN32)
set_target_properties(ai_scheduler PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
add_library(input_rtsp SHARED
input_rtsp/input_rtsp_node.cpp
${CMAKE_SOURCE_DIR}/src/hw_factory.cpp
${CMAKE_SOURCE_DIR}/src/hw_codec.cpp
${CMAKE_SOURCE_DIR}/src/hw_image_processor.cpp
)
target_include_directories(input_rtsp PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(input_rtsp PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(input_rtsp PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(input_rtsp PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(input_rtsp PRIVATE PkgConfig::FFMPEG)
endif()
if(RK3588_ENABLE_MPP AND RK_MPP_LIB)
target_compile_definitions(input_rtsp PRIVATE RK3588_ENABLE_MPP)
target_include_directories(input_rtsp PRIVATE
${RK_MPP_ROOT}/inc
${RK_RKNN_ROOT}/examples/3rdparty/mpp/include
)
target_link_libraries(input_rtsp PRIVATE ${RK_MPP_LIB})
endif()
set_target_properties(input_rtsp PROPERTIES
OUTPUT_NAME "input_rtsp"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
add_library(input_file SHARED
input_file/input_file_node.cpp
${CMAKE_SOURCE_DIR}/src/hw_factory.cpp
${CMAKE_SOURCE_DIR}/src/hw_codec.cpp
${CMAKE_SOURCE_DIR}/src/hw_image_processor.cpp
)
target_include_directories(input_file PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(input_file PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(input_file PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(input_file PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(input_file PRIVATE PkgConfig::FFMPEG)
endif()
if(RK3588_ENABLE_MPP AND RK_MPP_LIB)
target_compile_definitions(input_file PRIVATE RK3588_ENABLE_MPP)
target_include_directories(input_file PRIVATE
${RK_MPP_ROOT}/inc
${RK_RKNN_ROOT}/examples/3rdparty/mpp/include
)
target_link_libraries(input_file PRIVATE ${RK_MPP_LIB})
endif()
set_target_properties(input_file PROPERTIES
OUTPUT_NAME "input_file"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
add_library(publish SHARED
publish/publish_node.cpp
${CMAKE_SOURCE_DIR}/src/hw_factory.cpp
${CMAKE_SOURCE_DIR}/src/hw_codec.cpp
${CMAKE_SOURCE_DIR}/src/hw_image_processor.cpp
)
target_include_directories(publish PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(publish PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(publish PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(publish PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(publish PRIVATE PkgConfig::FFMPEG)
endif()
if(RK3588_ENABLE_MPP AND RK_MPP_LIB)
target_compile_definitions(publish PRIVATE RK3588_ENABLE_MPP)
target_include_directories(publish PRIVATE
${RK_MPP_ROOT}/inc
${RK_RKNN_ROOT}/examples/3rdparty/mpp/include
)
target_link_libraries(publish PRIVATE ${RK_MPP_LIB})
endif()
if(RK3588_ENABLE_ZLMEDIAKIT AND RK_ZLMK_API_LIB)
target_compile_definitions(publish PRIVATE RK3588_ENABLE_ZLMEDIAKIT)
target_include_directories(publish PRIVATE ${RK_ZLMEDIAKIT_INCLUDE_DIR})
target_link_libraries(publish PRIVATE ${RK_ZLMK_API_LIB})
set_target_properties(publish PROPERTIES BUILD_RPATH "\$ORIGIN" INSTALL_RPATH "\$ORIGIN")
add_custom_command(TARGET publish POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${RK_ZLMK_API_LIB}" $<TARGET_FILE_DIR:publish>
)
install(FILES "${RK_ZLMK_API_LIB}" DESTINATION ${CMAKE_INSTALL_LIBDIR}/rk3588-media-server/plugins)
endif()
set_target_properties(publish PROPERTIES
OUTPUT_NAME "publish"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
add_library(preprocess SHARED
preprocess/preprocess_node.cpp
${CMAKE_SOURCE_DIR}/src/hw_image_processor.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(preprocess PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(preprocess PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(preprocess PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(preprocess PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(preprocess PRIVATE PkgConfig::FFMPEG)
# swscale is required when preprocess runs in software mode (use_rga=false)
pkg_check_modules(SWSCALE_PREPROCESS IMPORTED_TARGET libswscale)
if(SWSCALE_PREPROCESS_FOUND)
target_link_libraries(preprocess PRIVATE PkgConfig::SWSCALE_PREPROCESS)
endif()
endif()
if(RK3588_ENABLE_RGA AND RK_RGA_LIB)
target_compile_definitions(preprocess PRIVATE RK3588_ENABLE_RGA)
target_include_directories(preprocess PRIVATE ${RK_RGA_INCLUDE_DIR})
target_link_libraries(preprocess PRIVATE ${RK_RGA_LIB})
endif()
set_target_properties(preprocess PROPERTIES
OUTPUT_NAME "preprocess"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# ai_yolo plugin (RKNN-based YOLO inference)
add_library(ai_yolo SHARED
ai_yolo/ai_yolo_node.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(ai_yolo PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_yolo PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_RKNN AND RK_RKNN_LIB)
target_compile_definitions(ai_yolo PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_yolo PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_yolo PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_yolo PROPERTIES
OUTPUT_NAME "ai_yolo"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# ai_face_det plugin (RKNN-based RetinaFace inference)
add_library(ai_face_det SHARED
ai_face_det/ai_face_det_node.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(ai_face_det PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_face_det PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_RKNN AND RK_RKNN_LIB)
target_compile_definitions(ai_face_det PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_face_det PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_face_det PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_face_det PROPERTIES
OUTPUT_NAME "ai_face_det"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# ai_scrfd plugin (SCRFD 640x640 face detection)
add_library(ai_scrfd SHARED
ai_scrfd/ai_scrfd_node.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(ai_scrfd PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_scrfd PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_RKNN AND RK_RKNN_LIB)
target_compile_definitions(ai_scrfd PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_scrfd PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_scrfd PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_scrfd PROPERTIES
OUTPUT_NAME "ai_scrfd"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# ai_scrfd_sliding plugin (SCRFD with sliding window detection)
add_library(ai_scrfd_sliding SHARED
ai_scrfd_sliding/ai_scrfd_sliding_node.cpp
${CMAKE_SOURCE_DIR}/src/face/scrfd_detector.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(ai_scrfd_sliding PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_scrfd_sliding PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_RKNN)
target_compile_definitions(ai_scrfd_sliding PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_scrfd_sliding PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_scrfd_sliding PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_scrfd_sliding PROPERTIES
OUTPUT_NAME "ai_scrfd_sliding"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# ai_face_recog plugin (RKNN-based ArcFace/MobileFaceNet inference)
add_library(ai_face_recog SHARED
ai_face_recog/ai_face_recog_node.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(ai_face_recog PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_face_recog PRIVATE project_options Threads::Threads ai_scheduler)
if(SQLite3_FOUND)
target_compile_definitions(ai_face_recog PRIVATE RK3588_ENABLE_SQLITE3)
if(TARGET SQLite::SQLite3)
target_link_libraries(ai_face_recog PRIVATE SQLite::SQLite3)
elseif(TARGET SQLite3::SQLite3)
target_link_libraries(ai_face_recog PRIVATE SQLite3::SQLite3)
else()
# Best-effort fallback; some toolchains only provide variables.
if(SQLite3_INCLUDE_DIRS)
target_include_directories(ai_face_recog PRIVATE ${SQLite3_INCLUDE_DIRS})
endif()
if(SQLite3_LIBRARIES)
target_link_libraries(ai_face_recog PRIVATE ${SQLite3_LIBRARIES})
endif()
endif()
endif()
if(RK3588_ENABLE_RKNN AND RK_RKNN_LIB)
target_compile_definitions(ai_face_recog PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_face_recog PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_face_recog PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_face_recog PROPERTIES
OUTPUT_NAME "ai_face_recog"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# det_post plugin (post-processing pipeline for detection results)
add_library(det_post SHARED det_post/det_post_node.cpp)
target_include_directories(det_post PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(det_post PRIVATE project_options Threads::Threads)
set_target_properties(det_post PROPERTIES
OUTPUT_NAME "det_post"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# tracker plugin (ByteTrack-lite style IOU association)
add_library(tracker SHARED tracker/tracker_node.cpp)
target_include_directories(tracker PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(tracker PRIVATE project_options Threads::Threads rk_shared_state)
set_target_properties(tracker PROPERTIES
OUTPUT_NAME "tracker"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
if(UNIX AND NOT APPLE)
set_target_properties(tracker PROPERTIES BUILD_RPATH "\$ORIGIN/.." INSTALL_RPATH "\$ORIGIN/..")
endif()
# gate plugin (conditional pass/drop based on shared state)
add_library(gate SHARED gate/gate_node.cpp)
target_include_directories(gate PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(gate PRIVATE project_options Threads::Threads rk_shared_state)
set_target_properties(gate PROPERTIES
OUTPUT_NAME "gate"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
if(UNIX AND NOT APPLE)
set_target_properties(gate PROPERTIES BUILD_RPATH "\$ORIGIN/.." INSTALL_RPATH "\$ORIGIN/..")
endif()
# osd plugin (on-screen display for detection results)
add_library(osd SHARED
osd/osd_node.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(osd PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(osd PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_RGA AND RK_RGA_LIB)
target_compile_definitions(osd PRIVATE RK3588_ENABLE_RGA)
target_include_directories(osd PRIVATE ${RK_RGA_INCLUDE_DIR})
target_link_libraries(osd PRIVATE ${RK_RGA_LIB})
endif()
set_target_properties(osd PROPERTIES
OUTPUT_NAME "osd"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# alarm plugin (rule-based alarm with actions: log, http, snapshot, clip)
add_library(alarm SHARED
alarm/alarm_node.cpp
alarm/rule_engine.cpp
alarm/frame_ring_buffer.cpp
alarm/packet_ring_buffer.cpp
alarm/actions/log_action.cpp
alarm/actions/http_action.cpp
alarm/actions/external_api_action.cpp
alarm/actions/snapshot_action.cpp
alarm/actions/clip_action.cpp
alarm/uploaders/local_uploader.cpp
alarm/uploaders/minio_uploader.cpp
alarm/uploaders/uploader_factory.cpp
${CMAKE_SOURCE_DIR}/src/utils/dma_alloc.cpp
)
target_include_directories(alarm PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/third_party
${CMAKE_CURRENT_SOURCE_DIR}/alarm
)
target_link_libraries(alarm PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(alarm PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(alarm PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(alarm PRIVATE PkgConfig::FFMPEG)
# Also need libswscale for image conversion
pkg_check_modules(SWSCALE IMPORTED_TARGET libswscale)
if(SWSCALE_FOUND)
target_link_libraries(alarm PRIVATE PkgConfig::SWSCALE)
endif()
endif()
# Optional: libcurl for HTTP action (on Linux)
find_package(CURL QUIET)
if(CURL_FOUND)
target_link_libraries(alarm PRIVATE CURL::libcurl)
endif()
# Optional: OpenSSL for MinIO/S3 SigV4 signing (when presign_endpoint is not used)
find_package(OpenSSL QUIET)
if(OpenSSL_FOUND)
target_compile_definitions(alarm PRIVATE RK3588_ENABLE_OPENSSL)
target_link_libraries(alarm PRIVATE OpenSSL::Crypto)
endif()
set_target_properties(alarm PROPERTIES
OUTPUT_NAME "alarm"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# logic_gate plugin (PPE compliance logic with spatial and color analysis)
add_library(logic_gate SHARED
logic_gate/logic_gate_node.cpp
logic_gate/spatial_matcher.cpp
logic_gate/color_analyzer.cpp
)
target_include_directories(logic_gate PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(logic_gate PRIVATE project_options Threads::Threads)
set_target_properties(logic_gate PROPERTIES
OUTPUT_NAME "logic_gate"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# region_event plugin (rule-driven region behavior events)
add_library(region_event SHARED
region_event/region_event_node.cpp
)
target_include_directories(region_event PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(region_event PRIVATE project_options Threads::Threads)
set_target_properties(region_event PROPERTIES
OUTPUT_NAME "region_event"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# storage plugin (continuous recording with segment management)
add_library(storage SHARED
storage/storage_node.cpp
${CMAKE_SOURCE_DIR}/src/hw_factory.cpp
${CMAKE_SOURCE_DIR}/src/hw_codec.cpp
${CMAKE_SOURCE_DIR}/src/hw_image_processor.cpp
)
target_include_directories(storage PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(storage PRIVATE project_options Threads::Threads ai_scheduler)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(storage PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(storage PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(storage PRIVATE PkgConfig::FFMPEG)
if(SWSCALE_FOUND)
target_link_libraries(storage PRIVATE PkgConfig::SWSCALE)
endif()
endif()
if(RK3588_ENABLE_MPP AND RK_MPP_LIB)
target_compile_definitions(storage PRIVATE RK3588_ENABLE_MPP)
target_include_directories(storage PRIVATE
${RK_MPP_ROOT}/inc
${RK_RKNN_ROOT}/examples/3rdparty/mpp/include
)
target_link_libraries(storage PRIVATE ${RK_MPP_LIB})
endif()
set_target_properties(storage PROPERTIES
OUTPUT_NAME "storage"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
# zlm_http plugin (embedded HTTP file server via ZLMediaKit)
if(RK3588_ENABLE_ZLMEDIAKIT AND RK_ZLMK_API_LIB)
add_library(zlm_http SHARED zlm_http/zlm_http_node.cpp)
target_include_directories(zlm_http PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_compile_definitions(zlm_http PRIVATE RK3588_ENABLE_ZLMEDIAKIT)
target_include_directories(zlm_http PRIVATE ${RK_ZLMEDIAKIT_INCLUDE_DIR})
target_link_libraries(zlm_http PRIVATE project_options Threads::Threads ${RK_ZLMK_API_LIB})
set_target_properties(zlm_http PROPERTIES
OUTPUT_NAME "zlm_http"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
BUILD_RPATH "\$ORIGIN"
INSTALL_RPATH "\$ORIGIN"
)
add_custom_command(TARGET zlm_http POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${RK_ZLMK_API_LIB}" $<TARGET_FILE_DIR:zlm_http>
)
install(TARGETS zlm_http
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/rk3588-media-server/plugins
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/rk3588-media-server/plugins
)
endif()
# ai_shoe_det plugin (shoe detection with sliding window support)
add_library(ai_shoe_det SHARED
ai_shoe_det/ai_shoe_det_node.cpp
)
target_include_directories(ai_shoe_det PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/third_party)
target_link_libraries(ai_shoe_det PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_RKNN AND RK_RKNN_LIB)
target_compile_definitions(ai_shoe_det PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(ai_shoe_det PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(ai_shoe_det PRIVATE ${RK_RKNN_LIB})
endif()
set_target_properties(ai_shoe_det PROPERTIES
OUTPUT_NAME "ai_shoe_det"
LIBRARY_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
RUNTIME_OUTPUT_DIRECTORY ${RK_PLUGIN_OUTPUT_DIR}
)
install(TARGETS input_rtsp input_file publish preprocess ai_yolo ai_face_det ai_scrfd ai_scrfd_sliding ai_face_recog tracker gate osd alarm logic_gate region_event storage ai_scheduler ai_shoe_det
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/rk3588-media-server/plugins
RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR}/rk3588-media-server/plugins
)