【第二季】海思官方sample的venc层源码分析之整体框架
目录一,官方mppsample的总体分析二,程序流程分析和MPP初始化详解VI部分详解VPSS部分详解图像编码压缩基本原理MPP手册中图像编码部分解读sample中venc模块源码解读编码后的流文件输出和课程总结一,官方mppsample的总体分析1、sample的整体架构(1)sample其实是很多个例程,所以有很多个main。sample里面不止一个程序。例如hifb文件夹,里面是和frame
一,官方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********************》(3)
pthread_create(&gs_IspPid, &attr, (void* (*)(void*))Test_ISP_Run, NULL)
Test_ISP_Run
HI_MPI_ISP_Run();
SAMPLE_COMM_VI_StartDev****************》(4)
HI_MPI_VI_SetDevAttr();
HI_MPI_ISP_GetWDRMode();
HI_MPI_VI_SetWDRAttr();
HI_MPI_VI_EnableDev();
SAMPLE_COMM_VI_StartChn****************》(5)
HI_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 媒体处理软件开发参考》,请勿用于商业用途,转载请注明出处。
更多推荐
所有评论(0)