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

  • 库文件:libvpu.so

【注意】

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

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

【举例】

Please refer to  CVI_GDC_AddRotationTask

【相关主题】

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

  • 库文件:libvpu.so

【注意】

  • hHandle必须为已经开启的Job

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

【举例】

Please refer to CVI_GDC_AddRotationTask

【相关主题】

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

  • 库文件:libvpu.so

【注意】

  • 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

  • 库文件:libvpu.so

【注意】

  • hHandle必须为已经开启的Job

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

【举例】

GDC_HANDLE hHandle;
struct gdc_job *job;
GDC_TASK_ATTR_S stTask;
VB_BLK blk;
VB_S *vb_out;
CVI_U32 buf_size;
CVI_S32 ret;
MMF_CHN_S *_chn;
SIZE_S size_out;

if (rot == ROTATION_90) {
  size_out = vb_in->buf.size;
} else {
  size_out.u32Width = vb_in->buf.size.u32Height;
  size_out.u32Height = vb_in->buf.size.u32Width;
}

// get buf for gdc output.
buf_size = vb_in->buf.length[0] + vb_in->buf.length[1] + vb_in->buf.length[2];
blk = CVI_VB_GetBlock(VB_INVALID_POOLID, buf_size);

vb_in->mod_ids |= BIT(CVI_ID_GDC);
vb_out = (VB_S *)blk;
vb_out->mod_ids = BIT(CVI_ID_GDC);
v4l2_get_frame_info(enPixFormat, size_out, &vb_out->buf, vb_out->phy_addr);

CVI_GDC_BeginJob(&hHandle);

stTask.reserved = CVI_GDC_MAGIC;
CVI_GDC_AddRotationTask(hHandle, &stTask, rot);

job = (struct gdc_job *)hHandle;
job->sync_io = sync_io;
ret = CVI_GDC_EndJob(hHandle);
return ret;

【相关主题】

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

  • 库文件:libvpu.so

【举例】

Please refer to CVI_GDC_AddLDCTask

【相关主题】

CVI_GDC_BeginJob

11.3.6. CVI_GDC_AddLDCTask

【描述】

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

【语法】

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

  • 库文件:libvpu.so

【注意】

  • hHandle必须为已经开启的Job

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

【举例】

stTask.stImgOut.stVFrame.u32Width = ALIGN(stSize.u32Width, DEFAULT_ALIGN);
stTask.stImgOut.stVFrame.u32Height = ALIGN(stSize.u32Height, DEFAULT_ALIGN);
s32Ret = CVI_GDC_GenLDCMesh(stTask.stImgOut.stVFrame.u32Width,
stTask.stImgOut.stVFrame.u32Height
  , &stLDCAttr, "ldc_user", &u64PhyAddr, &pVirAddr);
if (s32Ret != CVI_SUCCESS) {
  printf("CVI_GDC_GenLDCMesh failed, s32Ret:0x%x", s32Ret);
  CVI_GDC_CancelJob(hHandle);
  return -1;
}

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 = ALIGN(stSize.u32Height, DEFAULT_ALIGN);
size_out[0].u32Height = ALIGN(stSize.u32Width, DEFAULT_ALIGN);

if (enRotation == ROTATION_0 || enRotation == ROTATION_180) {
  size_out[1].u32Width = ALIGN(stSize.u32Width, DEFAULT_ALIGN);
  size_out[1].u32Height = ALIGN(stSize.u32Height, DEFAULT_ALIGN);
} 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;
}
memcpy(&stTaskArr[0], &stTask, sizeof(stTask));
stTaskArr[0].reserved = 0;//magic id
stTaskArr[0].au64privateData[0] = u64PhyAddr;
stTaskArr[0].au64privateData[1] = (uintptr_t)pVirAddr;
stTaskArr[0].au64privateData[2] = CVI_FALSE;
s32Ret = CVI_GDC_AddLDCTask(hHandle, &stTaskArr[0], &stLDCAttr, enRotationOut[0]);
if (s32Ret != CVI_SUCCESS) {
  printf("CVI_GDC_AddLDCTask 1st failed, s32Ret:0x%x", s32Ret);
  CVI_GDC_CancelJob(hHandle);
  return -1;
}

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] = u64PhyAddr + mesh_1st_size;
stTaskArr[1].au64privateData[1] = (uintptr_t)pVirAddr;//save orig mesh addr
stTaskArr[1].au64privateData[2] = CVI_TRUE;
s32Ret = CVI_GDC_AddLDCTask(hHandle, &stTaskArr[1], &stLDCAttr, enRotationOut[1]);
if (s32Ret != CVI_SUCCESS) {
  printf("CVI_GDC_AddLDCTask 2nd failed, s32Ret:0x%x", s32Ret);
  CVI_GDC_CancelJob(hHandle);
  return -1;
}
memcpy(&stTask, &stTaskArr[1], sizeof(GDC_TASK_ATTR_S));

s32Ret = CVI_GDC_EndJob(hHandle);
if (s32Ret != CVI_SUCCESS) {
  printf("CVI_GDC_EndJob failed, s32Ret:0x%x\n", s32Ret);
  CVI_GDC_CancelJob(hHandle);
  goto EXIT1;
}
return 0;

【相关主题】

CVI_GDC_BeginJob