海思3518E sample的整体架构venc层源码分析

1.sample的整体架构

在这里插入图片描述

 -> sample其实是很多个例程,所以有很多个main。sample里面不止一个程序。

 -> 每一个例程面向一个典型应用,common是通用性主体函数,common文件夹是其他代码共同需要的代码。

 -> 我们只分析venc, 我们主要研究venc文件夹里面的,这个文件夹里面的程序用于编码的,然后调用很多海思封装好的库函数。

2.sample_venc分析

在这里插入图片描述

分析源码之前弄清楚几个重要的概念:

 H.264 ,H.265, MJPEG,jpeg(视频编码规范标准)

1080P:视频分辨率(1920x1080(宽x高))

720P:视频分辨率(1280x720(宽x高))

VGA:视频分辨率(640x480(宽x高))

D1:视频分辨率(704x576(宽x高))

fps:(frame per second 每秒多少帧) 帧率

从main入手,main的传参分析:

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

 3.sample代码学习的技巧

学习这个视频框架需要理解很多抽象的概念,理解好概念再去理解代码会更好的上手,就像学习硬件驱动一样,硬件的原理没有搞懂,看代码根本看不懂。

请参考的我博客:海思HI3518E部分

系统控制mpp:海思HI3518E系统控制mpp_小辜同学的博客-CSDN博客

视频缓存池:海思HI3518E视频缓存池_小辜同学的博客-CSDN博客

视频输入VI:海思H3518E视频输入VI_小辜同学的博客-CSDN博客

视频输出VO:海思H3518E视频输出VO_小辜同学的博客-CSDN博客

视频处理VPSS:海思H3518E视频处理VPSS_小辜同学的博客-CSDN博客

4.绘制调用关系图谱

调用关系的图谱刚开始追代码的时候并不要再过深究,深究便会深陷进去。

根据原理理解视频输入输出处理的通路即可,等项目中遇到的问题再深究。

-> 全局把控整个过程全景视图。

-> 掌握细节数据结构元素含义,和遇到的概念。

-> 知道某些关键操作在哪里定义,哪里设置,将来需要改的时候能找到地方。

main()
	SAMPLE_VENC_1080P_CLASSIC
		SAMPLE_COMM_VI_GetSizeBySensor传入参数,做一个参数的检查,根据传入的参数选择senser的清晰度,最终选择的是三路码流,一路主码流是配置出来的,另外两路是简化出来的,三路的分辨率不一样。--------------------------------------------------------->(step1)
		SAMPLE_COMM__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);

5.系统控制mpp初始化解析

 

6.视频输入VI

VI模块就包含3大部分:Sensor对接的部分,ISP,VI dev和channel。

在这里插入图片描述

 7.视频处理VPSS

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

在这里插入图片描述

8.venc编码模块 

VENC概述:

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

VENC 模块的输入源包括三类:

-> 用户态读取图像文件向编码模块发送数据。

-> 视频输入( VIU)模块采集的图像经视频处理子系统( VPSS)发送到编码模块。

-> 视频输入( VIU)模块采集的图像直接发送到编码模块。

编码数据流程图:

在这里插入图片描述

-> VENC 模块由编码通道子模块( VENC)和编码协议子模块( H.264/H.265/JPEG/MJPEG)组成。

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

-> 如果输入图像比编码通道尺寸大, VENC 将按照编码通道尺寸大小,调用 VGS 对源图像进行缩小,然后对缩小之后的图像进行编码。

-> 如果输入图像比编码通道尺寸小, VENC 丢弃源图像。 VENC 不支持放大输入图像编码。

-> 如果输入图像与编码通道尺寸相当, VENC 直接接受源图像,进行编码。

编码通道:

编码通道完成图像转化为码流的功能,具体由码率控制器和编码器协同完成。

在这里插入图片描述

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式_笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值