i start a pipeline : filesrc ! h264parse ! nvv4l2decoder ! video/x-raw(memory:NVMM), format=NV12 ! fakesink
and i would like to get the gpu address from the pad of fakesink.
static GstPadProbeReturn decode_pad_buffer_probe_RT_yuv(GstPad * pad, GstPadProbeInfo * probe_info,
gpointer u_data) {
GstBuffer *inbuf = (GstBuffer *)probe_info->data;
GstMapInfo in_map_info;
GstFlowReturn flow_ret = GST_FLOW_OK;
memset(&in_map_info, 0, sizeof(in_map_info));
if (!gst_buffer_map(inbuf, &in_map_info, GST_MAP_READ)) {
flow_ret = GST_FLOW_ERROR;
printf("error\n");
}
NvBufSurface *surface = NULL;
surface = (NvBufSurface *) in_map_info.data;
NvBufSurfaceMapEglImage(surface,0);
int image_height = surface->surfaceList->height;
int image_width = surface->surfaceList->width;
CUresult status;
CUeglFrame eglFrame;
CUgraphicsResource pResource = NULL;
int ret = cuGraphicsEGLRegisterImage(&pResource,
surface->surfaceList->mappedAddr.eglImage,
CU_GRAPHICS_MAP_RESOURCE_FLAGS_NONE);
if (ret != CUDA_SUCCESS) {
g_printerr ("Failed to register EGLImage in cuda : %d \n",ret);
}
if (cuGraphicsResourceGetMappedEglFrame (&eglFrame,
pResource, 0, 0) != CUDA_SUCCESS) {
g_printerr ("Failed to get mapped EGL Frame\n");
}
int yLen = (image_height*image_width);
int frameLen = yLen + (yLen>>1);
if (frameLen > surface->surfaceList->dataSize)
frameLen = surface->surfaceList->dataSize;
unsigned char* yuvData;
cudaMalloc((void**)&yuvData, frameLen);
cudaMemcpy(yuvData,(unsigned char *)eglFrame.frame.pPitch[0],frameLen,cudaMemcpyDeviceToDevice);
status = cuCtxSynchronize();
if (status != CUDA_SUCCESS)
{
printf("cuCtxSynchronize failed after memcpy\n");
}
static int i = 0;
if (i == 0){
int bsize = frameLen;
char* yuvCh;
cudaMallocHost(&yuvCh,bsize);
cudaMemcpy(yuvCh, (unsigned char *)yuvData ,bsize , cudaMemcpyDeviceToHost);
char fname[128];
snprintf(fname,128,"yuv.data");
printf("read yuv data file:%s\n",fname);
FILE* sfile = fopen(fname,"w+");
if (sfile){
fwrite((char*)yuvCh,1,bsize,sfile);
fclose(sfile);
}
cudaFreeHost(yuvCh);
i = 1;
}
status = cuGraphicsUnregisterResource(pResource);
if (status != CUDA_SUCCESS)
{
printf("cuGraphicsEGLUnRegisterResource failed: %d\n", status);
}
gst_buffer_unmap(inbuf, &in_map_info);
return GST_PAD_PROBE_OK;
}
but it failed to register EGLImage in cuda,the error return 201.error 201 means CUDA_ERROR_INVALID_CONTEXT.
how can i get the NV12 data ptr?