Hi DaneLLL,
I tried your suggestion. I also referred the documentation for providing appropriate parameters. I could understand that I need to pass -1 for computation of all buffers. However, I am still unable to get the output for second stream. I get null pointer for “dst_surface->surfaceList[1].mappedAddr.addr[0]” using these parameters. Please find my code below:
/**
* Buffer probe function after tracker.
*/
static GstPadProbeReturn
tracking_done_buf_prob (GstPad * pad, GstPadProbeInfo * info, gpointer u_data)
{
NvDsInstanceBin *bin = (NvDsInstanceBin *) u_data;
guint index = bin->index;
AppCtx *appCtx = bin->appCtx;
GstBuffer *buf = (GstBuffer *) info->data;
std::vector<std::string> frame_data;
GstClockTime timestamp = buf->pts;
NvDsBatchMeta *batch_meta = gst_buffer_get_nvds_batch_meta (buf);
if (!batch_meta) {
NVGSTDS_WARN_MSG_V ("Batch meta not found for buffer %p", buf);
return GST_PAD_PROBE_OK;
}
curr_timepoint = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> time_span =
std::chrono::duration_cast<std::chrono::duration<double>>
(curr_timepoint - prev_timepoint);
if(time_span.count() > time_interval_secs)
{
#if 1
GstMapInfo in_map_info;
NvBufSurface *surface = NULL;
memset (&in_map_info, 0, sizeof (in_map_info));
if (!gst_buffer_map (buf, &in_map_info, GST_MAP_READ)) {
g_print ("Error: Failed to map gst buffer\n");
gst_buffer_unmap (buf, &in_map_info);
return GST_PAD_PROBE_OK;
}
cudaError_t cuda_err;
NvBufSurfTransformRect src_rect, dst_rect;
surface = (NvBufSurface *) in_map_info.data;
int batch_size= surface->batchSize;
printf("\nBatch Size : %d, resolution : %dx%d \n",batch_size,
surface->surfaceList[0].width, surface->surfaceList[0].height);
src_rect.top = 0;
src_rect.left = 0;
src_rect.width = (guint) surface->surfaceList[0].width;
src_rect.height= (guint) surface->surfaceList[0].height;
dst_rect.top = 0;
dst_rect.left = 0;
dst_rect.width = (guint) surface->surfaceList[0].width;
dst_rect.height= (guint) surface->surfaceList[0].height;
NvBufSurfTransformParams nvbufsurface_params;
nvbufsurface_params.src_rect = &src_rect;
nvbufsurface_params.dst_rect = &dst_rect;
nvbufsurface_params.transform_flag = NVBUFSURF_TRANSFORM_CROP_SRC |
NVBUFSURF_TRANSFORM_CROP_DST;
nvbufsurface_params.transform_filter = NvBufSurfTransformInter_Default;
NvBufSurface *dst_surface = NULL;
NvBufSurfaceCreateParams nvbufsurface_create_params;
/* An intermediate buffer for NV12/RGBA to BGR conversion will be
* required. Can be skipped if custom algorithm can work directly on NV12/RGBA. */
nvbufsurface_create_params.gpuId = surface->gpuId;
nvbufsurface_create_params.width = (gint) surface->surfaceList[0].width;
nvbufsurface_create_params.height = (gint) surface->surfaceList[0].height;
nvbufsurface_create_params.size = 0;
nvbufsurface_create_params.colorFormat = NVBUF_COLOR_FORMAT_RGBA;
nvbufsurface_create_params.layout = NVBUF_LAYOUT_PITCH;
nvbufsurface_create_params.memType = NVBUF_MEM_DEFAULT;
cuda_err = cudaSetDevice (surface->gpuId);
cudaStream_t cuda_stream;
cuda_err=cudaStreamCreate (&cuda_stream);
int create_result = NvBufSurfaceCreate(&dst_surface,batch_size,
&nvbufsurface_create_params);
NvBufSurfTransformConfigParams transform_config_params;
NvBufSurfTransform_Error err;
transform_config_params.compute_mode = NvBufSurfTransformCompute_Default;
transform_config_params.gpu_id = surface->gpuId;
transform_config_params.cuda_stream = cuda_stream;
err = NvBufSurfTransformSetSessionParams (&transform_config_params);
//NvBufSurfaceMemSet (dst_surface, 0, 0, 0);
NvBufSurfaceMemSet (dst_surface, -1, -1, 0);
err = NvBufSurfTransform (surface, dst_surface, &nvbufsurface_params);
if (err != NvBufSurfTransformError_Success) {
g_print ("NvBufSurfTransform failed with error %d while converting buffer\n", err);
}
//NvBufSurfaceMap (dst_surface, 0, 0, NVBUF_MAP_READ);
NvBufSurfaceMap (dst_surface, -1, -1, NVBUF_MAP_READ);
//NvBufSurfaceSyncForCpu (dst_surface, 0, 0);
NvBufSurfaceSyncForCpu (dst_surface, -1, -1);
cv::Mat bgr_frame = cv::Mat (cv::Size(nvbufsurface_create_params.width,
nvbufsurface_create_params.height), CV_8UC3);
for(int cam_id = 0 ; cam_id < batch_size ; ++cam_id)
{
cv::Mat in_mat =
cv::Mat (nvbufsurface_create_params.height,
nvbufsurface_create_params.width,
CV_8UC4, dst_surface->surfaceList[cam_id].mappedAddr.addr[0],
dst_surface->surfaceList[cam_id].pitch);
cv::cvtColor (in_mat, bgr_frame, CV_RGBA2BGR);
std::vector<uchar> encode_buffer;
cv::imencode(".jpg",bgr_frame,encode_buffer);
std::string encoded_jpeg;
auto base64_jpeg = reinterpret_cast<const unsigned char*>
(encode_buffer.data());
encoded_jpeg = base64_encode(base64_jpeg, encode_buffer.size());
frame_data.push_back(encoded_jpeg);
}
NvBufSurfaceUnMap (dst_surface, 0, 0);
NvBufSurfaceDestroy (dst_surface);
cudaStreamDestroy (cuda_stream);
gst_buffer_unmap (buf, &in_map_info);
#endif
/*
* Output KITTI labels with tracking ID if configured to do so.
*/
write_kitti_track_output(appCtx, batch_meta);
}
if (appCtx->primary_bbox_generated_cb)
appCtx->primary_bbox_generated_cb (appCtx, buf, batch_meta, index);
return GST_PAD_PROBE_OK;
}
Kindly help me out.
Thanks.