目錄
- 一,官方sample的總體分析
- 二,MPP初始化解析
- 三, VI部分解析
- 四,VPSS部分解析
- 五,venc編碼子產品解析
一,官方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 媒體處理軟體開發參考》,請勿用于商業用途,轉載請注明出處。