天天看點

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

目錄

  • 一,官方sample的總體分析
  • 二,MPP初始化解析
  • 三, VI部分解析
  • 四,VPSS部分解析
  • 五,venc編碼子產品解析

一,官方sample的總體分析

1、sample的整體架構

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

(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檔案夾也導入進去。

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

(1)從main入手,main的傳參分析

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

(2)幾個基本概念:

名稱 概念
H.264 ,H.265, MJPEG,jpeg 視訊編碼規範标準
1080P 視訊分辨率(1920x1080(寬x高))
720P 視訊分辨率(1280x720(寬x高))
VGA 視訊分辨率(640x480(寬x高))
D1 視訊分辨率(704x576(寬x高))
fps (frame per second 每秒多少幀) 幀率
【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析
【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

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初始化解析

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析
【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析
【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

三, VI部分解析

VI子產品就包含3大部分:

  • 第一部分是和Sensor對接的部分
  • 第二部分就是ISP
  • 第三部分就是VI dev和channel
【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

四,VPSS部分解析

Hi3518EV200的VI子產品隻有一個實體通道chn0,隻能綁定VPSS的一個Grp,而VPSS一個Grp可以建立若幹個VPSSchn作為不同分辨率的碼流輸出通道。

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

五,venc編碼子產品解析

【1】VENC 子產品概述

VENC 子產品,即視訊編碼子產品。本子產品支援多路實時編碼,且每路編碼獨立,編碼協定和編碼 profile 可以不同。本子產品支援視訊編碼同時,排程 Region 子產品對編碼圖像内容進行疊加和遮擋。

【2】VENC 子產品的輸入源包括三類

  • 使用者态讀取圖像檔案向編碼子產品發送資料;
  • 視訊輸入( VIU)子產品采集的圖像經視訊處理子系統( VPSS)發送到編碼子產品;
  • 視訊輸入( VIU)子產品采集的圖像直接發送到編碼子產品;

【3】編碼資料流程圖

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析
  • 典型的編碼流程包括了輸入圖像的接收、圖像内容的遮擋和覆寫、圖像的編碼、以及碼流的輸出等過程。
  • 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】編碼通道

編碼通道完成圖像轉化為碼流的功能,具體由碼率控制器和編碼器協同完成。這裡的編碼器指的是狹義上的編碼器,隻完成編碼功能。碼率控制器提供了對編碼參數的控制和調整,進而對輸出碼率進行控制。

【第二季】海思官方sample的venc層源碼分析之整體架構一,官方sample的總體分析二,MPP初始化解析三, VI部分解析四,VPSS部分解析五,venc編碼子產品解析

【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 媒體處理軟體開發參考》,請勿用于商業用途,轉載請注明出處。

繼續閱讀