Usage of NvSciBuf

Hi

I’m trying to use NvSciBuf and got the following error at NvSciBufAttrListReconcileAndObjAlloc.

What I want to do is that

  1. Create test image data(cv::Mat ) on CPU.
  2. Transfer it to NvMediaImage using NvSciBuf.
  3. Get a pointer to the destination surface plane.
  4. 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]

Hi @eri.kasamatsu,

According to NvSciBufAttrListReconcileAndObjAlloc() documentation page, it returned NvSciError_BadParameter (if any argument is NULL or invalid). Please check it. Thanks!