Hello,DaneLLL
I had got Segmentation fault when dealing with a copy of a nvmemory map,whether NV12 data requires additional operations?
The test code is shown below(Segmentation falut position :memcpy((char*)snap_yuv_img.data,dst_surface->surfaceList[0].mappedAddr.addr[0],400030003/2);):
GstBuffer *gstbuffer = gst_sample_get_buffer(sample);
if(gstbuffer)
{
GstMapInfo map;
if (gst_buffer_map(gstbuffer, &map, GST_MAP_READ))
{
if(0 < need_snap_counter && 0 == is_snap_process && 0 == storage_spacefull_flag)
{
NvBufSurface *surface = NULL;
NvBufSurfTransformRect src_rect, dst_rect;
surface = (NvBufSurface *) map.data;
int batch_size= surface->batchSize;
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 = 4000;
dst_rect.height= 3000;
NvBufSurfTransformParams nvbufsurface_params;
nvbufsurface_params.src_rect = &src_rect;
nvbufsurface_params.dst_rect = &dst_rect;
nvbufsurface_params.transform_flag = NVBUFSURF_TRANSFORM_NORMALIZE; //NVBUFSURF_TRANSFORM_CROP_SRC | NVBUFSURF_TRANSFORM_CROP_DST;
nvbufsurface_params.transform_filter = NvBufSurfTransformInter_Default;
NvBufSurface *dst_surface = NULL;
NvBufSurfaceCreateParams nvbufsurface_create_params;
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_NV12;
nvbufsurface_create_params.layout = NVBUF_LAYOUT_PITCH;
nvbufsurface_create_params.memType = NVBUF_MEM_DEFAULT;
cudaSetDevice (surface->gpuId);
cudaStream_t cuda_stream;
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;
err = NvBufSurfTransformSetSessionParams (&transform_config_params);
NvBufSurfaceMemSet (dst_surface, 0, 0, 0);
err = NvBufSurfTransform (surface, dst_surface, &nvbufsurface_params);
if (err != NvBufSurfTransformError_Success)
{
g_print ("Error: NvBufSurfTransform failed with error %d while converting buffer\n", err);
}
NvBufSurfaceMap (dst_surface, 0, 0, NVBUF_MAP_READ);
NvBufSurfaceSyncForCpu (dst_surface, 0, 0);
printf("over NvBufSurfaceSyncForCpu!\r\n");
need_snap_counter--;
char currentfolder[64] = {0};
//nv_dump_dmabuf_to_cpu_memory(dmabuf_fd,0,&templen,(char*)snap_yuv_img.data);
//nv_dump_dmabuf_to_cpu_memory(dmabuf_fd,1,&templen,(char*)snap_yuv_img.data);
memcpy((char*)snap_yuv_img.data,dst_surface->surfaceList[0].mappedAddr.addr[0],4000*3000*3/2);
printf("over memocpy!\r\n");
memset(&pub_jpeg_header,0,sizeof(pub_jpeg_header));
get_snap_timestr(currentfolder);
make_exifparam(&pub_jpeg_header, currentfolder, snap_savepath, index);
is_snap_process = 1;
if (NvBufSurfaceUnMap (dst_surface, 0, 0))
{
printf("Error:NvBufSurfaceUnMap fail!\r\n");
}
if (NvBufSurfaceDestroy (dst_surface))
{
printf("Error:NvBufSurfaceDestroy fail\r\n");
}
}
}
gst_buffer_unmap(gstbuffer, &map);
}