This section demonstrates how to query the EGL stream state to acquire produced frames.
bool cudaConsumeEGLFrame(
vx_context vxContext, CUeglStreamConnection cudaConsumer,
EGLDisplay eglDisplay, EGLStreamKHR eglStream)
{
EGLint streamState = 0;
if (!eglQueryStreamKHR(eglDisplay, eglStream, EGL_STREAM_STATE_KHR, &streamState))
{
printf("Cuda consumer, eglQueryStreamKHR EGL_STREAM_STATE_KHR failed\n");
return false;
}
if (streamState == EGL_STREAM_STATE_DISCONNECTED_KHR)
{
printf("CUDA Consumer: - EGL_STREAM_STATE_DISCONNECTED_KHR received\n");
return false;
}
else if (streamState != EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR)
{
return true;
}
CUgraphicsResource cudaResource;
CUresult cuStatus = cuEGLStreamConsumerAcquireFrame(&cudaConsumer, &cudaResource, NULL, 16000);
if (cuStatus != CUDA_SUCCESS)
{
const char * error = NULL;
cuGetErrorString(cuStatus, &error);
printf("Cuda Acquire failed with the error: \"%s\"\n", error);
return false;
}
CUeglFrame eglFrame;
cuStatus = cuGraphicsResourceGetMappedEglFrame(&eglFrame, cudaResource, 0, 0);
if (cuStatus != CUDA_SUCCESS)
{
const char * error = NULL;
cuGetErrorString(cuStatus, &error);
printf("Cuda get resource failed with the error: \"%s\"\n", error);
cuEGLStreamConsumerReleaseFrame(&cudaConsumer, cudaResource, NULL);
return false;
}
vxImageAddr.
dim_x = eglFrame.width;
vxImageAddr.
dim_y = eglFrame.height;
void * ptrs[] = { eglFrame.frame.pPitch[0] };
cuStatus = cuEGLStreamConsumerReleaseFrame(&cudaConsumer, cudaResource, NULL);
return true;
}