From 7680d7d7e3bd2e9e6c2e6d554537efb9dbb9df35 Mon Sep 17 00:00:00 2001 From: Barzan Hayati Date: Thu, 10 Jul 2025 22:59:36 +0000 Subject: [PATCH] Singleton configuration reader --- CMakeLists.txt | 9 ++++++--- src/config_manager.cpp | 16 ++++++++++++++++ src/config_manager.hpp | 19 +++++++++++++++++++ src/rtsp_streaming_manager.cpp | 24 ++++++++++-------------- src/rtsp_streaming_manager.hpp | 3 +-- src/sink_manager.cpp | 12 ++++-------- src/sink_manager.hpp | 3 +-- src/streammux_manager.cpp | 10 +++------- src/streammux_manager.hpp | 4 +--- 9 files changed, 61 insertions(+), 39 deletions(-) create mode 100644 src/config_manager.cpp create mode 100644 src/config_manager.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index aef07e1..78244a8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ -cmake_minimum_required(VERSION 3.15) -project(TextReader LANGUAGES CXX) +cmake_minimum_required(VERSION 3.19) +project(BodyPipeline LANGUAGES CXX) # Set C++ standard and enable modern practices set(CMAKE_CXX_STANDARD 17) @@ -66,12 +66,15 @@ include_directories(${PROJECT_SOURCE_DIR}/sink_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/message_handling.hpp) include_directories(${PROJECT_SOURCE_DIR}/rtsp_streaming_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/metrics_manager.hpp) +include_directories(${PROJECT_SOURCE_DIR}/config_manager.hpp) + + set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/streammux_manager.cpp src/source_bin.cpp src/gstds_example_manager.cpp src/tiler_manager.cpp src/nv_video_convert_manager.cpp src/nv_osd_manager.cpp src/queue_manager.cpp src/nv_ds_logger_manager.cpp src/sink_manager.cpp src/message_handling.cpp - src/rtsp_streaming_manager.cpp src/metrics_manager.cpp) + src/rtsp_streaming_manager.cpp src/metrics_manager.cpp src/config_manager.cpp) # Create the executable add_executable(${PROJECT_NAME} ${SOURCES}) diff --git a/src/config_manager.cpp b/src/config_manager.cpp new file mode 100644 index 0000000..7404025 --- /dev/null +++ b/src/config_manager.cpp @@ -0,0 +1,16 @@ +#include "config_manager.hpp" + +ConfigManager::ConfigManager() { + std::ifstream file("../data/configuration.json"); + if (!file) { + throw std::runtime_error("Could not open configuration.json"); + } + file >> config; +} + +ConfigManager& ConfigManager::get_instance() { + static ConfigManager instance; + return instance; +} + +const nlohmann::json& ConfigManager::get_config() const { return config; } diff --git a/src/config_manager.hpp b/src/config_manager.hpp new file mode 100644 index 0000000..445e978 --- /dev/null +++ b/src/config_manager.hpp @@ -0,0 +1,19 @@ +#pragma once +#include +#include +#include +#include + +class ConfigManager { + public: + static ConfigManager& get_instance(); + + const nlohmann::json& get_config() const; + + private: + ConfigManager(); // constructor loads the JSON file + ConfigManager(const ConfigManager&) = delete; + ConfigManager& operator=(const ConfigManager&) = delete; + + nlohmann::json config; +}; diff --git a/src/rtsp_streaming_manager.cpp b/src/rtsp_streaming_manager.cpp index c6c5ae7..f9382ed 100644 --- a/src/rtsp_streaming_manager.cpp +++ b/src/rtsp_streaming_manager.cpp @@ -4,8 +4,6 @@ g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL); #define GPU_ID 0 -using json = nlohmann::json; - GstRTSPServer *RtspStreamingManager::server; std::string RtspStreamingManager::codec_rtsp_out = ""; std::string RtspStreamingManager::mount_address = ""; @@ -16,19 +14,17 @@ guint RtspStreamingManager::updsink_port_num = 1; guint RtspStreamingManager::payload = 1; RtspStreamingManager::RtspStreamingManager() { - json j; - std::ifstream i("../data/configuration.json"); - i >> j; + const auto &config = ConfigManager::get_instance().get_config(); - j.at("codec_rtsp_out").get_to(codec_rtsp_out); - j.at("mount_address").get_to(mount_address); - j.at("udp_buffer_size").get_to(udp_buffer_size); - j.at("clock_rate").get_to(clock_rate); - j.at("bitrate").get_to(bitrate); - j.at("rtsp_port").get_to(rtsp_port); - j.at("updsink_port_num").get_to(updsink_port_num); - j.at("payload").get_to(payload); - j.at("host").get_to(host); + config.at("codec_rtsp_out").get_to(codec_rtsp_out); + config.at("mount_address").get_to(mount_address); + config.at("udp_buffer_size").get_to(udp_buffer_size); + config.at("clock_rate").get_to(clock_rate); + config.at("bitrate").get_to(bitrate); + config.at("rtsp_port").get_to(rtsp_port); + config.at("updsink_port_num").get_to(updsink_port_num); + config.at("payload").get_to(payload); + config.at("host").get_to(host); } gboolean RtspStreamingManager::start_rtsp_streaming() { diff --git a/src/rtsp_streaming_manager.hpp b/src/rtsp_streaming_manager.hpp index c4aa809..e53615d 100644 --- a/src/rtsp_streaming_manager.hpp +++ b/src/rtsp_streaming_manager.hpp @@ -3,10 +3,9 @@ #include #include -#include +#include "config_manager.hpp" #include "cuda_runtime_api.h" -#include "json.hpp" class RtspStreamingManager { private: diff --git a/src/sink_manager.cpp b/src/sink_manager.cpp index fb834c1..20bf566 100644 --- a/src/sink_manager.cpp +++ b/src/sink_manager.cpp @@ -4,15 +4,11 @@ g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL); #define GPU_ID 0 -using json = nlohmann::json; - SinkManager::SinkManager() { - json j; - std::ifstream i("../data/configuration.json"); - i >> j; - j.at("output_video_path").get_to(output_video_path); - j.at("display_output").get_to(display_output); - j.at("codec_rtsp_out").get_to(codec_rtsp_out); + const auto& config = ConfigManager::get_instance().get_config(); + config.at("output_video_path").get_to(output_video_path); + config.at("display_output").get_to(display_output); + config.at("codec_rtsp_out").get_to(codec_rtsp_out); } bool SinkManager::create_sink(cudaDeviceProp prop) { diff --git a/src/sink_manager.hpp b/src/sink_manager.hpp index c8981d7..0e1a996 100644 --- a/src/sink_manager.hpp +++ b/src/sink_manager.hpp @@ -2,10 +2,9 @@ #include #include -#include +#include "config_manager.hpp" #include "cuda_runtime_api.h" -#include "json.hpp" class SinkManager { private: diff --git a/src/streammux_manager.cpp b/src/streammux_manager.cpp index c9d9612..4a4f27e 100644 --- a/src/streammux_manager.cpp +++ b/src/streammux_manager.cpp @@ -5,15 +5,11 @@ #define GPU_ID 0 #define MUXER_BATCH_TIMEOUT_USEC 40000 -using json = nlohmann::json; - StreammuxManager::StreammuxManager() { - json j; - std::ifstream i("../data/configuration.json"); - i >> j; + const auto& config = ConfigManager::get_instance().get_config(); - MUXER_OUTPUT_HEIGHT = j["MUXER_OUTPUT_HEIGHT"]; - MUXER_OUTPUT_WIDTH = j["MUXER_OUTPUT_WIDTH"]; + MUXER_OUTPUT_HEIGHT = config["MUXER_OUTPUT_HEIGHT"]; + MUXER_OUTPUT_WIDTH = config["MUXER_OUTPUT_WIDTH"]; } bool StreammuxManager::create_streammux(int num_sources) { diff --git a/src/streammux_manager.hpp b/src/streammux_manager.hpp index bcdb456..922be7f 100644 --- a/src/streammux_manager.hpp +++ b/src/streammux_manager.hpp @@ -2,13 +2,11 @@ #include #include -#include -#include "json.hpp" +#include "config_manager.hpp" class StreammuxManager { private: - public: GstElement *streammux = NULL; int MUXER_OUTPUT_WIDTH;