本文主要介紹了Hi3518E的視頻緩沖池的重要概念,闡述視頻緩沖池VB在整個視頻編解碼中的地位。
一、Hi3518E的地址內存空間分布
如果您在Hi3518E上面部署好整個系統,會知道在進行燒錄鏡像時會在啟動參數要求指定地址空間的分布。其中會涉及一個比較重要但是陌生的名詞:MMZ。下文是從SDK中摘抄出來的片段。

2、DEMO板DDR內存管理示意 以容量為128MBytes的DDR內存為例,以下為根據本文檔和SDK默認配置得到的內存管理示意圖: DDR: -----|-------| 0x80000000 # Memory managed by OS. 32M | OS | | | -----|-------| 0x82000000 # Memory managed by MMZ block anonymous. 32 M | MMZ | | | -----|-------| 0x84000000 # Memory managed by MMZ block jpeg. 注意: (1)用戶在配置啟動參數時需要設置OS的管理內存為32M,“setenv bootargs 'mem=32M ...”。 (2)系統啟動后,配置load3518e腳本中指定總內存為64(-total 64),加載時指定osmem為32(-osmem 32),則MMZ管理的內存為32M; (3)如果有特殊應用,可以自行修改load3518e腳本,進行mmz區域划分,如“insmod mmz.ko mmz=anonymous,0,0x82000000,30M:jpeg,0,0x83D00000,2M anony=1”。 (4)在Hi3518EV201的bootargs的配置中,設置的啟動地址請不要寫為0x82000000,因為此芯片的DDR總大小為32M,地址邊界為0x82000000,建議為0x81000000。
通過官方文檔,我們可以查到其具體的含義:
MMZ 驅動管理用戶創建的分配池,用戶程序分配內存的時候可以指定要在哪個分配池中分配內存,分配器將查找滿足要求的分配池並從中分配合適的內存塊給程序使用。
另外還有一個重要的概念:公共緩沖池。顧名思義,公共緩沖池就是為VI部分、VPSS部分、VENC部分共用的部分,是它們操作的全局變量,當一個模塊處理完后可以通知下一個模塊使用,比較方便。
上圖是 公共緩沖池的數據流圖。我們可以看到公共緩沖池中有很多個緩沖池,每個緩沖池有很多個緩沖塊(B1、B2、、、Bn)。進行視頻編解碼時,首先VI模塊從VB中取得Bm緩沖塊,處理后扔給VPSS,VPSS再根據需要(比如裁剪、縮放等)將Bm變換成Bi、Bj、Bk等緩沖塊。這些緩沖塊會被流向VENC、VDA、VO等模塊,最后處理完成后,會釋放這些緩沖塊到緩沖池中,方便下一次使用。至於具體的流向,比如VPSS->VENC需要根據提供的API函數進行綁定。