Create streammux class

This commit is contained in:
Barzan Hayati 2025-06-30 00:09:24 +00:00
parent 5044982c87
commit f9d16f29cf
7 changed files with 74 additions and 2 deletions

View File

@ -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})

4
data/configuration.json Normal file
View File

@ -0,0 +1,4 @@
{
"MUXER_OUTPUT_HEIGHT": 1080,
"MUXER_OUTPUT_WIDTH": 1920
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -1,16 +1,20 @@
#include <glib.h>
#include <gst/gst.h>
#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();
};

37
src/streammux_manager.cpp Normal file
View File

@ -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;
}

19
src/streammux_manager.hpp Normal file
View File

@ -0,0 +1,19 @@
#include <gst/gst.h>
#include <fstream>
#include <iostream>
#include <nlohmann/json.hpp>
#include "json.hpp"
class StreammuxManager {
private:
GstElement *streammux = NULL;
public:
int MUXER_OUTPUT_WIDTH;
int MUXER_OUTPUT_HEIGHT;
StreammuxManager();
bool create_streammux(int);
~StreammuxManager();
};