Hello,
We are acquiring UserMeta from BatchMeta and then we are adding UserMeta to Frame for Further Use using following code Sequence.
NvDsBatchMeta *batch_meta = gst_buffer_get_nvds_batch_meta(GST_BUFFER(info->data));
NvDsUserMeta *user_payload_meta = nvds_acquire_user_meta_from_pool(batch_meta);
if (user_payload_meta)
{
user_payload_meta->user_meta_data = (void *)nvPayload;
user_payload_meta->base_meta.meta_type = NVDS_PAYLOAD_META;
user_payload_meta->base_meta.copy_func = (NvDsMetaCopyFunc)&DeepStreamFrameUserMeta::copyNvDsPayloadMeta;
user_payload_meta->base_meta.release_func = (NvDsMetaReleaseFunc)&DeepStreamFrameUserMeta::freeNvDsPayloadMeta;
string topic = INFER_META_SUBJ + (pInferConfig->inferenceBranchId) + "." + to_string(metaDataPayloadBuffer.sourceId);
user_payload_meta->base_meta.uContext = strdup(topic.c_str());
nvds_add_user_meta_to_frame((NvDsFrameMeta *)frame_meta, user_payload_meta);
}
and Release Function is written as follows.
void DeepStreamFrameUserMeta::freeNvDsPayloadMeta(gpointer data, gpointer uData)
{
g_return_if_fail (data);
NvDsUserMeta *user_meta = (NvDsUserMeta *) data;
NvDsPayload *srcPayload = (NvDsPayload *) user_meta->user_meta_data;
if (srcPayload)
{
g_free(srcPayload->payload);
srcPayload->payload = NULL;
g_free(srcPayload);
srcPayload = NULL;
}
if (user_meta->base_meta.uContext) {
free(user_meta->base_meta.uContext);
user_meta->base_meta.uContext = NULL;
}
}
Is it required to release or remove UserMeta or BatchMeta or FrameMeta using API inside release_func to avoid memory leaks gradually against following two functions ?
- nvds_acquire_user_meta_from_pool
- nvds_add_user_meta_to_frame
Regards