diff --git a/src/gstds_example_manager.cpp b/src/gstds_example_manager.cpp index d344986..d04a58a 100644 --- a/src/gstds_example_manager.cpp +++ b/src/gstds_example_manager.cpp @@ -1,5 +1,10 @@ #include "gstds_example_manager.hpp" +// #define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID +// (nvds_get_user_meta_type("NVIDIA.NVINFER.USER_META")) +#define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID \ + (nvds_get_user_meta_type(const_cast("NVIDIA.NVINFER.USER_META"))) + #define MAX_DISPLAY_LEN 64 #define PGIE_CLASS_ID_PERSON 0 @@ -67,6 +72,28 @@ GstPadProbeReturn GstdsExampleManager::gstds_example_src_pad_buffer_probe( << " Object ID: " << obj_meta->object_id << std::endl; } + + NvDsUserMeta *user_meta = NULL; + NvDsMetaList *l_user_meta = NULL; + float *user_meta_data = NULL; + for (l_user_meta = obj_meta->obj_user_meta_list; + l_user_meta != NULL; l_user_meta = l_user_meta->next) { + user_meta = (NvDsUserMeta *)(l_user_meta->data); + user_meta_data = (float *)user_meta->user_meta_data; + + // user_meta->base_meta.meta_type == 7 means it is user-defined + // metadata (NVDS_USER_META). + + // This is typically used when you attach custom metadata + // (like your float* user_meta_data) to an object + // (NvDsObjectMeta) using DeepStream APIs. + + if (user_meta->base_meta.meta_type == + NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID) { + for (int jkl = 0; jkl < 52; jkl++) + std::cout << user_meta_data[jkl] << std::endl; + } + } } display_meta = nvds_acquire_display_meta_from_pool(batch_meta); NvOSD_TextParams *txt_params = &display_meta->text_params[0]; diff --git a/src/nv_infer_server_manager.cpp b/src/nv_infer_server_manager.cpp index d8b7673..18168e1 100644 --- a/src/nv_infer_server_manager.cpp +++ b/src/nv_infer_server_manager.cpp @@ -1,5 +1,10 @@ #include "nv_infer_server_manager.hpp" +// #define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID +// (nvds_get_user_meta_type("NVIDIA.NVINFER.USER_META")) +#define NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID \ + (nvds_get_user_meta_type(const_cast("NVIDIA.NVINFER.USER_META"))) + #define MAX_DISPLAY_LEN 64 #define PGIE_CLASS_ID_PERSON 0 #define PGIE_DETECTED_CLASS_NUM 1 @@ -230,6 +235,7 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( (void)stream_height; (void)stream_width; + float source_id = (float)frame_meta->source_id; /* Iterate user metadata in frames to search PGIE's tensor metadata */ for (NvDsMetaList *l_user = frame_meta->frame_user_meta_list; l_user != NULL; l_user = l_user->next) { @@ -308,7 +314,7 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( << " w = " << data[jkl * 57 + 2] << " h = " << data[jkl * 57 + 3] << " score = " << data[jkl * 57 + 4] << std::endl; - for (unsigned int mno = 0; mno < 5; ++mno) { + for (unsigned int mno = 0; mno < 57; ++mno) { float value = data[jkl * 57 + mno]; (void)value; // std::cout << "data[" << jkl << "][" << mno @@ -362,19 +368,57 @@ GstPadProbeReturn NvInferServerManager::pgie_pad_buffer_probe( text_params.font_params.font_color = NvOSD_ColorParams{1, 1, 1, 1}; // adding landmarks to obj_meta as user_meta - // NvDsUserMeta* um1 = - // nvds_acquire_user_meta_from_pool(batch_meta); - // um1->user_meta_data = set_metadata_ptr(&(res[i].landmark[0]), - // source_id ); //Add landmarks here um1->base_meta.meta_type = - // NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID; - // um1->base_meta.copy_func = (NvDsMetaCopyFunc)copy_user_meta; - // um1->base_meta.release_func = - // (NvDsMetaReleaseFunc)release_user_meta; - // nvds_add_user_meta_to_obj(obj_meta, um1); + NvDsUserMeta *um1 = + nvds_acquire_user_meta_from_pool(batch_meta); + um1->user_meta_data = + set_metadata_ptr(&(data[index * 57 + 6]), + source_id); // Add landmarks here + um1->base_meta.meta_type = + NVDS_USER_OBJECT_META_LANDMARKS_AND_SOURCE_ID; + um1->base_meta.copy_func = (NvDsMetaCopyFunc)copy_user_meta; + um1->base_meta.release_func = + (NvDsMetaReleaseFunc)release_user_meta; + nvds_add_user_meta_to_obj(obj_meta, um1); nvds_add_obj_meta_to_frame(frame_meta, obj_meta, NULL); } } } // use_device_mem = 1 - use_device_mem; return GST_PAD_PROBE_OK; +} + +// add custom infromation to metadata by: set_metadata_ptr, copy_user_meta, +// release_user_meta +void *NvInferServerManager::set_metadata_ptr(float *arr, float source_id) { + int i = 0; + float *user_metadata = + (float *)g_malloc0(17 * 3 * sizeof(float) + 1 * sizeof(float)); + + for (i = 0; i < 51; i++) { + user_metadata[i] = arr[i]; + } + user_metadata[51] = source_id; + return (void *)user_metadata; +} + +gpointer NvInferServerManager::copy_user_meta(gpointer data, + gpointer user_data) { + (void)user_data; + NvDsUserMeta *user_meta = (NvDsUserMeta *)data; + gfloat *src_user_metadata = (gfloat *)user_meta->user_meta_data; + gfloat *dst_user_metadata = + (gfloat *)g_malloc0(17 * 3 * sizeof(gfloat) + 1 * sizeof(gfloat)); + memcpy(dst_user_metadata, src_user_metadata, + 17 * 3 * sizeof(gfloat) + 1 * sizeof(gfloat)); + return (gpointer)dst_user_metadata; +} + +void NvInferServerManager::release_user_meta(gpointer data, + gpointer user_data) { + (void)user_data; + NvDsUserMeta *user_meta = (NvDsUserMeta *)data; + if (user_meta->user_meta_data) { + g_free(user_meta->user_meta_data); + user_meta->user_meta_data = NULL; + } } \ No newline at end of file diff --git a/src/nv_infer_server_manager.hpp b/src/nv_infer_server_manager.hpp index 0044759..054e183 100644 --- a/src/nv_infer_server_manager.hpp +++ b/src/nv_infer_server_manager.hpp @@ -35,4 +35,7 @@ class NvInferServerManager { // static GstPadProbeReturn osd_sink_pad_buffer_probe_new(GstPad *, // GstPadProbeInfo // *, gpointer); + static void *set_metadata_ptr(float *, float); + static gpointer copy_user_meta(gpointer, gpointer); + static void release_user_meta(gpointer, gpointer); }; \ No newline at end of file