From 056676b3d80ea26125e5d137d8f3f8ff7b70201f Mon Sep 17 00:00:00 2001 From: Barzan Hayati Date: Sun, 7 Sep 2025 18:47:46 +0000 Subject: [PATCH] Create nvmsgconv --- CMakeLists.txt | 4 +- data/configuration.json | 4 +- data/nvmsgconv_configs/msgconv_config.txt | 30 +++++++++++++ src/nv_messgae_converter.cpp | 53 +++++++++++++++++++++++ src/nv_messgae_converter.hpp | 17 ++++++++ src/pipeline_manager.cpp | 2 + src/pipeline_manager.hpp | 2 + 7 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 data/nvmsgconv_configs/msgconv_config.txt create mode 100644 src/nv_messgae_converter.cpp create mode 100644 src/nv_messgae_converter.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 341ae19..c80e634 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,6 +81,7 @@ include_directories(${PROJECT_SOURCE_DIR}/nv_tracker_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/face_candid_trace.hpp) include_directories(${PROJECT_SOURCE_DIR}/face_nv_infer_server_manager.hpp) include_directories(${PROJECT_SOURCE_DIR}/face_nv_infer_server_manager.hpp) +include_directories(${PROJECT_SOURCE_DIR}/nv_messgae_converter.hpp) set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/streammux_manager.cpp @@ -91,7 +92,8 @@ set(SOURCES src/main.cpp src/camera_manager.cpp src/pipeline_manager.cpp src/st # src/metrics_manager.cpp src/config_manager.cpp src/nv_infer_server_manager.cpp src/nv_tracker_manager.cpp src/face_candid_trace.cpp - src/face_nv_infer_server_manager.cpp src/face_nv_infer_server_manager.cpp) + src/face_nv_infer_server_manager.cpp src/face_nv_infer_server_manager.cpp + src/nv_messgae_converter.cpp) # missing initializer for member 'NvDsInferDims::d' [-Werror=missing-field-initializers] NvDsInferDims dims = {0}; diff --git a/data/configuration.json b/data/configuration.json index af86b08..18bf68c 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -53,5 +53,7 @@ "max-latency": 1000000, "num-extra-surfaces": 1, "num-surfaces-per-frame": 0 - } + }, + "msgconv_config_file": "../data/nvmsgconv_configs/msgconv_config.txt", + "msgconv_frame_interval": 30 } \ No newline at end of file diff --git a/data/nvmsgconv_configs/msgconv_config.txt b/data/nvmsgconv_configs/msgconv_config.txt new file mode 100644 index 0000000..38aefbe --- /dev/null +++ b/data/nvmsgconv_configs/msgconv_config.txt @@ -0,0 +1,30 @@ +[schema] +version=1 +message.schema=1.0 +message.type=object + +[message] +#payload-type=1 +msg2p-newapi=0 +topic=face_topic +type=object + +[sensor0] +enable=1 +type=Camera +id=CAMERA_ID +location=45.29;-75.83;48.15 +description=Entrance camera + +[place0] +enable=1 +id=main_lobby +name=Lobby Entrance +type=building +location=45.29;-75.83;48.15 + +[analytics0] +enable=1 +id=analytics_face +description=Face detection +source=fr_module \ No newline at end of file diff --git a/src/nv_messgae_converter.cpp b/src/nv_messgae_converter.cpp new file mode 100644 index 0000000..6b7a22d --- /dev/null +++ b/src/nv_messgae_converter.cpp @@ -0,0 +1,53 @@ +#include "nv_messgae_converter.hpp" + +#define SET_GPU_ID(object, gpu_id) \ + g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL); +#define GPU_ID 0 + +NvMessageConverter::NvMessageConverter() { + const auto& config = ConfigManager::get_instance().get_config(); + + msgconv_config_file = config["msgconv_config_file"]; + frame_interval = config["msgconv_frame_interval"]; +} + +bool NvMessageConverter::create_message_converter() { + msgconv = gst_element_factory_make("nvmsgconv", "nvmsg-converter"); + g_object_set(G_OBJECT(msgconv), "config", msgconv_config_file, NULL); + g_object_set(G_OBJECT(msgconv), "payload-type", 0, + NULL); // 0 = DeepStream schema, 1 = minimal schema + g_object_set(G_OBJECT(msgconv), "msg2p-newapi", 0, + NULL); // use new API; If you want to send images, please set + // the "payload-type: 1" and "msg2p-newapi: 1" + // msg2p-newapi: TRUE for DeepStream 6.x+ (recommended). + g_object_set(G_OBJECT(msgconv), "frame-interval", frame_interval, NULL); + SET_GPU_ID(msgconv, GPU_ID); + + // g_object_set(G_OBJECT(msgconv), + // "config", "dstest5_msgconv.cfg", // message schema config + // file "payload-type", 0, "msg2p-newapi", TRUE, // + // use new API NULL); + + // g_object_set (G_OBJECT (msgconv), "config", "dstest4_msgconv_config.yml", + // NULL); RETURN_ON_PARSER_ERROR(nvds_parse_msgconv (msgconv, argv[1], + // "msgconv")); msg2p_meta = ds_test4_parse_meta_type(argv[1], "msgconv"); + // g_print("msg2p_meta = %d\n", msg2p_meta); + + // Set up the pipeline we add all elements into the pipeline + // gst_bin_add_many (GST_BIN (pipeline), + // source, h264parser, decoder, nvstreammux, pgie, + // nvvidconv, nvosd, tee, queue1, queue2, msgconv, msgbroker, sink, + // NULL); + + // /* we link the elements together */ + // /* file-source -> h264-parser -> nvh264-decoder -> nvstreammux -> + // * pgie -> nvvidconv -> nvosd -> tee -> video-renderer + // * | + // * |-> msgconv -> msgbroker */ + + if (!msgconv) { + g_printerr("Unable to create msgconv.Exiting."); + return false; + } + return true; +} \ No newline at end of file diff --git a/src/nv_messgae_converter.hpp b/src/nv_messgae_converter.hpp new file mode 100644 index 0000000..f0ba963 --- /dev/null +++ b/src/nv_messgae_converter.hpp @@ -0,0 +1,17 @@ +#include + +#include +#include + +#include "config_manager.hpp" + +class NvMessageConverter { + private: + public: + gint frame_interval; + GstElement *msgconv = NULL; + std::string msgconv_config_file; + NvMessageConverter(); + bool create_message_converter(); + ~NvMessageConverter(); +}; \ No newline at end of file diff --git a/src/pipeline_manager.cpp b/src/pipeline_manager.cpp index c8a1617..ec32129 100644 --- a/src/pipeline_manager.cpp +++ b/src/pipeline_manager.cpp @@ -434,6 +434,8 @@ bool PipelineManager::create_pipeline_elements(int num_sources, nv_video_convert_manager->create_nv_video_convert(); nv_osd_manager->create_nv_osd(); + nv_messgae_converter_manager->create_message_converter(); + /* Add queue elements between every two elements */ const char* base = "queue"; for (int i = 0; i < 5; i++) { diff --git a/src/pipeline_manager.hpp b/src/pipeline_manager.hpp index fdbbda0..b089d38 100644 --- a/src/pipeline_manager.hpp +++ b/src/pipeline_manager.hpp @@ -11,6 +11,7 @@ #include "message_handling.hpp" #include "nv_ds_logger_manager.hpp" #include "nv_infer_server_manager.hpp" +#include "nv_messgae_converter.hpp" #include "nv_osd_manager.hpp" #include "nv_tracker_manager.hpp" #include "nv_video_convert_manager.hpp" @@ -41,6 +42,7 @@ class PipelineManager { NvTrackerManager *nv_tracker_manager = new NvTrackerManager(); FaceNvInferServerManager *face_nv_infer_server_manager = new FaceNvInferServerManager(); + NvMessageConverter *nv_messgae_converter_manager = new NvMessageConverter(); static double fps_buffer_probe; static double fps_probe; static double fps_osd;