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
【相关主题】
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
【相关主题】
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 不能为空指针或非法指针。
【相关主题】
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;
【相关主题】
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
【相关主题】
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;
【相关主题】