1### 3.1.4 VO理论及实现方式 2 3#### 3.1.4.1 VO理论 4 5VO(Video Output,视频输出)模块主动从内存相应位置读取视频和图形数据,并通过相应的显示设备输出视频和图形。Hi3516DV300支持的显示/回写设备、视频层和图形层情况如下表所示,其他芯片型号请自行查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》中的表4-1内容。 6 7 8 9注:缩写解释 10 11DHD0:Device HD0,超高清设备0。 12 13DHD1:Device HD1,高清设备1。 14 15VHD0:Video layer of HD0,超高清视频层0,隶属于DHD0。 16 17VHD1:Video layer of HD1,高清视频层1,隶属于DHD1。 18 19VHD2:Video layer of HD2,高清视频层2,Hi3559AV100上隶属于DHD0,Hi3519AV100/Hi3556AV100上可以绑定至DHD0或者DHD1,用作PIP层。 20 21WD:Write Back Channel Device,回写通道设备。 22 23图形层G3:Graphic layer3,用作鼠标层,DHD0和DHD1中均有此项,但只能绑定其中一个设备,G3默认绑定在DHD1上 24 25**VO基本概念:** 26 27* 超高清、高清和标清显示设备 28 29SDK将高清和标清显示设备分别标示为DHDx(Device High Definition x)和DSDx(Device Standard Definition x),其中,x为索引号,从0开始取值,表示第几路高清/标清显示设备。例如第0路高清设备标示为DHD0,第0路标清显示设备标示为DSD0。所有高清和标清显示设备又可分别简称为HD和SD设备。Hi3516DV300中有1个高清显示设备DHD0。由于DHD0能够支持到4K(3840x2160)的时序,因此DHD0也可以称之为超高清显示设备。 30 31* 视频层 32 33对于固定在每个显示设备上面对应的视频层,SDK也对应采取VHDx和VSDx来标示。芯片支持显示设备的情况请参见表4-1。芯片HD设备功能对比参考表4-2。芯片VHD视频层功能对比如表4-3所示。视频层和显示设备的实际显示分辨率依赖于具体输出接口,设备上视频输出接口支持的最大时序见表4-4所示。 34 35**注:表4-1,表4-2,表4-3,表4-4均来自源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中的《HiMPP媒体处理软件 V4.0 开发参考.pdf》,对应各自的芯片型号查阅即可。** 36 37#### 3.1.4.2 实现方式 38 39在启动vo之前需要先config vo,围绕SAMPLE_VO_CONFIG_S结构体进行配置,该结构体由3大部分组成:device、layer、channel,如下图所示: 40 41此结构体可在 device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm.h中找到 42 43 44 45 46 47config vo代码实现细节如下图所示: 48 49可参考源码device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c中的StVoParamCfg( )接口 50 51 52 53需要配置mipi参数,配置前先仔细阅读mipi参数文档(由屏幕厂商提供),通过SAMPLE_VO_CONFIG_MIPI接口进行配置,如下图所示: 54 55注:关于config mipi参与细节,自行查阅device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c 中SAMPLE_VO_CONFIG_MIPI内容即可。 56 57下图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件的SampleVioVpssVoMipi()接口中找到。 58 59 60 61接下来需要start vo,start vo可参考SampleCommVoStartMipi接口,如下图所示: 62 63下图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件的SampleVioVpssVoMipi()接口中找到。 64 65 66 67关于SampleCommVoStartMipi接口调用的底层API进行如下说明: 68 69**VO_PUB_ATTR_S** 70 71此结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo_dev.h中找到 72 73【说明】 74 75定义视频输出公共属性结构体。 76 77【定义】 78 79 80 81【成员】 82 83 84 85【芯片差异】 86 87**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_PUB_ATTR_S结构体芯片差异内容。 88 89【注意事项】 90 91**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_PUB_ATTR_S结构体注意事项内容。 92 93**VO_VIDEO_LAYER_ATTR_S** 94 95此结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo.h中找到 96 97【说明】 98 99定义视频层属性。 100 101在视频层属性中存在三个概念,即设备分辨率、显示分辨率和图像分辨率。每种分辨率的概念可以从下图中可以看出: 102 103* 图像分辨率指放置各个通道图像的画布大小。 104 105* 显示分辨率是把图像分辨率中描述的画布经过VO放大后的显示区域。 106 107* 设备分辨率与设备时序一致,即如果时序为1920 x 1080,那设备分辨率就为1920 x 1080。 108 109 110 111视频层的内存使用分为通道聚集(如图a所示)和非聚集(如图b所示)两种方式。 112 113* **聚集方式:** 114 115 * 决定内存分配大小的因素:实际显示通道的分辨率的总和。 116 117 * 不支持视频层的放大功能。 118 119 * 仅适用于MULTI模式。 120 121 * 聚集方式开启后,对于MULTI模式下的视频层,可以调用通道显示位置接口(HI_MPI_VO_SetChnDisplayPosition)来合理布局通道的显示位置。 122 123* **非聚集方式:** 124* 决定内存分配大小的因素:显示图像的起始坐标(0,0)与最右下角的坐标所决定的区域大小和缩放比例(图像分辨率与显示分辨率的比)。 125 126* 支持视频层的放大功能。通过视频放大功能,在相同显示分辨率情况下,依据适当的比例把图像分辨率调小,那么需要分配的内存也相应减少,这种情况下可以做到节省内存,但是会因放大导致图像质量下降。 127 128* 在拼接好图像画面后,通道画面的显示位置不可以调整。 129 130图a 视频层使用聚集内存方式的场景a(聚集使用内存) 131 132 133 134图b 视频层使用非聚集内存方式的场景b(非聚集使用内存) 135 136 137 138【定义】 139 140 141 142【成员】 143 144 145 146【差异说明】 147 148**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_VIDEO_LAYER_ATTR_S结构体差异说明内容。 149 150【注意事项】 151 152**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_VIDEO_LAYER_ATTR_S结构体注意事项内容。 153 154**VO_CSC_S** 155 156此结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo_dev.h中找到 157 158【说明】 159 160定义图像输出效果结构体。 161 162【定义】 163 164 165 166【成员】 167 168 169 170在SampleCommVoStartMipi接口中,调用了SampleCommVoStartDevMipi来启动device,对SampleCommVoStartDevMipi接口调用的底层接口做如下说明: 171 172**VO_USER_INTFSYNC_INFO_S** 173 174此结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo_dev.h中找到 175 176【说明】 177 178用户接口时序信息,包括配置时钟源类型、时钟大小、时钟分频比和时钟相位,它们的拓扑关系如下图所示: 179 180 181 182【定义】 183 184 185 186【成员】 187 188 189 190【注意事项】 191 192**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_USER_INTFSYNC_INFO_S结构体中的注意事项内容,里面介绍了不同芯片的时钟分频比配置方法、前置分频配置方法、用户时序信息推导方法等,开发者自行查阅即可。 193 194 195 196以下四个接口可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo_dev.h中找到 197 198**HI_MPI_VO_SetPubAttr** 199 200【描述】 201 202配置视频输出设备的公共属性。 203 204【语法】 205 206HI_S32 HI_MPI_VO_SetPubAttr(VO_DEVVoDev, const VO_PUB_ATTR_S *pstPubAttr); 207 208【参数】 209 210 211 212【返回值】 213 214 215 216【需求】 217 218* 头文件:mpi_vo.h、hi_comm_vo.h 219 220* 库文件:libmpi.a 221 222【注意】 223 224* 视频输出设备属性为静态属性,必须在执行HI_MPI_VO_Enable前配置。 225 226* 各个DEV的使用说明详见VO_DEV。 227 228* 视频输出设备属性的使用说明详见VO_PUB_ATTR_S章节。 229 230 231 232**HI_MPI_VO_SetDevFrameRate** 233 234【描述】 235 236* 设置设备用户时序下设备帧率。 237 238【语法】 239 240* HI_S32 HI_MPI_VO_SetDevFrameRate(VO_DEVVoDev, HI_U32 u32FrameRate); 241 242【参数】 243 244 245 246【返回值】 247 248 249 250【需求】 251 252* 头文件:mpi_vo.h、hi_comm_vo.h 253 254* 库文件:libmpi.a 255 256【注意】 257 258* 只能在用户时序下使用。 259 260* 只能在调用HI_MPI_VO_SetPubAttr之后、HI_MPI_VO_Enable之前调用。 261 262 263 264**HI_MPI_VO_SetUserIntfSyncInfo** 265 266【描述】 267 268* 设置用户接口时序信息,用于配置时钟源、时钟大小和时钟分频比。 269 270【语法】 271 272* HI_S32 HI_MPI_VO_SetUserIntfSyncInfo (VO_DEV VoDev, VO_USER_INTFSYNC_INFO_S *pstUserInfo); 273 274【参数】 275 276 277 278【返回值】 279 280 281 282【需求】 283 284* 头文件:mpi_vo.h、hi_comm_vo.h 285 286* 库文件:libmpi.a 287 288【注意】 289 290* 在调用该接口前,必须对设备公共属性进行配置,否则返回设备未配置错误。 291 292* 只有物理设备支持设置用户时序信息。 293 294* 时钟源类型和时钟大小为静态信息,必须在执行HI_MPI_VO_Enable前配置。 295 296* 仅在HI_MPI_VO_SetPubAttr中接口数据VO_PUB_ATTR_S的enIntfSync成员设置为VO_OUTPUT_USER时有效。 297 298具体用户时序调试方法可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP 媒体处理软件V4.0 FAQ》,用户时序时钟相关的配置可参考VO_USER_INTFSYNC_INFO_S。 299 300 301 302**HI_MPI_VO_Enable** 303 304【描述】 305 306* 启动视频输出设备。 307 308【语法】 309 310* HI_S32 HI_MPI_VO_Enable (VO_DEV VoDev); 311 312【参数】 313 314 315 316【返回值】 317 318 319 320【需求】 321 322* 头文件:mpi_vo.h、hi_comm_vo.h 323 324* 库文件:libmpi.a 325 326【注意】 327 328* 由于系统没有初始化设备为使能状态,所以在使用视频输出功能前必须先进行设备使能操作。 329* 在调用设备使能前,必须对设备公共属性进行配置,否则返回设备未配置错误。 330* 为适应开机画面与正常操作界面间顺畅切换,此处需要检查VO硬件是否已经使能,如果已使能则返回成功,且沿用已有时序配置。如果希望更改VO的时序配置,则需要先调用HI_MPI_VO_Disable接口,强制关闭VO硬件后再使能。 331* 各个DEV的使用说明详见VO_DEV。 332* 重复调用此接口,会返回设备已使能。 333 334关于SampleCommVoStartDevMipi接口实现细节如下图所示: 335 336以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 337 338 339 340在SampleCommVoStartMipi接口中,调用了SampleCommVoGetWhMipi来获取mipi设备的宽、高,如下图所示: 341 342以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 343 344 345 346 347 348进入SampleCommVoGetWhMipi接口,需要在最后配置下MIPI屏宽高的一个case,taurus套件使用的mipi屏宽800,高480,如下图所示: 349 350以下截图可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 351 352 353 354若SampleCommVoGetWhMipi接口等执行失败,会进入SAMPLE_COMM_VO_StopDev接口终止设备,该接口调用的底层接口如下: 355 356**HI_MPI_VO_Disable** 357 358此接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo_dev.h文件中找到 359 360【描述】 361 362* 禁用视频输出设备。 363 364【语法】 365 366* HI_S32 HI_MPI_VO_Disable(VO_DEV VoDev); 367 368【参数】 369 370 371 372【返回值】 373 374 375 376【需求】 377 378* 头文件:mpi_vo.h、hi_comm_vo.h 379 380* 库文件:libmpi.a 381 382【注意】 383 384* 设备禁止前必须先禁止该设备上的视频层。 385* 设备禁止前,如果有使能WBC,则必须关闭该使能。 386* 调用HI_MPI_VO_Enable后,如果未调用该接口进行禁止,则VO设备将一直保持使能状态,并且下次设置设备属性时不会生效。 387* 设备禁止后需要重新设置设备公共属性,才可使能设备。 388 389SAMPLE_COMM_VO_StopDev接口代码实现细节如下: 390 391以下device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm_vo.c文件中找到 392 393 394 395在SampleCommVoStartMipi接口中,调用了HI_MPI_VO_SetDisplayBufLen、HI_MPI_VO_SetVideoLayerPartitionMode、HI_MPI_VO_GetVideoLayerCSC、HI_MPI_VO_SetVideoLayerCSC底层接口,分别执行设置显示缓冲的长度、设置视频层的分割模式、获取设备输出图像效果、设置视频层输出图像效果的业务,上述接口详细说明如下: 396 397**VO_LAYER** 398 399此结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_common.h文件中找到 400 401【说明】 402 403* 定义视频层号。 404 405【定义】 406 407* typedef HI_S32 VO_LAYER; 408 409【成员】 410 411* 请根据芯片类型查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_LAYER中的成员内容。 412 413【芯片差异】 414 415* 请根据芯片类型查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VO_LAYER中的芯片差异内容。 416 417 418 419以下四个接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vo.h文件中找到 420 421**HI_MPI_VO_SetDisplayBufLen** 422 423此接口可以在 424 425【描述】 426 427* 设置显示缓冲的长度。 428 429【语法】 430 431* HI_S32 HI_MPI_VO_SetDisplayBufLen(VO_LAYER VoLayer, HI_U32 u32BufLen); 432 433【参数】 434 435 436 437【返回值】 438 439 440 441【需求】 442 443* 头文件:mpi_vo.h、hi_comm_vo.h 444 445* 库文件:libmpi.a 446 447【注意】 448 449* 调用前需保证视频输出视频层未使能。 450 451* 缓冲长度默认值是0,默认是VO直通模式显示。 452 453* 当不满足VO直通的条件时,需要调用该接口设置缓冲的长度,否则VO无法正常工作。 454 455* 非直通情况下,当VO所有通道输入性能总和超过3840x2160@60(或7680x4320@15)时,VGS处理一帧的时间耗费得更多,一块缓存被占用的时间也更久,因此,设备帧率不变的情况下,需要将缓冲长度设置为大于等于4以满足低延时显示 456 457**HI_MPI_VO_SetVideoLayerPartitionMode** 458 459【描述】 460 461* 设置视频层的分割模式。 462 463【语法】 464 465* HI_S32 HI_MPI_VO_SetVideoLayerPartitionMode(VO_LAYER VoLayer, VO_PART_MODE_E enPartMode); 466 467【参数】 468 469 470 471【返回值】 472 473 474 475【需求】 476 477* 头文件:mpi_vo.h、hi_comm_vo.h、hi_defines.h 478 479* 库文件:libmpi.a 480 481【注意】 482 483请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》HI_MPI_VO_SetVideoLayerPartitionMode结构体中注意事项内容 484 485**HI_MPI_VO_GetVideoLayerCSC** 486 487【描述】 488 489* 获取设备输出图像效果。 490 491【语法】 492 493* HI_S32 HI_MPI_VO_GetVideoLayerCSC(VO_LAYER VoLayer, VO_CSC_S *pstVideoCSC); 494 495【参数】 496 497| 参数名称 | 描述 | 输入/输出 | 498| ----------- | -------------------------------------------- | --------- | 499| VoLayer | 视频输出视频层号。 取值范围:物理视频层号。 | 输入 | 500| pstVideoCSC | 图像输出效果结构体指针。 | 输出 | 501 502【返回值】 503 504 505 506【需求】 507 508* 头文件:mpi_vo.h、hi_comm_vo.h 509 510* 库文件:libmpi.a 511 512【注意】 513 514* 该接口主要用于获取图像的输出效果,包括亮度、对比度、色调、饱和度,其取值范围均为[0, 100]。 515 516**HI_MPI_VO_SetVideoLayerCSC** 517 518【描述】 519 520* 设置视频层输出图像效果。 521 522【语法】 523 524* HI_S32 HI_MPI_VO_SetVideoLayerCSC(VO_LAYER VoLayer, const VO_CSC_S *pstVideoCSC); 525 526【参数】 527 528| 参数名称 | 描述 | 输入/输出 | 529| ----------- | -------------------------------------------- | --------- | 530| VoLayer | 视频输出视频层号。 取值范围:物理视频层号。 | 输入 | 531| pstVideoCSC | 图像输出效果结构体指针。 | 输入 | 532 533【返回值】 534 535 536 537【芯片差异】 538 539* 请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》HI_MPI_VO_SetVideoLayerCSC结构体芯片差异内容。 540 541【需求】 542 543* 头文件:mpi_vo.h、hi_comm_vo.h 544 545* 库文件:libmpi.a 546 547【注意】 548 549* 请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》HI_MPI_VO_SetVideoLayerCSC结构体注意事项内容。 550 551在SampleCommVoStartMipi接口中,需要调用SAMPLE_COMM_VO_StartLayer接口来start layer,如下图所示: 552 553以下截图可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 554 555 556 557进入SAMPLE_COMM_VO_StartLayer接口进行分析,分析其调用的底层接口。 558 559以下两个接口可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vo.h文件中找到 560 561**HI_MPI_VO_SetVideoLayerAttr** 562 563【描述】 564 565* 设置视频层属性。 566 567【语法】 568 569* HI_S32 HI_MPI_VO_SetVideoLayerAttr(VO_LAYER VoLayer, const VO_VIDEO_LAYER_ATTR_S *pstLayerAttr); 570 571【参数】 572 573 574 575【返回值】 576 577 578 579【需求】 580 581* 头文件:mpi_vo.h、hi_comm_vo.h 582 583* 库文件:libmpi.a 584 585【注意】 586 587* 需要在视频层所绑定的设备处于使能状态时才能设置视频层属性。 588 589* 设置视频层属性(SINGLE模式下除了pstLayerAttr中stDispRect的s32X,s32Y)必须在视频层禁止的情况下进行。 590 591* SINGLE模式下,视频层使能后,可单独设置视频层显示位置。 592 593* 视频层属性的使用说明详见VO_VIDEO_LAYER_ATTR_S。 594 595**HI_MPI_VO_EnableVideoLayer** 596 597【描述】 598 599* 使能视频层。 600 601【语法】 602 603* HI_S32 HI_MPI_VO_EnableVideoLayer (VO_LAYER VoLayer); 604 605【参数】 606 607 608 609【返回值】 610 611 612 613【需求】 614 615* 头文件:mpi_vo.h、hi_comm_vo.h 616 617* 库文件:libmpi.a 618 619【注意】 620 621* 视频层使能前必须保证该视频层所绑定的设备处于使能状态。 622 623* 视频层使能前必须保证该视频层已经配置。 624 625* 各个视频层的使用说明详见VO_LAYER。 626 627SAMPLE_COMM_VO_StartLayer具体代码实现细节如下: 628 629此截图可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm_vo.c文件中找到 630 631 632 633在SampleCommVoStartMipi接口的最后,会调用SampleCommVoStartChnMipi接口来启动vo channels,如下图所示: 634 635此截图可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 636 637 638 639若SampleCommVoStartChnMipi接口返回值不等于HI_SUCCESS,需StopLayer and StopDev,及调用SAMPLE_COMM_VO_StopLayer和SAMPLE_COMM_VO_StopDev,其中SAMPLE_COMM_VO_StopDev接口上文已经讲述,这里只分析SAMPLE_COMM_VO_StopLayer接口,如下图所示。 640 641此截图可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/platform/common/sample_comm_vo.c文件中找到 642 643 644 645针对其调用的HI_MPI_VO_DisableVideoLayer接口作如下解释: 646 647此接口可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vo.h文件中找到 648 649【描述】 650 651* 禁止视频层 652 653【语法】 654 655* HI_S32 HI_MPI_VO_DisableVideoLayer(VO_LAYER VoLayer); 656 657【参数】 658 659 660 661【返回值】 662 663 664 665【需求】 666 667* 头文件:mpi_vo.h、hi_comm_vo.h 668 669* 库文件:libmpi.a 670 671【注意】 672 673* 视频层禁止前必须保证其上的通道全部禁止。 674 675* 在禁止视频层时,非直通情况下,如果用户没有释放从VO获取的图像buffer资源,该接口会返回HI_ERR_VB_BUSY的错误码,表示VO创建的VB资源没有释放。多见于用户调用获取屏幕图像未释放的情况下。 676 677* 在禁止视频层时,如果用户选择了WBC数据源为VO_WBC_DATASOURCE_VIDEO模式,则必须保证将该设备的WBC功能关闭使能。 678 679进入SampleCommVoStartChnMipi接口进行分析,发现其调用如下底层接口,接下来进行解读。 680 681**VO_CHN_ATTR_S** 682 683此结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/hi_comm_vo.h文件中找到 684 685【说明】 686 687* 定义视频输出通道属性。 688 689【定义】 690 691 692 693【成员】 694 695 696 697【注意事项】 698 699* 属性中的优先级,数值越大优先级越高。 700* SINGLE模式下,当多个通道有重叠的显示区域时,优先级高的通道图像将覆盖优先级低的通道。优先级相同的各通道有重叠时,默认通道号大的图像将覆盖通道号小的通道图像。 701* 通道显示区域不能超过视频层属性中设定的画布大小(stImageSize大小)。 702* 如果有视频层放大的情况,stRect是放大前视频层上的起始位置和宽高,放大后显示的起始位置和宽高会按视频层放大的比例偏移或放大。 703 704 705 706以下四个接口可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/include/mpi_vo.h文件中找到 707 708**HI_MPI_VO_GetVideoLayerAttr** 709 710【描述】 711 712* 获取视频层属性。 713 714【语法】 715 716* HI_S32 HI_MPI_VO_GetVideoLayerAttr(VO_LAYER VoLayer, VO_VIDEO_LAYER_ATTR_S *pstLayerAttr); 717 718【参数】 719 720 721 722【返回值】 723 724 725 726【需求】 727 728* 头文件:mpi_vo.h、hi_comm_vo.h 729 730* 库文件:libmpi.a 731 732【注意】 733 734* 不调用HI_MPI_VO_EnableVideoLayer和HI_MPI_VO_SetVideoLayerAttr也可获取视频层属性。此时获取的为默认值。 735 736* 建议在设置视频层属性前先调用此接口获取视频层属性。 737 738 739 740**HI_MPI_VO_SetChnAttr** 741 742【描述】 743 744* 配置指定视频输出通道的属性。 745 746【语法】 747 748* HI_S32 HI_MPI_VO_SetChnAttr(VO_LAYER VoLayer, VO_CHN VoChn, const VO_CHN_ATTR_S *pstChnAttr); 749 750【参数】 751 752 753 754【返回值】 755 756 757 758【需求】 759 760* 头文件:mpi_vo.h、hi_comm_vo.h 761 762* 库文件:libmpi.a 763 764【注意】 765 766* 请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》HI_MPI_VO_SetChnAttr结构体注意事项内容。 767 768**HI_MPI_VO_SetChnRotation** 769 770【描述】 771 772* 设置指定视频输出通道的旋转角度。对通道设置旋转角度,该旋转角度将作用于进入通道的视频图像,具体效果是对图像旋转相应的角度后再进行显示。 773 774【语法】 775 776* HI_S32 HI_MPI_VO_SetChnRotation(VO_LAYER VoLayer, VO_CHN VoChn, ROTATION_E enRotation); 777 778【参数】 779 780 781 782【返回值】 783 784 785 786【需求】 787 788* 头文件:mpi_vo.h、hi_comm_vo.h 789 790* 库文件:libmpi.a 791 792【注意】 793 794* 设置旋转的角度只能是ROTATION_0, ROTATION_90, ROTATION_180, ROTATION_270其中之一。 795 796* VO在SINGLE模式下并且前端在预览模式下旋转功能才会生效。但如果VO前端绑定VPSS并且VPSS工作在USER模式下,即使VPSS前端为回放模式,旋转也会生效。 797 798* VO在MULTI模式下通道不支持旋转,即使对通道设置了旋转角度,也不生效。 799 800**HI_MPI_VO_EnableChn** 801 802【描述】 803 804* 启用指定的视频输出通道。 805 806【语法】 807 808* HI_S32 HI_MPI_VO_EnableChn (VO_LAYER VoLayer, VO_CHN VoChn); 809 810【参数】 811 812 813 814 815 816【返回值】 817 818 819 820【需求】 821 822* 头文件:mpi_vo.h、hi_comm_vo.h 823 824* 库文件:libmpi.a 825 826【注意】 827 828* 调用前必须保证视频层绑定关系存在,否则将返回失败。 829 830* 调用前必须使能相应设备上的视频层。 831 832* 通道使能前必须进行通道配置,否则返回通道未配置的错误。 833 834* 允许重复使能同一视频输出通道,不返回失败。 835 836#### 3.1.4.3 VPSS bind VO 837 838VPSS bind VOS绑定VPSS和VO之间的关联关系,绑定后,数据源生成的数据将自动发送给接收者,依然调用HI_MPI_SYS_Bind接口,上文已经对HI_MPI_SYS_Bind接口进行详细解释,这里不再阐述,如下图所示: 839 840以下截图可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 841 842 843 844 845 846注:SAMPLE_VIO_VPSS_VO_MIPI接口中VI、VPSS、VO每个环节均有异常判断,若进入到异常环节,均会goto到异常判断API,该部分异常判断接口较为简单,自行查阅源码即可,如下图所示: 847 848以下截图可以在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中找到 849 850 851