Files
ANSCORE/CMakeLists.txt
Tuan Nghia Nguyen 9f0a10a4c8 Improve ANSCV with sotfware decoder:
Thread-local staging Mat (video_player.cpp:1400-1407) — single biggest win. Eliminates the 12 MB per-call malloc/free cycle.
Contiguous get_buffer2 allocator (video_decoder.cpp:35-102) — keeps the 3 bulk memcpys cache-friendly. Would also enable FAST/zero-copy for resolutions where visible_h % 64 == 0.
SW-decoder thread config (video_decoder.cpp:528-540) — thread_count=0, thread_type=FRAME|SLICE. FRAME is downgraded to SLICE-only by AV_CODEC_FLAG_LOW_DELAY, but decode throughput is sufficient for your input rate.
SetTargetFPS(100) delivery throttle (already there) — caps onVideoFrame post-decode work at 10 FPS. Keeps the caller path warm-cached.
Instrumentation — [MEDIA_DecInit] / [MEDIA_Convert] / [MEDIA_SWDec] / [MEDIA_Timing] / [MEDIA_JpegTiming] — always-on regression detector, zero cost when ANSCORE_DEBUGVIEW=OFF.
2026-04-20 12:18:43 +10:00

168 lines
7.4 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.
cmake_minimum_required(VERSION 3.28)
cmake_policy(SET CMP0167 NEW) # Suppress FindBoost removal warning
# ── CUDA is optional (not available on macOS) ───────────────────
include(CheckLanguage)
check_language(CUDA)
if(CMAKE_CUDA_COMPILER)
project(ANSCORE LANGUAGES C CXX CUDA)
set(ANSCORE_HAS_CUDA ON)
set(CMAKE_CUDA_STANDARD 20)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_ARCHITECTURES 75 80 86 87 88 89 90 100)
if(MSVC)
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --use-fast-math -Xcompiler=/utf-8")
else()
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --use-fast-math")
endif()
else()
project(ANSCORE LANGUAGES C CXX)
set(ANSCORE_HAS_CUDA OFF)
message(WARNING "CUDA not found — GPU-accelerated modules will be limited")
endif()
# ── Platform detection ──────────────────────────────────────────
if(WIN32)
set(ANSCORE_PLATFORM "windows")
elseif(APPLE)
set(ANSCORE_PLATFORM "macos")
else()
set(ANSCORE_PLATFORM "linux")
endif()
message(STATUS "ANSCORE platform: ${ANSCORE_PLATFORM}, CUDA: ${ANSCORE_HAS_CUDA}")
# ── Global Settings ──────────────────────────────────────────────
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Output all binaries to a single directory
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
# ── Compiler Configuration ──────────────────────────────────────
if(MSVC)
# Dynamic CRT (/MD) — matches original VS projects and prebuilt libs like HWiNFO
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
# Apply MSVC flags only to C/C++ (not CUDA — nvcc doesn't understand them)
add_compile_options(
"$<$<COMPILE_LANGUAGE:C,CXX>:/W3>"
"$<$<COMPILE_LANGUAGE:C,CXX>:/utf-8>"
"$<$<AND:$<COMPILE_LANGUAGE:C,CXX>,$<NOT:$<CONFIG:MINSIZEREL>>>:/Zi>"
# RelWithDebInfo: keep /O2 but disable inlining so debuggers can land
# breakpoints on small dispatch functions (e.g. avframeToCVMat).
"$<$<AND:$<COMPILE_LANGUAGE:C,CXX>,$<CONFIG:RelWithDebInfo>>:/Ob0>"
)
add_link_options(
"$<$<NOT:$<CONFIG:DEBUG>>:/DEBUG:FULL>"
# /OPT:REF and /OPT:ICF improve Release size/perf but confuse the
# debugger (folds identical functions, strips unused ones). Apply
# them to Release only, not RelWithDebInfo.
"$<$<CONFIG:Release>:/OPT:REF>"
"$<$<CONFIG:Release>:/OPT:ICF>"
"$<$<CONFIG:RelWithDebInfo>:/OPT:NOREF>"
"$<$<CONFIG:RelWithDebInfo>:/OPT:NOICF>"
)
add_compile_definitions(_CRT_SECURE_NO_WARNINGS _WINSOCK_DEPRECATED_NO_WARNINGS)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
add_compile_options(-Wall -Wextra -Wno-unused-parameter)
if(NOT APPLE)
add_link_options(-Wl,--as-needed)
endif()
endif()
# ── DebugView logging toggle ────────────────────────────────────
# When ON, every ANS_DBG(...) call across the whole tree expands to an
# OutputDebugStringA() call visible in Sysinternals DebugView (Dbgview.exe).
# This is the single switch for verbose runtime diagnostics in ANSLPR,
# ANSCV (RTSP lifecycle, HW decoder auto-config), ANSODEngine (NV12 fast
# path, ORT/TRT engine selection), ANSFR (face recognizer state), etc.
#
# Enable it to diagnose field issues (e.g. "ALPR worked for a while then
# stopped"), then turn it back OFF for production because every ANS_DBG
# call adds a kernel round-trip and string formatting cost.
#
# Usage:
# cmake -B build -DANSCORE_DEBUGVIEW=ON # enable
# cmake -B build -DANSCORE_DEBUGVIEW=OFF # disable (default)
#
# Or toggle in CLion/VS: edit the cache variable ANSCORE_DEBUGVIEW.
option(ANSCORE_DEBUGVIEW "Enable ANS_DBG OutputDebugString logging for DebugView" OFF)
if(ANSCORE_DEBUGVIEW)
add_compile_definitions(ANSCORE_DEBUGVIEW=1)
message(STATUS "ANSCORE_DEBUGVIEW = ON — ANS_DBG verbose logging ENABLED (DebugView)")
else()
message(STATUS "ANSCORE_DEBUGVIEW = OFF — ANS_DBG verbose logging disabled (production)")
endif()
# ── Vendored libyuv (submodule: 3rdparty/libyuv) ────────────────
# SIMD-optimized YUV conversion library. Only genuinely fast on toolchains
# that understand GCC inline assembly (Clang/clang-cl/GCC) — 144 of its
# SIMD row functions live in row_gcc.cc. MSVC (cl.exe) can only compile the
# 8 routines in row_win.cc, so on MSVC libyuv silently falls back to the
# scalar C code in row_common.cc and runs ~10× slower than OpenCV+IPP's
# cv::cvtColor(COLOR_YUV2BGR_I420). Do NOT enable on MSVC builds.
#
# Default: OFF. Enable with `-DANSCORE_USE_LIBYUV=ON` only after switching
# the project's compiler to clang-cl / clang / gcc.
option(ANSCORE_USE_LIBYUV "Use libyuv for YUV→BGR conversion (only effective on Clang/GCC, NOT MSVC)" OFF)
if(ANSCORE_USE_LIBYUV AND EXISTS "${CMAKE_SOURCE_DIR}/3rdparty/libyuv/CMakeLists.txt")
if(MSVC AND NOT CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
message(WARNING "ANSCORE_USE_LIBYUV=ON but compiler is MSVC cl.exe — "
"libyuv's SIMD paths (row_gcc.cc) won't compile. "
"Expect ~10× slowdown vs cv::cvtColor. "
"Use clang-cl (LLVM) instead, or keep ANSCORE_USE_LIBYUV=OFF.")
endif()
# Prevent libyuv from finding a system libjpeg and enabling HAVE_JPEG
# (we don't use libyuv's MJPEG codepaths; avoids an unnecessary runtime dep).
set(CMAKE_DISABLE_FIND_PACKAGE_JPEG TRUE)
add_subdirectory(3rdparty/libyuv EXCLUDE_FROM_ALL)
set(ANSCORE_HAS_LIBYUV ON)
message(STATUS "libyuv: ENABLED (vendored from 3rdparty/libyuv, static target 'yuv')")
else()
set(ANSCORE_HAS_LIBYUV OFF)
message(STATUS "libyuv: DISABLED — using cv::cvtColor+IPP path (fast on MSVC)")
endif()
# ── External Dependencies ───────────────────────────────────────
include(cmake/Dependencies.cmake)
# ── Subprojects (ordered by dependency) ─────────────────────────
# Core — licensing & infrastructure
add_subdirectory(core/anslicensing)
add_subdirectory(core/ANSLicensingSystem)
add_subdirectory(core/ANSLibsLoader)
# Modules — feature DLLs (cross-platform)
add_subdirectory(modules/ANSMOT)
add_subdirectory(modules/ANSUtilities)
add_subdirectory(modules/ANSTrainingEngine)
add_subdirectory(modules/ANSLLM)
# Integrations — hardware & protocol DLLs
if(WIN32)
add_subdirectory(integrations/ANNHUB)
add_subdirectory(integrations/ANSIO)
add_subdirectory(integrations/ANSONVIF)
endif()
add_subdirectory(integrations/ANSPulsar)
add_subdirectory(integrations/ANSRabbitMQ)
# Modules — engine layer (CUDA + inference frameworks)
if(ANSCORE_HAS_CUDA)
add_subdirectory(modules/ANSODEngine)
add_subdirectory(modules/ANSOCR)
add_subdirectory(modules/ANSFR)
add_subdirectory(modules/ANSLPR)
endif()
add_subdirectory(modules/ANSCV)
# Facade
add_subdirectory(ANSLIB)
# Tests
add_subdirectory(tests)