If I uncomment below code then RAM usage is stable. This code is adopted from Deepstream sample code snippet - #3 by bcao Do you see anything wrong in below code implemented in gie_processing_done_buf_prob()
NvBufSurface *inter_buf = nullptr;
NvBufSurfaceCreateParams create_params;
create_params.gpuId = in_surf->gpuId;
create_params.width = width;
create_params.height = height;
create_params.size = 0;
create_params.colorFormat = NVBUF_COLOR_FORMAT_RGBA;
create_params.layout = NVBUF_LAYOUT_PITCH;
create_params.memType = NVBUF_MEM_DEFAULT;
//Create another scratch RGBA NvBufSurface
if (NvBufSurfaceCreate (&inter_buf, 1, &create_params) != 0) {
GST_ERROR ("Error: Could not allocate internal buffer ");
return GST_PAD_PROBE_OK;
}
inter_buf->numFilled = 1;
if(NvBufSurfaceMap (inter_buf, 0, -1, NVBUF_MAP_READ_WRITE) != 0)
std::cout << "map error" << std::endl;
if(NvBufSurfaceSyncForCpu (inter_buf, 0, 0) != 0) {
printf("Sync CPU failed for in_surf\n");
}
cv::Mat inter_mat = cv::Mat(height, width, CV_8UC4, inter_buf->surfaceList[0].mappedAddr.addr[0],
inter_buf->surfaceList[0].pitch);
cv::cvtColor(in_frame_bgr, inter_mat, cv::COLOR_BGR2RGBA);
NvBufSurfaceSyncForDevice(inter_buf, 0, 0);
NvBufSurfTransformConfigParams transform_config_params;
NvBufSurfTransformParams transform_params;
NvBufSurfTransformRect src_rect;
NvBufSurfTransformRect dst_rect;
cudaStream_t cuda_stream;
CHECK_CUDA_STATUS (cudaStreamCreate (&cuda_stream), "Could not create cuda stream");
transform_config_params.compute_mode = NvBufSurfTransformCompute_Default;
transform_config_params.gpu_id = in_surf->gpuId;
transform_config_params.cuda_stream = cuda_stream;
// Set the transform session parameters for the conversions executed in this thread.
if (NvBufSurfTransformSetSessionParams (&transform_config_params) != NvBufSurfTransformError_Success) {
std::cerr << "NvBufSurfTransformSetSessionParams failed with error" << std::endl;
return GST_PAD_PROBE_OK;
}
// Set the transform ROIs for source and destination, only do the color format conversion
src_rect = {0, 0, width, height};
dst_rect = {0, 0, width, height};
// Set the transform parameters
transform_params.src_rect = &src_rect;
transform_params.dst_rect = &dst_rect;
transform_params.transform_flag = NVBUFSURF_TRANSFORM_FILTER | NVBUFSURF_TRANSFORM_CROP_SRC |
NVBUFSURF_TRANSFORM_CROP_DST;
transform_params.transform_filter = NvBufSurfTransformInter_Default;
// Transformation format conversion, Transform rotated RGBA mat to NV12 memory in original input surface
if (NvBufSurfTransform (inter_buf, in_surf, &transform_params) != NvBufSurfTransformError_Success) {
std::cerr << "NvBufSurfTransform failed with error %d while converting buffer" << std::endl;
return GST_PAD_PROBE_OK;
}
// unmap surface after writing
if(NvBufSurfaceUnMap(inter_buf, 0, -1) != 0) {
std::cerr << "Error: Failed to unmap NvBufSurface in_surf" << std::endl;
gst_buffer_unmap(buf, &in_map_info);
return GST_PAD_PROBE_OK;
}
NvBufSurfaceDestroy(inter_buf);
// unmap surface after writing
if(NvBufSurfaceUnMap(in_surf, 0, -1) != 0) {
std::cerr << "Error: Failed to unmap NvBufSurface after writing" << std::endl;
gst_buffer_unmap(buf, &in_map_info);
return GST_PAD_PROBE_OK;
}