diff --git a/src/face_nv_infer_server_manager.cpp b/src/face_nv_infer_server_manager.cpp index 52e1af2..aef8960 100644 --- a/src/face_nv_infer_server_manager.cpp +++ b/src/face_nv_infer_server_manager.cpp @@ -46,6 +46,8 @@ FaceNvInferServerManager::FaceNvInferServerManager() { MUXER_OUTPUT_WIDTH = config["MUXER_OUTPUT_WIDTH"]; MUXER_OUTPUT_HEIGHT = config["MUXER_OUTPUT_HEIGHT"]; threshold_face_detection = config["threshold_face_detection"]; + compression_coefficient = + static_cast(config["compression_coefficient"]) * 100; } bool FaceNvInferServerManager::create_face_nv_infer_server(int num_sources) { @@ -1148,6 +1150,53 @@ void FaceNvInferServerManager::add_face_body(int object_id, float face_score) { return; } +void FaceNvInferServerManager::encode_objects_attach_meta( + gpointer ctx, NvBufSurface *ip_surf, NvDsFrameMeta *frame_meta, + NvDsObjectMeta *obj_meta) { + NvDsObjEncUsrArgs objData = {0}; + /* To be set by user */ + objData.saveImg = FaceNvInferServerManager::save_img; + objData.attachUsrMeta = FaceNvInferServerManager::attach_user_meta; + /* Set if Image scaling Required */ + objData.scaleImg = FALSE; + objData.scaledWidth = 0; + objData.scaledHeight = 0; + /* Preset */ + // objData.objNum = num_rects; + /* Quality */ + objData.quality = 80; + /* Set to calculate time taken to encode JPG image. */ + // if (calc_enc) { + // objData.calcEncodeTime = 1; + // } + /*Main Function Call */ + nvds_obj_enc_process(static_cast(ctx), &objData, + ip_surf, obj_meta, frame_meta); +} + +void FaceNvInferServerManager::encode_full_frame_attach_meta( + gpointer ctx, NvBufSurface *ip_surf, NvDsFrameMeta *frame_meta) { + NvDsObjEncUsrArgs frameData = {0}; + /* Preset */ + frameData.isFrame = 1; + /* To be set by user */ + frameData.saveImg = FaceNvInferServerManager::save_img; + frameData.attachUsrMeta = FaceNvInferServerManager::attach_user_meta; + /* Set if Image scaling Required */ + frameData.scaleImg = FALSE; + frameData.scaledWidth = 0; + frameData.scaledHeight = 0; + /* Quality */ + frameData.quality = compression_coefficient; + /* Set to calculate time taken to encode JPG image. */ + // if (calc_enc) { + // frameData.calcEncodeTime = 1; + // } + /* Main Function Call */ + nvds_obj_enc_process(static_cast(ctx), &frameData, + ip_surf, NULL, frame_meta); +} + // AVX check function bool FaceNvInferServerManager::allZeroAVX(const float *data, size_t size) { size_t i = 0; @@ -1231,12 +1280,14 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( NvDsBatchMeta *batch_meta = gst_buffer_get_nvds_batch_meta(GST_BUFFER(info->data)); if (!batch_meta) return GST_PAD_PROBE_OK; - bool is_zero_embedding_vector; + bool is_zero_embedding_vector = false; + bool current_full_frame_is_captured = false; /* Iterate each frame metadata in batch */ for (NvDsMetaList *l_frame = batch_meta->frame_meta_list; l_frame != NULL; l_frame = l_frame->next) { NvDsFrameMeta *frame_meta = (NvDsFrameMeta *)l_frame->data; + current_full_frame_is_captured = false; /* Iterate object metadata in frame */ for (NvDsMetaList *l_obj = frame_meta->obj_meta_list; l_obj != NULL; @@ -1408,10 +1459,6 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( // } } } - // std::quick_exit(0); - if (is_zero_embedding_vector == 0) { - ; - } if (score_face > threshold_face_detection) { // std::cout<<"obj_meta->rect_params left = @@ -1513,6 +1560,17 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( obj_meta); // nvds_add_obj_meta_to_frame(frame_meta, final_face_obj, // NULL); + if (is_zero_embedding_vector == false) { + if (current_full_frame_is_captured == false) { + encode_full_frame_attach_meta(ctx, ip_surf, + frame_meta); + current_full_frame_is_captured = true; + } + encode_objects_attach_meta(ctx, ip_surf, frame_meta, + obj_meta); + encode_objects_attach_meta(ctx, ip_surf, frame_meta, + final_face_obj); + } } // for (size_t jkl = 0; jkl < outputLayersInfo.size(); jkl++) { @@ -1618,6 +1676,7 @@ GstPadProbeReturn FaceNvInferServerManager::sgie_pad_buffer_probe( } } + nvds_obj_enc_finish(static_cast(ctx)); // use_device_mem = 1 - use_device_mem; return GST_PAD_PROBE_OK; } diff --git a/src/face_nv_infer_server_manager.hpp b/src/face_nv_infer_server_manager.hpp index 9cf661e..4e8f135 100644 --- a/src/face_nv_infer_server_manager.hpp +++ b/src/face_nv_infer_server_manager.hpp @@ -24,6 +24,9 @@ class FaceNvInferServerManager { static std::vector face_body_list; GstElement *face_detector = NULL; int face_batch_size; + inline static constexpr bool save_img = TRUE; + inline static constexpr bool attach_user_meta = TRUE; + inline static float compression_coefficient; static unsigned int FACE_NET_WIDTH; static unsigned int FACE_NET_HEIGHT; @@ -65,4 +68,8 @@ class FaceNvInferServerManager { static void add_face_body(int, float); static bool allZeroAVX(const float *, size_t); static bool allZero(const float *, size_t); + static void encode_full_frame_attach_meta(gpointer, NvBufSurface *, + NvDsFrameMeta *); + static void encode_objects_attach_meta(gpointer, NvBufSurface *, + NvDsFrameMeta *, NvDsObjectMeta *); }; \ No newline at end of file