RTSP camera access frame issue

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.