Hi
I’d like to read RGB image data via OpenCV and convert it to YUV444 with NvMedia2DBlitEx on Drive AGX.
I implemented code referring to img_producer.c in ipp_yuv,
however I got the following error message at NvMediaImageCreateNew for output.
NvMediaSurfaceType 1018 is deprecated.
Use NvMediaSurfaceFormatGetType function to get new surface type.
NvMediaImageLock: Failed Params check
My code is as follows.
Could you give me some advice to fix the problem?
typedef struct {
NvMediaDevice* device;
char* inputImages;
uint32_t width;
uint32_t height;
uint32_t ippNum;
uint32_t frameCount;
NvMediaSurfaceType surfaceType;
NvMedia2D* i2d;
NvMediaRect dstRect;
NvMediaRect srcRect;
NvMedia2DBlitParameters* blitParams;
} ImageProducerCtx;
void NvMediaBGR2YUV(const cv::Mat& bgr) {
NvMediaStatus status;
ImageProducerCtx* client = new ImageProducerCtx;
if (!client) {
printf(“%s:: failed to alloc memory\n”, func);
return;
}
memset(client, 0, sizeof(ImageProducerCtx));
client->device = NvMediaDeviceCreate();
client->i2d = NvMedia2DCreate(client->device);
if (!client->i2d) {
printf(“%s: Failed to create NvMedia 2D i2d\n”, func);
return;
}
NvMediaSurfAllocAttr surfAllocAttrs[8];
surfAllocAttrs[0].type = NVM_SURF_ATTR_WIDTH;
surfAllocAttrs[0].value = 1920 * 3;
surfAllocAttrs[1].type = NVM_SURF_ATTR_HEIGHT;
NvMediaImageSurfaceMap inputSurfaceMap;
status = NvMediaImageLock(input, NVMEDIA_IMAGE_ACCESS_READ, &inputSurfaceMap);
status = NvMediaImagePutBits(input, &dstRect, (void**)&bgr.data, &dstPitch);
NvMediaImageUnlock(input);
status = NvMedia2DImageRegister(client->i2d, input, NVMEDIA_ACCESS_MODE_READ);
status = NvMedia2DImageRegister(client->i2d, output,
NVMEDIA_ACCESS_MODE_READ_WRITE);
NVM_SURF_FMT_DEFINE_ATTR(output_surface_format_attr);
NVM_SURF_FMT_SET_ATTR_YUV(output_surface_format_attr, YUV, 444, PLANAR, UINT,
8, PL);
NvMediaSurfaceType output_type =
NvMediaSurfaceFormatGetType(output_surface_format_attr, 7);NvMediaImage* input =
NvMediaImageCreateNew(client->device, input_type, surfAllocAttrs, 2, 0);
NvMediaImage* output =
NvMediaImageCreateNew(client->device, output_type, surfAllocAttrs, 2, 0);
input->type = NvMediaSurfaceType_Image_RGBA;
input->width = 1920;
input->height = 1080;
input->imageCount = 1;
input->colorStd = NVMEDIA_2D_BLIT_PARAMS_COLOR_STD;
output->type = NvMediaSurfaceType_Image_YUV_444;
output->width = 1920;
output->height = 1080;
output->imageCount = 1;
output->colorStd = NVMEDIA_2D_BLIT_PARAMS_COLOR_STD;
NvMediaRect dstRect = {0, 0, 1920, 1080};
const uint32_t dstPitch = 1920 * 3;
NvMediaImageSurfaceMap inputSurfaceMap;
status = NvMediaImageLock(input, NVMEDIA_IMAGE_ACCESS_READ, &inputSurfaceMap);
status = NvMediaImagePutBits(input, &dstRect, (void**)&bgr.data, &dstPitch);
NvMediaImageUnlock(input);
status = NvMedia2DImageRegister(client->i2d, input, NVMEDIA_ACCESS_MODE_READ);
status = NvMedia2DImageRegister(client->i2d, output,
NVMEDIA_ACCESS_MODE_READ_WRITE);client->blitParams = new NvMedia2DBlitParameters;
memset(client->blitParams, 0, sizeof(NvMedia2DBlitParameters));
if (!client->blitParams) {
printf(“Out of memory\n”);
return;
}
status = NvMedia2DBlitEx(client->i2d, output, NULL, input, NULL,
client->blitParams, NULL);
cv::Mat dst(1080, 1920, CV_8UC3);
status = NvMediaImageGetBits(output, &dstRect, (void**)&bgr.data, &dstPitch);
cv::imwrite(“./yuv_nvmedia.png”, dst);status = NvMedia2DImageUnRegister(client->i2d, input);
status = NvMedia2DImageUnRegister(client->i2d, output);
NvMedia2DDestroy(client->i2d);
NvMediaDeviceDestroy(client->device);
delete client->blitParams;
delete output;
delete input;
delete client;
}
Hardware Platform: [DRIVE AGX Xavier™ Developer Kit]
Software Version: [DRIVE Software 10]
Host Machine Version: [Example: native Ubuntu 18.04]
SDK Manager Version: [Example: 1.0.1.5538]