【第二季】海思官方sample的venc层源码分析之整体框架

    技术2024-01-25  120

    目录

    一,官方sample的总体分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc编码模块解析


    一,官方sample的总体分析


    1、sample的整体架构

    (1)sample其实是很多个例程,所以有很多个main。sample里面不止一个程序。例如hifb文件夹,里面是和framebuff有关的,hi3518e在做摄像头的时候,也可以使用这个程序,用于拍照时候实时显示用的。 common文件夹是其他代码共同需要的代码。

    (2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析venc, 我们主要研究venc文件夹里面的,这个文件夹里面的程序用于编码的,然后调用很多海思封装好的库函数。

    (3)基本的架构是:venc中的main调用venc中的功能函数,再调用common中的功能函数,common中的功能函数再调用mpp中的API,API都来自ko文件夹里面的编译好的动态库文件,以驱动方式来实现的,但是这些源码我们看不到,所以就得看海思提供的文档。。

    (4) API的查阅在下载的海思sdk包里面的Hi3518E V200R001C01SPC030\01.software\board\document_cnHiMPP IPC V2.0 媒体处理软件开发参考.pdf。

    2、sample_venc的大体分析 首先先将sample程序导入到source insight中,这样方便我们学习代码,导入的时候记得将sample上层目录的include文件夹也导入进去。

    (1)从main入手,main的传参分析

    (2)几个基本概念:

    名称概念H.264 ,H.265, MJPEG,jpeg视频编码规范标准1080P视频分辨率(1920x1080(宽x高))720P视频分辨率(1280x720(宽x高))VGA视频分辨率(640x480(宽x高))D1视频分辨率(704x576(宽x高))fps(frame per second 每秒多少帧) 帧率

    3、sample代码学习的关键 (1)得理解很多基础概念,譬如图像采集原理、模拟数字、通道、绑定等等 参考我的博客: 海思HI3518E视频处理基础知识《一》----- 系统控制mpp 海思HI3518E视频处理基础概念《二》----- 视频输入VI和 视频输出VO 海思HI3518E视频处理基础概念《三》----- 视频处理子系统VPSS (2)得从宏观上理解整个视频采集、内部传递、处理、编码输出、网络传输等的过程。 (3)得反复看代码,熟才能生巧,才能帮助理解整个代码。 (4)得查阅mpp手册,熟悉海思这一套API的规矩和一般用法。 (5)关于图像像素格式RGB和YUV深度理解参考我的博客:图像像素格式RGB和YUV深度理解

    4、绘制调用关系图谱 (1)简单浏览VI部分的调用层次,发现很复杂 (2)有些函数是sample写的,有些是调用MPP的,数据结构也是2种都有 (3)学习重点1:全局把控熟悉整个过程全景视图 (4)学习重点2:掌握细节数据结构元素含义,和遇到的概念 (5)学习重点3:知道某些关键操作在哪里定义,哪里设置,将来需要改的时候能找到地方

    main() SAMPLE_VENC_1080P_CLASSIC SAMPLE_COMM_VI_GetSizeBySensor--------------------------------------------------------->(step1) SAMPLE_COMM_SYS_CalcPicVbBlkSize SAMPLE_COMM_SYS_GetPicSize SAMPLE_COMM_SYS_Init------------------------------------------------------------------->(step2) HI_MPI_SYS_Exit(); HI_MPI_VB_Exit(); HI_MPI_VB_SetConf(); HI_MPI_VB_Init(); HI_MPI_SYS_SetConf(); HI_MPI_SYS_Init(); SAMPLE_COMM_VI_StartVi----------------------------------------------------------------->(step3) IsSensorInput SAMPLE_COMM_VI_StartIspAndVi SAMPLE_COMM_VI_StartMIPI*****************》(1) SAMPLE_COMM_VI_SetMipiAttr fd = open("/dev/hi_mipi", O_RDWR); ioctl(fd, HI_MIPI_SET_DEV_ATTR, pstcomboDevAttr) SAMPLE_COMM_ISP_Init********************》(2//isp就是image signal process,图像信号处理 sensor_register_callback HI_MPI_AE_Register(); HI_MPI_AWB_Register(); HI_MPI_AF_Register(); HI_MPI_ISP_MemInit(); HI_MPI_ISP_SetWDRMode(); HI_MPI_ISP_SetPubAttr(); HI_MPI_ISP_Init(); SAMPLE_COMM_ISP_Run********************》(3pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL) Test_ISP_Run HI_MPI_ISP_Run(); SAMPLE_COMM_VI_StartDev****************》(4HI_MPI_VI_SetDevAttr(); HI_MPI_ISP_GetWDRMode(); HI_MPI_VI_SetWDRAttr(); HI_MPI_VI_EnableDev(); SAMPLE_COMM_VI_StartChn****************》(5HI_MPI_VI_SetChnAttr(); HI_MPI_VI_SetRotate(); HI_MPI_VI_EnableChn(); SAMPLE_COMM_SYS_GetPicSize------------------------------------------------------------>(step4) SAMPLE_COMM_VPSS_StartGroup HI_MPI_VPSS_CreateGrp(); HI_MPI_VPSS_GetNRParam(); HI_MPI_VPSS_SetNRParam(); HI_MPI_VPSS_StartGrp(); SAMPLE_COMM_VI_BindVpss SAMPLE_COMM_VI_Mode2Param HI_MPI_SYS_Bind(); SAMPLE_COMM_VPSS_EnableChn HI_MPI_VPSS_SetChnAttr(); HI_MPI_VPSS_SetExtChnAttr(); HI_MPI_VPSS_SetChnMode(); HI_MPI_VPSS_EnableChn(); SAMPLE_COMM_VENC_Start---------------------------------------------------------------->(step5) SAMPLE_COMM_SYS_GetPicSize step 1: Create Venc Channel HI_MPI_VENC_CreateChn(); step 2: Start Recv Venc Pictures HI_MPI_VENC_StartRecvPic(); SAMPLE_COMM_VENC_BindVpss HI_MPI_SYS_Bind(); SAMPLE_COMM_VENC_StartGetStream------------------------------------------------------->(step6) SAMPLE_COMM_VENC_StartGetStream pthread_create(&gs_VencPid, 0, SAMPLE_COMM_VENC_GetVencStreamProc, (HI_VOID*)&gs_stPara); SAMPLE_COMM_VENC_StopGetStream-------------------------------------------------------->(step7) pthread_join(gs_VencPid, 0);

    二,MPP初始化解析



    三, VI部分解析


    VI模块就包含3大部分:

    第一部分是和Sensor对接的部分第二部分就是ISP第三部分就是VI dev和channel


    四,VPSS部分解析


    Hi3518EV200的VI模块只有一个物理通道chn0,只能绑定VPSS的一个Grp,而VPSS一个Grp可以创建若干个VPSSchn作为不同分辨率的码流输出通道。


    五,venc编码模块解析


    【1】VENC 模块概述

    VENC 模块,即视频编码模块。本模块支持多路实时编码,且每路编码独立,编码协议和编码 profile 可以不同。本模块支持视频编码同时,调度 Region 模块对编码图像内容进行叠加和遮挡。

    【2】VENC 模块的输入源包括三类

    用户态读取图像文件向编码模块发送数据;视频输入( VIU)模块采集的图像经视频处理子系统( VPSS)发送到编码模块;视频输入( VIU)模块采集的图像直接发送到编码模块;

    【3】编码数据流程图

    典型的编码流程包括了输入图像的接收、图像内容的遮挡和覆盖、图像的编码、以及码流的输出等过程。VENC 模块由编码通道子模块( VENC)和编码协议子模块( H.264/H.265/JPEG/MJPEG)组成。通道支持接收 YUV 格式图像输入,支持格式为 Semi-planar YUV 4:2:0 或 Semi-planarYUV 4:2:2,其中 H.264/H.265 只支持 Semi-planar YUV 4:2:0, JPEG/MJPEG 支持 Semiplanar YUV 4:2:0 或 Semi-planar YUV 4:2:2。另外, Hi3518EV200 能够支持单分量输入(只存在 Y 分量)。通道模块接收外部原始图像数据,而不关心图像数据是来自哪个外部模块。

    【4】通道接收到图像之后,比较图像尺寸和编码通道尺寸

    如果输入图像比编码通道尺寸大, VENC 将按照编码通道尺寸大小,调用 VGS 对源图像进行缩小,然后对缩小之后的图像进行编码。如果输入图像比编码通道尺寸小, VENC 丢弃源图像。 VENC 不支持放大输入图像编码。如果输入图像与编码通道尺寸相当, VENC 直接接受源图像,进行编码

    【5】编码通道 编码通道完成图像转化为码流的功能,具体由码率控制器和编码器协同完成。这里的编码器指的是狭义上的编码器,只完成编码功能。码率控制器提供了对编码参数的控制和调整,从而对输出码率进行控制。

    【6】码率控制 码率控制器分别提供了对 H.264\H.265\MJPEG 协议编码通道 CBR、 VBR、 FIXQP 等三种码率控制模式,对图像质量和码率进行调节。

    CBR( Constant Bit Rate)固定比特率。即在码率统计时间内保证编码码率平稳。码率稳定主要由两个量来评估,这两个量都可以由用户在创建编码通道时指定。VBR( Variable Bit Rate)可变比特率,即允许在码率统计时间内编码码率波动,从而保证编码图像质量平稳。FixQp :固定 Qp 值。在码率统计时间内,编码图像所有宏块 Qp 值相同,采用用户设定的图像 Qp 值, I 帧和 P 帧的 QP 值可以分别设置。

    文章内容参考了海思官方的《HiMPP IPC V2.0 媒体处理软件开发参考》,请勿用于商业用途,转载请注明出处。

    Processed: 0.022, SQL: 9