11bd4fe43Sopenharmony_ci### 3.1.3 VPSS理论及实现方式 21bd4fe43Sopenharmony_ci 31bd4fe43Sopenharmony_ci#### 3.1.3.1 VPSS理论 41bd4fe43Sopenharmony_ci 51bd4fe43Sopenharmony_ciVPSS(Video Process Sub-System)支持对一幅输入图像进行统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理,最后**输出多种不同分辨率**的图像。 61bd4fe43Sopenharmony_ci VPSS是视频处理子系统,支持的具体图像处理功能包括FRC(Frame Rate Control)、CROP、Sharpen、3DNR、Scale、像素格式转换、LDC、Spread、固定角度旋转、任意角度旋转、鱼眼校正、Cover/Coverex、Overlayex、Mosaic、Mirror/Flip、HDR、AspectRatio、压缩解压等。 71bd4fe43Sopenharmony_ci 81bd4fe43Sopenharmony_ci关于VPSS的功能描述及相关名词概念描述请自行阅读**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》第5章视频处理子系统中的5.2章节。 91bd4fe43Sopenharmony_ci 101bd4fe43Sopenharmony_ciVPSS在系统中的位置如下图所示: 111bd4fe43Sopenharmony_ci 121bd4fe43Sopenharmony_ci 131bd4fe43Sopenharmony_ci 141bd4fe43Sopenharmony_ci通过调用SYS模块的绑定接口,可与AVS/USER/VDEC/VI和VO/VENC/SVP等模块进行绑定,其中前者为VPSS的输入源,后者为VPSS的接收者。用户可通过MPI接口对GROUP进行管理。每个GROUP仅可与一个输入源绑定。GROUP的物理通道有两种工作模式:AUTO和USER,两种模式间可动态切换。AUTO模式下各通道仅可与一个接收者绑定,主要用于预览和回放场景下做播放控制。USER模式下各通道可与多个接收者绑定。**需要特别注意的是,USER模式主要用于对同一通道图像进行多路编码的场景,此模式下播放控制不生效,因此回放场景下不建议使用USER模式**。VPSS只有工作在离线模式下才支持AUTO模式。 151bd4fe43Sopenharmony_ci 161bd4fe43Sopenharmony_ciHi3516DV300 VPSS芯片数据处理流程如下图所示: 171bd4fe43Sopenharmony_ci 181bd4fe43Sopenharmony_ci 191bd4fe43Sopenharmony_ci 201bd4fe43Sopenharmony_ci**注意:** 211bd4fe43Sopenharmony_ci 221bd4fe43Sopenharmony_ci* VPSS在调用VGS做通道后处理时顺序为CoverEx、LumaStat、OverlayEx。 231bd4fe43Sopenharmony_ci 241bd4fe43Sopenharmony_ci* 固定角度旋转和任意角度旋转功能互斥,这两个功能在图中的先后顺序无需关注。 251bd4fe43Sopenharmony_ci 261bd4fe43Sopenharmony_ci* 扩展通道GDC任务和VGS任务互斥。 271bd4fe43Sopenharmony_ci 281bd4fe43Sopenharmony_ci#### 3.1.3.2 VPSS实现方式 291bd4fe43Sopenharmony_ci 301bd4fe43Sopenharmony_ci在device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/中,VPSS部分实现细节如下: 311bd4fe43Sopenharmony_ci 321bd4fe43Sopenharmony_ci##### 3.1.3.2.1 config vpss 331bd4fe43Sopenharmony_ci 341bd4fe43Sopenharmony_ci首先需要配置vpss所需的结构体,核心对VPSS_GRP_ATTR_S结构体和VPSS_CHN_ATTR_S结构体进行配置,下面对这个两个结构体进行详细说明。 351bd4fe43Sopenharmony_ci 361bd4fe43Sopenharmony_ci这两个结构体可在device/soc/hisilicon/hi3516dv300/sdk_linux/include/hi_comm_vpss.h中找到 371bd4fe43Sopenharmony_ci 381bd4fe43Sopenharmony_ci**VPSS_GRP_ATTR_S** 391bd4fe43Sopenharmony_ci 401bd4fe43Sopenharmony_ci【说明】 411bd4fe43Sopenharmony_ci 421bd4fe43Sopenharmony_ci* 定义VPSS GROUP属性 431bd4fe43Sopenharmony_ci 441bd4fe43Sopenharmony_ci【定义】 451bd4fe43Sopenharmony_ci 461bd4fe43Sopenharmony_ci 471bd4fe43Sopenharmony_ci 481bd4fe43Sopenharmony_ci【成员】 491bd4fe43Sopenharmony_ci 501bd4fe43Sopenharmony_ci 511bd4fe43Sopenharmony_ci 521bd4fe43Sopenharmony_ci注:表5-5来源于**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》 531bd4fe43Sopenharmony_ci 541bd4fe43Sopenharmony_ci【注意事项】 551bd4fe43Sopenharmony_ci 561bd4fe43Sopenharmony_ci请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VPSS_GRP_ATTR_S结构体注意事项内容。 571bd4fe43Sopenharmony_ci 581bd4fe43Sopenharmony_ci**VPSS_CHN_ATTR_S** 591bd4fe43Sopenharmony_ci 601bd4fe43Sopenharmony_ci【说明】 611bd4fe43Sopenharmony_ci 621bd4fe43Sopenharmony_ci* 定义VPSS物理通道的属性 631bd4fe43Sopenharmony_ci 641bd4fe43Sopenharmony_ci【定义】 651bd4fe43Sopenharmony_ci 661bd4fe43Sopenharmony_ci 671bd4fe43Sopenharmony_ci 681bd4fe43Sopenharmony_ci【成员】 691bd4fe43Sopenharmony_ci 701bd4fe43Sopenharmony_ci 711bd4fe43Sopenharmony_ci 721bd4fe43Sopenharmony_ci注:表5-6来源于**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》 731bd4fe43Sopenharmony_ci 741bd4fe43Sopenharmony_ci【注意事项】 751bd4fe43Sopenharmony_ci 761bd4fe43Sopenharmony_ci请查阅**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件 V4.0 开发参考.pdf》VPSS_CHN_ATTR_S结构体注意事项内容。 771bd4fe43Sopenharmony_ci 781bd4fe43Sopenharmony_ciconfig vpss 代码实现可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c**中的int SampleVioVpssVoMipi(void)接口,具体细节如下: 791bd4fe43Sopenharmony_ci 801bd4fe43Sopenharmony_ci 811bd4fe43Sopenharmony_ci 821bd4fe43Sopenharmony_ci 831bd4fe43Sopenharmony_ci 841bd4fe43Sopenharmony_ci 851bd4fe43Sopenharmony_ci 861bd4fe43Sopenharmony_ci##### 3.1.3.2.2 start vpss 871bd4fe43Sopenharmony_ci 881bd4fe43Sopenharmony_ci代码实现可参考**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c**文件 891bd4fe43Sopenharmony_ci 901bd4fe43Sopenharmony_ci核心围绕VpssStart接口,如下图所示: 911bd4fe43Sopenharmony_ci 921bd4fe43Sopenharmony_ci 931bd4fe43Sopenharmony_ci 941bd4fe43Sopenharmony_ci针对VpssStart接口调用的底层接口作如下说明: 951bd4fe43Sopenharmony_ci 961bd4fe43Sopenharmony_ci**VPSS_GRP** 971bd4fe43Sopenharmony_ci 981bd4fe43Sopenharmony_ci【说明】 991bd4fe43Sopenharmony_ci 1001bd4fe43Sopenharmony_ci* 定义VPSS组号 1011bd4fe43Sopenharmony_ci 1021bd4fe43Sopenharmony_ci【定义】 1031bd4fe43Sopenharmony_ci 1041bd4fe43Sopenharmony_ci* typedef HI_S32 VPSS_GRP; 1051bd4fe43Sopenharmony_ci 1061bd4fe43Sopenharmony_ci【注意事项】 1071bd4fe43Sopenharmony_ci 1081bd4fe43Sopenharmony_ci* 无 1091bd4fe43Sopenharmony_ci 1101bd4fe43Sopenharmony_ci**HI_MPI_VPSS_CreateGrp** 1111bd4fe43Sopenharmony_ci 1121bd4fe43Sopenharmony_ci【描述】 1131bd4fe43Sopenharmony_ci 1141bd4fe43Sopenharmony_ci* 创建一个VPSS GROUP 1151bd4fe43Sopenharmony_ci 1161bd4fe43Sopenharmony_ci【语法】 1171bd4fe43Sopenharmony_ci 1181bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_VPSS_CreateGrp(VPSS_GRP VpssGrp, const VPSS_GRP_ATTR_S *pstGrpAttr); 1191bd4fe43Sopenharmony_ci 1201bd4fe43Sopenharmony_ci【参数】 1211bd4fe43Sopenharmony_ci 1221bd4fe43Sopenharmony_ci 1231bd4fe43Sopenharmony_ci 1241bd4fe43Sopenharmony_ci【返回值】 1251bd4fe43Sopenharmony_ci 1261bd4fe43Sopenharmony_ci 1271bd4fe43Sopenharmony_ci 1281bd4fe43Sopenharmony_ci【需求】 1291bd4fe43Sopenharmony_ci 1301bd4fe43Sopenharmony_ci* 头文件:hi_comm_vpss.h、mpi_vpss.h 1311bd4fe43Sopenharmony_ci 1321bd4fe43Sopenharmony_ci* 库文件:libmpi.a 1331bd4fe43Sopenharmony_ci 1341bd4fe43Sopenharmony_ci【注意】 1351bd4fe43Sopenharmony_ci 1361bd4fe43Sopenharmony_ci* 不支持重复创建。 1371bd4fe43Sopenharmony_ci 1381bd4fe43Sopenharmony_ci* 当VPSS工作在VI_PARALLEL_VPSS_PARALLEL模式时,只有GROUP0可以被创建 1391bd4fe43Sopenharmony_ci 1401bd4fe43Sopenharmony_ci* 当Hi3516DV300的GROUP0工作VI_ONLINE_VPSS_ONLINE模式时,只有GROUP0可以被创建。 1411bd4fe43Sopenharmony_ci 1421bd4fe43Sopenharmony_ci**HI_MPI_VPSS_SetChnAttr** 1431bd4fe43Sopenharmony_ci 1441bd4fe43Sopenharmony_ci【描述】 1451bd4fe43Sopenharmony_ci 1461bd4fe43Sopenharmony_ci* 设置VPSS通道属性。 1471bd4fe43Sopenharmony_ci 1481bd4fe43Sopenharmony_ci【语法】 1491bd4fe43Sopenharmony_ci 1501bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_VPSS_SetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_CHN_ATTR_S *pstChnAttr); 1511bd4fe43Sopenharmony_ci 1521bd4fe43Sopenharmony_ci【参数】 1531bd4fe43Sopenharmony_ci 1541bd4fe43Sopenharmony_ci 1551bd4fe43Sopenharmony_ci 1561bd4fe43Sopenharmony_ci【返回值】 1571bd4fe43Sopenharmony_ci 1581bd4fe43Sopenharmony_ci 1591bd4fe43Sopenharmony_ci 1601bd4fe43Sopenharmony_ci【需求】 1611bd4fe43Sopenharmony_ci 1621bd4fe43Sopenharmony_ci* 头文件:hi_comm_vpss.h、mpi_vpss.h 1631bd4fe43Sopenharmony_ci 1641bd4fe43Sopenharmony_ci* 库文件:libmpi.a 1651bd4fe43Sopenharmony_ci 1661bd4fe43Sopenharmony_ci【注意】 1671bd4fe43Sopenharmony_ci 1681bd4fe43Sopenharmony_ci* GROUP必须已创建。 1691bd4fe43Sopenharmony_ci 1701bd4fe43Sopenharmony_ci* 扩展通道不支持此接口。 1711bd4fe43Sopenharmony_ci 1721bd4fe43Sopenharmony_ci* 通道做任意角度旋转、LDC、Spread处理或者其绑定的扩展通道开启了鱼眼校正时不支持通道尺寸动态改变,需要先关闭如上功能,才能动态改变通道尺寸。 1731bd4fe43Sopenharmony_ci 1741bd4fe43Sopenharmony_ci 1751bd4fe43Sopenharmony_ci 1761bd4fe43Sopenharmony_ci**HI_MPI_VPSS_EnableChn** 1771bd4fe43Sopenharmony_ci 1781bd4fe43Sopenharmony_ci【描述】 1791bd4fe43Sopenharmony_ci 1801bd4fe43Sopenharmony_ci* 启用VPSS通道 1811bd4fe43Sopenharmony_ci 1821bd4fe43Sopenharmony_ci【语法】 1831bd4fe43Sopenharmony_ci 1841bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); 1851bd4fe43Sopenharmony_ci 1861bd4fe43Sopenharmony_ci【参数】 1871bd4fe43Sopenharmony_ci 1881bd4fe43Sopenharmony_ci 1891bd4fe43Sopenharmony_ci 1901bd4fe43Sopenharmony_ci【返回值】 1911bd4fe43Sopenharmony_ci 1921bd4fe43Sopenharmony_ci 1931bd4fe43Sopenharmony_ci 1941bd4fe43Sopenharmony_ci【需求】 1951bd4fe43Sopenharmony_ci 1961bd4fe43Sopenharmony_ci* 头文件:hi_comm_vpss.h、mpi_vpss.h 1971bd4fe43Sopenharmony_ci 1981bd4fe43Sopenharmony_ci* 库文件:libmpi.a 1991bd4fe43Sopenharmony_ci 2001bd4fe43Sopenharmony_ci【注意】 2011bd4fe43Sopenharmony_ci 2021bd4fe43Sopenharmony_ci* 多次使能返回成功。 2031bd4fe43Sopenharmony_ci* GROUP 必须已创建。 2041bd4fe43Sopenharmony_ci* 若支持扩展通道,扩展通道必须保证此通道绑定的源物理通道已经使能,否则返回失败错误码。 2051bd4fe43Sopenharmony_ci 2061bd4fe43Sopenharmony_ci 2071bd4fe43Sopenharmony_ci 2081bd4fe43Sopenharmony_ci**HI_MPI_VPSS_StartGrp** 2091bd4fe43Sopenharmony_ci 2101bd4fe43Sopenharmony_ci【描述】 2111bd4fe43Sopenharmony_ci 2121bd4fe43Sopenharmony_ci* 启用VPSS GROUP。 2131bd4fe43Sopenharmony_ci 2141bd4fe43Sopenharmony_ci【语法】 2151bd4fe43Sopenharmony_ci 2161bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_VPSS_StartGrp(VPSS_GRP VpssGrp); 2171bd4fe43Sopenharmony_ci 2181bd4fe43Sopenharmony_ci【参数】 2191bd4fe43Sopenharmony_ci 2201bd4fe43Sopenharmony_ci 2211bd4fe43Sopenharmony_ci 2221bd4fe43Sopenharmony_ci【返回值】 2231bd4fe43Sopenharmony_ci 2241bd4fe43Sopenharmony_ci 2251bd4fe43Sopenharmony_ci 2261bd4fe43Sopenharmony_ci【需求】 2271bd4fe43Sopenharmony_ci 2281bd4fe43Sopenharmony_ci* 头文件:hi_comm_vpss.h、mpi_vpss.h 2291bd4fe43Sopenharmony_ci 2301bd4fe43Sopenharmony_ci* 库文件:libmpi.a 2311bd4fe43Sopenharmony_ci 2321bd4fe43Sopenharmony_ci【注意】 2331bd4fe43Sopenharmony_ci 2341bd4fe43Sopenharmony_ci* GROUP必须已创建。 2351bd4fe43Sopenharmony_ci 2361bd4fe43Sopenharmony_ci* 重复调用该函数设置同一个组返回成功。 2371bd4fe43Sopenharmony_ci 2381bd4fe43Sopenharmony_ci#### 3.1.3.3 VI bind VPSS 2391bd4fe43Sopenharmony_ci 2401bd4fe43Sopenharmony_ciMPP提供系统绑定接口(HI_MPI_SYS_Bind),即通过数据接收者绑定数据源来建立两者之间的关联关系(只允许数据接收者绑定数据源)。绑定后,数据源生成的数据将自动发送给接收者。目前MPP支持的绑定关系如下: 2411bd4fe43Sopenharmony_ci 2421bd4fe43Sopenharmony_ci 2431bd4fe43Sopenharmony_ci 2441bd4fe43Sopenharmony_ci 2451bd4fe43Sopenharmony_ci 2461bd4fe43Sopenharmony_ci**VI bind VPSS绑定VI和VPSS之间的关联关系,绑定后,数据源生成的数据将自动发送给接收者,调用的底层接口如下:** 2471bd4fe43Sopenharmony_ci 2481bd4fe43Sopenharmony_ci**HI_MPI_SYS_Bind** 2491bd4fe43Sopenharmony_ci 2501bd4fe43Sopenharmony_ci【描述】 2511bd4fe43Sopenharmony_ci 2521bd4fe43Sopenharmony_ci* 数据源到数据接收者绑定接口。 2531bd4fe43Sopenharmony_ci 2541bd4fe43Sopenharmony_ci【语法】 2551bd4fe43Sopenharmony_ci 2561bd4fe43Sopenharmony_ci* HI_S32 HI_MPI_SYS_Bind(const MPP_CHN_S *pstSrcChn, const MPP_CHN_S *pstDestChn); 2571bd4fe43Sopenharmony_ci 2581bd4fe43Sopenharmony_ci【参数】 2591bd4fe43Sopenharmony_ci 2601bd4fe43Sopenharmony_ci 2611bd4fe43Sopenharmony_ci 2621bd4fe43Sopenharmony_ci【返回值】 2631bd4fe43Sopenharmony_ci 2641bd4fe43Sopenharmony_ci 2651bd4fe43Sopenharmony_ci 2661bd4fe43Sopenharmony_ci【需求】 2671bd4fe43Sopenharmony_ci 2681bd4fe43Sopenharmony_ci* 头文件:hi_comm_sys.h、mpi_sys.h 2691bd4fe43Sopenharmony_ci 2701bd4fe43Sopenharmony_ci* 库文件:libmpi.a 2711bd4fe43Sopenharmony_ci 2721bd4fe43Sopenharmony_ci【注意】 2731bd4fe43Sopenharmony_ci 2741bd4fe43Sopenharmony_ci* 系统目前支持的绑定关系,请参见**源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/doc中**的《HiMPP媒体处理软件V4.0开发参考.pdf》中的表2-2。 2751bd4fe43Sopenharmony_ci* 同一个数据接收者只能绑定一个数据源。 2761bd4fe43Sopenharmony_ci* 绑定是指数据源和数据接收者建立关联关系。绑定后,数据源生成的数据将自动发送给接收者。 2771bd4fe43Sopenharmony_ci* VI和VDEC作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为0,SDK不检查输入的设备号。 2781bd4fe43Sopenharmony_ci* VO作为数据源发送回写(WBC)数据时,是以设备为发送者,向其他模块发送数据,用户将通道号置为0,SDK不检查输入的通道号。 2791bd4fe43Sopenharmony_ci* VPSS作为数据接收者时,是以设备(GROUP)为接收者,接收其他模块发来的数据,用户将通道号置为0。 2801bd4fe43Sopenharmony_ci* VENC作为数据接收者时,是以通道号为接收者,接收其他模块发过来的数据,用户将设备号置为0,SDK不检查输入的设备号。若VENC工作在VENC_PIC_RECEIVE_MULTI模式下,用户需要配置设备号,此时设备号实际用于指定输入源,可以使用VENC_PIC_RECEIVE_SOURCE0、VENC_PIC_RECEIVE_SOURCE1、VENC_PIC_RECEIVE_SOURCE2、VENC_PIC_RECEIVE_SOURCE3宏进行输入源指定。 2811bd4fe43Sopenharmony_ci* AVS作为数据接收者时,是以设备(GROUP)、通道(PIPE)为接收者。 2821bd4fe43Sopenharmony_ci* 其他情况均需指定设备号和通道号。 2831bd4fe43Sopenharmony_ci 2841bd4fe43Sopenharmony_ci**在源码的device/soc/hisilicon/hi3516dv300/sdk_linux/sample/taurus/helloworld/smp/sample_lcd.c文件中** 2851bd4fe43Sopenharmony_ci 2861bd4fe43Sopenharmony_civi bind vpss代码在ViVpssCreate()接口中的实现方式如下: 2871bd4fe43Sopenharmony_ci 2881bd4fe43Sopenharmony_ci 2891bd4fe43Sopenharmony_ci 2901bd4fe43Sopenharmony_ci其中ViBindVpss具体实现细节如下: 2911bd4fe43Sopenharmony_ci 2921bd4fe43Sopenharmony_ci 2931bd4fe43Sopenharmony_ci 294