视频图形子系统(VGS)
概述
VGS(Video Graphics Sub-System)视频图形子系统,主要是对输入的图像进行缩放、旋转、抠图、打 COVER、画线等操作。
基本概念
-
task
对一幅图像完成具体的一个或多个操作,比如打 OSD、缩放或旋转等。VGS 默认的最大的 task 数为 200。
-
job
VGS 管理 task 的结构,一个 job 里可以包含多个 task,VGS 保证 task 按照添加到 job 的顺序一次性提交硬件执行。VGS 默认的最大的 job 数为 100。
-
HANDLE
任务句柄,标识一个 job。
功能描述
VGS 的功能包括缩放、抠图、旋转、打 OSD、打 COVER、画线、打 mosaic。
-
缩放
VGS 支持对一幅图像进行缩放,最大支持图像宽高放大和缩小 32 倍。支持单分量 Y 缩放。
-
旋转
VGS 支持对一幅图像进行 0、90、180、270 角度的旋转。
-
打 OSD
VGS 支持在一幅图像上面叠加一张位图、支持批量打 OSD。打 OSD 操作不支持对输入的位图进行反色操作。打 OSD 时输入和输出图像使用的是同一块内存。
-
打 COVER
VGS 支持对一幅图像进行遮挡操作,遮挡的形状为矩形或者任意的四边形。当 COVER 为矩形的时候,COVER 只能是实心;COVER 为任意四边形的时候,COVER 可以是实心或者空心的。打 COVER 操作时,输入和输出图像使用的是同一块内存。
-
画线
VGS 支持对一幅图像进行画线操作,支持批量画线操作。画线操作时,输入和输出图像使用的是同一块内存。
-
打 mosaic
VGS 支持对一幅图像进行打 mosaic 操作,支持不同的块大小输入,支持批量进行打 mosaic 操作。打 mosaic 操作时,输入和输出图像使用的是同一块内存。
硬件规格
芯片平台 VGS 硬件规格如下所示。
| 数据格式 | 宽度对齐像素 | 高度对齐像素 | 像素比特数 |
|---|---|---|---|
| ZH_FMT_YUV420SP ZH_FMT_YUV420SP_VU | 16 | 1 | 8 |
| ZH_FMT_RGB888 ZH_FMT_BGR888 | 64 | 1 | 24 |
| ZH_FMT_BGRA888 ZH_FMT_RGBA888 | 16 | 1 | 32 |
注意:
VGS 支持图像大小在 64x64 到 8192x8192 范围内的缩放。
API参考
该功能模块为用户提供以下 MPI:
- ZH_MPI_VGS_BeginJob:启动一个 job。
- ZH_MPI_VGS_AddScaleTask:向一个已经启动的 job 添加缩放 task。
- ZH_MPI_VGS_AddCropTask:向一个已经启动的 job 添加裁剪 task。
- ZH_MPI_VGS_AddDrawLineTask:向一个已经启动的 job 添加画线 task。
- ZH_MPI_VGS_AddCoverTask:向一个已经启动的 job 添加打 COVER task。
- ZH_MPI_VGS_AddOsdTask:向一个已经启动的 job 添加打 OSD task。
- ZH_MPI_VGS_AddRotationTask:向一个已经启动的 job 里添加旋转任务。
- ZH_MPI_VGS_AddMosaicTask:向一个已经启动的 job 里添加打马赛克任务。
- ZH_MPI_VGS_AddDrawLineTaskArray:向一个已经启动的 job 里添加批量画线的任务。
- ZH_MPI_VGS_AddCoverTaskArray:向一个已经启动的 job 里添加批量打 COVER 的任务。
- ZH_MPI_VGS_AddOsdTaskArray:向一个已经启动的 job 里添加批量打 OSD 的任务。
- ZH_MPI_VGS_AddMosaicTaskArray:在一个已经启动的 job 里添加批量打马赛克的任务。
ZH_MPI_VGS_BeginJob
描述
启动一个 job。
语法
ZH_S32 ZH_MPI_VGS_BeginJob(VGS_HANDLE *phHandle);
参数
| 参数名称 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| phHandle | VGS_HANDLE* | 返回的 job handle。 | 输出 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,见 VGS 错误码。 |
注意事项
- 可一次启动多个 job。但必须判断 ZH_MPI_VGS_BeginJob 函数返回成功后,才能使用 phHandle 返回的 HANDLE。
- phHandle 不能为空指针或非法指针。
示例代码
ZH_S32 s32Ret = ZH_SUCCESS;
VGS_HANDLE hHandle;
VGS_TASK_ATTR_S stTask;
s32Ret = ZH_MPI_VGS_BeginJob(&hHandle);
if (s32Ret != ZH_SUCCESS) {
VGS_ERROR_PROCESS(s32Ret);
}
s32Ret = ZH_MPI_VGS_AddScaleTask(hHandle, &stTask, VGS_SCLCOEF_NORMAL);
if (s32Ret != ZH_SUCCESS) {
ZH_MPI_VGS_CancelJob(hHandle);
VGS_ERROR_PROCESS(s32Ret);
}
s32Ret = ZH_MPI_VGS_EndJob(hHandle);
if (s32Ret != ZH_SUCCESS) {
ZH_MPI_VGS_CancelJob(hHandle);
VGS_ERROR_PROCESS(s32Ret);
}
ZH_MPI_VGS_EndJob
描述
提交一个 job。
语法
ZH_S32 ZH_MPI_VGS_EndJob(VGS_HANDLE hHandle);
参数
| 参数名称 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| hHandle | VGS_HANDLE | 表示一个已启动 job 的 HANDLE。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,见 VGS 错误码。 |
注意事项
- 如果此接口返回失败,必须调用 ZH_MPI_VGS_CancelJob 接口取消掉 hHandle 标识的 job。否则会导致 hHandle 标识的 job 不能再被循环利用。
- hHandle 标识的 job 必须是已经启动的 job。
ZH_MPI_VGS_CancelJob
描述
取消一个 job。
语法
ZH_S32 ZH_MPI_VGS_CancelJob(VGS_HANDLE hHandle);
参数
| 参数名称 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| hHandle | VGS_HANDLE | 表示一个已启动 job 的 HANDLE。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,见 VGS 错误码。 |
注意事项
hHandle 标识的 job 必须是已经启动的 job。
ZH_MPI_VGS_AddScaleTask
描述
向一个已经启动的 job 中添加缩放 task。
语法
ZH_S32 ZH_MPI_VGS_AddScaleTask(VGS_HANDLE hHandle, const VGS_TASK_ATTR_S *pstTask, VGS_SCLCOEF_MODE_E enScaleCoefMode);
参数
| 参数名称 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| hHandle | VGS_HANDLE | 表示一个已启动 job 的 HANDLE。 | 输入 |
| pstTask | const VGS_TASK_ATTR_S* | VGS task 属性指针。 | 输入 |
| enScaleCoefMode | VGS_SCLCOEF_MODE_E | 缩放系数模式,暂不支持。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,见 VGS 错误码。 |
注意事项
- 如果此接口返回失败,必须调用 ZH_MPI_VGS_CancelJob 接口取消掉 hHandle 标识的 job,否则会导致 hHandle 标识的 job 不能再被循环利用。
- hHandle 标识的 job 必须是已经启动的 job。
- 输入图像的宽高、对齐方式参考硬件规格中的图像格式对齐说明。
- 缩放时输入或者输出的宽高如不符合 VGS 模块要求的对齐,job 缩放失败。
- 做缩放任务,输入和输出的可以是不同的两块内存。
示例代码
参考 ZH_MPI_VGS_BeginJob 中的举例。
ZH_MPI_VGS_AddCropTask
描述
向一个已经启动的 job 中添加裁剪 task。
语法
ZH_S32 ZH_MPI_VGS_AddCropTask(VGS_HANDLE hHandle, const VGS_TASK_ATTR_S *pstTask, const VGS_CROP_INFO_S *pstVgsCrop);
参数
| 参数名称 | 数据类型 | 描述 | 输入/输出 |
|---|---|---|---|
| hHandle | VGS_HANDLE | 表示一个已启动 job 的 HANDLE。 | 输入 |
| pstTask | const VGS_TASK_ATTR_S* | VGS task 属性指针。 | 输入 |
| pstVgsCrop | const VGS_CROP_INFO_S* | 需要裁剪的区域。 | 输入 |
返回值
| 返回值 | 描述 |
|---|---|
| 0 | 成功。 |
| 非 0 | 失败,见 VGS 错误码。 |
注意事项
- 如果此接口返回失败,必须调用 ZH_MPI_VGS_CancelJob 接口取消掉 hHandle 标识的 job,否则会导致 hHandle 标识的 job 不能再被循环利用。
- hHandle 标识的 job 必须是已经启动的 job。
- 输入图像的宽高、对齐方式参考硬件规格中的图像格式对齐说明。
示例代码
参考 ZH_MPI_VGS_BeginJob 中的举例。