Hi
I’m trying to use NvSciBuf and got the following error at NvSciBufAttrListReconcileAndObjAlloc.
What I want to do is that
- Create test image data(cv::Mat ) on CPU.
- Transfer it to NvMediaImage using NvSciBuf.
- Get a pointer to the destination surface plane.
- Visualize data to confirm that it is equal to test image data.
[ERROR: NvSciBufAttrListCommonSetAttr]: Invalid operation on key
[ERROR: NvSciBufAttrListCommonSetAttr]: key: NvSciBufGeneralAttrKey_Types, readonly: 0, status: 0x765130
[ERROR: NvSciBufAttrListSlotSetAttrs]: Failed to set Buffer type
[NvMediaImageFillNvSciBufAttrs:779] NvMNvSciBufAttrListSetAttrs failed (error code = 256)
void NvMediaBGR2YUVwithNvSciBuf(const cv::Mat& bgr) {
NvSciBufObj bufobj_in;
NvSciBufObj bufobj_out;
NvMediaImage* nvmimg_in;
NvMediaImage* nvmimg_out;
NvMediaDevice* nvmdevice = NvMediaDeviceCreate();
NvMediaImageNvSciBufInit();
NvMedia2D* nvm2d = NvMedia2DCreate(nvmdevice);
NvMediaStatus status;
NvSciError sci_ret;
NvSciBufModule bufModule;
sci_ret = NvSciBufModuleOpen(&bufModule);
// for input
NvMediaSurfAllocAttr surfAllocAttrs[8];
int in_attr_num = 0;
surfAllocAttrs[in_attr_num].type = NVM_SURF_ATTR_WIDTH;
surfAllocAttrs[in_attr_num++].value = bgr.cols;
surfAllocAttrs[in_attr_num].type = NVM_SURF_ATTR_HEIGHT;
surfAllocAttrs[in_attr_num++].value = bgr.rows;
surfAllocAttrs[in_attr_num].type = NVM_SURF_ATTR_CPU_ACCESS;
surfAllocAttrs[in_attr_num++].value = NVM_SURF_ATTR_CPU_ACCESS_CACHED;
NVM_SURF_FMT_DEFINE_ATTR(intput_surface_format_attr);
NVM_SURF_FMT_SET_ATTR_RGBA(intput_surface_format_attr, RGBA, UINT, 8, PL);
NvMediaSurfaceType input_type =
NvMediaSurfaceFormatGetType(intput_surface_format_attr, 7);
// setup buffer
NvMediaImageSurfaceMap inputSurfaceMap, outputSurfaceMap;
NvSciBufAttrList unreconciled_attrlist = NULL;
NvSciBufAttrList reconciled_attrlist = NULL;
NvSciBufAttrList conflictlist = NULL;
NvSciBufType bufType = NvSciBufType_Image;
NvSciBufAttrValAccessPerm access_perm = NvSciBufAccessPerm_ReadWrite;
bool cpuaccess_flag = true;
NvSciBufAttrKeyValuePair attr_kvp[] = {
{NvSciBufGeneralAttrKey_RequiredPerm, &access_perm, sizeof(access_perm)},
{NvSciBufGeneralAttrKey_Types, &bufType, sizeof(bufType)},
{NvSciBufGeneralAttrKey_NeedCpuAccess, &cpuaccess_flag,
sizeof(cpuaccess_flag)}};
sci_ret = NvSciBufAttrListCreate(bufModule, &unreconciled_attrlist);
sci_ret = NvSciBufAttrListSetAttrs(unreconciled_attrlist, attr_kvp, 3);
status = NvMediaImageFillNvSciBufAttrs(nvmdevice, input_type, surfAllocAttrs,
in_attr_num, 0, unreconciled_attrlist);
sci_ret = NvSciBufAttrListReconcileAndObjAlloc(&unreconciled_attrlist, 1,
&bufobj_in, &conflictlist);
status = NvMediaImageCreateFromNvSciBuf(nvmdevice, bufobj_in, &nvmimg_in);
// copy RGBA data to NvMediaImage using NvSciBuf
status =
NvMediaImageLock(nvmimg_in, NVMEDIA_IMAGE_ACCESS_WRITE, &inputSurfaceMap);
uint8_t* in_ptr;
sci_ret = NvSciBufObjGetCpuPtr(bufobj_in, (void**)&in_ptr);
cv::Mat rgb;
cv::cvtColor(bgr, rgb, cv::COLOR_BGR2RGBA);
memcpy(in_ptr, rgb.ptr(), rgb.cols * rgb.rows * rgb.channels());
NvMediaImageUnlock(nvmimg_in);
// Get data from NvMediaImage and confirm whether RGBA data is set to NvMediaImage correctly.
cv::Mat getrgba(1080, 1920, CV_8UC4);
uint32_t dstPitches = 1920 * 4;
status =
NvMediaImageLock(nvmimg_in, NVMEDIA_IMAGE_ACCESS_READ, &inputSurfaceMap);
status =
NvMediaImageGetBits(nvmimg_in, NULL, (void**)getrgba.data, &dstPitches);
NvMediaImageUnlock(nvmimg_in);
cv::imwrite("./scibuf_test.png", getrgba);
}
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]