11.3. API参考

11.3.1. CVI_GDC_BeginJob

【描述】

开始一个Job。

【语法】

CVI_S32 CVI_GDC_BeginJob(GDC_HANDLE *phHandle);

【参数】

参数名称

描述

输入/输出

phHandle

取得HANDLE

输出

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • 可同时开启多个 job,比如VI进行做LDC job的时候,VO也可同时做旋转job,但必须判断 CVI_GDC_BeginJob 函数返回成功后才能使用 phHandle 返回的 HANLDE。

  • phHandle 不能为空指针或非法指针。

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_EndJob

11.3.2. CVI_GDC_EndJob

【描述】

结束一个job,所有在此job中的Task会被提交到GDC 模块

【语法】

CVI_S32 CVI_GDC_EndJob(GDC_HANDLE hHandle);

【参数】

参数名称

描述

输入/输出

hHandle

已开启的Job Handle

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • hHandle必须为已经开启的Job

  • hHandle 不能为空指针或非法指针。

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob

11.3.3. CVI_GDC_CancelJob

【描述】

取消一个job,所有在此job中的Task不会被提交到GDC 模块

【语法】

CVI_S32 CVI_GDC_CancelJob(GDC_HANDLE hHandle);

【参数】

参数名称

描述

输入/输出

hHandle

已开启的Job Handle

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • hHandle必须为已经开启的Job

  • phHandle 不能为空指针或非法指针。

【相关主题】

CVI_GDC_BeginJob

11.3.4. CVI_GDC_AddRotationTask

【描述】

在既有Job中安插一个旋转的Task,不支持旋转180度。

【语法】

CVI_S32 CVI_GDC_AddRotationTask(GDC_HANDLE hHandle, const GDC_TASK_ATTR_S *pstTask, ROTATION_E enRotation);

【参数】

参数名称

描述

输入/输出

hHandle

已开启的Job Handle

输入

pstTask

GDC Task pointer

输入

enRotation

旋转角度 (90, 270);

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h, cvi_comm_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • hHandle必须为已经开启的Job

  • phHandle 不能为空指针或非法指针。

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob

11.3.5. CVI_GDC_GenLDCMesh

【描述】

为LDC属性生成mesh,mesh用于存储原始图像和矫正后的图像像素点的对应性。

【语法】

CVI_S32 CVI_GDC_GenLDCMesh(CVI_U32 u32Width, CVI_U32 u32Height, const LDC_ATTR_S *pstLDCAttr, const char *name, CVI_U64 *pu64PhyAddr, CVI_VOID
**ppVirAddr);

【参数】

参数名称

描述

输入/输出

U32Width

矫正后图像宽

输入

u32Height

矫正后图像高

输入

pstLDCAttr

镜头畸变矫正属性

输入

name

mesh名字

输入

pu64PhyAddr

物理地址

输入

ppVirAddr

虚拟地址

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h, cvi_comm_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob

11.3.6. CVI_GDC_AddLDCTask

【描述】

在既有Job中安插一个镜头矫正的Task。

【语法】

CVI_S32 CVI_GDC_AddLDCTask(GDC_HANDLE hHandle, const GDC_TASK_ATTR_S *pstTask, const LDC_ATTR_S *pstLDCAttr, ROTATION_E enRotation);

【参数】

参数名称

描述

输入/输出

hHandle

已开启的Job Handle

输入

pstTask

GDC Task pointer

输入

pstLDCAttr

LDC属性

输入

enRotation

旋转角度 (90, 270);

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h, cvi_comm_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • hHandle必须为已经开启的Job

  • phHandle 不能为空指针或非法指针。

  • 一次镜头矫正会分2个task完成,第一次会先旋转90度,第二次会再旋转270度,两次旋转过程中会伴随不同方向的矫正过程。

【举例】

stTask.stImgOut.u32PoolId           = CVI_VB_Handle2PoolId(vbOutBlk);
stTask.stImgOut.stVFrame.u64PhyAddr[0]      = u64OutPhyAddr;
stTask.stImgOut.stVFrame.u64PhyAddr[1]      = u64OutPhyAddr
          + stVbOutCalConfig.u32MainStride * stSizeOut.u32Height;
stTask.stImgOut.stVFrame.u64PhyAddr[2]      = 0;
stTask.stImgOut.stVFrame.pu8VirAddr[0]      = pu8OutVirtAddr;
stTask.stImgOut.stVFrame.pu8VirAddr[1]      = pu8OutVirtAddr
          + stVbOutCalConfig.u32MainStride * stSizeOut.u32Height;
stTask.stImgOut.stVFrame.pu8VirAddr[2]      = 0;
stTask.stImgOut.stVFrame.u32Stride[0]       = stVbOutCalConfig.u32MainStride;
stTask.stImgOut.stVFrame.u32Stride[1]       = stVbOutCalConfig.u32CStride;
stTask.stImgOut.stVFrame.u32Stride[2]       = 0;
stTask.stImgOut.stVFrame.u32Width   = stSizeOut.u32Width;
stTask.stImgOut.stVFrame.u32Height  = stSizeOut.u32Height;
if (pParam->bLDCEnable) {
  if (pParam->bLDCUseLoadMesh) {
    s32Ret = CVI_GDC_LoadLDCMesh(stSize.u32Width, stSize.u32Height
      , pParam->szLoadMeshName, "ldc_user"
      , &pParam->meshPhyAddr, &pParam->meshVirAddr);
    if (s32Ret != CVI_SUCCESS) {
      SAMPLE_PRT("CVI_GDC_LoadLDCMesh failed, s32Ret:0x%x", s32Ret);
      CVI_GDC_CancelJob(hHandle);
      goto EXIT1;
    }
  } else {
    s32Ret = CVI_GDC_GenLDCMesh(stSize.u32Width, stSize.u32Height
      , &pParam->stLDCAttr, "ldc_user"
      , &pParam->meshPhyAddr, &pParam->meshVirAddr);
    if (s32Ret != CVI_SUCCESS) {
      SAMPLE_PRT("CVI_GDC_GenLDCMesh failed, s32Ret:0x%x", s32Ret);
      CVI_GDC_CancelJob(hHandle);
      goto EXIT1;
    }
  }
  GDC_TASK_ATTR_S stTaskArr[2];
  SIZE_S size_out[2];
  ROTATION_E enRotationOut[2];
  CVI_U32 mesh_1st_size;

  // Rotate 90/270 for 1st job
  size_out[0].u32Width = stSize.u32Height;
  size_out[0].u32Height = stSize.u32Width;

  if (enRotation == ROTATION_0 || enRotation == ROTATION_180) {
    size_out[1] = stSize;
  } else {
    size_out[1].u32Width = ALIGN(stSize.u32Height, DEFAULT_ALIGN);
    size_out[1].u32Height = ALIGN(stSize.u32Width, DEFAULT_ALIGN);
  }
  stTask.stImgOut.stVFrame.u32Width = size_out[0].u32Width;
  stTask.stImgOut.stVFrame.u32Height = size_out[0].u32Height;
  switch (enRotation) {
  default:
  case ROTATION_0:
    enRotationOut[0] = ROTATION_90;
    enRotationOut[1] = ROTATION_270;
    break;
  case ROTATION_90:
    enRotationOut[0] = ROTATION_90;
    enRotationOut[1] = ROTATION_0;
    break;
  case ROTATION_180:
    enRotationOut[0] = ROTATION_90;
    enRotationOut[1] = ROTATION_90;
    break;
  case ROTATION_270:
    enRotationOut[0] = ROTATION_270;
    enRotationOut[1] = ROTATION_0;
    break;
  }

  if (pParam->stLDCAttr.stGridInfoAttr.Enable) {
    enRotationOut[0] = ROTATION_270;
    enRotationOut[1] = ROTATION_90;
  }

  memcpy(&stTaskArr[0], &stTask, sizeof(stTask));
  stTaskArr[0].reserved = 0;//magic id
  stTaskArr[0].au64privateData[0] = pParam->meshPhyAddr;
  stTaskArr[0].au64privateData[1] = (uintptr_t)pParam->meshVirAddr;
  s32Ret = CVI_GDC_AddLDCTask(hHandle, &stTaskArr[0], &pParam->stLDCAttr, enRotationOut[0]);
  if (s32Ret != CVI_SUCCESS) {
    SAMPLE_PRT("CVI_GDC_AddLDCTask 1st failed, s32Ret:0x%x", s32Ret);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }

  mesh_gen_get_1st_size(size_out[0], &mesh_1st_size);
  memcpy(&stTaskArr[1].stImgIn, &stTask.stImgOut, sizeof(stTask.stImgOut));
  memcpy(&stTaskArr[1].stImgOut, &stTask.stImgIn, sizeof(stTask.stImgIn));
  stTaskArr[1].stImgOut.stVFrame.u32Width = size_out[1].u32Width;
  stTaskArr[1].stImgOut.stVFrame.u32Height = size_out[1].u32Height;
  stTaskArr[1].reserved = 0;//magic id
  stTaskArr[1].au64privateData[0] = pParam->meshPhyAddr + mesh_1st_size;
  s32Ret = CVI_GDC_AddLDCTask(hHandle, &stTaskArr[1], &pParam->stLDCAttr, enRotationOut[1]);
  if (s32Ret != CVI_SUCCESS) {
    SAMPLE_PRT("CVI_GDC_AddLDCTask 2st failed, s32Ret:0x%x", s32Ret);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }
  memcpy(&stTask, &stTaskArr[1], sizeof(GDC_TASK_ATTR_S));
} else {
  s32Ret = CVI_GDC_AddRotationTask(hHandle, &stTask, enRotation);
  if (s32Ret != CVI_SUCCESS) {
    SAMPLE_PRT("CVI_GDC_AddRotationTask failed, s32Ret:0x%x", s32Ret);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }
}
if (pstBufWrap->bEnable) {
  s32Ret = CVI_GDC_SetBufWrapAttr(hHandle, &stTask, pstBufWrap);
  if (s32Ret != CVI_SUCCESS) {
    SAMPLE_PRT("CVI_GDC_SetBufWrapAttr failed, s32Ret:0x%x", s32Ret);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }

  s32Ret = CVI_GDC_GetBufWrapAttr(hHandle, &stTask, &stBufWrap);
  if (s32Ret != CVI_SUCCESS) {
    SAMPLE_PRT("CVI_GDC_GetBufWrapAttr failed, s32Ret:0x%x", s32Ret);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }

  if (pstBufWrap->bEnable != stBufWrap.bEnable || pstBufWrap->u32BufLine != stBufWrap.u32BufLine ||
      pstBufWrap->u32WrapBufferSize != stBufWrap.u32WrapBufferSize) {
    SAMPLE_PRT("BufWrapAttr compare failed, bEnable(%d), u32BufLine(%d), u32WrapBufferSize(%d)\n",
        stBufWrap.bEnable, stBufWrap.u32BufLine, stBufWrap.u32WrapBufferSize);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }

  // Verify api only, test slice buffer mode in vpss
  pstBufWrap->bEnable = CVI_FALSE;
  s32Ret = CVI_GDC_SetBufWrapAttr(hHandle, &stTask, pstBufWrap);
  if (s32Ret != CVI_SUCCESS) {
    SAMPLE_PRT("CVI_GDC_SetBufWrapAttr failed, s32Ret:0x%x", s32Ret);
    CVI_GDC_CancelJob(hHandle);
    goto EXIT1;
  }
}
SAMPLE_PRT("CVI_GDC_EndJob\n");
s32Ret = CVI_GDC_EndJob(hHandle);
if (s32Ret != CVI_SUCCESS) {
  SAMPLE_PRT("CVI_GDC_EndJob failed, s32Ret:0x%x\n", s32Ret);
  CVI_GDC_CancelJob(hHandle);
  goto EXIT1;
}
return 0;

【相关主题】

CVI_GDC_BeginJob

11.3.7. CVI_GDC_LoadLDCMesh

【描述】

用户模式加载LDC mesh

【语法】

CVI_S32 CVI_GDC_LoadLDCMesh(CVI_U32 u32Width, CVI_U32 u32Height, const char *fileNname
     , const char *tskName, CVI_U64 *pu64PhyAddr, CVI_VOID **ppVirAddr);

【参数】

参数名称

描述

输入/输出

u32Width

mesh的宽度

输入

u32Height

mesh的高度

输入

fileNname

mesh的文件名

输入

tskName

task的名字

输入

pu64PhyAddr

mesh的物理地址

输出

ppVirAddr

mesh的虚拟地址

输出

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • 需与CVI_GDC_BeginJob,CVI_GDC_EndJob等一起使用

  • 仅单LINUX OS支持

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob CVI_GDC_EndJob CVI_GDC_AddLDCTask

11.3.8. CVI_GDC_SetBufWrapAttr

【描述】

设置wrap buf的设置

【语法】

CVI_S32 CVI_GDC_SetBufWrapAttr(GDC_HANDLE hHandle, const GDC_TASK_ATTR_S *pstTask, const DWA_BUF_WRAP_S *pstBufWrap);

【参数】

参数名称

描述

输入/输出

hHandle

已开启的Job Handle

输入

pstTask

GDC Task pointer

输入

pstBufWrap

wrap buf属性指针

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • hHandle必须为已经开启的Job

  • hHandle,pstTask,pstBufWrap 不能为空指针或非法指针。

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob CVI_GDC_EndJob

11.3.9. CVI_GDC_GetBufWrapAttr

【描述】

get wrap buf的设置

【语法】

CVI_S32 CVI_GDC_GetBufWrapAttr(GDC_HANDLE hHandle, const GDC_TASK_ATTR_S *pstTask, DWA_BUF_WRAP_S *pstBufWrap);

【参数】

参数名称

描述

输入/输出

hHandle

已开启的Job Handle

输入

pstTask

GDC Task pointer

输入

pstBufWrap

wrap buf属性指针

输出

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • hHandle必须为已经开启的Job

  • hHandle,pstTask,pstBufWrap 不能为空指针或非法指针。

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob CVI_GDC_EndJob

11.3.10. CVI_GDC_DumpMesh

【描述】

dump使用的mesh

【语法】

CVI_S32 CVI_GDC_DumpMesh(MESH_DUMP_ATTR_S *pMeshDumpAttr);

【参数】

参数名称

描述

输入/输出

pMeshDumpAttr

mesh dump时需要的属性

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • 使用该api前提条件为VI/VPSS模块对应的通道有使能

  • pMeshDumpAttr不能为空指针或非法指针。

【举例】

【相关主题】

CVI_GDC_BeginJob CVI_GDC_EndJob

11.3.11. CVI_GDC_LoadMesh

【描述】

加载使用的mesh

【语法】

CVI_S32 CVI_GDC_LoadMesh(MESH_DUMP_ATTR_S *pMeshDumpAttr, const LDC_ATTR_S *pstLDCAttr);

【参数】

参数名称

描述

输入/输出

pMeshDumpAttr

mesh dump时需要的属性

输入

pstLDCAttr

LDC属性

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • 使用该api前提条件为VI/VPSS模块对应的通道有使能

  • pMeshDumpAttr不能为空指针或非法指针。

  • pstLDCAttr不能为空指针或非法指针。

【举例】

【相关主题】

CVI_GDC_BeginJob CVI_GDC_EndJob

11.3.12. CVI_GDC_LoadMeshWithBuf

【描述】

加载使用的mesh

【语法】

CVI_S32 CVI_GDC_LoadMeshWithBuf(MESH_DUMP_ATTR_S *pMeshDumpAttr, const LDC_ATTR_S *pstLDCAttr, CVI_VOID *pBuf, CVI_U32 Len);

【参数】

参数名称

描述

输入/输出

pMeshDumpAttr

mesh dump时需要的属性

输入

pstLDCAttr

LDC属性

输入

pBuf

mesh所在的buf地址

输入

Len

mesh在内存中的size

输入

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • 使用该api前提条件为VI/VPSS模块对应的通道有使能

  • pMeshDumpAttr不能为空指针或非法指针。

  • pstLDCAttr不能为空指针或非法指针。

  • pBuf不能为空指针或非法指针。

【举例】

【相关主题】

CVI_GDC_BeginJob CVI_GDC_EndJob

11.3.13. CVI_GDC_Suspend

【描述】

休眠gdc

【语法】

CVI_S32 CVI_GDC_Suspend(void);

【参数】

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • gdc休眠后无法进行旋转与ldc

  • 仅DUAL OS支持

【举例】

【相关主题】

CVI_GDC_Resume

11.3.14. CVI_GDC_Resume

【描述】

唤醒gdc

【语法】

CVI_S32 CVI_GDC_Resume(void);

【参数】

【返回值】

返回值

描述

0

成功。

非 0

失败,请参见 错误码

【需求】

  • 头文件:cvi_gdc.h

  • 库文件:单LINUX OS (libgdc.a,libgdc.so), DUAL OS (libgdc.a)

【注意】

  • gdc休眠后再进行唤醒可以进行旋转与ldc

  • 仅DUAL OS支持

【举例】

【相关主题】

CVI_GDC_Suspend