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 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 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 30 31分析SAMPLE_VI_CONFIG_S结构体,核心是对SAMPLE_VI_INFO_S结构体进行配置,如下图所示: 32 33 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 42 43**SAMPLE_DEV_INFO_S:** 44 45该结构体定义:ViDev、WDRMode成员。 46 47 48 49**SAMPLE_PIPE_INFO_S:** 50 51该结构体定义:Pipe、MastPipeMode、MultiPipe、VcNumCfged、IspBypass、PixFmt、VCNum结构体成员。 52 53 54 55**SAMPLE_CHN_INFO_S:** 56 57该结构体成员定义:ViChn、PixFormat、DynamicRange、VideoFormat、CompressMode成员。 58 59 60 61**SAMPLE_SNAP_INFO_S:** 62 63该结构体成员定义:Snap、DoublePipe、VideoPipe、SnapPipe、VideoPipeMode、SnapPipeMode成员。 64 65 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 74 75配置vi还需要配置SAMPLE_VI_CONFIG_S其他成员元素,实现细节如下: 76 77以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 78 79 80 81 82 83 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 92 93根据SAMPLE_COMM_VI_GetSizeBySensor接口输出的enPicSize来得到图片的width和height,实现方式通过SAMPLE_COMM_SYS_GetPicSize来实现,如下图所示: 94 95 96 97SAMPLE_COMM_VI_GetSizeBySensor和SAMPLE_COMM_SYS_GetPicSize接口实现方式较为简单,读者自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/目录**下的**sample_comm_vi.c和sample_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 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 128 129【成员】 130 131 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 150 151【成员】 152 153 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 174 175【成员】 176 177 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 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 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 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 224 225【需求】 226 227* 头文件:hi_comm_sys.h、mpi_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 260 261【需求】 262 263* 头文件:hi_comm_vb.h、mpi_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 290 291【返回值】 292 293 294 295【需求】 296 297* 头文件:hi_comm_vb.h、mpi_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 326 327【需求】 328 329* 头文件:hi_comm_vb.h、mpi_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 356 357【需求】 358 359* 头文件:hi_comm_sys.h、mpi_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 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 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 422 423【需求】 424 425* 头文件:hi_comm_sys.h、mpi_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 440 441【成员】 442 443 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 460 461【成员】 462 463 464 465 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 484 485【返回值】 486 487 488 489【需求】 490 491* 头文件:hi_comm_sys.h、mpi_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 518 519【返回值】 520 521 522 523【芯片差异】 524 525无。 526 527【需求】 528 529* 头文件: hi_comm_vi.h 、 mpi_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 563 564【成员】 565 566 567 568 569 570 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 605 606【返回值】 607 608 609 610【芯片差异】 611 612* 无。 613 614【需求】 615 616* 头文件:hi_comm_vi.h、mpi_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 641 642【返回值】 643 644 645 646【芯片差异】 647 648* 无 649 650【需求】 651 652* 头文件:hi_comm_vi.h、mpi_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 669 670【成员】 671 672 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 691 692【返回值】 693 694 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.h、mpi_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 731 732【成员】 733 734 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 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 761 762【返回值】 763 764 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 795 796【返回值】 797 798 799 800【芯片差异】 801 802* 无。 803 804【需求】 805 806* 头文件:hi_comm.h、mpi_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 828 829【返回值】 830 831 832 833【芯片差异】 834 835* 无 836 837【需求】 838 839* 头文件:hi_comm_vi.h、mpi_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 863 864【返回值】 865 866 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 891 892【返回值】 893 894 895 896【芯片差异】 897 898* 无 899 900【需求】 901 902* 头文件:hi_comm_vi.h、mpi_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 929 930【返回值】 931 932 933 934【芯片差异】 935 936* 无。 937 938【需求】 939 940* 头文件:hi_comm_vi.h、mpi_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 963 964【返回值】 965 966 967 968【芯片差异】 969 970* 无。 971 972【需求】 973 974* 头文件:hi_comm_vi.h、mpi_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 1001 1002【返回值】 1003 1004 1005 1006【芯片差异】 1007 1008* 无。 1009 1010【需求】 1011 1012* 头文件:hi_comm_vi.h、mpi_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 1051 1052【返回值】 1053 1054 1055 1056【需求】 1057 1058* 头文件:hi_comm_isp.h、mpi_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 1079 1080【返回值】 1081 1082 1083 1084【需求】 1085 1086* 头文件:hi_comm_isp.h、mpi_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 1109 1110【返回值】 1111 1112 1113 1114【需求】 1115 1116* 头文件:hi_comm_isp.h、mpi_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 1149 1150【返回值】 1151 1152 1153 1154【需求】 1155 1156* 头文件:hi_comm_isp.h、mpi_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 1179 1180【返回值】 1181 1182 1183 1184【需求】 1185 1186* 头文件:hi_comm_isp.h、mpi_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 1217 1218【返回值】 1219 1220 1221 1222【需求】 1223 1224* 头文件:hi_comm_isp.h、mpi_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 1249 1250【返回值】 1251 1252 1253 1254【需求】 1255 1256* 头文件:hi_comm_isp.h、mpi_ae.h 1257 1258* 库文件:libisp.a、lib_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 1281 1282【返回值】 1283 1284 1285 1286【需求】 1287 1288* 头文件:hi_comm_isp.h、mpi_ae.h 1289 1290* 库文件:libisp.a、lib_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 1315 1316【返回值】 1317 1318 1319 1320【需求】 1321 1322* 头文件:hi_comm_isp.h、mpi_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 1351 1352【返回值】 1353 1354 1355 1356【需求】 1357 1358* 头文件:hi_comm_isp.h、mpi_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 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 1389 1390【返回值】 1391 1392 1393 1394【需求】 1395 1396* 头文件:hi_comm_isp.h、mpi_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 1421 1422【返回值】 1423 1424 1425 1426【需求】 1427 1428* 头文件:hi_comm_isp.h、mpi_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 1443