1## 3.2 图像Resize 2 3### 3.2.1 VPSS 4 5VPSS(Video Process Sub-System)是视频处理子系统,支持的具体图像处理功能包括FRC(Frame Rate Control)、CROP、Sharpen、3DNR、Scale、像素格式转换、LDC、Spread、固定角度旋转、任意角度旋转、鱼眼校正、Cover/Coverex、Overlayex、Mosaic、Mirror/Flip、HDR、Aspect Ratio、压缩解压等。 6 7VPSS对用户提供组(GROUP)的概念。最大个数请参见 VPSS_MAX_GRP_NUM 定义,各GROUP分时复用 VPSS 硬件,硬件依次处理各个组提交的任务。缩放,对图像进行缩小放大。物理通道水平、垂直最大支持 15 倍缩小,最大支持 16 倍放大;扩展通道水平、垂直最大支持 30 倍缩小,最大支持 16 倍放大。 8 9通过VPSS实现图像resize方法如下: 10 11可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/svp/ive/sample**路径下的sample_ive_kcf.c接口中的config vpss参数进行配置,核心围绕VPSS_GRP_ATTR_S、VPSS_CHN_ATTR_S结构体来展开,VPSS_GRP_ATTR_S结构体定义如下: 12 13**VPSS_GRP_ATTR_S** 14 15【说明】 16 17* 定义VPSS GROUP属性。 18 19【定义】 20 21 22 23【成员】 24 25* 请参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》文档中的VPSS_GRP_ATTR_S结构体成员的内容。 26 27【注意事项】 28 29* **源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》文档中的VPSS_GRP_ATTR_S结构体注意事项内容。 30 31VPSS_CHN_ATTR_S结构体定义如下: 32 33**VPSS_CHN_ATTR_S** 34 35【说明】 36 37* 定义VPSS物理通道的属性。 38 39【定义】 40 41 42 43【成员】 44 45 46 47注:u32Width及u32Height请参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》文档中的表5-6内容 48 49【注意事项】 50 51* **源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》中的VPSS_CHN_ATTR_S结构体注意事项内容。 52 53将void SAMPLE_IVE_Kcf(void){}接口按照下图进行配置: 54 55以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/svp/ive/sample/sample_ive_kcf.c文件中找到 56 57 58 59### 3.2.2 VGS 60 61VGS是视频图形子系统,全称为Video GraphicsSub-System。支持对一幅输入图像进行处理,如进行缩放、像素格式转换、视频存储格式转换、压缩/解压、打COVER、打OSD、画线、旋转、动态范围转换等处理。 62 63关于VGS的基本概念、功能描述请参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》第10章内容,这里不再详细论述。 64 65接下来讲解通过VGS方式对图片进行RESIZE,其涉及的关键底层API接口如下: 66 67**HI_MPI_VGS_BeginJob** 68 69【描述】 70 71* 启动一个job。 72 73【语法】 74 75* HI_S32 HI_MPI_VGS_BeginJob(VGS_HANDLE *phHandle); 76 77【参数】 78 79 80 81【返回值】 82 83 84 85【需求】 86 87* 头文件:hi_comm_vgs.h、mpi_vgs.h 88 89* 库文件:libmpi.a 90 91【注意】 92 93* 可一次启动多个job,但必须判断HI_MPI_VGS_BeginJob函数返回成功后才能使用phHandle返回的HANLDE 94 95* phHandle不能为空指针或非法指针。 96 97 98 99**HI_MPI_VGS_AddScaleTask** 100 101【描述】 102 103* 往一个已经启动的job里添加缩放task。 104 105【语法】 106 107* HI_S32 HI_MPI_VGS_AddScaleTask(VGS_HANDLE hHandle, const VGS_TASK_ATTR_S *pstTask, VGS_SCLCOEF_MODE_E enScaleCoefMode); 108 109【参数】 110 111 112 113【返回值】 114 115 116 117【需求】 118 119* 头文件:hi_comm_vgs.h、mpi_vgs.h 120 121* 库文件:libmpi.a 122 123【注意】 124 125* hHandle标识的job必须是已经启动的job。 126 127* task属性必须满足VGS的能力。 128 129* 如果此接口返回失败,如不需再添加其他任务,可以调用HI_MPI_VGS_EndJob接口提交已经添加的task,否则必须调用HI_MPI_VGS_CancelJob接口取消掉hHandle标识的job。否则会导致hHandle标识的job不能再被循环利用。 130 131* 如果宽(高)度的缩小倍数大于15倍时,要求输入图像的宽(高)度4像素对齐。 132 133* 用户态调用VGS做10bit位宽数据压缩时,要注意扩展地址和扩展stride等参数的配置,具体配置方法参考VGS 10bit位宽数据压缩sample。 134 135* 缩放任务比较灵活,不限制用户输入输出是否使用同一块VB。 136 137* 2阶缩放系数仅Hi3516EV200支持 138 139* 支持非VB内存的物理地址,用户只需配置正确的物理地址即可,无需配置PoolId和虚拟地址,但用户需要保证物理连续的内存大小足够。 140 141 142 143**HI_MPI_VGS_EndJob** 144 145【描述】 146 147* 提交一个job。 148 149【语法】 150 151* HI_S32 HI_MPI_VGS_EndJob(VGS_HANDLE hHandle); 152 153【参数】 154 155 156 157【返回值】 158 159 160 161【需求】 162 163* 头文件:hi_comm_vgs.h、mpi_vgs.h 164 165* 库文件:libmpi.a 166 167【注意】 168 169* hHandle标识的job必须是已经启动的job。 170 171* 如果此接口返回失败,必须调用HI_MPI_VGS_CancelJob接口取消掉hHandle标识的job。否则会导致hHandle标识的job不能再被循环利用。 172 173 174 175**HI_MPI_VGS_CancelJob** 176 177【描述】 178 179* 取消一个job。 180 181【语法】 182 183* HI_S32 HI_MPI_VGS_CancelJob(VGS_HANDLE hHandle); 184 185【参数】 186 187 188 189【返回值】 190 191 192 193【需求】 194 195* 头文件:hi_comm_vgs.h、mpi_vgs.h 196 197* 库文件:libmpi.a 198 199【注意】 200 201* hHandle标识的job必须是已经启动的job。 202 203### 3.2.3 IVE 204 205IVE(IntelligentVideoEngine)是上海海思媒体处理芯片智能分析系统中的硬件加速模块。用户基于IVE开发智能分析方案可以加速智能分析,降低CPU占用。当前IVE提供的算子可以支撑开发视频诊断、周界防范等智能分析方案。 206 207通过IVE来可实现图像的resize,可通过**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/resize_crop/smp/smp_resize_crop.c文件中**的**IveImgResize**接口进行实现,如下图所示: 208 209 210 211分析上图可以发现,其中const IVE_IMAGE_S *src为待缩放的原始image,IVE_IMAGE_S *dst为保存缩放后的image,uint32_t dstWidth为需要缩放的width,uint32_t dstHeight为需要缩放的height。分析IveImgResize函数,接下来对IveImgResize函数调用的底层API进行如下解读: 212 213**HI_MPI_IVE_Resize** 214 215【描述】 216 217* 创建图像缩放任务,支持bilinear、area插值缩放,支持多张U8C1\U8C3_PLANAR图像同时输入做一种类型的缩放。 218 219【语法】 220 221* HI_S32 HI_MPI_IVE_Resize(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S astSrc[], IVE_DST_IMAGE_S astDst[], IVE_RESIZE_CTRL_S *pstResizeCtrl, HI_BOOL bInstant); 222 223【参数】 224 225 226 227 228 229 230 231【返回值】 232 233 234 235【需求】 236 237* 头文件:hi_comm_ive.h、hi_ive.h、mpi_ive.h 238 239* 库文件:libive.a(PC上模拟用ive_clib2.1.lib) 240 241【注意】 242 243* 基于OpenCV中resize实现,IVE_RESIZE_MODE_LINEAR、IVE_RESIZE_MODE_AREA分别对应OpenCV resize的INTER_LINEAR、INTER_AREA。 244 245* 支持U8C1、U8C3_PLANAR混合图像数组输入,但所有图像的缩放模式相同。 246 247* 最大支持16倍缩放。 248 249* pstResizeCtrl→stMem内存至少需要25*U8C1_NUM + 49 * (pstResizeCtrl->u16Num –U8C1_NUM)字节,其中U8C1_NUM为混合图像数组中U8C1图像的数目。 250 251**HI_MPI_IVE_Query** 252 253【描述】 254 255* 查询已创建任务完成情况。 256 257【语法】 258 259* HI_S32 HI_MPI_IVE_Query(IVE_HANDLE IveHandle, HI_BOOL *pbFinish, HI_BOOL bBlock); 260 261【参数】 262 263 264 265 266 267【返回值】 268 269 270 271【需求】 272 273* 头文件:hi_comm_ive.h、hi_ive.h、mpi_ive.h 274 275* 库文件:libive.a(PC上模拟用ive_clib2.x.lib) 276 277【注意】 278 279* 在用户使用IVE任务结果前,为确保IVE任务已完成,用户可以使用阻塞方式调用此接口查询。 280 281* IVE内部是按任务创建顺序依次执行任务的,所以用户不必每次都使用查询接口,如用户依次创建了A,B两个任务,那么如果B任务完成了,这个时候A任务肯定也完成了,此时使用A任务的结果时不必再次调用查询接口。 282 283* 返回值为HI_ERR_IVE_QUERY_TIMEOUT(查询超时)时,可以继续查询。 284 285* 返回值为HI_ERR_IVE_SYS_TIMEOUT(系统超时)时,用户的IVE任务必须全部重新提交。 286 287### 3.2.4 Resize sample 288 289* 以IVE为例,讲述如何跑通resize,该部分请参考[ resize_crop操作指导](../resize_crop/README.md)的Resize部分的内容。 290 291