Hello,
I’m trying to acquire frames with the library Argus and to use them with Visionworks.
I tried to use methods found in several samples of the L4T Multimedia API.
Thus, I’m using Argus and EGLStream to capture the frames and I manage to retrieve a pointer to the data.
Then I create a vx_image that I fill with the frame data. To check if it works I also render it.
std::unique_ptr<nvxio::Render> render(nvxio::createDefaultRender(m_context, "Camera Capture", STREAM_SIZE.width, STREAM_SIZE.height));
I first tried to display a raw (IYUV) image but I can’t create such a render.
That’s why I convert my vx_image to a RGBX format.
EGLStream::Image *image = iFrame->getImage();
EGLStream::IImage* iImage = interface_cast<EGLStream::IImage>(image);
EGLStream::IImage2D* iImage2D = interface_cast<EGLStream::IImage2D>(image);
Argus::Status status;
uint8_t *data[3];
for (uint32_t i = 0; i < iImage->getBufferCount(); i++){
const uint8_t *d = static_cast<const uint8_t*>(iImage->mapBuffer(i));
if(!d)
printf("\tFailed to map Buffer !\n");
Argus::Size size = iImage2D->getSize(i);
printf("\tIImage(2D): buffer %u (%ux%u, %u stride)\n", i, size.width, size.height, iImage2D->getStride(i));
data[i] = (uint8_t *)d;
}
//Create Image
vx_image img = vxCreateImage(m_context, STREAM_SIZE.width, STREAM_SIZE.height, VX_DF_IMAGE_IYUV);
int j = 1;
for (int ch = 0; ch < 3; ch++){
if (ch > 0)
j = 2;
void *ptr;
vx_map_id map_id;
vx_imagepatch_addressing_t addr;
vx_rectangle_t rect = {0u, 0u, STREAM_SIZE.width/j, STREAM_SIZE.height/j};
vxMapImagePatch(img, &rect, ch, &map_id, &addr, &ptr, VX_WRITE_ONLY, VX_MEMORY_TYPE_HOST, 1);
uint8_t *row_ptr = (uint8_t*) ptr;
memcpy(row_ptr, data[ch], addr.dim_x * addr.dim_y);
vxUnmapImagePatch(img, map_id);
}
//void *ptrs[] = { data, &data[1], &data[2] };
//vx_image img = vxCreateImageFromHandle(m_context, VX_DF_IMAGE_IYUV, &addr, ptrs, VX_MEMORY_TYPE_HOST);
vx_image img_rgb = vxCreateImage(m_context, STREAM_SIZE.width, STREAM_SIZE.height, VX_DF_IMAGE_RGBX);
vxuColorConvert(m_context, img, img_rgb);
printf("Image YUV: %d\n", vxGetStatus((vx_reference) img));
printf("Image RGB: %d\n", vxGetStatus((vx_reference) img_rgb));
// Display the frame acquired
m_render->putImage(img_rgb);
m_render->flush();
vxReleaseImage(&img);
vxReleaseImage(&img_rgb);
}
I’ve also tried to use the vxCreateImageFromHandle function without success:
//Creation de l'image
vx_imagepatch_addressing_t addr;
addr.dim_x = STREAM_SIZE.width;
addr.dim_y = STREAM_SIZE.height;
addr.stride_x = 3 * sizeof(vx_uint8);
addr.stride_y = static_cast<vx_int32>(addr.dim_x * addr.stride_x);
void *ptrs[] = { data, &data[1], &data[2] };
vx_image img = vxCreateImageFromHandle(m_context, VX_DF_IMAGE_IYUV, &addr, ptrs, VX_MEMORY_TYPE_HOST);
vx_image img_rgb = vxCreateImage(m_context, STREAM_SIZE.width, STREAM_SIZE.height, VX_DF_IMAGE_RGBX);
vxuColorConvert(m_context, img, img_rgb);
It always make a “Segmentation Fault” at the m_renderer->putImage(img_rgb) method.
I think I’m doing something bad but I can’t find what.
I’d really appreciate some help.
Thank you :)
Edit:
I’ve just found that there is a mistake during the conversion:
[NVX LOG] context=(nil),ref=0x1cba390,status=-1002 : vxuColorConvert: Internal CUDA error