From f9d16f29cfbbca6479af110a1cecb5094851394a Mon Sep 17 00:00:00 2001 From: Barzan Hayati Date: Mon, 30 Jun 2025 00:09:24 +0000 Subject: [PATCH] Create streammux class --- CMakeLists.txt | 7 +++++-- data/configuration.json | 4 ++++ src/main.cpp | 1 + src/pipeline_manager.cpp | 4 ++++ src/pipeline_manager.hpp | 4 ++++ src/streammux_manager.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/streammux_manager.hpp | 19 +++++++++++++++++++ 7 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 data/configuration.json create mode 100644 src/streammux_manager.cpp create mode 100644 src/streammux_manager.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 12e0cb6..ac403f3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,16 +25,19 @@ endif() find_package(PkgConfig REQUIRED) -pkg_check_modules(GLIB REQUIRED glib-2.0 gobject-2.0) +pkg_check_modules(GLIB REQUIRED glib-2.0 gobject-2.0 nlohmann_json gstreamer-base-1.0 gstreamer-1.0 gstreamer-video-1.0) include_directories(/usr/lib/x86_64-linux-gnu/glib-2.0/include) include_directories(/usr/include/gstreamer-1.0) +include_directories(/usr/include/nlohmann) include_directories(${PROJECT_SOURCE_DIR}/camera_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/pipeline_manager.hpp) +include_directories(${PROJECT_SOURCE_DIR}/streammux_manager.hpp) -set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp) + +set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/streammux_manager.cpp) # Create the executable add_executable(${PROJECT_NAME} ${SOURCES}) diff --git a/data/configuration.json b/data/configuration.json new file mode 100644 index 0000000..9a15f28 --- /dev/null +++ b/data/configuration.json @@ -0,0 +1,4 @@ +{ + "MUXER_OUTPUT_HEIGHT": 1080, + "MUXER_OUTPUT_WIDTH": 1920 +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 36689ea..60e055d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -77,6 +77,7 @@ int main(int argc, char *argv[]) { PipelineManager *pipeline_manager = new PipelineManager(num_sources, url_camera); pipeline_manager->create_pipeline(); + pipeline_manager->create_pipeline_elements(num_sources); return 0; } \ No newline at end of file diff --git a/src/pipeline_manager.cpp b/src/pipeline_manager.cpp index 4a5fa60..6bfe606 100644 --- a/src/pipeline_manager.cpp +++ b/src/pipeline_manager.cpp @@ -20,4 +20,8 @@ int PipelineManager::create_pipeline() { return -1; } return 1; +} + +void PipelineManager::create_pipeline_elements(int num_sources) { + streammux_manager->create_streammux(num_sources); } \ No newline at end of file diff --git a/src/pipeline_manager.hpp b/src/pipeline_manager.hpp index 8d9ab8c..603efe6 100644 --- a/src/pipeline_manager.hpp +++ b/src/pipeline_manager.hpp @@ -1,16 +1,20 @@ #include #include +#include "streammux_manager.hpp" + class PipelineManager { private: gboolean g_run_forever = FALSE; GMainLoop *loop = NULL; GstElement *pipeline = NULL; GMutex eos_lock; + StreammuxManager *streammux_manager = new StreammuxManager(); public: PipelineManager(); PipelineManager(int, char **); int create_pipeline(); + void create_pipeline_elements(int); ~PipelineManager(); }; \ No newline at end of file diff --git a/src/streammux_manager.cpp b/src/streammux_manager.cpp new file mode 100644 index 0000000..c9d9612 --- /dev/null +++ b/src/streammux_manager.cpp @@ -0,0 +1,37 @@ +#include "streammux_manager.hpp" + +#define SET_GPU_ID(object, gpu_id) \ + g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL); +#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; + + MUXER_OUTPUT_HEIGHT = j["MUXER_OUTPUT_HEIGHT"]; + MUXER_OUTPUT_WIDTH = j["MUXER_OUTPUT_WIDTH"]; +} + +bool StreammuxManager::create_streammux(int num_sources) { + /* Create nvstreammux instance to form batches from one or more sources. */ + streammux = gst_element_factory_make("nvstreammux", "stream-muxer"); + g_object_set(G_OBJECT(streammux), "batch-size", num_sources, NULL); + g_object_set(G_OBJECT(streammux), "enable-padding", 1, NULL); + // g_object_set (G_OBJECT (streammux), "drop-pipeline-eos", + // g_run_forever, NULL); + g_object_set(G_OBJECT(streammux), "live-source", 1, NULL); + g_object_set(G_OBJECT(streammux), "width", MUXER_OUTPUT_WIDTH, "height", + MUXER_OUTPUT_HEIGHT, "batched-push-timeout", + MUXER_BATCH_TIMEOUT_USEC, NULL); + SET_GPU_ID(streammux, GPU_ID); + + if (!streammux) { + g_printerr("Unable to create streammux.Exiting."); + return false; + } + return true; +} \ No newline at end of file diff --git a/src/streammux_manager.hpp b/src/streammux_manager.hpp new file mode 100644 index 0000000..0ab6573 --- /dev/null +++ b/src/streammux_manager.hpp @@ -0,0 +1,19 @@ +#include + +#include +#include +#include + +#include "json.hpp" + +class StreammuxManager { + private: + GstElement *streammux = NULL; + + public: + int MUXER_OUTPUT_WIDTH; + int MUXER_OUTPUT_HEIGHT; + StreammuxManager(); + bool create_streammux(int); + ~StreammuxManager(); +}; \ No newline at end of file