• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1### 3.1.3 VPSS理论及实现方式
2
3#### 3.1.3.1 VPSS理论
4
5VPSS(Video Process Sub-System)支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后**输出多种不同分辨率**的图像。
6 VPSS是视频处理子系统,支持的具体图像处理功能包括FRC(Frame Rate Control)、CROP、Sharpen、3DNR、Scale、像素格式转换、LDC、Spread、固定角度旋转、任意角度旋转、鱼眼校正、Cover/Coverex、Overlayex、Mosaic、Mirror/Flip、HDR、AspectRatio、压缩解压等。
7
8关于VPSS的功能描述及相关名词概念描述请自行阅读**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》第5章视频处理子系统中的5.2章节。
9
10VPSS在系统中的位置如下图所示:
11
12![](./figures/hispark_taurus_helloworld_sample/102VPSS%E5%9C%A8%E7%B3%BB%E7%BB%9F%E4%B8%AD%E7%9A%84%E4%BD%8D%E7%BD%AE.png)
13
14通过调用SYS模块的绑定接口,可与AVS/USER/VDEC/VIVO/VENC/SVP等模块进行绑定,其中前者为VPSS的输入源,后者为VPSS的接收者。用户可通过MPI接口对GROUP进行管理。每个GROUP仅可与一个输入源绑定。GROUP的物理通道有两种工作模式:AUTO和USER,两种模式间可动态切换。AUTO模式下各通道仅可与一个接收者绑定,主要用于预览和回放场景下做播放控制。USER模式下各通道可与多个接收者绑定。**需要特别注意的是,USER模式主要用于对同一通道图像进行多路编码的场景,此模式下播放控制不生效,因此回放场景下不建议使用USER模式**。VPSS只有工作在离线模式下才支持AUTO模式。
15
16Hi3516DV300 VPSS芯片数据处理流程如下图所示:
17
18![](./figures/hispark_taurus_helloworld_sample/103Hi3516DV300%20VPSS%E8%8A%AF%E7%89%87%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B.png)
19
20**注意:**
21
22* VPSS在调用VGS做通道后处理时顺序为CoverEx、LumaStat、OverlayEx。
23
24* 固定角度旋转和任意角度旋转功能互斥,这两个功能在图中的先后顺序无需关注。
25
26* 扩展通道GDC任务和VGS任务互斥。
27
28#### 3.1.3.2 VPSS实现方式
29
30device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/中,VPSS部分实现细节如下:
31
32##### 3.1.3.2.1 config vpss
33
34首先需要配置vpss所需的结构体,核心对VPSS_GRP_ATTR_S结构体和VPSS_CHN_ATTR_S结构体进行配置,下面对这个两个结构体进行详细说明。
35
36这两个结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/include/hi_comm_vpss.h中找到
37
38**VPSS_GRP_ATTR_S**
39
40【说明】
41
42* 定义VPSS GROUP属性
43
44【定义】
45
46![](./figures/hispark_taurus_helloworld_sample/104VPSS_GRP_ATTR_S%E5%AE%9A%E4%B9%89.png)
47
48【成员】
49
50![](./figures/hispark_taurus_helloworld_sample/105VPSS_GRP_ATTR_S%E6%88%90%E5%91%98.png)
51
52注:表5-5来源于**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》
53
54【注意事项】
55
56请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VPSS_GRP_ATTR_S结构体注意事项内容。
57
58**VPSS_CHN_ATTR_S**
59
60【说明】
61
62* 定义VPSS物理通道的属性
63
64【定义】
65
66![](./figures/hispark_taurus_helloworld_sample/106VPSS_CHN_ATTR_S%E5%AE%9A%E4%B9%89.png)
67
68【成员】
69
70![](./figures/hispark_taurus_helloworld_sample/107VPSS_CHN_ATTR_S%E6%88%90%E5%91%98.png)
71
72注:表5-6来源于**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》
73
74【注意事项】
75
76请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VPSS_CHN_ATTR_S结构体注意事项内容。
77
78config vpss 代码实现可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c**中的int SampleVioVpssVoMipi(void)接口,具体细节如下:
79
80![](./figures/hispark_taurus_helloworld_sample/108config%20vpss.png)
81
82![](./figures/hispark_taurus_helloworld_sample/108initVPSScfg.png)
83
84![](./figures/hispark_taurus_helloworld_sample/108addvpsschannel.png)
85
86##### 3.1.3.2.2 start vpss
87
88代码实现可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c**文件
89
90核心围绕VpssStart接口,如下图所示:
91
92![](./figures/hispark_taurus_helloworld_sample/109SAMPLE_COMM_VPSS_Start.png)
93
94针对VpssStart接口调用的底层接口作如下说明:
95
96**VPSS_GRP**
97
98【说明】
99
100* 定义VPSS组号
101
102【定义】
103
104* typedef HI_S32 VPSS_GRP;
105
106【注意事项】
107
108* 无
109
110**HI_MPI_VPSS_CreateGrp**
111
112【描述】
113
114* 创建一个VPSS GROUP
115
116【语法】
117
118* HI_S32 HI_MPI_VPSS_CreateGrp(VPSS_GRP VpssGrp, const VPSS_GRP_ATTR_S *pstGrpAttr);
119
120【参数】
121
122![](./figures/hispark_taurus_helloworld_sample/110HI_MPI_VPSS_CreateGrp%E5%8F%82%E6%95%B0.png)
123
124【返回值】
125
126![](./figures/hispark_taurus_helloworld_sample/110HI_MPI_VPSS_CreateGrp%E8%BF%94%E5%9B%9E%E5%80%BC.png)
127
128【需求】
129
130* 头文件:hi_comm_vpss.hmpi_vpss.h
131
132* 库文件:libmpi.a
133
134【注意】
135
136* 不支持重复创建。
137
138* 当VPSS工作在VI_PARALLEL_VPSS_PARALLEL模式时,只有GROUP0可以被创建
139
140* 当Hi3516DV300的GROUP0工作VI_ONLINE_VPSS_ONLINE模式时,只有GROUP0可以被创建。
141
142**HI_MPI_VPSS_SetChnAttr**
143
144【描述】
145
146* 设置VPSS通道属性。
147
148【语法】
149
150* HI_S32 HI_MPI_VPSS_SetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_CHN_ATTR_S *pstChnAttr);
151
152【参数】
153
154![](./figures/hispark_taurus_helloworld_sample/111HI_MPI_VPSS_SetChnAttr%E5%8F%82%E6%95%B0.png)
155
156【返回值】
157
158![](./figures/hispark_taurus_helloworld_sample/112HI_MPI_VPSS_SetChnAttr%E8%BF%94%E5%9B%9E%E5%80%BC.png)
159
160【需求】
161
162* 头文件:hi_comm_vpss.hmpi_vpss.h
163
164* 库文件:libmpi.a
165
166【注意】
167
168* GROUP必须已创建。
169
170* 扩展通道不支持此接口。
171
172* 通道做任意角度旋转、LDC、Spread处理或者其绑定的扩展通道开启了鱼眼校正时不支持通道尺寸动态改变,需要先关闭如上功能,才能动态改变通道尺寸。
173
174
175
176**HI_MPI_VPSS_EnableChn**
177
178【描述】
179
180* 启用VPSS通道
181
182【语法】
183
184* HI_S32 HI_MPI_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn);
185
186【参数】
187
188![](./figures/hispark_taurus_helloworld_sample/113HI_MPI_VPSS_EnableChn%E5%8F%82%E6%95%B0.png)
189
190【返回值】
191
192![](./figures/hispark_taurus_helloworld_sample/114HI_MPI_VPSS_EnableChn%E8%BF%94%E5%9B%9E%E5%80%BC.png)
193
194【需求】
195
196* 头文件:hi_comm_vpss.hmpi_vpss.h
197
198* 库文件:libmpi.a
199
200【注意】
201
202* 多次使能返回成功。
203* GROUP 必须已创建。
204* 若支持扩展通道,扩展通道必须保证此通道绑定的源物理通道已经使能,否则返回失败错误码。
205
206
207
208**HI_MPI_VPSS_StartGrp**
209
210【描述】
211
212* 启用VPSS GROUP。
213
214【语法】
215
216* HI_S32 HI_MPI_VPSS_StartGrp(VPSS_GRP VpssGrp);
217
218【参数】
219
220![](./figures/hispark_taurus_helloworld_sample/115HI_MPI_VPSS_StartGrp%E5%8F%82%E6%95%B0.png)
221
222【返回值】
223
224![](./figures/hispark_taurus_helloworld_sample/116HI_MPI_VPSS_StartGrp%E8%BF%94%E5%9B%9E%E5%80%BC.png)
225
226【需求】
227
228* 头文件:hi_comm_vpss.hmpi_vpss.h
229
230* 库文件:libmpi.a
231
232【注意】
233
234* GROUP必须已创建。
235
236* 重复调用该函数设置同一个组返回成功。
237
238#### 3.1.3.3 VI bind VPSS
239
240MPP提供系统绑定接口(HI_MPI_SYS_Bind),即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。目前MPP支持的绑定关系如下:
241
242![](./figures/hispark_taurus_helloworld_sample/118MPP%E6%94%AF%E6%8C%81%E7%9A%84%E7%BB%91%E5%AE%9A%E5%85%B3%E7%B3%BB.png)
243
244![](./figures/hispark_taurus_helloworld_sample/119MPP%E6%94%AF%E6%8C%81%E7%9A%84%E7%BB%91%E5%AE%9A%E5%85%B3%E7%B3%BB.png)
245
246**VI bind VPSS绑定VI和VPSS之间的关联关系,绑定后,数据源生成的数据将自动发送给接收者,调用的底层接口如下:**
247
248**HI_MPI_SYS_Bind**
249
250【描述】
251
252* 数据源到数据接收者绑定接口。
253
254【语法】
255
256* HI_S32 HI_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn);
257
258【参数】
259
260![](./figures/hispark_taurus_helloworld_sample/120HI_MPI_SYS_Bind%E5%8F%82%E6%95%B0.png)
261
262【返回值】
263
264![](./figures/hispark_taurus_helloworld_sample/121HI_MPI_SYS_Bind%E8%BF%94%E5%9B%9E%E5%80%BC.png)
265
266【需求】
267
268* 头文件:hi_comm_sys.hmpi_sys.h
269
270* 库文件:libmpi.a
271
272【注意】
273
274* 系统目前支持的绑定关系,请参见**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件V4.0开发参考.pdf》中的表2-2。
275* 同一个数据接收者只能绑定一个数据源。
276* 绑定是指数据源和数据接收者建立关联关系。绑定后,数据源生成的数据将自动发送给接收者。
277* VI和VDEC作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为0,SDK不检查输入的设备号。
278* VO作为数据源发送回写(WBC)数据时,是以设备为发送者,向其他模块发送数据,用户将通道号置为0,SDK不检查输入的通道号。
279* VPSS作为数据接收者时,是以设备(GROUP)为接收者,接收其他模块发来的数据,用户将通道号置为0。
280* VENC作为数据接收者时,是以通道号为接收者,接收其他模块发过来的数据,用户将设备号置为0,SDK不检查输入的设备号。若VENC工作在VENC_PIC_RECEIVE_MULTI模式下,用户需要配置设备号,此时设备号实际用于指定输入源,可以使用VENC_PIC_RECEIVE_SOURCE0、VENC_PIC_RECEIVE_SOURCE1、VENC_PIC_RECEIVE_SOURCE2、VENC_PIC_RECEIVE_SOURCE3宏进行输入源指定。
281* AVS作为数据接收者时,是以设备(GROUP)、通道(PIPE)为接收者。
282* 其他情况均需指定设备号和通道号。
283
284**在源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中**
285
286vi bind vpss代码在ViVpssCreate()接口中的实现方式如下:
287
288![](./figures/hispark_taurus_helloworld_sample/122vi%20bind%20vpss%E4%BB%A3%E7%A0%81.png)
289
290其中ViBindVpss具体实现细节如下:
291
292![](./figures/hispark_taurus_helloworld_sample/123SAMPLE_COMM_VI_Bind_VPSS.png)
293
294