int CUDAtransform::map_to_eglimage(int fd, CUeglFrame *eglFrame)
{
CUresult status;
if (-1 == NvBufSurfaceFromFd(fd, (void **)(&pSurf)))
{
std::cerr << "Unable to NvBufSurfaceFromFd" << std::endl;
return -5;
}
if (pSurf->surfaceList[0].mappedAddr.eglImage == NULL)
{
if (NvBufSurfaceMapEglImage(pSurf, 0) != 0)
{
std::cerr << "Unable to map EGL Image" << std::endl;
return -6;
}
}
egl_khr_image = pSurf->surfaceList[0].mappedAddr.eglImage;
if (!egl_khr_image)
{
std::cerr << "egl_khr_image is null" << std::endl;
return -1;
}
cudaFree(0);
status = cuGraphicsEGLRegisterImage(&pResource, egl_khr_image, CU_GRAPHICS_MAP_RESOURCE_FLAGS_READ_ONLY);
if (status != CUDA_SUCCESS)
{
std::cerr << "cuGraphicsEGLRegisterImage failed: " << status
<< " cuda process stop" << std::endl;
return -2;
}
status = cuGraphicsResourceGetMappedEglFrame(eglFrame, pResource, 0, 0);
if (status != CUDA_SUCCESS)
{
std::cerr << "cuGraphicsSubResourceGetMappedArray failed" << std::endl;
return -3;
}
cudaDeviceSynchronize();
return 0;
}
Here is my code,eglFrame->pitch is always 0, fd is the capture decode from H264 and the fd is
cParams.width = crop.c.width;
cParams.height = crop.c.height;
cParams.layout = NVBUF_LAYOUT_BLOCK_LINEAR;
cParams.memType = NVBUF_MEM_SURFACE_ARRAY;
cParams.memtag = NvBufSurfaceTag_VIDEO_DEC;
if (format.fmt.pix_mp.pixelformat == V4L2_PIX_FMT_NV24M)
{
cParams.colorFormat = NVBUF_COLOR_FORMAT_NV24;
LOG("yuv444");
}
else
{
LOG("yuv420");
cParams.colorFormat = NVBUF_COLOR_FORMAT_NV12;
}
I don’t know why. Width and height works well.