第二季4:HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID)函数的分析
以下內容源于朱有鵬課程與海思相關SDK文檔的解讀,如有侵權,請告知刪除。
速覽點
1、標題函數(提取碼1111)在SDK/package/mmp/sample/venc/sample_venc.c中,由此文件的main函數引出。之所以研究該函數,是因為該函數符合課程與板子的特征。
2、此函數分步驟如下。
(1)step 1: init sys variable 初始化(填充)mpp系統的變量、參數
(2)step 2: mpp system init. 初始化mmp系統
(3)step 3: start vi dev & chn to capture 進行圖像的采集
(4)step 4: start vpss and vi bind vpss 啟動VPSS并綁定VI,進行圖像處理
(5)step 5: start stream venc進行編碼得到裸流文件
(6)step 6: stream venc process -- get stream, then save it to file. 將裸流存儲
(7)step 7: exit process退出進程
一、mpp系統的初始化
1、step 1: init sys variable 初始化(填充)mpp系統的變量、參數
- ?輸出型參數
2、step 2: mpp system init. 初始化mmp系統
二、VI部分詳解
1、分析發現
- 有些函數是sample目錄中的文件寫的,有些函數是調用MPP的API,所用的數據結構在兩者中都有相關定義。
- 可以從前綴知道一些函數位置等信息。如HI_MPI_VI_SetDevAttr()函數,HI_MPI表示是調用MPP中的API,_VI表示是VI部分的函數。
2、學習方法
- 該部分函數調用關系很復雜,需要繪制調用關系圖譜。
- 全局把控熟悉整個過程全景視圖。
- 掌握細節數據結構元素含義,和遇到的概念。
- 知道某些關鍵操作在哪里定義,哪里設置,將來需要改的時候能找到地方。
3、函數調用圖譜【制提取碼1111】
4、根據圖譜分析內容
(1)常用Sensor的接口有三種:MIPI、LVDS、DC。
(2)WDR寬動態:讓同一幅圖不同區域曝光程度不一樣,這樣的一種技術讓很亮的和很暗的區域都能看清楚。
(3)isp即image signal process(圖像信號處理)。HI3518e內部集成了ISP處理單元,屬于硬件單元,隸屬于VI模塊。
(4)VI模塊包含3大部分:第一部分是和Sensor對接的部分,第二部分就是ISP,第三部分就是VI的dev(用來采集圖像的硬件單元)和channel(通道,一個設備可能有幾個不同的處理方式)。
三、VPSS部分詳解
1、VPSS的手冊部分解讀
(1)VPSS(Video Process Sub-System,視頻處理子系統)支持對一幅輸入圖像進行統一預處理,如去噪、去隔行等,然后再對各通道分別進行縮放、銳化等處理,最后輸出多種不同分辨率的圖像。(一進多出)
(2)VPSS 單元支持的具體圖像處理功能包括 FRC(Frame Rate Control)、Crop、NR(Noise Reduce)、LDC(Lens Distortion Correction)、Rotate、Cover/Overlay、Scale、Mirror/Flip、FishEye 等。
(3)重要概念
- GROUP(單GROUP時,GROUP相當于VPSS;多GROUP時,分時復用VPSS硬件)
- CHANNEL(不同的通道,即不同處理功能)。
- VPSS相當于總加工廠。GROUP相當于某個車間,當工廠只有一個車間時,這個車間就是工廠!CHANNEL相當于某車間里具備某些功能的生產設備。
- 一個GROUP有3條CHANNEL(可以設置有多少,這里設置為3)。
(4)VPSS上下文關系
- 通過調用 SYS 模塊(即MPP模塊)的綁定接口(即HI_MPI_SYS_Bind),可將VPSS與 VI 和 VO/VENC/IVE 等模塊進行綁定,其中前者為 VPSS 的輸入源,后者為 VPSS 的接收者。
- 用戶可通過提供的 MPI 接口對 GROUP進行管理。每個 GROUP 僅可與一個輸入源綁定。GROUP 的物理通道有兩種工作模式:AUTO 和 USER,兩種模式間可動態切換。默認的工作模式為 AUTO,此模式下各通道僅可與一個接收者綁定。若想使用 USER 模式,則需調用 MPI 接口進行設置,同時指定所需圖像的大小和格式,此模式下各通道可與多個接收者綁定。需要特別注意。特別注意的是,USER 模式主要用于對同一通道圖像進行多路編碼的場景,此模式下播放控制不生效,因此預覽和回放場景下不建議使用模式主要用于對同一通道圖像進行多路編碼的場景,此模式下播放控制不生效,因此預覽和回放場景下不建議使用 USER。
- Hi3516A/Hi3518EV200/Hi3519V100 僅支持 USER 工作模式。
2、VPSS的函數調用關系圖譜
(1)代碼截圖:三個channel重復上面step4的過程。這里僅列出channel0的。
(2)注意SAMPLE_COMM_VI_BindVpss函數中有一段這樣的代碼。
- 這表示將源(即VI,根據代碼,指的是設備0的通道0)綁定到目標(即VPSS,根據代碼,指的是0group的通道0)。
- 然后使用HI_MPI_SYS_Bind函數進行綁定,這是在線形式(VI和VPSS之間不經過DDR)。
(2)注意SAMPLE_COMM_VPSS_EnableChn之前的一段代碼。
- 這是設置VPSS的通道屬性。圖示的是channel0的屬性。
-----------------------------------------------------------------------------
3、截止目前代碼達到的效果
(1)VI部分調用sensor獲得圖像,并進行一些基本的處理,傳給VPSS的group0。
(2)VPSS的group0通過三個通道輸出三路分辨率不同的、未經過編碼的原始圖像,即720p(channel0,主碼流通道)、VGA(channel1)、svga(channel2)。
(3)接下來,三路原始圖像將進入編碼模塊進行編碼。
四、VENC 模塊
1、基礎知識
- 模塊圖像編碼壓縮原理,參考:http://blog.csdn.net/newchenxf/article/details/51693753
- 圖像Qp,參考:https://blog.csdn.net/u013354805/article/details/51988171
2、VENC模塊的描述
(1)VENC,即視頻編碼模塊。本模塊支持多路實時編碼,且每路編碼獨立,編碼協議和編碼 profile可以不同。本模塊支持視頻編碼同時,調度 Region 模塊對編碼圖像內容進行疊加與遮擋。
(2)VENC 模塊的輸入源包括三類:
- 用戶態讀取圖像文件向編碼模塊發送數據;
- 視頻輸入(VIU)模塊采集的圖像經視頻處理子系統(VPSS)發送到編碼模塊;
- 視頻輸入(VIU)模塊采集的圖像直接發送到編碼模塊;
- 不同型號的芯片支持不同的編碼規格,芯片支持的編碼規格如表所示。B-Basic,M-main,H-high,三種不同的profile。
- JPEG是圖片,MOTION JPEG即MJPEG。
(3)數據流程圖·
- 典型的編碼流程包括了輸入圖像的接收、圖像內容的遮擋和覆蓋(可選)、圖像的編碼、以及碼流的輸出等過程。
- VENC模塊由接收通道模塊(VENC)和編碼通道模塊(H.264/H.265/JPEG/MJPEG)組成。
1)接收通道
A、通道支持接收 YUV 格式圖像輸入(支持格式為 Semi-planar YUV 4:2:0 或 Semi-planar
YUV 4:2:2),其中 H.264/H.265 只支持 Semi-planar YUV 4:2:0,JPEG/MJPEG 支持 Semi-planar YUV 4:2:0 或 Semi-planar YUV 4:2:2。另外,Hi3518EV200 能夠支持單分量輸入(只存在 Y 分量)。通道模塊接收外部原始圖像數據,而不關心圖像數據是來自哪個外部模塊。
B、通道接收到圖像之后,比較圖像尺寸和編碼通道尺寸:
- ?如果輸入圖像比編碼通道尺寸大,VENC 將按照編碼通道尺寸大小,調用 VGS 對源圖像進行縮小,然后對縮小之后的圖像進行編碼。
- ?如果輸入圖像比編碼通道尺寸小,VENC 丟棄源圖像。VENC 不支持放大輸入圖像編碼。
- 如果輸入圖像與編碼通道尺寸相當,VENC 直接接受源圖像,進行編碼。
2)編碼通道
- 編碼通道作為基本容器,保存編碼通道的多種用戶設置和管理編碼通道的多種內部資源。
- 編碼通道完成圖像轉化為碼流的功能,具體由碼率控制器和編碼器協同完成。這里的編碼器指的是狹義上的編碼器,只完成編碼功能。碼率控制器提供了對編碼參數的控制和調整,從而對輸出碼率進行控制。
- 碼率控制是針對連續的編碼碼流而言,所以JPEG 協議編碼通道不包括碼率控制功能。Hi3518EV200 不支持 H.265 編碼,所以,也不支持 H.265 類型的碼率控制
- 碼率控制器分別提供了對 H.264\H.265\MJPEG 協議編碼通道 CBR(碼率不變)、VBR(可變碼率)、FIXQP(固定Qp值) 等三種碼率控制模式,對圖像質量和碼率進行調節。
3、代碼解釋
(1)首先,碼率控制模式的選擇
(2)接著,進行三路編碼
五、編碼后的流文件輸出
1、最后的步驟6與步驟7。
2、函數調用關系圖譜
步驟6值得好好讀一下,里面關于文件的操作很不錯。
SAMPLE_COMM_VENC_GetFilePostfix:獲取文件名后綴。
? ? ? ?
? ? ? ?至此可以得到裸流文件(即沒有頭信息表征內容,里面都是直接的絕對的內容)。VLC播放器可以支持播放這種裸流文件。
總結
以上是生活随笔為你收集整理的第二季4:HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID)函数的分析的全部內容,希望文章能夠幫你解決所遇到的問題。