跳转至

视频图形子系统

概述

VGS是视频图形子系统,全称为Video Graphics Sub-System。支持对一幅输入图像进行处理,如进行Crop、缩放、像素格式转换、视频存储格式转换、压缩/解压、Cover、OSD、Mosaic、画线、旋转、亮度和统计、Corner_rect、拼接、Border、Aspect Ratio、Mirror/Flip等处理。

功能描述

基本概念

  • job

    VGS管理task的结构,一个job里可以包含多个task,VGS保证task按照添加到job的顺序执行,并且保证一个job里的所有task一次性提交硬件执行。用户可以在加载VGS ko时设置模块参数(g_max_vgs_job)来设置VGS支持的最大job数。job数取值范围为[OT_VGS_MIN_JOB_NUM,OT_VGS_MAX_JOB_NUM],默认为OT_VGS_DEFAULT_JOB_NUM。

  • task

    对一幅图像完成具体的一个或多个操作,比如叠加OSD、缩放或像素格式转换等。用户可以在加载VGS ko时设置模块参数(g_max_vgs_task)来设置VGS支持的最大task数。task数取值范围为[OT_VGS_MIN_TASK_NUM,OT_VGS_MAX_TASK_NUM],默认为OT_VGS_DEFAULT_TASK_NUM。

  • node

    VGS硬件的最小执行单位,一个task对应一个或多个node。node中包含硬件工作需要的信息,比如源图像地址,目标图像地址,操作类型等,并按照硬件要求的形式组织。用户可以在加载VGS ko时设置模块参数(g_max_vgs_node)来设置VGS支持的最大node数。node数取值范围为[OT_VGS_MIN_NODE_NUM,OT_VGS_MAX_NODE_NUM],默认为OT_VGS_DEFAULT_NODE_NUM。

  • handle

    任务句柄,标识一个job。

  • 在垂直分块场景下,handle最大数量不受g_max_vgs_job限制,而是通过模块参数(g_max_vgs_ver_split_handle)进行配置。vgs_ver_split_handle取值范围[2,10],默认为5。

说明:

加载ko并配置模块参数命令示例:insmod ot_vgs.ko g_max_vgs_job=64 g_max_vgs_task=100 g_max_vgs_node=100 g_max_vgs_ver_split_handle=5

功能描述

VGS的功能主要有Crop、缩放、OSD、Cover、Mosaic、画线、像素格式转换、视频存储格式转换、压缩/解压、旋转、亮度和统计、Corner_rect、拼接、Aspect Ratio、Border、Mirror/Flip。

  • Crop

    VGS支持从图像中裁剪指定区域。

  • 缩放

    VGS支持对一幅图像进行缩放,最大支持图像宽高均放大16倍,最大支持图像宽高均缩小30倍。支持单分量(Y)缩放。

  • OSD

    VGS支持在一幅图像上叠加一张位图,可设置位图是否反色,支持批量叠加OSD。

    须知:

    批量叠加OSD时,内部是通过提交多个task来实现,每个task使用上一个task叠加完OSD的图像作为当前task的源图像进行OSD处理。

  • Cover

    VGS支持对一幅图像进行遮挡操作,遮挡区域形状可以是矩形或者任意四边形,遮挡区域颜色为纯色,支持批量叠加Cover。

    须知:

    批量叠加Cover时,内部是通过提交多个task来实现,每个task使用上一个task叠加完Cover的图像作为当前task的源图像进行Cover处理。

  • Mosaic

    VGS支持对一幅图像进行叠加Mosaic操作,Mosaic块大小有8x8、16x16、32x32、64x64四种选择,Mosaic区域形状为矩形,每个Mosaic块为纯色,支持批量叠加Mosaic。

    须知:

    批量叠加Mosaic时,内部是通过提交多个task来实现,每个task使用上一个task叠加完Mosaic的图像作为当前task的源图像进行Mosaic处理。

  • Corner_rect

    VGS支持对一幅图像进行叠加Corner_rect操作,Corner_rect类型有角框和实线框,支持批量叠加Corner_rect。

    须知:

    • 批量叠加Corner_rect时,内部是通过提交多个task来实现,每个task使用上一个task叠加完Corner_rect的图像作为当前task的源图像进行打Corner_rect处理。
    • 批量叠加Corner_rect时,每个Corner_rect颜色和类型是一样的。
  • 拼接

    VGS支持对最多4幅图像进行水平拼接操作,图像数量可设置。

    须知:

    拼接输入的图像的宽高、像素格式、视频存储格式、压缩类型等信息需要保持一致。不支持对紧凑段压缩图像进行拼接。

  • 画线

    VGS支持对一幅图像进行画线操作,支持批量画线。

    须知:

    • 画线操作时,如果起始坐标和结束坐标的X坐标相同,则起始坐标和结束坐标的Y坐标不变,X坐标分别向右增加线的宽度。
    • 画线操作时,如果起始坐标和结束坐标的X坐标不相同,则X坐标不变,起始坐标与结束坐标的Y坐标分别向下方延伸线的宽度(即X坐标不变,Y坐标向下增加线宽)。
  • 像素格式转换

    VGS支持的输入输出像素格式包括semi-planar 420、semi-planar 422、package 422和单分量(Y)。支持semi-planar 420与semi-planar 422之间的格式转换,支持semi-planar 420、semi-planar 422到单分量(Y)格式的转换,做像素格式转换时,支持UV先后顺序可调整。

  • 视频存储格式转换

    VGS支持linear、tile64x16和tile32x4格式。

  • 压缩/解压

    VGS支持linear格式下semi-planar 422、semi-planar 420和单分量(Y)格式的压缩/解压。

  • 亮度和统计

    统计图像的指定区域亮度信息之和。支持批量统计。

  • 旋转

    VGS支持0、90、180和270度的旋转。

  • Aspect Ratio

    幅形比,指定输出画面相对于输入画面的宽高纵横比。

  • Border

    边框,指定输出画面四边覆盖边框。

  • Mirror/Flip

    Mirror即水平镜像,Flip即上下翻转。可使用Mirror+Flip实现180°旋转。

图 1 Hi3519DV500 online任务支持功能的处理流程图

图 2 Hi3516CV610 online任务支持功能的处理流程图

图 3 Hi3511CV100 online任务支持功能的处理流程图

表 1 非online任务支持的功能

解决方案名称

SCALE

MOSAIC

COVER

OSD

CORNER_RECT

LINE

LUMA_SUM

STITCH

ROTATION

Hi3519DV500

Y

Y

Y

Y

Y

Y

Y

Y

Y

Hi3516CV610

Y

N

Y

N

Y

Y

Y

N

Y

Hi3511CV100

Y

Y

Y

Y

Y

Y

Y

N

Y

须知:

非online任务处理顺序与提交对应task的顺序保持一致。

输入输出特性

表 1 Hi3519DV500 VGS硬件规格

规格点

描述

视频输入数据格式

1、支持linear、tile64x16和tile32x4格式。

2、支持输入linear格式非压缩、紧凑段压缩和非紧凑段压缩图像,tile32x4格式非压缩和tile压缩图像。

3、支持OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422、OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_422、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_400、OT_PIXEL_FORMAT_YUYV_PACKAGE_422、OT_PIXEL_FORMAT_YVYU_PACKAGE_422、OT_PIXEL_FORMAT_UYVY_PACKAGE_422、OT_PIXEL_FORMAT_VYUY_PACKAGE_422、OT_PIXEL_FORMAT_YYUV_PACKAGE_422、OT_PIXEL_FORMAT_YYVU_PACKAGE_422、OT_PIXEL_FORMAT_UVYY_PACKAGE_422、OT_PIXEL_FORMAT_VUYY_PACKAGE_422、OT_PIXEL_FORMAT_VY1UY0_PACKAGE_422格式输入。

4、只支持8 bit YUV。

注意:

1、tile64x16格式不支持压缩。

2、package 422像素格式不支持压缩。

3、tile32x4格式非压缩时仅支持semi-planar 420,压缩时支持semi-planar 420和单分量(Y)。

输入图像分辨率及对齐要求

1、最小支持:32x32。

2、最大支持:16384x8192。

3、宽度和高度均为2像素对齐(在ss_mpi_vgs_add_scale_task和ss_mpi_vgs_add_online_task接口中支持linear非压缩奇数宽高图像输入)。

4、非压缩时,linear格式帧起始地址2对齐,stride 16对齐。tile64x16格式帧起始地址2对齐,stride 16对齐。tile32x4格式帧起始地址32对齐,stride 32对齐。

5、压缩时包含以下两种格式:

  • linear格式压缩头地址16对齐。header_stride 在帧宽度不大于4096时16对齐,帧宽度大于4096且不大于8192时32对齐,帧宽度大于8192时64对齐;帧起始地址16对齐,stride16对齐。
  • tile32x4格式帧起始地址32对齐,stride 32对齐。

注意:

1、要进行Mosaic处理时,输入图像宽度不能小于64。

2、仅缩放时,最小支持到8x6。

视频输出数据格式

1、支持linear格式和tile32x4格式。

2、支持输出linear格式非压缩、紧凑段压缩和非紧凑段压缩图像,tile32x4格式非压缩和tile压缩图像。

3、支持OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422、OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_422、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_400、OT_PIXEL_FORMAT_YUYV_PACKAGE_422、OT_PIXEL_FORMAT_YVYU_PACKAGE_422、OT_PIXEL_FORMAT_UYVY_PACKAGE_422、OT_PIXEL_FORMAT_VYUY_PACKAGE_422、OT_PIXEL_FORMAT_YYUV_PACKAGE_422、OT_PIXEL_FORMAT_YYVU_PACKAGE_422、OT_PIXEL_FORMAT_UVYY_PACKAGE_422、OT_PIXEL_FORMAT_VUYY_PACKAGE_422、OT_PIXEL_FORMAT_VY1UY0_PACKAGE_422格式输出。

4、只支持8 bit YUV。

注意:

1、不支持同时输入和输出package 422像素格式。

2、package 422像素格式不支持压缩。

3、tile32x4格式非压缩时仅支持semi-planar 420,压缩时支持semi-planar 420和单分量(Y)。

4、tile32x4格式输出时不支持像素格式转换。

输出图像分辨率及对齐要求

1、最小支持:4x4。

2、最大支持:16384x8192。

3、宽度和高度均为2像素对齐。

4、非压缩时,linear格式帧起始地址2对齐,stride 16对齐。tile32x4格式帧起始地址32对齐,stride 32对齐。

5、压缩时包含以下两种格式:

  • linear格式压缩头地址16对齐。header_stride在帧宽度不大于4096时16对齐,帧宽度大于4096且不大于8192时32对齐,帧宽度大于8192时64对齐;帧起始地址16对齐,stride16对齐。
  • tile32x4格式帧起始地址32对齐,stride32对齐。

注意:

仅缩放时,最小支持到2x2。

缩放能力

1、支持16倍放大。

2、支持30倍缩小。

3、当输入Linear格式图像CROP后宽度大于8192(2*4096)且输出为非压缩时,只支持15倍缩小;当输入tile64x16或tile32x4格式图像Crop后宽度大于6144(2*3072)且输出为非压缩时,只支持11倍缩小。

4、package 422像素格式不支持缩放。

5、tile32x4格式输出时不支持缩放。

表 2 Hi3516CV610 VGS硬件规格

规格点

描述

视频输入数据格式

1、支持linear格式。

2、支持输入linear格式非压缩图像。

3、支持OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422、OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_422、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_400格式输入。

4、只支持8 bit YUV。

输入图像分辨率及对齐要求

1、最小支持:6x6。

2、最大支持:4096x4096。

3、宽度和高度均为2像素对齐(在ss_mpi_vgs_add_scale_task和ss_mpi_vgs_add_online_task接口中支持linear非压缩奇数宽高图像输入),linear格式帧起始地址2对齐,stride 8对齐。

视频输出数据格式

1、支持linear格式。

2、支持输出linear格式非压缩图像。

3、支持OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422、OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_422、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_400、OT_PIXEL_FORMAT_YUYV_PACKAGE_422、OT_PIXEL_FORMAT_YVYU_PACKAGE_422、OT_PIXEL_FORMAT_UYVY_PACKAGE_422、OT_PIXEL_FORMAT_VYUY_PACKAGE_422、OT_PIXEL_FORMAT_YYUV_PACKAGE_422、OT_PIXEL_FORMAT_YYVU_PACKAGE_422、OT_PIXEL_FORMAT_UVYY_PACKAGE_422、OT_PIXEL_FORMAT_VUYY_PACKAGE_422、OT_PIXEL_FORMAT_VY1UY0_PACKAGE_422格式输出。

4、只支持8 bit YUV。

输出图像分辨率及对齐要求

1、最小支持:4x4。

2、最大支持:4096x4096。

3、宽度和高度均为2像素对齐,linear格式帧起始地址2对齐,stride 8对齐。

缩放能力

1、支持16倍放大。

2、支持30倍缩小。

3、当输入Linear格式图像Crop后宽度大于2048(2*1024)且输出为非压缩时,只支持15倍缩小。

4、package 422像素格式不支持缩放。

表 3 Hi3511CV100 VGS硬件规格

规格点

描述

视频输入数据格式

1、支持linear格式。

2、支持输入linear格式非压缩、紧凑段压缩和非紧凑段压缩图像。

3、支持OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422、OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_422、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_400格式输入。

4、只支持8 bit YUV。

输入图像分辨率及对齐要求

1、最小支持:32x32。

2、最大支持:16384x8192。

3、宽度和高度均为2像素对齐(在ss_mpi_vgs_add_scale_task和ss_mpi_vgs_add_online_task接口中支持linear非压缩奇数宽高图像输入)。

4、非压缩时,linear格式帧起始地址2对齐,stride 16对齐。

5、压缩时,linear格式压缩头地址16对齐。header_stride 在帧宽度不大于4096时16对齐,帧宽度大于4096且不大于8192时32对齐,帧宽度大于8192时64对齐;帧起始地址16对齐,stride 16对齐。

注意:

1、要进行Mosaic处理时,输入图像宽度不能小于64。

视频输出数据格式

1、支持linear格式。

2、支持输出linear格式非压缩、紧凑段压缩和非紧凑段压缩图像。

3、支持OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422、OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_422、OT_PIXEL_FORMAT_YUV_SEMIPLANAR_420、OT_PIXEL_FORMAT_YUV_400格式输出。

4、只支持8 bit YUV。

输出图像分辨率及对齐要求

1、最小支持:4x4。

2、最大支持:16384x8192。

3、宽度和高度均为2像素对齐。

4、非压缩时,linear格式帧起始地址2对齐,stride 16对齐。

5、压缩时,linear格式压缩头地址16对齐。header_stride 在帧宽度不大于4096时16对齐,帧宽度大于4096且不大于8192时32对齐,帧宽度大于8192时64对齐;帧起始地址16对齐,stride 16对齐。

缩放能力

1、支持16倍放大。

2、支持15倍缩小。

API参考

该功能模块为用户提供以下MPI:

ss_mpi_vgs_begin_job

【描述】

启动一个job。

【语法】

td_s32 ss_mpi_vgs_begin_job(ot_vgs_handle *handle);

【参数】

参数名称

描述

输入/输出

handle

用以返回HANDLE。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

可一次启动多个job,但必须判断ss_mpi_vgs_begin_job函数返回成功后才能使用handle返回的HANDLE。

【举例】

td_s32 ret = TD_SUCCESS;
ot_vgs_handle handle;
ot_vgs_task_attr task_attr;

ret = ss_mpi_vgs_begin_job(&handle);
if (ret != TD_SUCCESS) {
    VGS_ERROR_PROCESS(ret);
}

ret = ss_mpi_vgs_add_scale_task(handle, &task_attr, OT_VGS_SCALE_COEF_NORM);
if (ret != TD_SUCCESS){
    ss_mpi_vgs_cancel_job(handle);
    VGS_ERROR_PROCESS(ret);
}

ret = ss_mpi_vgs_end_job(handle);
if (ret != TD_SUCCESS){
    ss_mpi_vgs_cancel_job(handle);    
    VGS_ERROR_PROCESS(ret);
}

ss_mpi_vgs_add_scale_task

【描述】

往一个已经启动的job里添加缩放task。

【语法】

td_s32 ss_mpi_vgs_add_scale_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, ot_vgs_scale_coef_mode mode);

【参数】

参数名称

描述

输入/输出

handle

表示一个已经启动的job的HANDLE。

输入

task

VGS task属性指针。

输入

mode

缩放系数模式,可选择普通、2阶、4阶、6阶、8阶缩放系数。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 缩放任务比较灵活,不限制用户输入输出是否使用同一块VB。使用同一块VB时,建议只做非压缩图像的缩小任务,否则可能会导致图像异常。在Hi3511CV100中,当使用不同VB且输入帧包含附属信息时,需注意VGS不会将附属信息复制到输出帧。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • 缩放系数支持的类型在ot_vgs_scale_coef_mode中有详细描述。
  • Hi3519DV500 和Hi3511CV100当输入宽度大于4096时,不支持紧凑段压缩输入,也不支持紧凑段压缩输出。当输出宽度大于4096时,不支持紧凑段压缩输出。
  • 对于Hi3519DV500,在输入非package422像素格式时,支持自适应输入低延时。
  • 对于Hi3516CV610,仅在UVC场景支持输入低延时。
  • 对于Hi3511CV100,支持输入低延时。
  • 当宽(高)缩小倍数大于15时,输入宽(高)需4像素对齐。
  • 在Hi3519DV500中

    • 若宽(高)缩小倍数大于15,需满足宽不大于8192。
    • 当输入Tile64x16或Tile32x4且为压缩时,若宽(高)缩小倍数大于11,需满足宽不大于6144。
  • 在Hi3516CV610中,当宽缩小倍数大于15时,输入宽度不大于2048。

  • 在Hi3511CV100中,不支持预缩放,最大支持图像宽高缩小15倍。

【举例】

请参见ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_draw_line_task

【描述】

往一个已经启动的job里添加批量画线task。

【语法】

td_s32 ss_mpi_vgs_add_draw_line_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_vgs_line line[], td_u32 array_size);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

task

VGS task属性指针。

输入

line

VGS画线属性配置结构体数组。

输入

array_size

VGS画线数目,范围:[1, 100]

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • 做批量画线任务时,输入输出压缩类型、像素格式保持不变。
  • Hi3519DV500和Hi3511CV100压缩类型不是紧凑段压缩时,输入输出图像为同一块buffer。压缩类型为紧凑段压缩时,输入输出图像必须使用不同的buffer,而且一次只能画一个。在Hi3511CV100中,当使用不同buffer且输入帧包含附属信息时,需注意VGS不会将附属信息复制到输出帧。
  • Hi3519DV500和Hi3511CV100压缩图像输入,画线功能实际上是由Cover功能实现,因此效果和非压缩图像效果略有不同。
  • Hi3519DV500 支持linear格式和tile32x4格式输入。
  • Hi3519DV500 和Hi3511CV100输入宽度大于4096时,不支持紧凑段压缩输入,也不支持紧凑段压缩输出。

【举例】

请参见 ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_cover_task

【描述】

往一个已经启动的job里添加批量叠加Cover task。

【语法】

td_s32 ss_mpi_vgs_add_cover_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_cover cover[], td_u32 array_size);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

task

VGS task属性指针。

输入

cover

Cover属性配置结构体数组。

输入

array_size

Cover的数目,范围:[1, 100]

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 做批量Cover任务时,输入输出压缩类型、像素格式保持不变。压缩类型不是紧凑段压缩时,输入输出图像为同一块buffer。压缩类型为紧凑段压缩时,输入输出图像必须使用不同的buffer,而且一次只能画一个。在Hi3511CV100中,当使用不同buffer且输入帧包含附属信息时,需要注意VGS不会将附属信息复制到输出帧。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • Hi3519DV500 和Hi3511CV100输入宽度大于4096时,不支持紧凑段压缩输入,也不支持紧凑段压缩输出。
  • Cover起始坐标及宽高2对齐。
  • Hi3519DV500 和Hi3511CV100支持实心/空心任意四边形Cover,如果是凹四边形则退化为三角形。
  • 空心任意四边形Cover和空心矩形Cover线宽范围为[2, 16],线宽2对齐。
  • Hi3516CV610 空心任意四边形各点坐标需按照顺时针或逆时针方向输入。
  • 当矩形Cover与输入图像存在重合区域时,自适应调整矩形Cover大小到图像内。

表 1 不同芯片Cover属性差异

芯片

支持视频格式

矩形Cover

任意四边形Cover

坐标水平X和垂直Y

宽和高

空心实现方式

坐标水平X和垂直Y

支持实心

Hi3519DV500

linear

tile32x4

X [-16384, 16382]

Y [-8192, 8190]

宽 [2, 16384]

高 [2, 8192]

角框

X [-16384, 16384]

Y [-8192, 8192]

是

Hi3516CV610

linear

X [-4096, 4094]

Y [-4096, 4094]

宽 [2, 4096]

高 [2, 4096]

空心任意四边形

X [-4096, 4096]

Y [-4096, 4096]

否

Hi3511CV100

linear

X [-16384, 16382]

Y [-8192, 8190]

宽 [2, 16384]

高 [2, 8192]

画线

X [-16384, 16384]

Y [-8192, 8192]

是

【举例】

请参见ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_osd_task

【描述】

往一个已经启动的job里添加批量叠加OSD task。

【语法】

td_s32 ss_mpi_vgs_add_osd_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_vgs_osd osd[], td_u32 array_size);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的handle。

输入

task

VGS task属性指针。

输入

osd

OSD属性配置结构体数组

输入

array_size

OSD的数目,范围: [1, 100]

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 做批量OSD任务时,输入输出压缩类型、像素格式保持不变。压缩类型不是紧凑段压缩时,输入输出图像为同一块buffer。压缩类型为紧凑段压缩时,输入输出图像必须使用不同的buffer,而且一次只能画一个。在Hi3511CV100中,当使用不同buffer且输入帧包含附属信息时,需要注意VGS不会将附属信息复制到输出帧。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • Hi3519DV500 支持linear格式和tile32x4格式输入。
  • Hi3511CV100 支持linear格式输入。
  • Hi3519DV500 和Hi3511CV100 输入宽度大于4096时,不支持紧凑段压缩输入,也不支持紧凑段压缩输出。
  • Hi3511CV100不支持OSD反色。
  • Hi3516CV610不支持OSD。

【举例】

请参见 ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_rotation_task

【描述】

往一个已经启动的job里添加旋转任务。

【语法】

td_s32 ss_mpi_vgs_add_rotation_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, ot_rotation angle);

【参数】

参数名称

描述

输入/输出

handle

表示一个已创建job的HANDLE。

输入

task

VGS task属性指针。

输入

angle

旋转角度。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经创建的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • 做旋转任务时,需要申请输入图像buffer和输出图像buffer。在Hi3511CV100中,当使用不同buffer且输入帧包含附属信息时,需要注意VGS不会将附属信息复制到输出帧。
  • 旋转的输入输出像素格式只支持semi-planar 420、单分量(Y),且不支持像素格式转换。
  • 旋转不支持压缩写出。
  • Hi3519DV500 和Hi3511CV100 旋转输入支持非紧凑段压缩和非压缩,但是非紧凑段压缩输入旋转90°和270°时的处理性能约为非压缩输入时的四分之一。
  • Hi3519DV500 旋转支持linear格式和tile64x16格式输入,仅支持linear格式输出。
  • Hi3511CV100 旋转支持linear格式输入输出。

【举例】

请参见 ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_luma_task

【描述】

往一个已经启动的job里批量添加获取亮度和任务。

【语法】

td_s32 ss_mpi_vgs_add_luma_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_rect luma_rect[], td_u32 array_size, td_u64 luma_data[]);

【参数】

参数名称

描述

输入/输出

handle

表示一个已创建job的HANDLE。

输入

task

VGS task属性指针。

输入

luma_rect

亮度和区域数组首地址。

输入

array_size

亮度和区域数量,范围: [1, 100]

输入

luma_data

亮度和写出数组首地址(用户态虚拟地址)

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经创建的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • 做获取亮度和任务时,只需要申请输入图像buffer。
  • VGS只检查task的输入属性,不检查task的输出属性。
  • 亮度和区域必须在输入图像内,且起始点及宽高均要求2像素对齐。
  • Hi3519DV500 输入宽度大于4096时,不支持紧凑段压缩输入。
  • Hi3519DV500 亮度和区域大小最小为2x2,最大为8192x8192。
  • Hi3511CV100 亮度和区域大小最小为2x2,最大为16384x8192。
  • Hi3516CV610 亮度和区域大小最小为6x6,最大为4096x4096。

【举例】

请参见 ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_mosaic_task

【描述】

往一个已经启动的job里添加批量叠加Mosaic task。

【语法】

td_s32 ss_mpi_vgs_add_mosaic_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_mosaic mosaic[], td_u32 array_size);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

task

VGS task属性指针。

输入

mosaic

Mosaic属性配置结构体数组。

输入

array_size

Mosaic的数目,范围[1, 100]。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 做批量Mosaic任务时,输入输出压缩类型、像素格式保持不变。压缩类型不是紧凑段压缩时,输入输出图像为同一块buffer。压缩类型为紧凑段压缩时,输入输出图像必须使用不同的buffer,而且一次只能画一个。在Hi3511CV100中,当使用不同buffer且输入帧包含附属信息时,需要注意VGS不会将附属信息复制到输出帧。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • Hi3519DV500 支持linear格式和tile32x4格式输入。
  • Hi3511CV100 支持linear格式输入。
  • Hi3519DV500 和Hi3511CV100输入宽度大于4096时,不支持紧凑段压缩输入。
  • Mosaic起始坐标及宽4对齐,高2对齐。
  • Hi3516CV610不支持Mosaic。

表 1 不同芯片Mosaic属性差异

芯片

支持视频格式

坐标水平X和垂直Y

宽和高

Mosaic Block

Hi3519DV500

linear

tile32x4

X [-8192,16380]

Y [-8192,8190]

宽 [8,8192]

高 [8,8192]

16x16,32x32,64x64

Hi3511CV100

linear

X [-16384,16380]

Y [-8192,8190]

宽 [8,16384]

高 [8,8192]

8x8,16x16,32x32,64x64

【举例】

请参见 ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_corner_rect_task

【描述】

往一个已经启动的job里添加批量叠加Corner_rect task。

【语法】

td_s32 ss_mpi_vgs_add_corner_rect_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_corner_rect corner_rect[], const ot_corner_rect_attr *corner_rect_attr, td_u32 array_size);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

task

VGS task属性指针。

输入

corner_rect

Corner_rect 属性配置结构体数组。

ot_corner_rect 请参考“系统控制”章节。

输入

corner_rect_attr

Corner_rect公共属性。

ot_corner_rect_attr请参考“系统控制”章节。

输入

array_size

Corner_rect的数目

Hi3519DV500范围:[1, 100]

Hi3516CV610范围:

  • 线框[1, 100]
  • 角框[1, 50]

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 做批量Corner_rect任务时,输入输出压缩类型、像素格式保持不变。压缩类型不是紧凑段压缩时,输入输出图像为同一块buffer。压缩类型为紧凑段压缩时,输入输出图像必须使用不同的buffer,而且一次只能画一个。在Hi3511CV100中,当使用不同buffer且输入帧包含附属信息时,需要注意VGS不会将附属信息复制到输出帧。

    支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。

  • Hi3519DV500 支持linear格式和tile32x4格式输入。

  • Hi3516CV610和Hi3511CV100 支持linear格式输入。
  • Hi3519DV500 和Hi3511CV100输入宽度大于4096时,不支持紧凑段压缩输入。
  • Corner_rect的类型可分为实线框(OT_CORNER_RECT_TYPE_FULL_LINE)或角框(OT_CORNER_RECT_TYPE_CORNER)。
  • Corner_rect起始坐标及宽高2对齐。
  • 坐标及宽高取值范围:

    Hi3519DV500和Hi3511CV100:水平X:[-8192, 16382],垂直Y:[-8192, 8190],宽:[2, 8192],高:[2, 8192]。

    Hi3516CV610:水平X:[-4096,4094],垂直Y:[-4096,4094],宽:[2,4096],高:[2,4096]。

  • 线宽范围为[2, 16],线宽2对齐。水平线长(hor_len)不大于Corner_rect的宽,竖直线长(ver_len)不大于Corner_rect的高。

  • 当角框与输入图像存在重合区域时,自适应调整角框大小到图像内。
  • 批量处理时,每个Corner_rect的颜色、类型等属性(corner_rect_attr)都一样。
  • Hi3516CV610中Corner_rect使用画线实现。
  • Hi3511CV100中Corner_rect在非压缩场景使用画线实现,压缩场景使用cover实现。

【举例】

请参见ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_stitch_task

【描述】

往一个已经启动的job里添加拼接 task。

【语法】

td_s32 ss_mpi_vgs_add_stitch_task(ot_vgs_handle handle, const ot_vgs_stitch_task_attr *task, td_u32 pic_num);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

task

VGS拼接 task属性指针。

输入

pic_num

拼接图像的数目,范围[1, 4]。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • 做拼接任务时,各输入图像的压缩类型、像素格式、视频存储格式,宽高大小需要一样。输出图像的宽度是各输入图像宽之和,输出图像高与输入图像高相同,不支持缩放。
  • 不支持像素格式转换,即输出图像的像素格式需与输入图像的一致。
  • 拼接输入图像宽高取值范围:宽:[32,4096],高:[32,8192]。
  • 输入输出图像不支持紧凑段压缩。
  • Hi3519DV500 支持linear格式输入,支持linear格式和tile32x4格式输出,其中tile32x4格式输出时要求输出宽度不大于4096。
  • Hi3516CV610和Hi3511CV100均不支持拼接。

【举例】

请参见ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_add_online_task

【描述】

往一个已经启动的job里添加在线任务,叠加OSD/Cover/Mosaic/Corner_rect、Crop、Aspect Ratio、Mirror/Flip和缩放功能可以在同一个任务中处理。

【语法】

td_s32 ss_mpi_vgs_add_online_task(ot_vgs_handle handle, const ot_vgs_task_attr *task, const ot_vgs_online *online);

【参数】

参数名称

描述

输入/输出

handle

表示一个已经启动的job的HANDLE。

输入

task

VGS task属性指针。

输入

online

在线任务属性。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • task属性必须满足VGS的能力。
  • 如果此接口返回失败,如不需再添加其他任务,可以调用ss_mpi_vgs_end_job接口提交已经添加的task,否则必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。
  • 不限制用户输入输出是否使用同一块VB。使用同一块VB时,建议只做非压缩图像的缩小任务,否则可能会导致图像异常。在Hi3511CV100中,当使用不同VB且输入帧包含附属信息时,需要注意VGS不会将附属信息复制到输出帧。
  • 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。
  • 当设置紧凑段压缩写出时,不支持mirror或flip。
  • Hi3519DV500 任务执行顺序为:Crop->Mosaic->Cover->Corner_rect->OSD->Scale/Aspect Ratio/Mirror/Flip。整个任务只占用一张图像的性能消耗。
  • Hi3511CV100 任务执行顺序为:Crop->Mosaic->Cover->OSD->Scale/Aspect Ratio/Border/Mirror/Flip。整个任务只占用一张图像的性能消耗。
  • Hi3516CV610 任务执行顺序为:Crop->Cover->Scale/Mirror/Flip。整个任务只占用一张图像的性能消耗。
  • Cover/Mosaic/Corner_rect/OSD数量不要超过数组的大小。
  • 所有Mosaic的块大小相同,以最后一个参数有效的Mosaic的块大小为准。
  • Crop时,宽高和坐标必须2对齐,裁剪区域宽高不能小于32(其中Hi3516CV610不能小于6),不能大于原图。
  • Aspect Ratio时,幅形比视频区域的宽高和坐标必须2对齐,宽高不能小于32,不能大于原图。
  • 对于Hi3519DV500,Cover的数量范围:OT_COVER_RECT类型最多16个,OT_COVER_QUAD类型最多1个。其中空心矩形Cover是用Corner_rect实现的,数量上是共享的;如果只配置了空心矩形Cover,所有空心矩形Cover的颜色一致,统一使用第一个空心矩形Cover的颜色;如果同时配置了空心矩形Cover和Corner_rect,二者的颜色统一使用Corner_rect的颜色。
  • 对于Hi3511CV100,Cover的数量范围:OT_COVER_RECT类型最多5个,OT_COVER_QUAD类型最多1个。其中空心矩形Cover是用空心任意四边形实现的,数量上是共享的;如果只配置了空心矩形Cover,所有空心矩形Cover的颜色一致,统一使用第一个空心矩形Cover的颜色。
  • 对于Hi3516CV610,Cover的数量范围:OT_COVER_RECT类型最多1个。
  • 对于Hi3519DV500,在输入非package422像素格式时,支持自适应输入低延时。
  • 对于Hi3516CV610,仅在UVC场景支持输入低延时。
  • 对于Hi3511CV100,支持输入低延时。
  • Scale时,若当宽(高)缩小倍数大于15,对应输入宽(高)需4像素对齐。
  • 当输入Linear格式图像宽度超过4096或tile64x16或tile32x4格式图像宽度超过3072,并且压缩输出时,不支持mirror和幅形比同时开启。
  • 输出非压缩图像时,支持将一张图的某个区域缩放到另一张图的任意区域,输出的首地址是计算偏移后的,stride是大图的,width和height是小图的。如图1所示。

    图 1 大图上叠小图的示意图

【举例】

请参见ss_mpi_vgs_begin_job的举例。

ss_mpi_vgs_end_job

【描述】

提交一个job。

【语法】

td_s32 ss_mpi_vgs_end_job(ot_vgs_handle handle);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle标识的job必须是已经启动的job。
  • 如果此接口返回失败,必须调用ss_mpi_vgs_cancel_job接口取消掉handle标识的job。否则会导致handle标识的job不能再被循环利用。

【举例】

参见ss_mpi_vgs_begin_job举例。

ss_mpi_vgs_cancel_job

【描述】

取消一个job。

【语法】

td_s32 ss_mpi_vgs_cancel_job(ot_vgs_handle handle);

【参数】

参数名称

描述

输入/输出

handle

表示一个已启动job的HANDLE。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

handle标识的job必须是已经启动的job。

【举例】

请参见ss_mpi_vgs_begin_job举例。

ss_mpi_vgs_get_ver_split_job

【描述】

获取垂直分块配置。

【语法】

td_s32 ss_mpi_vgs_get_ver_split_job(const ot_vgs_ver_split_attr *ver_split_attr, ot_vgs_handle *handle, td_u32 *node_num);

【参数】

参数名称

描述

输入/输出

ver_split_attr

垂直分块属性配置结构体。

输入

handle

用以返回垂直分块场景所用HANDLE。

输出

node_num

用以返回垂直分块场景所需分块数。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle允许的最大数目可在加载ko时通过VGS模块参数g_max_vgs_ver_split_handle进行配置,最大值[2,10](默认为5),合理的设置更小值有助于减少内存占用。
  • 垂直分块功能仅支持输出图像高度大于输出图像高度时使用。
  • 若本接口计算出最后一块的高度小于32(jpeg允许的最小高度)时,会报错,此时需要调整buf_size让内部重新计算分块策略。
  • 仅Hi3516CV610支持该接口。

【举例】

无。

ss_mpi_vgs_proc_ver_split

【描述】

完成本垂直分块放大处理。

【语法】

td_s32 ss_mpi_vgs_proc_ver_split(ot_vgs_handle handle, td_u32 node_id, ot_video_frame_info *in_frame, ot_video_frame_info *out_frame);

【参数】

参数名称

描述

输入/输出

handle

本垂直分块场景HANDLE。

输入

node_id

当前处理块序号(从0开始)。

输入

in_frame

输入图像属性。

ot_video_frame_info请参考“系统控制”章节。

输入

out_frame

输出图像属性。

ot_video_frame_info请参考“系统控制”章节。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

  • handle号需从ss_mpi_vgs_get_ver_split_job得到,即已获取过配置。
  • VGS仅会在node_id为0时接收in_frame信息,且该帧信息的宽高需要与ss_mpi_vgs_get_ver_split_job时填写的一致。
  • node_id为当前需要处理块的序号,从序号0开始,总共0~node_num-1,需按照递增顺序依次填入。
  • 支持循环处理,即从0~node_num-1后,当放大输入输出分辨率、buf地址和size不变时,可再从0~node_num-1提交,达到分块信息重复利用的目的。
  • 处理完成后,编码需要的帧信息在out_frame中返回。
  • 仅Hi3516CV610支持该接口。

【举例】

无。

ss_mpi_vgs_release_ver_split_job

【描述】

结束本场景垂直分块处理。

【语法】

td_s32 ss_mpi_vgs_release_ver_split_job(ot_vgs_handle handle);

【参数】

参数名称

描述

输入/输出

handle

本垂直分块场景HANDLE。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码。

【需求】

  • 头文件:ot_common_vgs.h、ss_mpi_vgs.h
  • 库文件:libss_mpi.a

【注意】

【举例】

无。

数据类型

VGS模块相关数据类型定义如下:

OT_VGS_DEFAULT_JOB_NUM

【说明】

定义VGS默认job数量。

【定义】

#define OT_VGS_DEFAULT_JOB_NUM             64

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_DEFAULT_TASK_NUM

【说明】

定义VGS默认task数量。

【定义】

#define OT_VGS_DEFAULT_TASK_NUM            100

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_DEFAULT_NODE_NUM

【说明】

定义VGS默认node数量。

【定义】

#define OT_VGS_DEFAULT_NODE_NUM            100

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_MAX_JOB_NUM

【说明】

定义VGS最大job数量

【定义】

#define OT_VGS_MAX_JOB_NUM                 200

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_MIN_JOB_NUM

【说明】

定义VGS最小job数量

【定义】

#define OT_VGS_MIN_JOB_NUM                 20

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_MAX_TASK_NUM

【说明】

定义VGS最大task数量。

【定义】

#define OT_VGS_MAX_TASK_NUM                400

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_MIN_TASK_NUM

【说明】

定义VGS最小task数量。

【定义】

#define OT_VGS_MIN_TASK_NUM                 20

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_MAX_NODE_NUM

【说明】

定义VGS最大node数量。

【定义】

#define OT_VGS_MAX_NODE_NUM                400

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_MIN_NODE_NUM

【说明】

定义VGS最小node数量。

【定义】

#define OT_VGS_MIN_NODE_NUM                 20

【注意事项】

无

【相关数据类型及接口】

无

OT_VGS_CLUT_LEN

【说明】

定义CLUT颜色表的长度。

【定义】

#define OT_VGS_CLUT_LEN                16

【注意事项】

无。

【相关数据类型及接口】

ss_mpi_vgs_add_osd_task

OT_VGS_TASK_PRIVATE_DATA_LEN

【说明】

定义私有数据长度。

【定义】

#define OT_VGS_TASK_PRIVATE_DATA_LEN   4

【注意事项】

无。

【相关数据类型及接口】

OT_VGS_STITCH_NUM

【说明】

定义水平拼接的最大图像数量。

【定义】

#define OT_VGS_STITCH_NUM   4

【注意事项】

Hi3516CV610和Hi3511CV100不支持。

【相关数据类型及接口】

ot_vgs_stitch_task_attr

OT_VGS_IP_NUM

【说明】

定义VGS IP个数。

【定义】

#define OT_VGS_IP_NUM                      1

【注意事项】

无。

【相关数据类型及接口】

无。

OT_VGS0

【说明】

定义VGS IP0。

【定义】

#define OT_VGS0                            0

【注意事项】

无。

【相关数据类型及接口】

无。

OT_VGS_MAX_SOLID_RECT_COVER_NUM

【说明】

定义Online 任务中的最大实心矩形Cover数量。

【定义】

Hi3519DV500:

#define OT_VGS_MAX_SOLID_RECT_COVER_NUM   8

Hi3511CV100:

#define OT_VGS_MAX_SOLID_RECT_COVER_NUM   4

Hi3516CV610:

#define OT_VGS_MAX_SOLID_RECT_COVER_NUM   1

【注意事项】

无。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_HOLLOW_RECT_COVER_NUM

【说明】

定义Online 任务中的最大空心矩形Cover数量。

【定义】

#define OT_VGS_MAX_HOLLOW_RECT_COVER_NUM   OT_VGS_MAX_CORNER_RECT_NUM

Hi3511CV100:

#define OT_VGS_MAX_HOLLOW_RECT_COVER_NUM   OT_VGS_MAX_QUAD_COVER_NUM

【注意事项】

  • Hi3519DV500 空心矩形是用Corner_rect实现的,online任务中,空心矩形Cover与Corner_rect的数量和最大为OT_VGS_MAX_CORNER_RECT_NUM。
  • Hi3511CV100空心矩形是用空心Quad实现的,online任务中,空心矩形Cover和空心Quad数量和最大为1。
  • Hi3516CV610不支持。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_RECT_COVER_NUM

【说明】

定义Online 任务中的最大矩形Cover数量。

【定义】

#define OT_VGS_MAX_RECT_COVER_NUM   (OT_VGS_MAX_SOLID_RECT_COVER_NUM + OT_VGS_MAX_HOLLOW_RECT_COVER_NUM)

【注意事项】

无。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_QUAD_COVER_NUM

【说明】

定义Online 任务中的最大任意四边形Cover数量。

【定义】

#define OT_VGS_MAX_QUAD_COVER_NUM   1

【注意事项】

Hi3516CV610不支持。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_COVER_NUM

【说明】

定义Online 任务中的最大Cover数量。

【定义】

Hi3519DV500:

#define OT_VGS_MAX_COVER_NUM   (OT_VGS_MAX_RECT_COVER_NUM + OT_VGS_MAX_QUAD_COVER_NUM)

Hi3516CV610:

#define OT_VGS_MAX_COVER_NUM   OT_VGS_MAX_SOLID_RECT_COVER_NUM

Hi3511CV100:

#define OT_VGS_MAX_COVER_NUM   (OT_VGS_MAX_SOLID_RECT_COVER_NUM + OT_VGS_MAX_QUAD_COVER_NUM)

【注意事项】

无。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_OSD_NUM

【说明】

定义Online 任务中的最大OSD数量。

【定义】

#define OT_VGS_MAX_OSD_NUM   1

【注意事项】

Hi3516CV610不支持。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_CORNER_RECT_NUM

【说明】

定义Online 任务中的最大Corner_rect数量。

【定义】

#define OT_VGS_MAX_CORNER_RECT_NUM   8

【注意事项】

Hi3516CV610和Hi3511CV100不支持。

【相关数据类型及接口】

ot_vgs_online

OT_VGS_MAX_MOSAIC_NUM

【说明】

定义Online 任务中的最大Mosaic数量。

【定义】

Hi3519DV500:

#define OT_VGS_MAX_MOSAIC_NUM   4

Hi3511CV100:

#define OT_VGS_MAX_MOSAIC_NUM   1

【注意事项】

Hi3516CV610不支持。

【相关数据类型及接口】

ot_vgs_online

ot_vgs_handle

【说明】

定义VGS job的句柄。

【定义】

typedef td_s32   ot_vgs_handle;

【注意事项】

无。

【相关数据类型及接口】

无。

ot_vgs_task_attr

【说明】

定义VGS task的属性。

【定义】

typedef struct {
    ot_video_frame_info        img_in;
    ot_video_frame_info        img_out;
    td_u64                     private_data[OT_VGS_TASK_PRIVATE_DATA_LEN];
    td_u32                     reserved;
} ot_vgs_task_attr;

【成员】

成员名称

描述

img_in

输入图像属性。

ot_video_frame_info请参考“系统控制”章节。

img_out

输出图像属性。

private_data

与task相关的私有数据,VGS不会使用和修改其中的数据。

reserved

保留项。

【注意事项】

输入和输出图像属性需要满足相关约束。

【相关数据类型及接口】

ot_video_frame_info

ot_vgs_stitch_task_attr

【说明】

定义VGS 拼接task的属性。

【定义】

typedef struct {
    ot_video_frame_info        img_in[OT_VGS_STITCH_NUM];
    ot_video_frame_info        img_out;
    td_u64                     private_data[OT_VGS_TASK_PRIVATE_DATA_LEN];
    td_u32                     reserved;
} ot_vgs_stitch_task_attr;

【成员】

成员名称

描述

img_in

输入图像属性数组,最多4张图像。

img_out

输出图像属性。

private_data

与task相关的私有数据,VGS不会使用和修改其中的数据。

reserved

保留项。

【注意事项】

  • 输入和输出图像属性需要满足相关约束。
  • Hi3516CV610和Hi3511CV100不支持。

【相关数据类型及接口】

ss_mpi_vgs_add_stitch_task

ot_vgs_line

【说明】

定义VGS画线操作的相关配置。

【定义】

typedef struct {
    ot_point                   start_point;          
    ot_point                   end_point;           
    td_u32                     thick;                
    td_u32                     color;                
} ot_vgs_line;

【成员】

成员名称

描述

start_point

线的起始点坐标。坐标值均要求2对齐,取值范围:

Hi3519DV500和Hi3511CV100:

水平位置X:[-16384, 16382]

垂直位置Y:[-8192, 8190]

Hi3516CV610:

水平位置X:[-4096, 4094]

垂直位置Y:[-4096, 4094]

end_point

线的结束点坐标。坐标值均要求2对齐,取值范围:

Hi3519DV500和Hi3511CV100:

水平位置X:[-16384, 16384]

垂直位置Y:[-8192, 8192]

Hi3516CV610:

水平位置X:[-4096, 4096]

垂直位置Y:[-4096, 4096]

thick

线的宽度,2像素对齐。

取值范围:[2,16]

color

线的颜色,RGB888格式,取值范围:[0x0, 0xFFFFFF]

【注意事项】

  • 画线操作时,如果起始坐标和结束坐标的X坐标相同,则起始坐标和结束坐标的Y坐标不变,X坐标分别向右增加线的宽度。如果起始坐标和结束坐标的X坐标不相同,则X坐标不变,起始坐标和结束坐标的Y坐标分别向下增加线的宽度。
  • 画线可以部分或者全部超出目标图像。
  • 画线颜色为RGB模式,R、G、B分别对应位域如下:

    31 23 15 7 0

    |--------------|--------R------|--------G------|--------B------|

【相关数据类型及接口】

ot_point

ot_vgs_osd_inverted_color

【说明】

定义OSD反色模式类型。

【定义】

typedef enum {
    OT_VGS_OSD_INVERTED_COLOR_NONE = 0,
    OT_VGS_OSD_INVERTED_COLOR_RGB,
    OT_VGS_OSD_INVERTED_COLOR_ALPHA,
    OT_VGS_OSD_INVERTED_COLOR_ALL,
    OT_VGS_OSD_INVERTED_COLOR_BUTT
} ot_vgs_osd_inverted_color;

【成员】

成员名称

描述

OT_VGS_OSD_INVERTED_COLOR_NONE

不反色。

OT_VGS_OSD_INVERTED_COLOR_RGB

仅对RGB反色。

OT_VGS_OSD_INVERTED_COLOR_ALPHA

仅对alpha反色。

OT_VGS_OSD_INVERTED_COLOR_ALL

对RGB和alpha反色。

【注意事项】

Hi3516CV610和Hi3511CV100不支持。

【相关数据类型及接口】

无

ot_vgs_osd

【说明】

定义VGS上OSD的配置。

【定义】

typedef struct {
    ot_rect                    rect;
    td_u32                     bg_color;
    ot_pixel_format            pixel_format;
    td_phys_addr_t             phys_addr;
    td_u32                     stride;
    td_u32                     bg_alpha;
    td_u32                     fg_alpha;
    td_u32                     clut[OT_VGS_CLUT_LEN];
    ot_vgs_osd_inverted_color  osd_inverted_color;
} ot_vgs_osd;

【成员】

成员名称

描述

rect

OSD的起始坐标及宽高。位置和宽高值均要求2对齐。

取值范围:

水平位置X:[0, 16382]

垂直位置Y:[0, 8190]

宽度:[2, 8192]

高度:[2, 8192]

bg_color

保留参数。

pixel_format

OSD的像素格式:

支持ARGB1555,ARGB4444,ARGB8888,Clut2,Clut4格式

phys_addr

OSD图像的物理地址,2对齐。

stride

OSD的stride,16对齐。

bg_alpha

像素格式为ARGB1555时,OSD的背景alpha值,取值范围[0, 255]。

fg_alpha

像素格式为ARGB1555时,OSD的前景alpha值,取值范围[0, 255]。

clut [OT_VGS_CLUT_LEN]

OSD像素格式为Clut4或Clut2时的颜色值。Clut2使用4个颜色值。Clut4使用16个颜色值。

osd_inverted_color

反色模式。

【注意事项】

  • OSD区域可以部分或者全部超出目标图像,但起始点坐标不能为负。
  • Hi3511CV100不支持反色模式。
  • Hi3516CV610不支持。

【相关数据类型及接口】

ss_mpi_vgs_add_osd_task

ot_vgs_aspect_ratio

【说明】

定义VGS 幅形比信息。

【定义】

typedef struct {
    ot_rect         video_rect;
    td_u32          bg_color;
} ot_vgs_aspect_ratio;

【成员】

成员名称

描述

video_rect

幅型比视频区域。

bg_color

幅型比背景颜色,取值范围[0x0, 0xFFFFFF]。

【注意事项】

Hi3516CV610不支持。

【相关数据类型及接口】

ot_vgs_online

ot_border

【说明】

定义VGS 视频边框信息。

【定义】

typedef struct {
    td_u32          top_width;
    td_u32          bottom_width;
    td_u32          left_width;
    td_u32          right_width;
    td_u32          color;
} ot_border;

【成员】

成员名称

描述

top_width

顶部边框宽度,取值范围:[0, 14],2对齐

bottom_width

底部边框宽度,取值范围:[0, 14],2对齐

left_width

左侧边框宽度,取值范围:[0, 14],2对齐

right_width

右侧边框宽度,取值范围:[0, 14],2对齐

color

边框颜色,取值范围:[0x0, 0xFFFFFF]

【注意事项】

仅Hi3511CV100支持。

【相关数据类型及接口】

ot_vgs_online

ot_vgs_scale_coef_mode

【说明】

定义VGS缩放系数模式的配置。

【定义】

typedef enum {
    OT_VGS_SCALE_COEF_NORM = 0,
    OT_VGS_SCALE_COEF_TAP2,
    OT_VGS_SCALE_COEF_TAP4,
    OT_VGS_SCALE_COEF_TAP6,
    OT_VGS_SCALE_COEF_TAP8,
    OT_VGS_SCALE_COEF_BUTT
} ot_vgs_scale_coef_mode;

【成员】

成员名称

描述

OT_VGS_SCALE_COEF_NORM

普通缩放系数,水平、垂直方向任意比例缩放。

OT_VGS_SCALE_COEF_TAP2

2阶缩放系数,水平、垂直方向任意比例缩放。

OT_VGS_SCALE_COEF_TAP4

4阶缩放系数,垂直方向缩小4倍,水平方向4阶滤波。

OT_VGS_SCALE_COEF_TAP6

6阶缩放系数,垂直方向缩小4倍,水平方向6阶滤波。

OT_VGS_SCALE_COEF_TAP8

8阶缩放系数,垂直方向缩小4倍,水平方向8阶滤波。

【注意事项】

  • 使用4阶、6阶、8阶缩放系数时,输入输出图像高度比例需设置为1/4,宽度不变。
  • Hi3519DV500只支持OT_VGS_SCALE_COEF_NORM模式。

【相关数据类型及接口】

ss_mpi_vgs_add_scale_task

ot_vgs_online

【说明】

定义VGS在线任务的配置。

【定义】

typedef struct {
    td_bool             crop_en;
    ot_rect             crop_rect;
    td_u32              mosaic_num;
    ot_mosaic           mosaic[OT_VGS_MAX_MOSAIC_NUM];
    td_u32              cover_num;
    ot_cover            cover[OT_VGS_MAX_COVER_NUM];
    td_u32              corner_rect_num;
    ot_corner_rect_attr corner_rect_attr;
    ot_corner_rect      corner_rect[OT_VGS_MAX_CORNER_RECT_NUM];
    td_u32              osd_num;
    ot_vgs_osd          osd[OT_VGS_MAX_OSD_NUM];
    td_bool             aspect_ratio_en;
    ot_vgs_aspect_ratio aspect_ratio;
    td_bool             border_en;
    ot_border           border;
    td_bool             mirror_en;
    td_bool             flip_en;
    ot_vgs_scale_coef_mode scale_coef_mode;
} ot_vgs_online;

【成员】

成员名称

描述

crop_en

Crop是否使能。

crop_rect

Crop功能的配置。

mosaic_num

Mosaic的数量。取值范围:[0, OT_VGS_MAX_MOSAIC_NUM]

mosaic

Mosaic功能参数配置。

cover_num

Cover的数量。取值范围:[0, OT_VGS_MAX_COVER_NUM]

cover

Cover功能参数配置。

corner_rect_num

Corner_rect的数量。取值范围:[0, OT_VGS_MAX_CORNER_RECT_NUM]

corner_rect_attr

Corner_rect功能公共参数。

corner_rect

Corner_rect功能参数配置。

osd_num

OSD的数量。取值范围:[0, OT_VGS_MAX_OSD_NUM]

osd

OSD功能参数配置。

aspect_ratio_en

Aspect Ratio是否使能。

aspect_ratio

Aspect Ratio参数配置。

border_en

Border是否使能。

border

Border参数配置。

mirror_en

Mirror是否使能。

flip_en

Flip是否使能。

scale_coef_mode

缩放模式的参数配置。

【注意事项】

scale_coef_mode只支持OT_VGS_SCALE_COEF_NORM模式。

【相关数据类型及接口】

ss_mpi_vgs_add_online_task

ot_vgs_ver_split_attr

【说明】

定义垂直分块属性。

【定义】

typedef struct {
    ot_size in;
    ot_size out;
    ot_pixel_format pixel_format;
    td_phys_addr_t buf_phys_addr;
    td_u32 buf_size;
} ot_vgs_ver_split_attr;

【成员】

成员名称

描述

in

垂直分块输入帧size

out

垂直分块输出完整帧size

pixel_format

输入(输出)帧像素格式

ot_pixel_format请参考“系统控制”章节。

buf_phys_addr

(存放各放大块)buffer物理地址

buf_size

(存放各放大块)buffer的大小

【注意事项】

帧像素格式当前仅支持sp420。

【相关数据类型及接口】

ss_mpi_vgs_get_ver_split_job

错误码

VGS API错误码如表1所示。

表 1 VGS API错误码

错误代码

宏定义

描述

0xa02d8016

OT_ERR_VGS_BUF_EMPTY

VGS的job,task或node已经使用完毕

0xa02d8007

OT_ERR_VGS_ILLEGAL_PARAM

VGS参数设置无效

0xa02d800a

OT_ERR_VGS_NULL_PTR

输入参数空指针错误

0xa02d800c

OT_ERR_VGS_NOT_SUPPORT

操作不支持

0xa02d800d

OT_ERR_VGS_NOT_PERM

操作不允许

0xa02d8015

OT_ERR_VGS_NO_BUF

分配内存失败

0xa02d8018

OT_ERR_VGS_NOT_READY

系统未初始化

0xa02d8017

OT_ERR_VGS_BUF_FULL

没有剩余BUF

【注意事项】

宏定义OT_ERR_VGS_BUF_FULL未使用,保留。