• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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![](./figures/hispark_taurus_resize_crop_sample/001VPSS_GRP_ATTR_S%E5%AE%9A%E4%B9%89.png)
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![](./figures/hispark_taurus_resize_crop_sample/003VPSS_CHN_ATTR_S%E5%AE%9A%E4%B9%89.png)
42
43【成员】
44
45![](./figures/hispark_taurus_resize_crop_sample/004VPSS_CHN_ATTR_S%E6%88%90%E5%91%98.png)
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![](./figures/hispark_taurus_resize_crop_sample/005configvpss.png)
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![](./figures/hispark_taurus_resize_crop_sample/006HI_MPI_VGS_BeginJob%E5%8F%82%E6%95%B0.png)
80
81【返回值】
82
83![](./figures/hispark_taurus_resize_crop_sample/007HI_MPI_VGS_BeginJob%E8%BF%94%E5%9B%9E%E5%80%BC.png)
84
85【需求】
86
87* 头文件:hi_comm_vgs.hmpi_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![](./figures/hispark_taurus_resize_crop_sample/008HI_MPI_VGS_AddScaleTask%E5%8F%82%E6%95%B0.png)
112
113【返回值】
114
115![](./figures/hispark_taurus_resize_crop_sample/009HI_MPI_VGS_AddScaleTask%E8%BF%94%E5%9B%9E%E5%80%BC.png)
116
117【需求】
118
119* 头文件:hi_comm_vgs.hmpi_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![](./figures/hispark_taurus_resize_crop_sample/010HI_MPI_VGS_EndJob%E5%8F%82%E6%95%B0.png)
156
157【返回值】
158
159![](./figures/hispark_taurus_resize_crop_sample/011HI_MPI_VGS_EndJob%E8%BF%94%E5%9B%9E%E5%80%BC.png)
160
161【需求】
162
163* 头文件:hi_comm_vgs.hmpi_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![](./figures/hispark_taurus_resize_crop_sample/012HI_MPI_VGS_CancelJob%E5%8F%82%E6%95%B0.png)
188
189【返回值】
190
191![](./figures/hispark_taurus_resize_crop_sample/013HI_MPI_VGS_CancelJob%E8%BF%94%E5%9B%9E%E5%80%BC.png)
192
193【需求】
194
195* 头文件:hi_comm_vgs.hmpi_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![](./figures/hispark_taurus_resize_crop_sample/014IveImgResize.png)
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![](./figures/hispark_taurus_resize_crop_sample/015HI_MPI_IVE_Resize%E5%8F%82%E6%95%B0.png)
226
227![](./figures/hispark_taurus_resize_crop_sample/016HI_MPI_IVE_Resize%E5%8F%82%E6%95%B02.png)
228
229![](./figures/hispark_taurus_resize_crop_sample/017HI_MPI_IVE_Resize%E5%8F%82%E6%95%B03.png)
230
231【返回值】
232
233![](./figures/hispark_taurus_resize_crop_sample/018HI_MPI_IVE_Resize%E8%BF%94%E5%9B%9E%E5%80%BC.png)
234
235【需求】
236
237* 头文件:hi_comm_ive.hhi_ive.hmpi_ive.h
238
239* 库文件:libive.a(PC上模拟用ive_clib2.1.lib240
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![](./figures/hispark_taurus_resize_crop_sample/021HI_MPI_IVE_Query%E5%8F%82%E6%95%B0.png)
264
265![](./figures/hispark_taurus_resize_crop_sample/022HI_MPI_IVE_Query%E5%8F%82%E6%95%B02.png)
266
267【返回值】
268
269![](./figures/hispark_taurus_resize_crop_sample/023HI_MPI_IVE_Query%E8%BF%94%E5%9B%9E%E5%80%BC.png)
270
271【需求】
272
273* 头文件:hi_comm_ive.hhi_ive.hmpi_ive.h
274
275* 库文件:libive.a(PC上模拟用ive_clib2.x.lib276
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