OrangePi3588Media/CMakeLists.txt

174 lines
6.1 KiB
CMake

# Minimum version based on requirements from PRD (CMake >= 3.20)
cmake_minimum_required(VERSION 3.20)
project(rk3588_media_server
VERSION 0.1.0
DESCRIPTION "RK3588 media server bootstrap"
LANGUAGES C CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(BUILD_SAMPLES "Build demo binaries" ON)
option(BUILD_TESTS "Build unit tests" ON)
option(ENABLE_RK_DEMOS "Use official Rockchip demos that link against vendor SDKs" OFF)
set(RK_MPP_ROOT "${CMAKE_SOURCE_DIR}/third_party/mpp" CACHE PATH "Path to Rockchip MPP SDK root")
set(RK_MPP_LIB_PATH "" CACHE FILEPATH "Absolute path to librockchip_mpp.so built for RK3588")
set(RK_RKNN_ROOT "${CMAKE_SOURCE_DIR}/third_party/rknpu2" CACHE PATH "Path to Rockchip RKNN runtime repository")
set(RKNN_RUNTIME_LIB_DIR "${RK_RKNN_ROOT}/runtime/RK3588/Linux/librknn_api/aarch64" CACHE PATH "Directory containing librknnrt.so")
set(RKNN_RUNTIME_INCLUDE_DIR "${RK_RKNN_ROOT}/runtime/RK3588/Linux/librknn_api/include" CACHE PATH "include path for rknn_api.h")
set(RKNN_MODEL_PATH "${RK_RKNN_ROOT}/examples/rknn_api_demo/model/RK3588/mobilenet_v1.rknn" CACHE FILEPATH "Default RKNN demo model")
set(RKNN_SAMPLE_IMAGE "${RK_RKNN_ROOT}/examples/rknn_api_demo/model/dog_224x224.jpg" CACHE FILEPATH "Default RKNN demo input image")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
find_package(Threads REQUIRED)
if(RK3588_ENABLE_FFMPEG)
find_package(PkgConfig REQUIRED)
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavformat libavcodec libavutil)
pkg_check_modules(SWSCALE REQUIRED IMPORTED_TARGET libswscale)
endif()
# Helper target for common warnings
add_library(project_options INTERFACE)
if(MSVC)
target_compile_options(project_options INTERFACE /W4)
else()
target_compile_options(project_options INTERFACE -Wall -Wextra -Wpedantic)
endif()
# Resolve git revision if possible
find_package(Git QUIET)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
OUTPUT_VARIABLE RK_GIT_SHA
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)
endif()
if(NOT RK_GIT_SHA)
set(RK_GIT_SHA "nogit")
endif()
set(SRC_FILES
src/main.cpp
src/media_server_app.cpp
src/graph_manager.cpp
src/plugin_loader.cpp
src/ai_scheduler.cpp
src/http_server.cpp
src/hw_factory.cpp
src/hw_codec.cpp
src/hw_image_processor.cpp
src/utils/dma_alloc.cpp
src/utils/config_expand.cpp
)
# Shared cross-plugin state (used by gate/tracker and potentially other nodes).
add_library(rk_shared_state SHARED src/utils/shared_state.cpp)
target_compile_definitions(rk_shared_state PRIVATE RK3588_BUILD_SHARED_STATE)
target_include_directories(rk_shared_state PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_link_libraries(rk_shared_state PRIVATE project_options Threads::Threads)
set_target_properties(rk_shared_state PROPERTIES
OUTPUT_NAME "rk_shared_state"
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
)
install(TARGETS rk_shared_state
RUNTIME DESTINATION bin
LIBRARY DESTINATION bin
)
add_executable(media-server ${SRC_FILES})
set_target_properties(media-server PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
target_include_directories(media-server
PRIVATE
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/third_party
)
target_link_libraries(media-server PRIVATE project_options Threads::Threads)
if(RK3588_ENABLE_FFMPEG)
target_compile_definitions(media-server PRIVATE RK3588_ENABLE_FFMPEG)
target_include_directories(media-server PRIVATE ${FFMPEG_INCLUDE_DIRS})
target_link_libraries(media-server PRIVATE PkgConfig::FFMPEG PkgConfig::SWSCALE)
endif()
if(RK3588_ENABLE_MPP)
target_include_directories(media-server SYSTEM PRIVATE
${RK_MPP_ROOT}/inc
${RK_RKNN_ROOT}/examples/3rdparty/mpp/include
)
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(media-server PRIVATE -Wno-pedantic)
endif()
endif()
if(RK3588_ENABLE_RGA)
# Use system librga by default (rknpu2 prebuilt may contain broken symlinks)
if(NOT RK_RGA_INCLUDE_DIR)
set(RK_RGA_INCLUDE_DIR "${RK_RKNN_ROOT}/examples/3rdparty/rga/RK3588/include" CACHE PATH "RGA include directory")
endif()
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}")
target_compile_definitions(media-server PRIVATE RK3588_ENABLE_RGA)
target_include_directories(media-server SYSTEM PRIVATE ${RK_RGA_INCLUDE_DIR})
target_link_libraries(media-server PRIVATE ${RK_RGA_LIB})
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang")
target_compile_options(media-server PRIVATE -Wno-pedantic)
endif()
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")
else()
target_compile_definitions(media-server PRIVATE RK3588_ENABLE_RKNN)
target_include_directories(media-server PRIVATE ${RKNN_RUNTIME_INCLUDE_DIR})
target_link_libraries(media-server PRIVATE ${RK_RKNN_LIB})
endif()
endif()
if(WIN32)
target_link_libraries(media-server PRIVATE ws2_32)
endif()
target_compile_definitions(media-server PRIVATE
RK_PROJECT_VERSION="${PROJECT_VERSION}"
RK_GIT_SHA="${RK_GIT_SHA}"
)
install(TARGETS media-server RUNTIME DESTINATION bin)
if(BUILD_SAMPLES)
add_subdirectory(samples)
endif()
if(BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
add_subdirectory(plugins)
include(GNUInstallDirs)
install(FILES configs/sample_cam1.json DESTINATION ${CMAKE_INSTALL_DATADIR}/rk3588-media-server)