1### 3.1.2 VI理论及实现方式
2
3#### 3.1.2.1  VI理论
4
5视频输入(VI)模块实现的功能:通过 MIPI Rx(含MIPI接口、LVDS接口和HISPI接口),SLVS-EC,BT.1120,BT.656,BT.601,DC等接口接收视频数据。VI将接收到的数据存入到指定的内存区域,在此过程中,VI可以对接收到的原始视频图像数据进行处理,实现视频数据的采集。
6
7VI功能框图如下:
8
9![](./figures/hispark_taurus_helloworld_sample/002VI%E5%8A%9F%E8%83%BD%E6%A1%86%E5%9B%BE.png)
10
11VI从软件上划分了输入设备(DEV),输入PIPE (图示为物理PIPE,虚拟PIPE只包含ISP_BE)、物理通道(PHY_CHN)、扩展通道(EXT_CHN)四个层级。Hi3516DV300的设备、PIPE、通道个数差异如下表所示:
12
13| 芯片        | DEV <br />VI_MAX_ DEV_NUM | PHY_PIPE<br />VI_MAX_PHY<br />_PIPE_NUM | VIR_PIPE <br />VI_MAX_VIR<br />_PIPE_NUM | PHY_CHN<br />VI_MAX_PHY<br />_CHN_NUM | EXT_CHN<br />VI_MAX<br />_EXT_CHN_NUM |
14| ----------- | :-----------------------: | --------------------------------------- | ---------------------------------------- | ------------------------------------- | :-----------------------------------: |
15| Hi3516DV300 |             2             | 4                                       | 0                                        | 1                                     |                   8                   |
16
17Hi3516DV300视频输入通道功能如下图所示:
18
19![](./figures/hispark_taurus_helloworld_sample/004%E8%A7%86%E9%A2%91%E9%A9%B6%E5%85%A5%E9%80%9A%E9%81%93%E5%8A%9F%E8%83%BD.png)
20
21#### 3.1.2.2 VI实现方式
22
23在helloworld中,VI部分实现细节如下:
24
25##### 3.1.2.2.1 config vi
26
27配置vi参数首先要对Sensor的参数进行配置,其中,SAMPLE_COMM_VI_GetSensorInfo接口是获取Sensor信息,该接口是对SAMPLE_VI_CONFIG_S结构体的配置, SAMPLE_VI_CONFIG_S如下图所示:
28
29![](./figures/hispark_taurus_helloworld_sample/005SAMPLE_VI_CONFIG_S.png)
30
31分析SAMPLE_VI_CONFIG_S结构体,核心是对SAMPLE_VI_INFO_S结构体进行配置,如下图所示:
32
33![](./figures/hispark_taurus_helloworld_sample/006SAMPLE_VI_INFO_S.png)
34
35分析SAMPLE_VI_INFO_S结构体,其围绕SAMPLE_SENSOR_INFO_S、SAMPLE_DEV_INFO_S、SAMPLE_PIPE_INFO_S、SAMPLE_CHN_INFO_S、SAMPLE_SNAP_INFO_S结构体来展开,其每个结果体成员定义如下:
36
37**SAMPLE_SENSOR_INFO_S:**
38
39该结构体成员分别定义:SnsType、SnsId、BusId、MipiDev成员。
40
41![](./figures/hispark_taurus_helloworld_sample/007SAMPLE_SENSOR_INFO_S.png)
42
43**SAMPLE_DEV_INFO_S:**
44
45该结构体定义:ViDev、WDRMode成员。
46
47![](./figures/hispark_taurus_helloworld_sample/008SAMPLE_DEV_INFO_S.png)
48
49**SAMPLE_PIPE_INFO_S:**
50
51该结构体定义:Pipe、MastPipeMode、MultiPipe、VcNumCfged、IspBypass、PixFmt、VCNum结构体成员。
52
53![](./figures/hispark_taurus_helloworld_sample/009SAMPLE_PIPE_INFO_S.png)
54
55**SAMPLE_CHN_INFO_S:**
56
57该结构体成员定义:ViChn、PixFormat、DynamicRange、VideoFormat、CompressMode成员。
58
59![](./figures/hispark_taurus_helloworld_sample/010SAMPLE_CHN_INFO_S.png)
60
61**SAMPLE_SNAP_INFO_S:**
62
63该结构体成员定义:Snap、DoublePipe、VideoPipe、SnapPipe、VideoPipeMode、SnapPipeMode成员。
64
65![](./figures/hispark_taurus_helloworld_sample/011SAMPLE_SNAP_INFO_S.png)
66
67关于上述结构体列举的枚举型成员,自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm.h**文件,该文件里面详细定义枚举型成员,这里不再详细阐述。
68
69SAMPLE_COMM_VI_GetSensorInfo接口实现细节,如下图所示:
70
71可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/platform/common/中的sample_comm_vi.c文件**
72
73![](./figures/hispark_taurus_helloworld_sample/012SAMPLE_VIO_VPSS_VO_MIPI.png)
74
75配置vi还需要配置SAMPLE_VI_CONFIG_S其他成员元素,实现细节如下:
76
77以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到
78
79![](./figures/hispark_taurus_helloworld_sample/187VIPramCfg.png)
80
81![](./figures/hispark_taurus_helloworld_sample/188ConfigVi.png)
82
83![](./figures/hispark_taurus_helloworld_sample/189ViCfgSetChn.png)
84
85##### 3.1.2.2.2 get picture size
86
87SAMPLE_COMM_VI_GetSizeBySensor接口通过sensor型号来获取图片的大小,通过enPicSize输出,如PIC_1080P,实现接口如下:
88
89可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c**中的int SampleVioVpssVoMipi(void)接口中的get picture size部分。
90
91![](./figures/hispark_taurus_helloworld_sample/014SAMPLE_COMM_VI_GetSizeBySensor.png)
92
93根据SAMPLE_COMM_VI_GetSizeBySensor接口输出的enPicSize来得到图片的width和height,实现方式通过SAMPLE_COMM_SYS_GetPicSize来实现,如下图所示:
94
95![](./figures/hispark_taurus_helloworld_sample/015SAMPLE_COMM_SYS_GetPicSize.png)
96
97SAMPLE_COMM_VI_GetSizeBySensor和SAMPLE_COMM_SYS_GetPicSize接口实现方式较为简单,读者自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/目录**下的**sample_comm_vi.csample_comm_sys.c**即可。
98
99##### 3.1.2.2.3 config vb and get picture/raw buffer size
100
101启动vi之前,需要配置vb(视频缓存池),视频缓存池的概念如下:
102
103视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。
104
105一组大小相同、物理地址连续的缓存块组成一个视频缓存池。必须在系统初始化之前配置公共视频缓存池。根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。
106
107所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像,如下图所示,VI从公共视频缓存池B中获取视频缓存块Bm,缓存块Bm经VI发送给VPSS,输入缓存块Bm经过VPSS处理之后被释放回公共视频缓存池。假设VPSS通道的工作模式是USER,则VPSS通道0从公共视频缓存池B中获取缓存块Bi作为输出图像缓存buffer发送给VENC,VPSS通道1从公共视频缓存池B中获取缓存块Bk作为输出图像缓存buffer发送给VO,Bi经VENC编码完之后释放回公共视频缓存池,Bk经VO显示完之后释放回公共视频缓存池。
108
109典型的公共视频缓存池数据流图如下图所示:
110
111![](./figures/hispark_taurus_helloworld_sample/016%E5%85%AC%E5%85%B1%E8%A7%86%E9%A2%91%E7%BC%93%E5%AD%98%E6%B1%A0%E6%95%B0%E6%8D%AE%E6%B5%81%E5%9B%BE.png)
112
113**注:**不同类型的视频缓存池大小计算请参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》文档中的表2-1中的hi_buffer.h内容。
114
115核心配置VB_CONFIG_S结构体,该结构体定义如下:
116
117以下结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vb.h文件中找到
118
119**VB_CONFIG_S**
120
121【说明】
122
123* 定义视频缓存池属性结构体
124
125【定义】
126
127![](./figures/hispark_taurus_helloworld_sample/017%E8%A7%86%E9%A2%91%E7%BC%93%E5%AD%98%E6%B1%A0%E5%B1%9E%E6%80%A7%E7%BB%93%E6%9E%84%E4%BD%93.png)
128
129【成员】
130
131![](./figures/hispark_taurus_helloworld_sample/018%E8%A7%86%E9%A2%91%E7%BC%93%E5%AD%98%E6%B1%A0%E5%B1%9E%E6%80%A7%E7%BB%93%E6%9E%84%E4%BD%93%E6%88%90%E5%91%98.png)
132
133**【注意事项】**
134
135* u32BlkSize等于0或u32BlkCnt等于0,则对应的缓存池不会被创建。
136
137* 建议整个结构体先memset为0再按需赋值。
138
139**对VB_CONFIG_S中嵌套的VB_POOL_CONFIG_S结构体进行说明。**
140
141**VB_POOL_CONFIG_S**
142
143【说明】
144
145* 定义视频缓存池属性结构体。
146
147【定义】
148
149![](./figures/hispark_taurus_helloworld_sample/019VB_POOL_CONFIG_S.png)
150
151【成员】
152
153![](./figures/hispark_taurus_helloworld_sample/020VB_POOL_CONFIG_S%E6%88%90%E5%91%98.png)
154
155【注意事项】
156
157*  每个缓存块的大小u64BlkSize应根据当前图像宽高、像素格式、数据位宽、是否压缩等来计算。详细计算方法请参见**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》表2-1和代码[hi_buffer.h](https://gitee.com/openharmony/device_soc_hisilicon/blob/master/hi3516dv300/sdk_linux/include/hi_buffer.h)里面各种格式的图像存储计算公式。
158
159* 该缓存池是从空闲MMZ内存中分配,一个缓存池包含若干个大小相同的缓存块。如果该缓存池的大小超过了保留内存中的空闲空间,则创建缓存池会失败。
160
161* 用户需保证输入的DDR名字已经存在,如果输入不存在DDR的名字,会造成分不到内存。如果数组acMmzName被memset为0则表示在没有命名的DDR中创建缓存池。
162
163**对VB_POOL_CONFIG_S中嵌套的结构体VB_REMAP_MODE_E进行解释。**
164
165**VB_REMAP_MODE_E**
166
167【说明】
168
169* 定义VB内核态虚拟地址映射模式。
170
171【定义】
172
173![](./figures/hispark_taurus_helloworld_sample/021VB_REMAP_MODE_E.png)
174
175【成员】
176
177![](./figures/hispark_taurus_helloworld_sample/022VB_REMAP_MODE_E%E6%88%90%E5%91%98.png)
178
179【注意事项】
180
181* 无
182
183
184
185**配置vb具体的代码实现方式如下图所示:**
186
187* 可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中** StVbParamCfg( )函数。
188
189![](./figures/hispark_taurus_helloworld_sample/023config%20vb.png.png)
190
191**get picture buffer size和get raw buffer size代码实现方式如下图所示:**
192
193* 可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c中的**HI_S32 int SampleVioVpssVoMipi(void)接口中的get picture buffer size部分和get raw buffer size部分。
194
195![](./figures/hispark_taurus_helloworld_sample/024get%20picture%20buffer%20size.png)
196
197##### 3.1.2.2.4 Vb init & MPI system init
198
199通过**HI_S32 SAMPLE_COMM_SYS_Init(VB_CONFIG_S* pstVbConfig);**接口进行system初始化,可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c中**的**int SampleVioVpssVoMipi(void)**接口中的**vb init & MPI system init**部分,如下图所示:
200
201![](./figures/hispark_taurus_helloworld_sample/025vb%20init.png)
202
203进入device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm_sys.c的SAMPLE_COMM_SYS_Init接口,对其调用的底层接口进行说明和阐述,调用的接口如下:
204
205以下接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_sys.h文件中找到
206
207**HI_MPI_SYS_Exit**
208
209【描述】
210
211* 去初始化MPP系统。包括音频输入输出、视频输入输出、视频编解码、视频叠加区域、视频处理、图形处理等模块都会被销毁或者禁用
212
213【语法】
214
215* HI_S32 HI_MPI_SYS_Exit(HI_VOID);
216
217【参数】
218
219* 无
220
221【返回值】
222
223![](./figures/hispark_taurus_helloworld_sample/026HI_MPI_SYS_Exit%E8%BF%94%E5%9B%9E%E5%80%BC.png)
224
225【需求】
226
227* 头文件:hi_comm_sys.hmpi_sys.h
228
229* 库文件:libmpi.a
230
231【注意】
232
233* 去初始化时,如果有阻塞在MPI上的用户进程,则去初始化会失败。如果所有阻塞在MPI上的调用都返回,则可以成功去初始化。
234
235* 可以反复去初始化,不返回失败。
236
237* 由于系统去初始化不会销毁音频的编解码通道,因此这些通道的销毁需要用户主动进行。如果创建这些通道的进程退出,则通道随之被销毁。
238
239**注:本章节涉及到的错误码请参考源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中的《HiMPP媒体处理软件V4.0开发参考.pdf》指导手册中对应的错误码**
240
241以下四个接口可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vb.h文件中找到
242
243**HI_MPI_VB_Exit**
244
245【描述】
246
247* 去初始化MPP视频缓存池。
248
249【语法】
250
251* HI_S32 HI_MPI_VB_Exit (HI_VOID);
252
253【参数】
254
255* 无。
256
257【返回值】
258
259![](./figures/hispark_taurus_helloworld_sample/027HI_MPI_VB_Exit%E8%BF%94%E5%9B%9E%E5%80%BC.png)
260
261【需求】
262
263* 头文件:hi_comm_vb.hmpi_vb.h
264
265* 库文件:libmpi.a
266
267【注意】
268
269* 必须先调用HI_MPI_SYS_Exit去初始化MPP系统,再去初始化缓存池,否则返回失败。
270
271* 可以反复去初始化,不返回失败。
272
273* 去初始化不会清除先前对缓存池的配置。
274
275* 退出VB池之前请确保VB池里的任何VB都没有被占用,否则无法退出。
276
277**HI_MPI_VB_SetConfig**
278
279【描述】
280
281* 设置MPP视频缓存池属性。
282
283【语法】
284
285* HI_S32 HI_MPI_VB_SetConfig(const VB_CONFIG_S *pstVbConfig);
286
287【参数】
288
289![](./figures/hispark_taurus_helloworld_sample/028HI_MPI_VB_SetConfig%E5%8F%82%E6%95%B0.png)
290
291【返回值】
292
293![](./figures/hispark_taurus_helloworld_sample/029HI_MPI_VB_SetConfig%E8%BF%94%E5%9B%9E%E5%80%BC.png)
294
295【需求】
296
297* 头文件:hi_comm_vb.hmpi_vb.h
298
299* 库文件:libmpi.a
300
301【注意】
302
303* 只能在系统处于未初始化的状态下,才可以设置缓存池属性,否则会返回失败。
304
305* video buf根据不同的应用场景需要不同的配置。配置规则参见**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》2.2.1 “视频缓存池”。
306
307* 公共缓存池中每个缓存块的大小应根据当前图像像素格式以及图像是否压缩而有所不同。具体分配大小请参考VB_CONFIG_S结构体中的描述。
308
309**HI_MPI_VB_Init**
310
311【描述】
312
313* 初始化MPP视频缓存池。
314
315【语法】
316
317* HI_S32 HI_MPI_VB_Init (HI_VOID);
318
319【参数】
320
321* 无。
322
323【返回值】
324
325![](./figures/hispark_taurus_helloworld_sample/030HI_MPI_VB_Init%E8%BF%94%E5%9B%9E%E5%80%BC.png)
326
327【需求】
328
329* 头文件:hi_comm_vb.hmpi_vb.h
330
331* 库文件:libmpi.a
332
333【注意】
334
335* 必须先调用HI_MPI_VB_SetConfig配置缓存池属性,再初始化缓存池,否则会失败。
336
337* 可反复初始化,不返回失败。
338
339**HI_MPI_SYS_Init**
340
341【描述】
342
343* 初始化MPP系统。包括音频输入输出、视频输入输出、视频编解码、视频叠加区域、视频处理、图形处理等模块都会被初始化。
344
345【语法】
346
347* HI_S32 HI_MPI_SYS_Init(HI_VOID);
348
349【参数】
350
351* 无。
352
353【返回值】
354
355![](./figures/hispark_taurus_helloworld_sample/031HI_MPI_SYS_Init%E8%BF%94%E5%9B%9E%E5%80%BC.png)
356
357【需求】
358
359* 头文件:hi_comm_sys.hmpi_sys.h
360
361* 库文件:libmpi.a
362
363【注意】
364
365* 必须先调用HI_MPI_SYS_SetConfig配置MPP系统后才能初始化,否则初始化会失败。
366* 由于MPP系统的正常运行依赖于缓存池,因此需要先调用HI_MPI_VB_Init初始化缓存池,再初始化MPP系统,否则会导致业务运行异常。
367* 如果多次初始化,仍会返回成功,但实际上系统不会对MPP的运行状态有任何影响。
368* 只要有一个进程进行初始化即可,不需要所有的进程都做系统初始化的操作。
369* 由于音频模块依赖用户态属性,故音频不支持多进程操作。用户需要保证音频的相关操作和HI_MPI_SYS_Init在同一个进程中。
370
371SAMPLE_COMM_SYS_Init接口实现细节如下:
372
373以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm_sys.c文件中找到
374
375![](./figures/hispark_taurus_helloworld_sample/032SAMPLE_COMM_SYS_Init%E6%8E%A5%E5%8F%A3.png)
376
377##### 3.1.2.2.5 start vi
378
379通过SAMPLE_COMM_VI_StartVi接口实现启动vi功能,可参考
380
381**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c中**的
382
383**int SampleVioVpssVoMipi(void)**接口中的start vi部分,如下图所示:
384
385![](./figures/hispark_taurus_helloworld_sample/033start%20vi.png)
386
387针对SAMPLE_COMM_VI_StartVi 调用的底层接口进行如下解释和说明:
388
389HI_S32 SAMPLE_COMM_VI_StartVi(SAMPLE_VI_CONFIG_S * pstViConfig)接口开启vi,包括SAMPLE_COMM_VI_StartMIPI()、SAMPLE_COMM_VI_SetParam()、SAMPLE_COMM_VI_CreateVi()、SAMPLE_COMM_VI_CreateIsp()等接口。
390
391这些接口都可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm_vi.c文件中找到
392
393**(1) SAMPLE_COMM_VI_StartMIPI()**
394
395该接口为初始化MIPI。
396
397**(2) SAMPLE_COMM_VI_SetParam()**
398
399该接口涉及到的关键接口HI_MPI_SYS_GetVIVPSSMode、HI_MPI_SYS_SetVIVPSSMode,下面逐一进行解读。
400
401以下接口可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_sys.h文件中找到
402
403**HI_MPI_SYS_GetVIVPSSMode**
404
405【描述】
406
407获取VI、VPSS的工作模式
408
409【语法】
410
411HI_S32 HI_MPI_SYS_GetVIVPSSMode(VI_VPSS_MODE_S* pstVIVPSSMode);
412
413【参数】
414
415| 参数名称      | 描述            | 输入/输出 |
416| ------------- | --------------- | --------- |
417| pstVIVPSSMode | VI/VPSS工作模式 | 输出      |
418
419【返回值】
420
421![](./figures/hispark_taurus_helloworld_sample/034HI_MPI_SYS_GetVIVPSSMode%E8%BF%94%E5%9B%9E%E5%80%BC.png)
422
423【需求】
424
425* 头文件:hi_comm_sys.hmpi_sys.h
426
427* 库文件:libmpi.a
428
429针对HI_MPI_SYS_GetVIVPSSMode接口的出参VI_VPSS_MODE_S结构体进行说明:
430
431**VI_VPSS_MODE_S**
432
433【说明】
434
435* 定义VI PIPE和VPSS组的工作模式
436
437【定义】
438
439![](./figures/hispark_taurus_helloworld_sample/035VI_VPSS_MODE_S%E5%AE%9A%E4%B9%89.png)
440
441【成员】
442
443![](./figures/hispark_taurus_helloworld_sample/036VI_VPSS_MODE_S%E6%88%90%E5%91%98.png)
444
445【注意事项】
446
447Hi3559AV100ES只支持VI_OFFLINE_VPSS_OFFLINE,VI_ONLINE_VPSS_OFFLINE,VI_PARALLEL_VPSS_OFFLINE三种模式
448
449VI_VPSS_MODE_S嵌套VI_VPSS_MODE_E结构体,对该枚举型结构体说明如下:
450
451**VI_VPSS_MODE_E**
452
453【说明】
454
455定义VI PIPE和VPSS组的工作模式。
456
457【定义】
458
459![](./figures/hispark_taurus_helloworld_sample/037VI_VPSS_MODE_E%E5%AE%9A%E4%B9%89.png)
460
461【成员】
462
463![](./figures/hispark_taurus_helloworld_sample/038VI_VPSS_MODE_E%E6%88%90%E5%91%98.png)
464
465![](./figures/hispark_taurus_helloworld_sample/039VI_VPSS_MODE_E%E6%88%90%E5%91%98.png)
466
467【注意事项】
468
469* VI_OFFLINE_VPSS_ONLINE,VI_ONLINE_VPSS_ONLINE,VI_PARALLEL_VPSS_PARALLEL模式下VI PIPE编号与VPSS GROUP号一一对应,数据从VI PIPE流动到VPSS GROUP,不需要软件设定绑定关系。
470
471**HI_MPI_SYS_SetVIVPSSMode**
472
473【描述】
474
475* 设置VI、VPSS工作模式。
476
477【语法】
478
479* HI_S32 HI_MPI_SYS_SetVIVPSSMode(const VI_VPSS_MODE_S* pstVIVPSSMode);
480
481【参数】
482
483![](./figures/hispark_taurus_helloworld_sample/040HI_MPI_SYS_SetVIVPSSMode%E5%8F%82%E6%95%B0.png)
484
485【返回值】
486
487![](./figures/hispark_taurus_helloworld_sample/041HI_MPI_SYS_SetVIVPSSMode%E8%BF%94%E5%9B%9E%E5%80%BC.png)
488
489【需求】
490
491* 头文件:hi_comm_sys.hmpi_sys.h
492
493* 库文件:libmpi.a
494
495【注意】
496
497* 必须在HI_MPI_SYS_Init后,所有的VI PIPE和所有的VPSS组创建前设置。
498
499
500
501**(3) SAMPLE_COMM_VI_CreateVi()**
502
503以下接口可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vi.h文件中找到
504
505**HI_MPI_VI_SetDevAttr**
506
507【描述】
508
509* 设置VI设备属性。基本设备属性默认了部分芯片配置,满足大部分的sensor对接要求。
510
511【语法】
512
513* HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev, const VI_DEV_ATTR_S *pstDevAttr);
514
515【参数】
516
517![](./figures/hispark_taurus_helloworld_sample/042HI_MPI_VI_SetDevAttr%E5%8F%82%E6%95%B0.png)
518
519【返回值】
520
521![](./figures/hispark_taurus_helloworld_sample/043HI_MPI_VI_SetDevAttr%E8%BF%94%E5%9B%9E%E5%80%BC.png)
522
523【芯片差异】
524
525无。
526
527【需求】
528
529* 头文件: hi_comm_vi.hmpi_vi.h
530
531* 库文件:libmpi.a
532
533【注意】
534
535* 不支持BT.1120隔行输入。
536
537* 在调用前要保证VI设备处于禁用状态。如果VI设备已处于使能状态,可以使用HI_MPI_VI_DisableDev来禁用设备
538
539* 参数pstDevAttr主要用来配置指定VI设备的视频接口模式,用于与外围camera、sensor或codec对接,支持的接口模式包括MIPI Rx(MIPI/LVDS/HISPI)、SLVS-EC。用户需要配置以下几类信息,具体属性意义参见**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》3.6“数据类型”部分的说明:
540  * 接口模式信息:接口模式为MIPI Rx(MIPI/LVDS/HISPI)、SLVS-EC等模式
541  * 工作模式信息:1路、2路、4路复合模式
542  * 数据布局信息:复合模式下多路数据的排布
543  *  数据信息:逐行输入、YUV数据输入顺序
544  * 同步时序信息:垂直、水平同步信号的属性
545
546* WDR模式下不支持BAS功能。
547
548
549
550针对HI_MPI_VI_SetDevAttr 接口参数涉及到VI_DEV_ATTR_S结构体进行说明:
551
552以下结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vi.h文件中找到
553
554**VI_DEV_ATTR_S**
555
556【说明】
557
558定义视频输入设备的属性
559
560【定义】
561
562![](./figures/hispark_taurus_helloworld_sample/044VI_DEV_ATTR_S%E5%AE%9A%E4%B9%89.png)
563
564【成员】
565
566![](./figures/hispark_taurus_helloworld_sample/045VI_DEV_ATTR_S%E6%88%90%E5%91%98.png)
567
568![](./figures/hispark_taurus_helloworld_sample/046VI_DEV_ATTR_S%E6%88%90%E5%91%98.png)
569
570![](./figures/hispark_taurus_helloworld_sample/047VI_DEV_ATTR_S%E6%88%90%E5%91%98.png)
571
572【芯片差异】
573
574* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VI_DEV_ATTR_S结构体芯片差异部分。
575
576【注意事项】
577
578* as32AdChnId为无效参数,推荐统一将数组as32AdChnId的值都设为-1
579
580* 不支持多路复合只有1路复合工作模式,必须设置为VI_WORK_MODE_1Multiplex,否则报错。
581
582* stSize中u32Width必须等于实际输入图像的宽度,u32Height必须等于实际输入图像的高度,否则会导致没有图像输出。
583
584* 只有DEV0支持DATA_RATE_X2。enDataRate的值需与mipi_data_rate_t(详情请参考MIPI章节)保持一致。
585
586* 并行模式时,必须配置enDataRate为DATA_RATE_X2。
587
588* DATA_RATE_X2通路配置:MIPI0配置为MIPI_DATA_RATE_X2,DEV0配置DATA_RATE_X2,DEV0绑定PIPE0,其他通路不支持。
589
590* 当接口模式为VI_MODE_MIPI_YUV420_NORMAL,VI_MODE_MIPI_YUV420_LEGACY,VI_MODE_MIPI_YUV422时bDataReverse必须为HI_FALSE,且掩码的设置必须为au32ComponentMask[0] = 0xFF000000,au32ComponentMask[1]= 0x00FF0000,即高8bit输入Y数据,低8bit输入C数据,否则会导致图像异常或无图像等现像。
591
592**HI_MPI_VI_EnableDev**
593
594【描述】
595
596* 启动VI设备
597
598【语法】
599
600* HI_S32 HI_MPI_VI_EnableDev(VI_DEV ViDev);
601
602【参数】
603
604![](./figures/hispark_taurus_helloworld_sample/048HI_MPI_VI_EnableDev%E5%8F%82%E6%95%B0.png)
605
606【返回值】
607
608![](./figures/hispark_taurus_helloworld_sample/049HI_MPI_VI_EnableDev%E8%BF%94%E5%9B%9E%E5%80%BC.png)
609
610【芯片差异】
611
612* 无。
613
614【需求】
615
616* 头文件:hi_comm_vi.hmpi_vi.h
617
618* 库文件:libmpi.a
619
620【注意】
621
622* 启用前必须已经设置设备属性,否则返回失败。
623
624* 可重复启用,不返回失败。
625
626* Hi3516DV300支持同时启动两个VI DEV。
627
628**HI_MPI_VI_SetDevBindPipe**
629
630【描述】
631
632* 设置VI设备与物理PIPE的绑定关系
633
634【语法】
635
636* HI_S32 HI_MPI_VI_SetDevBindPipe(VI_DEV ViDev, const VI_DEV_BIND_PIPE_S *pstDevBindPipe);
637
638【参数】
639
640![](./figures/hispark_taurus_helloworld_sample/050HI_MPI_VI_SetDevBindPipe%E5%8F%82%E6%95%B0.png)
641
642【返回值】
643
644![](./figures/hispark_taurus_helloworld_sample/051HI_MPI_VI_SetDevBindPipe%E8%BF%94%E5%9B%9E%E5%80%BC.png)
645
646【芯片差异】
647
648* 无
649
650【需求】
651
652* 头文件:hi_comm_vi.hmpi_vi.h
653
654* 库文件:libmpi.a
655
656
657
658针对HI_MPI_VI_SetDevBindPipe接口入参涉及的VI_DEV_BIND_PIPE_S进行如下说明:
659
660**VI_DEV_BIND_PIPE_S**
661
662【说明】
663
664* 定义 VI DEV 与 PIPE 的绑定关系。
665
666【定义】
667
668![](./figures/hispark_taurus_helloworld_sample/052VI_DEV_BIND_PIPE_S%E5%AE%9A%E4%B9%89.png)
669
670【成员】
671
672![](./figures/hispark_taurus_helloworld_sample/053VI_DEV_BIND_PIPE_S%E6%88%90%E5%91%98.png)
673
674【注意】
675
676* 无。
677
678**HI_MPI_VI_CreatePipe**
679
680【描述】
681
682* 创建一个VI PIPE
683
684【语法】
685
686* HI_S32 HI_MPI_VI_CreatePipe(VI_PIPE ViPipe, const VI_PIPE_ATTR_S *pstPipeAttr);
687
688【参数】
689
690![](./figures/hispark_taurus_helloworld_sample/054HI_MPI_VI_CreatePipe%E5%8F%82%E6%95%B0.png)
691
692【返回值】
693
694![](./figures/hispark_taurus_helloworld_sample/055HI_MPI_VI_CreatePipe%E5%8F%82%E6%95%B0.png)
695
696【芯片差异】
697
698* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》HI_MPI_VI_CreatePipe芯片差异部分。
699
700【需求】
701
702* 头文件:hi_comm_vi.hmpi_vi.h
703
704* 库文件:libmpi.a
705
706【注意】
707
708* 只有PIPE0支持并行模式。
709
710* 物理PIPE属性中的u32MaxW、u32MaxH、enPixFmt、enBitWidth等必须与前端进入VI的时序设置保持一致,否则会出现错误。
711
712* 不支持重复创建。
713
714* 当VI离线且输入图像大于4096时,不支持压缩。
715
716* WDR模式下需要创建多个物理PIPE绑定到同一个开了WDR的设备上,当进行切换时,需要把所有绑定到该设备的物理PIPE销毁再重建。不能使用上次使用过而未销毁的物理PIPE,否则可能造成错误。
717
718
719
720针对HI_MPI_VI_CreatePipe接口中入参VI_PIPE_ATTR_S结构体进行如下说明:
721
722**VI_PIPE_ATTR_S**
723
724【描述】
725
726* 设置VI PIPE属性
727
728【定义】
729
730![](./figures/hispark_taurus_helloworld_sample/056VI_PIPE_ATTR_S%E5%AE%9A%E4%B9%89.png)
731
732【成员】
733
734![](./figures/hispark_taurus_helloworld_sample/057VI_PIPE_ATTR_S%E6%88%90%E5%91%98.png)
735
736<img src="./figures/hispark_taurus_helloworld_sample/058VI_PIPE_ATTR_S%E6%88%90%E5%91%98.png" style="zoom:130%;" />
737
738![](./figures/hispark_taurus_helloworld_sample/059VI_PIPE_ATTR_S%E6%88%90%E5%91%98.png)
739
740【芯片差异】
741
742* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VI_PIPE_ATTR_S结构体芯片差异内容。
743
744【注意事项】
745
746* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VI_PIPE_ATTR_S结构体注意事项内容。
747
748**HI_MPI_VI_SetPipeVCNumber**
749
750【描述】
751
752* 设置VI物理PIPE对接前端sensor或者AD的VC号。
753
754【语法】
755
756* HI_S32 HI_MPI_VI_SetPipeVCNumber(VI_PIPE ViPipe, HI_U32 u32VCNumber); 
757
758【参数】
759
760![](./figures/hispark_taurus_helloworld_sample/060HI_MPI_VI_SetPipeVCNumber%E5%8F%82%E6%95%B0.png)
761
762【返回值】
763
764![](./figures/hispark_taurus_helloworld_sample/061HI_MPI_VI_SetPipeVCNumber%E8%BF%94%E5%9B%9E%E5%80%BC.png)
765
766【芯片差异】
767
768* 无。
769
770【需求】
771
772* 头文件:mpi_vi.h
773
774【注意】
775
776* 必须在 PIPE 创建后,使能之前调用。
777
778* 虚拟 PIPE 不支持。
779
780  
781
782**HI_MPI_VI_DestroyPipe**
783
784【描述】
785
786* 销毁一个VI PIPE
787
788【语法】
789
790* HI_S32 HI_MPI_VI_DestroyPipe(VI_PIPE ViPipe);
791
792【参数】
793
794![](./figures/hispark_taurus_helloworld_sample/062HI_MPI_VI_DestroyPipe%20%E5%8F%82%E6%95%B0.png)
795
796【返回值】
797
798![](./figures/hispark_taurus_helloworld_sample/063HI_MPI_VI_DestroyPipe%E8%BF%94%E5%9B%9E%E5%80%BC.png)
799
800【芯片差异】
801
802* 无。
803
804【需求】
805
806* 头文件:hi_comm.hmpi_vi.h
807
808【注意】
809
810* 使用本接口前,需先调用HI_MPI_VI_StopPipe(ViPipe)停止PIPE,否则提示失败。
811* 在未创建PIPE或重复销毁PIPE时,调用本接口,将提示PIPE不存在。
812
813
814
815**HI_MPI_VI_StartPipe**
816
817【配置】
818
819* 启用VI PIPE
820
821【语法】
822
823* HI_S32 HI_MPI_VI_StartPipe(VI_PIPE ViPipe);
824
825【参数】
826
827![](./figures/hispark_taurus_helloworld_sample/064HI_MPI_VI_StartPipe%E5%8F%82%E6%95%B0.png)
828
829【返回值】
830
831![](./figures/hispark_taurus_helloworld_sample/065HI_MPI_VI_StartPipe%E8%BF%94%E5%9B%9E%E5%80%BC.png)
832
833【芯片差异】
834
835* 无
836
837【需求】
838
839* 头文件:hi_comm_vi.hmpi_vi.h
840
841* 库文件:libmpi.a
842
843【注意】
844
845* PIPE必须已创建
846* 重复调用该函数设置同一个PIPE返回成功。
847
848
849
850**HI_MPI_VI_SetChnAttr**
851
852【描述】
853
854* 设置VI通道属性
855
856【语法】
857
858* HI_S32 HI_MPI_VI_SetChnAttr(VI_PIPE ViPipe, VI_CHN ViChn, const VI_CHN_ATTR_S *pstChnAttr);
859
860【参数】
861
862![](./figures/hispark_taurus_helloworld_sample/066%20HI_MPI_VI_SetChnAttr%E5%8F%82%E6%95%B0.png)
863
864【返回值】
865
866![](./figures/hispark_taurus_helloworld_sample/067HI_MPI_VI_SetChnAttr%E8%BF%94%E5%9B%9E%E5%80%BC.png)
867
868【芯片差异】
869
870* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》中的HI_MPI_VI_SetChnAttr芯片差异内容。
871
872【注意事项】
873
874* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》中的HI_MPI_VI_SetChnAttr注意事项内容。
875
876
877
878**HI_MPI_VI_EnableChn**
879
880【描述】
881
882* 启动VI通道
883
884【语法】
885
886* HI_S32 HI_MPI_VI_EnableChn(VI_PIPE ViPipe, VI_CHN ViChn);
887
888【参数】
889
890![](./figures/hispark_taurus_helloworld_sample/068HI_MPI_VI_EnableChn%E5%8F%82%E6%95%B0.png)
891
892【返回值】
893
894![](./figures/hispark_taurus_helloworld_sample/069HI_MPI_VI_EnableChn%E8%BF%94%E5%9B%9E%E5%80%BC.png)
895
896【芯片差异】
897
898* 无
899
900【需求】
901
902* 头文件:hi_comm_vi.hmpi_vi.h
903
904* 库文件:libmpi.h
905
906【注意】
907
908* PIPE必须已创建,否则会返回失败。
909* 必须先设置通道属性。 
910* 若启用扩展通道,则必须保证此通道绑定的源物理通道已经使能,否则返回失败错误码。 
911* 可重复启用VI通道,不返回失败。 
912* VI在线VPSS在线模式、VI 离线VPSS在线模式,VI并行VPSS并行模式下,启动VI通道不生效,直接返回成功。
913
914
915
916**HI_MPI_VI_StopPipe**
917
918【描述】
919
920* 禁用VI PIPE。
921
922【语法】
923
924* HI_S32 HI_MPI_VI_StopPipe(VI_PIPE ViPipe);
925
926【参数】
927
928![](./figures/hispark_taurus_helloworld_sample/070HI_MPI_VI_StopPipe%E5%8F%82%E6%95%B0.png)
929
930【返回值】
931
932![](./figures/hispark_taurus_helloworld_sample/071HI_MPI_VI_StopPipe%E8%BF%94%E5%9B%9E%E5%80%BC.png)
933
934【芯片差异】
935
936* 无。
937
938【需求】
939
940* 头文件:hi_comm_vi.hmpi_vi.h
941
942【注意】
943
944* PIPE必须已创建。
945
946* 重复调用该函数设置同一个PIPE返回成功。
947
948
949
950**HI_MPI_VI_DisableDev**
951
952【描述】
953
954* 禁用VI设备。
955
956【语法】
957
958* HI_S32 HI_MPI_VI_DisableDev(VI_DEV ViDev);
959
960【参数】
961
962![](./figures/hispark_taurus_helloworld_sample/072HI_MPI_VI_DisableDev%E5%8F%82%E6%95%B0.png)
963
964【返回值】
965
966![](./figures/hispark_taurus_helloworld_sample/073HI_MPI_VI_DisableDev%E8%BF%94%E5%9B%9E%E5%80%BC.png)
967
968【芯片差异】
969
970* 无。
971
972【需求】
973
974* 头文件:hi_comm_vi.hmpi_vi.h
975
976* 库文件:libmpi.a
977
978【注意】
979
980* 需先销毁所有与该VI设备绑定的物理PIPE后,再禁用VI设备
981
982* 可重复禁用,不返回失败。
983
984* 支持低功耗处理,禁用VI设备后将完全关闭该设备,需要重新设置属性,才能使能VI设备。
985
986
987
988**HI_MPI_VI_DisableChn**
989
990【描述】
991
992* 禁用VI通道。
993
994【语法】
995
996* HI_S32 HI_MPI_VI_DisableChn(VI_PIPE ViPipe, VI_CHN ViChn);
997
998【参数】
999
1000![](./figures/hispark_taurus_helloworld_sample/074HI_MPI_VI_DisableChn%E5%8F%82%E6%95%B0.png)
1001
1002【返回值】
1003
1004![](./figures/hispark_taurus_helloworld_sample/075HI_MPI_VI_DisableChn%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1005
1006【芯片差异】
1007
1008* 无。
1009
1010【需求】
1011
1012* 头文件:hi_comm_vi.hmpi_vi.h
1013
1014* 库文件:libmpi.a
1015
1016【注意】
1017
1018* PIPE必须已创建,否则会返回失败。
1019
1020* 若禁用物理通道,则必须保证此通道绑定的扩展通道已经全部禁用,否则返回失败的错误码。
1021
1022* 可重复禁用VI通道,不返回失败。
1023
1024* VI在线VPSS在线模式、VI离线VPSS在线模式,VI并行VPSS并行模式下,禁用VI通道不生效,直接返回成功。
1025
1026
1027
1028**SAMPLE_COMM_VI_CreateIsp**
1029
1030ISP通过一系列数字图像处理算法完成对数字图像的效果处理。主要包括3A、坏点校正、去噪、强光抑制、背光补偿、色彩增强、镜头阴影校正等处理。
1031
1032ISP包括逻辑部分以及运行在其上的firmware ISP部分底层接口优先参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiISP 开发参考.pdf》指导手册,针对SAMPLE_COMM_VI_CreateIsp用到关键底层接口做如下说明:
1033
1034**注:下文涉及的所有AE库接口都只是针对上海海思AE库,如果客户自己实现AE库,不需要关注这些接口,且无法使用这些接口。所有AWB库接口都只是针对上海海思AWB库,如果客户自己实现AWB库,不需要关注这些接口,且无法使用这些接口。**
1035
1036以下接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_isp.h文件中找到
1037
1038**HI_MPI_ISP_MemInit**
1039
1040【描述】
1041
1042* 初始化ISP外部寄存器
1043
1044【语法】
1045
1046* HI_S32 HI_MPI_ISP_MemInit(VI_PIPE ViPipe);
1047
1048【参数】
1049
1050![](./figures/hispark_taurus_helloworld_sample/076HI_MPI_ISP_MemInit%E5%8F%82%E6%95%B0.png)
1051
1052【返回值】
1053
1054![](./figures/hispark_taurus_helloworld_sample/077HI_MPI_ISP_MemInit%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1055
1056【需求】
1057
1058* 头文件:hi_comm_isp.hmpi_isp.h
1059
1060* 库文件:libisp.a
1061
1062【注意事项】
1063
1064* 自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiISP 开发参考.pdf》指导手册中的HI_MPI_ISP_MemInit结构体注意事项内容。
1065
1066**HI_MPI_ISP_Init**
1067
1068【描述】
1069
1070* 初始化ISP firmware
1071
1072【语法】
1073
1074* HI_S32 HI_MPI_ISP_Init(VI_PIPE ViPipe);
1075
1076【参数】
1077
1078![](./figures/hispark_taurus_helloworld_sample/078HI_MPI_ISP_Init%E5%8F%82%E6%95%B0.png)
1079
1080【返回值】
1081
1082![](./figures/hispark_taurus_helloworld_sample/079HI_MPI_ISP_Init%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1083
1084【需求】
1085
1086* 头文件:hi_comm_isp.hmpi_isp.h
1087
1088* 库文件:libisp.a
1089
1090【注意】
1091
1092* 自行参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiISP 开发参考.pdf》指导手册中的HI_MPI_ISP_Init注意事项内容。
1093
1094
1095
1096**HI_MPI_ISP_Exit**
1097
1098【描述】
1099
1100* 退出ISP firmware
1101
1102【语法】
1103
1104* HI_S32 HI_MPI_ISP_Exit(VI_PIPE ViPipe);
1105
1106【参数】
1107
1108![](./figures/hispark_taurus_helloworld_sample/080HI_MPI_ISP_Exit%E5%8F%82%E6%95%B0.png)
1109
1110【返回值】
1111
1112![](./figures/hispark_taurus_helloworld_sample/081HI_MPI_ISP_Exit%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1113
1114【需求】
1115
1116* 头文件:hi_comm_isp.hmpi_isp.h
1117
1118* 库文件:libisp.a
1119
1120【注意】
1121
1122* 调用HI_MPI_ISP_Init和HI_MPI_ISP_Run之后,再调用本接口退出ISP firmware。 
1123
1124* 不支持多进程,必须要与 sensor_register_callback、HI_MPI_AE_Register、HI_MPI_AWB_Register、HI_MPI_ISP_MemInit、HI_MPI_ISP_Init、HI_MPI_ISP_Run 接口在同一个进程调用。 
1125
1126* 支持重复调用本接口。
1127
1128* 在拼接模式时,必须先退出主pipe,后退出其他pipe。 
1129
1130* 不支持相同ViPipe时,多线程执行ISP创建和销毁(多线程同时调用sensor_register_callback、HI_MPI_AE_Register、HI_MPI_AWB_Register、HI_MPI_ISP_MemInit、HI_MPI_ISP_Init、HI_MPI_ISP_Exit) 
1131
1132* 推荐调用 HI_MPI_ISP_Init 之后,在调用本接口。
1133
1134
1135
1136**HI_MPI_ISP_SetPubAttr**
1137
1138【描述】
1139
1140* 设置 ISP 公共属性。
1141
1142【语法】
1143
1144* HI_S32 HI_MPI_ISP_SetPubAttr(VI_PIPE ViPipe, const ISP_PUB_ATTR_S *pstPubAttr);
1145
1146【参数】
1147
1148![](./figures/hispark_taurus_helloworld_sample/082HI_MPI_ISP_SetPubAttr%E5%8F%82%E6%95%B0.png)
1149
1150【返回值】
1151
1152![](./figures/hispark_taurus_helloworld_sample/083HI_MPI_ISP_SetPubAttr%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1153
1154【需求】
1155
1156* 头文件:hi_comm_isp.hmpi_isp.h
1157
1158* 库文件:libisp.a
1159
1160【注意】
1161
1162* 自行参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiISP 开发参考.pdf》HI_MPI_ISP_SetPubAttr中的注意内容。
1163
1164
1165
1166**HI_MPI_ISP_Run**
1167
1168【描述】
1169
1170* 运行ISP firmware
1171
1172【语法】
1173
1174* HI_S32 HI_MPI_ISP_Run(VI_PIPE ViPipe);
1175
1176【参数】
1177
1178![](./figures/hispark_taurus_helloworld_sample/084HI_MPI_ISP_Run%E5%8F%82%E6%95%B0.png)
1179
1180【返回值】
1181
1182![](./figures/hispark_taurus_helloworld_sample/085HI_MPI_ISP_Run%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1183
1184【需求】
1185
1186* 头文件:hi_comm_isp.hmpi_isp.h
1187
1188* 库文件:libisp.a
1189
1190【注意】
1191
1192* 运行前需要确保sensor已经初始化,并且向ISP注册了回调函数。
1193
1194* 运行前需要确保已调用HI_MPI_ISP_Init初始化ISP
1195
1196* 不支持多进程,必须要与sensor_register_callback、HI_MPI_AE_Register、HI_MPI_AWB_Register、HI_MPI_ISP_MemInit、HI_MPI_ISP_Init、HI_MPI_ISP_Exit接口在同一个进程调用。
1197
1198* 该接口是阻塞接口,建议用户采用实时线程处理。
1199
1200
1201
1202此接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_awb.h文件中找到
1203
1204**HI_MPI_AWB_UnRegister**
1205
1206【描述】
1207
1208* 向ISP注消AWB库。
1209
1210【语法】
1211
1212* HI_S32 HI_MPI_AWB_UnRegister(VI_PIPE ViPipe, ALG_LIB_S*pstAwbLib);
1213
1214【参数】
1215
1216![](./figures/hispark_taurus_helloworld_sample/086HI_MPI_AWB_UnRegister%E5%8F%82%E6%95%B0.png)
1217
1218【返回值】
1219
1220![](./figures/hispark_taurus_helloworld_sample/087HI_MPI_AWB_UnRegister%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1221
1222【需求】
1223
1224* 头文件:hi_comm_isp.hmpi_awb.h
1225
1226* 库文件:libisp.a
1227
1228【注意】
1229
1230* 该接口调用了ISP库提供的AWB反注册回调接口HI_MPI_ISP_AWBLibRegCallBack,以实现AWB向ISP库反注册的功能。
1231* 用户调用此接口完成上海海思AWB库向ISP库反注册,此接口不支持多进程操作。
1232* 
1233
1234以下接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_ae.h文件中找到
1235
1236**HI_MPI_AE_UnRegister**
1237
1238【描述】
1239
1240* 向ISP反注册AE库。
1241
1242【语法】
1243
1244* HI_S32 HI_MPI_AE_UnRegister(VI_PIPE ViPipe, ALG_LIB_S *pstAeLib);
1245
1246【参数】
1247
1248![](./figures/hispark_taurus_helloworld_sample/088HI_MPI_AE_UnRegister%E5%8F%82%E6%95%B0.png)
1249
1250【返回值】
1251
1252![](./figures/hispark_taurus_helloworld_sample/089HI_MPI_AE_UnRegister%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1253
1254【需求】
1255
1256* 头文件:hi_comm_isp.hmpi_ae.h
1257
1258* 库文件:libisp.alib_hiae.a
1259
1260【注意】
1261
1262* 该接口调用了ISP库提供的AE反注册回调接口HI_MPI_ISP_AELibUnRegCallBack,以实现AE向ISP库反注册的功能。
1263
1264* 此接口不支持多进程操作。
1265
1266
1267
1268**HI_MPI_AE_Register**
1269
1270【描述】
1271
1272* 向ISP注册AE库。
1273
1274【语法】
1275
1276* HI_S32 HI_MPI_AE_Register(VI_PIPE ViPipe, ALG_LIB_S *pstAeLib);
1277
1278【参数】
1279
1280![](./figures/hispark_taurus_helloworld_sample/090HI_MPI_AE_Register%E5%8F%82%E6%95%B0.png)
1281
1282【返回值】
1283
1284![](./figures/hispark_taurus_helloworld_sample/091HI_MPI_AE_Register%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1285
1286【需求】
1287
1288* 头文件:hi_comm_isp.hmpi_ae.h
1289
1290* 库文件:libisp.alib_hiae.a
1291
1292【注意】
1293
1294* 该接口调用了ISP库提供的AE注册回调接口HI_MPI_ISP_AELibRegCallBack,以实现上海海思AE库向ISP库注册的功能。
1295* AE库可以注册多个实例。
1296* 此接口不支持多进程操作。
1297
1298
1299
1300以下接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_awb.h文件中找到
1301
1302**HI_MPI_AWB_Register**
1303
1304【描述】
1305
1306* 向ISP注册AWB库。
1307
1308【语法】
1309
1310* HI_S32 HI_MPI_AWB_Register(VI_PIPE ViPipe, ALG_LIB_S *pstAwbLib);
1311
1312【参数】
1313
1314![](./figures/hispark_taurus_helloworld_sample/092HI_MPI_AWB_Register%E5%8F%82%E6%95%B0.png)
1315
1316【返回值】
1317
1318![](./figures/hispark_taurus_helloworld_sample/093HI_MPI_AWB_Register%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1319
1320【需求】
1321
1322* 头文件:hi_comm_isp.hmpi_awb.h
1323
1324* 库文件:libisp.a
1325
1326【注意】
1327
1328* 该接口调用了ISP库提供的AWB注册回调接口HI_MPI_ISP_AWBLibRegCallBack,以实现向ISP库注册的功能。
1329
1330* 用户调用此接口完成上海海思AWB库向ISP库注册。
1331
1332* AWB库可以注册多个实例,此接口不支持多进程操作。
1333
1334
1335
1336以下接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_isp.h文件中找到
1337
1338**HI_MPI_ISP_AWBLibRegCallBack**
1339
1340【描述】
1341
1342* ISP提供的AWB库注册的回调接口。
1343
1344【语法】
1345
1346* HI_S32 HI_MPI_ISP_AWBLibRegCallBack(VI_PIPE ViPipe, ALG_LIB_S *pstAwbLib, ISP_AWB_REGISTER_S *pstRegister);
1347
1348【参数】
1349
1350![](./figures/hispark_taurus_helloworld_sample/094HI_MPI_ISP_AWBLibRegCallBack%E5%8F%82%E6%95%B0.png)
1351
1352【返回值】
1353
1354![](./figures/hispark_taurus_helloworld_sample/095HI_MPI_ISP_AWBLibRegCallBack%E8%BF%94%E5%9B%9E%E5%80%BCpng.png)
1355
1356【需求】
1357
1358* 头文件:hi_comm_isp.hmpi_isp.h
1359
1360* 库文件:libisp.a
1361
1362【注意】
1363
1364* ISP提供统一的AWB算法库接口,初始化、运行、控制、销毁AWB算法库。使用上海海思AWB算法库时,不需要关注此接口;使用用户自己的AWB算法库时,需要调用此接口向ISP注册回调函数。
1365
1366* 此接口不支持多进程操作。
1367
1368* 最大支持2个AWB库注册。
1369
1370ISP库与AWB库间的接口如下图所示:
1371
1372![](./figures/hispark_taurus_helloworld_sample/096ISP%E5%BA%93%E4%B8%8EAWB%E5%BA%93%E9%97%B4%E7%9A%84%E6%8E%A5%E5%8F%A3.png)
1373
1374
1375
1376**HI_MPI_ISP_AELibUnRegCallBack**
1377
1378【描述】
1379
1380* ISP提供的AE库反注册的回调接口。
1381
1382【语法】
1383
1384* HI_S32 HI_MPI_ISP_AELibUnRegCallBack(VI_PIPE ViPipe, ALG_LIB_S *pstAeLib);
1385
1386【参数】
1387
1388![](./figures/hispark_taurus_helloworld_sample/097HI_MPI_ISP_AELibUnRegCallBack%E5%8F%82%E6%95%B0.png)
1389
1390【返回值】
1391
1392![](./figures/hispark_taurus_helloworld_sample/098HI_MPI_ISP_AELibUnRegCallBack%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1393
1394【需求】
1395
1396* 头文件:hi_comm_isp.hmpi_isp.h
1397
1398* 库文件:libisp.a
1399
1400【注意】
1401
1402* 使用上海海思AE算法库时,不需要关注此接口;使用用户自己的AE算法库时,需要调用此接口向ISP反注册回调函数。
1403
1404* 此接口不支持多进程操作。
1405
1406
1407
1408**HI_MPI_ISP_AELibRegCallBack**
1409
1410【描述】
1411
1412* ISP提供的AE库注册的回调接口。
1413
1414【语法】
1415
1416* HI_S32 HI_MPI_ISP_AELibRegCallBack(VI_PIPE ViPipe, ALG_LIB_S *pstAeLib, ISP_AE_REGISTER_S *pstRegister);
1417
1418【参数】
1419
1420![](./figures/hispark_taurus_helloworld_sample/099HI_MPI_ISP_AELibRegCallBack%E5%8F%82%E6%95%B0.png)
1421
1422【返回值】
1423
1424![](./figures/hispark_taurus_helloworld_sample/100HI_MPI_ISP_AELibRegCallBack%E8%BF%94%E5%9B%9E%E5%80%BC.png)
1425
1426【需求】
1427
1428* 头文件:hi_comm_isp.hmpi_isp.h
1429
1430* 库文件:libisp.a
1431
1432【注意】
1433
1434* ISP提供统一的AE算法库接口,初始化、运行、控制、销毁AE算法库。使用上海海思AE算法库时,不需要关注此接口;使用用户自己的AE算法库时,需要调用此接口向ISP注册回调函数。
1435
1436* 此接口不支持多进程操作。
1437
1438* 最大支持2个AE库注册。
1439
1440ISP库与AE库间的接口关系如下图所示:
1441
1442![](./figures/hispark_taurus_helloworld_sample/101ISP%E5%BA%93%E4%B8%8EAE%E5%BA%93%E9%97%B4%E7%9A%84%E6%8E%A5%E5%8F%A3%E5%85%B3%E7%B3%BB.png)
1443