cmake_minimum_required(VERSION 3.20) project(cvmmap-streamer LANGUAGES CXX) set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) find_package(Threads REQUIRED) find_package(cppzmq QUIET) set(CVMMAP_LOCAL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../cv-mmap" CACHE PATH "Path to a local cv-mmap checkout") set(CVMMAP_LOCAL_BUILD "${CVMMAP_LOCAL_ROOT}/build/core" CACHE PATH "Path to local cv-mmap build artifacts") if (cvmmap-core_DIR) find_package(cvmmap-core CONFIG QUIET) endif() find_package(ZeroMQ QUIET) find_package(spdlog REQUIRED) find_package(Protobuf REQUIRED) find_package(PkgConfig REQUIRED) find_package(rvl CONFIG QUIET) set(ZED_DIR "/usr/local/zed" CACHE PATH "Path to the local ZED SDK") find_package(ZED REQUIRED) find_package(CUDA ${ZED_CUDA_VERSION} REQUIRED) add_subdirectory(third_party) pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil libswscale) pkg_check_modules(PROTOBUF_PKG QUIET IMPORTED_TARGET protobuf) pkg_check_modules(ZSTD REQUIRED IMPORTED_TARGET libzstd) pkg_check_modules(LZ4 REQUIRED IMPORTED_TARGET liblz4) if (NOT TARGET cvmmap::client) if ( EXISTS "${CVMMAP_LOCAL_ROOT}/core/include/cvmmap/client.hpp" AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_client.a" AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_ipc.a" AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_target.a") add_library(cvmmap::client INTERFACE IMPORTED) set_target_properties(cvmmap::client PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${CVMMAP_LOCAL_ROOT}/core/include" INTERFACE_LINK_LIBRARIES "${CVMMAP_LOCAL_BUILD}/libcvmmap_client.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_ipc.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_target.a") else() message(FATAL_ERROR "cvmmap::client target is unavailable and local cv-mmap build artifacts were not found") endif() endif() if (NOT TARGET rvl::rvl) set(RVL_LOCAL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../rvl_impl" CACHE PATH "Path to a local rvl_impl checkout") set(RVL_LOCAL_BUILD "${RVL_LOCAL_ROOT}/build/core") if ( EXISTS "${RVL_LOCAL_ROOT}/core/include/rvl/rvl.hpp" AND EXISTS "${RVL_LOCAL_BUILD}/librvl_core.a") add_library(rvl::rvl INTERFACE IMPORTED) set_target_properties(rvl::rvl PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${RVL_LOCAL_ROOT}/core/include" INTERFACE_LINK_LIBRARIES "${RVL_LOCAL_BUILD}/librvl_core.a") else() message(FATAL_ERROR "rvl::rvl target is unavailable and local rvl_impl build artifacts were not found") endif() endif() add_library(cvmmap_streamer_foxglove_proto STATIC) protobuf_generate( TARGET cvmmap_streamer_foxglove_proto LANGUAGE cpp PROTOS "${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/CompressedVideo.proto" "${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/CameraCalibration.proto" "${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/PoseInFrame.proto" "${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/Pose.proto" "${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/Quaternion.proto" "${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/Vector3.proto" IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}/proto") add_library(cvmmap_streamer_depth_proto STATIC) protobuf_generate( TARGET cvmmap_streamer_depth_proto LANGUAGE cpp PROTOS "${CMAKE_CURRENT_LIST_DIR}/proto/cvmmap_streamer/DepthMap.proto" IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}/proto") add_library(cvmmap_streamer_protobuf INTERFACE) target_include_directories(cvmmap_streamer_foxglove_proto PUBLIC "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/proto" ${Protobuf_INCLUDE_DIRS}) target_include_directories(cvmmap_streamer_depth_proto PUBLIC "${CMAKE_CURRENT_BINARY_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/proto" ${Protobuf_INCLUDE_DIRS}) target_include_directories(cvmmap_streamer_protobuf INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/proto" ${Protobuf_INCLUDE_DIRS}) if (TARGET protobuf::libprotobuf) target_link_libraries(cvmmap_streamer_protobuf INTERFACE protobuf::libprotobuf) elseif (TARGET Protobuf::libprotobuf) target_link_libraries(cvmmap_streamer_protobuf INTERFACE Protobuf::libprotobuf) else() target_link_libraries(cvmmap_streamer_protobuf INTERFACE ${Protobuf_LIBRARIES}) endif() if (TARGET PkgConfig::PROTOBUF_PKG) target_link_libraries(cvmmap_streamer_protobuf INTERFACE PkgConfig::PROTOBUF_PKG) endif() target_link_libraries(cvmmap_streamer_foxglove_proto PUBLIC cvmmap_streamer_protobuf) target_link_libraries(cvmmap_streamer_depth_proto PUBLIC cvmmap_streamer_protobuf) add_library(cvmmap_streamer_mcap_runtime STATIC src/record/mcap_runtime.cpp) target_include_directories(cvmmap_streamer_mcap_runtime PUBLIC) target_link_libraries(cvmmap_streamer_mcap_runtime PUBLIC mcap::mcap PkgConfig::ZSTD PkgConfig::LZ4) add_library(cvmmap_streamer_record_support STATIC src/encode/encoder_backend.cpp src/encode/ffmpeg_encoder_backend.cpp src/record/protobuf_descriptor.cpp src/record/mcap_record_sink.cpp) target_include_directories(cvmmap_streamer_record_support PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}") target_link_libraries(cvmmap_streamer_record_support PUBLIC cvmmap_streamer_foxglove_proto cvmmap_streamer_depth_proto cvmmap_streamer_mcap_runtime PkgConfig::FFMPEG PkgConfig::ZSTD PkgConfig::LZ4 rvl::rvl mcap::mcap msft_proxy4::proxy cvmmap_streamer_protobuf) if (TARGET spdlog::spdlog) target_link_libraries(cvmmap_streamer_record_support PUBLIC spdlog::spdlog) elseif (TARGET spdlog) target_link_libraries(cvmmap_streamer_record_support PUBLIC spdlog) endif() if (TARGET PkgConfig::PROTOBUF_PKG) target_link_libraries(cvmmap_streamer_record_support PUBLIC PkgConfig::PROTOBUF_PKG) endif() add_library(cvmmap_streamer_common STATIC src/ipc/help.cpp src/config/runtime_config.cpp src/core/frame_source.cpp src/core/ingest_runtime.cpp src/ipc/contracts.cpp src/protocol/wire_codec.cpp src/metrics/latency_tracker.cpp src/pipeline/pipeline_runtime.cpp src/protocol/rtmp_output.cpp src/protocol/rtp_publisher.cpp) target_include_directories(cvmmap_streamer_common PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}") set(CVMMAP_STREAMER_LINK_DEPS Threads::Threads cvmmap_streamer_record_support PkgConfig::FFMPEG PkgConfig::ZSTD PkgConfig::LZ4 cvmmap::client CLI11::CLI11 tomlplusplus::tomlplusplus mcap::mcap) if (TARGET cppzmq::cppzmq) list(APPEND CVMMAP_STREAMER_LINK_DEPS cppzmq::cppzmq) elseif (TARGET cppzmq) list(APPEND CVMMAP_STREAMER_LINK_DEPS cppzmq) endif() if (TARGET ZeroMQ::libzmq) list(APPEND CVMMAP_STREAMER_LINK_DEPS ZeroMQ::libzmq) elseif (TARGET ZeroMQ::ZeroMQ) list(APPEND CVMMAP_STREAMER_LINK_DEPS ZeroMQ::ZeroMQ) endif() if (TARGET spdlog::spdlog) list(APPEND CVMMAP_STREAMER_LINK_DEPS spdlog::spdlog) elseif (TARGET spdlog) list(APPEND CVMMAP_STREAMER_LINK_DEPS spdlog) endif() list(APPEND CVMMAP_STREAMER_LINK_DEPS cvmmap_streamer_protobuf) if (TARGET PkgConfig::PROTOBUF_PKG) list(APPEND CVMMAP_STREAMER_LINK_DEPS PkgConfig::PROTOBUF_PKG) endif() target_link_libraries(cvmmap_streamer_common PUBLIC ${CVMMAP_STREAMER_LINK_DEPS}) function(add_cvmmap_binary target source) add_executable(${target} ${source} ${ARGN}) target_include_directories(${target} PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}") target_link_libraries(${target} PRIVATE cvmmap_streamer_common) set_target_properties(${target} PROPERTIES OUTPUT_NAME "${target}" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") endfunction() add_cvmmap_binary(cvmmap_streamer src/main_streamer.cpp) add_cvmmap_binary(rtp_receiver_tester src/testers/rtp_receiver_tester.cpp) add_cvmmap_binary(rtp_output_tester src/testers/rtp_output_tester.cpp) add_cvmmap_binary(rtmp_stub_tester src/testers/rtmp_stub_tester.cpp) add_cvmmap_binary(rtmp_output_tester src/testers/rtmp_output_tester.cpp) add_cvmmap_binary(ipc_snapshot_tester src/testers/ipc_snapshot_tester.cpp) add_cvmmap_binary(mcap_depth_record_tester src/testers/mcap_depth_record_tester.cpp) add_cvmmap_binary(mcap_body_record_tester src/testers/mcap_body_record_tester.cpp) add_cvmmap_binary(mcap_body_inspector src/testers/mcap_body_inspector.cpp) add_cvmmap_binary(mcap_pose_record_tester src/testers/mcap_pose_record_tester.cpp) add_executable(mcap_reader_tester src/testers/mcap_reader_tester.cpp) target_include_directories(mcap_reader_tester PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}") target_link_libraries(mcap_reader_tester PRIVATE CLI11::CLI11 cvmmap_streamer_foxglove_proto cvmmap_streamer_depth_proto cvmmap_streamer_mcap_runtime mcap::mcap PkgConfig::ZSTD PkgConfig::LZ4) if (TARGET spdlog::spdlog) target_link_libraries(mcap_reader_tester PRIVATE spdlog::spdlog) elseif (TARGET spdlog) target_link_libraries(mcap_reader_tester PRIVATE spdlog) endif() target_link_libraries(mcap_reader_tester PRIVATE cvmmap_streamer_protobuf) if (TARGET PkgConfig::PROTOBUF_PKG) target_link_libraries(mcap_reader_tester PRIVATE PkgConfig::PROTOBUF_PKG) endif() set_target_properties(mcap_reader_tester PROPERTIES OUTPUT_NAME "mcap_reader_tester" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") add_executable(mcap_replay_tester src/testers/mcap_replay_tester.cpp) target_include_directories(mcap_replay_tester PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}") target_link_libraries(mcap_replay_tester PRIVATE Threads::Threads CLI11::CLI11 cvmmap_streamer_foxglove_proto cvmmap_streamer_mcap_runtime mcap::mcap PkgConfig::ZSTD PkgConfig::LZ4) if (TARGET spdlog::spdlog) target_link_libraries(mcap_replay_tester PRIVATE spdlog::spdlog) elseif (TARGET spdlog) target_link_libraries(mcap_replay_tester PRIVATE spdlog) endif() target_link_libraries(mcap_replay_tester PRIVATE cvmmap_streamer_protobuf) if (TARGET PkgConfig::PROTOBUF_PKG) target_link_libraries(mcap_replay_tester PRIVATE PkgConfig::PROTOBUF_PKG) endif() set_target_properties(mcap_replay_tester PROPERTIES OUTPUT_NAME "mcap_replay_tester" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin") add_executable( zed_svo_to_mcap src/tools/zed_svo_to_mcap.cpp src/config/runtime_config.cpp) target_include_directories(zed_svo_to_mcap PRIVATE "${CMAKE_CURRENT_LIST_DIR}/include" "${CMAKE_CURRENT_BINARY_DIR}" ${ZED_INCLUDE_DIRS} ${CUDA_INCLUDE_DIRS}) target_link_directories(zed_svo_to_mcap PRIVATE ${ZED_LIBRARY_DIR} ${CUDA_LIBRARY_DIRS}) target_link_libraries(zed_svo_to_mcap PRIVATE cvmmap_streamer_record_support CLI11::CLI11 tomlplusplus::tomlplusplus ${ZED_LIBRARIES} ${CUDA_CUDA_LIBRARY} ${CUDA_CUDART_LIBRARY}) if (TARGET spdlog::spdlog) target_link_libraries(zed_svo_to_mcap PRIVATE spdlog::spdlog) elseif (TARGET spdlog) target_link_libraries(zed_svo_to_mcap PRIVATE spdlog) endif() set_target_properties(zed_svo_to_mcap PROPERTIES OUTPUT_NAME "zed_svo_to_mcap" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")