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 直接接受源图像,进行编码。
编码通道:
编码通道完成图像转化为码流的功能,具体由码率控制器和编码器协同完成。