一,官方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 媒体处理软件开发参考》,请勿用于商业用途,转载请注明出处。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐