姓名:張猛
【嵌牛導讀】:對于Hi33518e網(wǎng)絡攝像頭的一些概況性、流程性的東西的總結(jié)唐断,大原理衷畦,大思路的提煉,具體的函數(shù)就暫時忽略斤程。
【嵌牛鼻子】:流程 vpss 綁定? 通道
【嵌牛提問】:對于網(wǎng)絡攝像頭調(diào)試軟件層次的一些整體把握
【嵌牛正文】
1.開發(fā)環(huán)境
1.1 概述
嵌入式系統(tǒng)通常是一個資源受限的系統(tǒng)菩混,直接在嵌入式系統(tǒng)的硬件平臺上編寫軟件比較困難,甚至是不可能的疚脐,通常采用宿主機棍弄、目標機的開發(fā)模式疟游。在宿主機上編寫程序,交叉編譯生成目標板上可以執(zhí)行的二進制文件蛮原,通過文件系統(tǒng)另绩,將二進制代碼放在特定目錄下儒陨,在目標板上運行蹦漠。
宿主機:VMware\ubuntu?
環(huán)境:交叉開發(fā)工具包津辩,nfs
目標機:hi3518e
1.2 安裝
一般官方的SDK會有比較詳細的說明
2.開發(fā)流程
首先要有這樣一個意識容劳,對開發(fā)板進行配置,是以我們的需求為基礎的竭贩。
所需的函數(shù)同一由MPP(媒體處理平臺)提供接口留量。MPP封裝實現(xiàn)了基本功能函數(shù),屏蔽掉了對底層的操作楼熄。
sample_venc.c為完成視頻采集編碼一系列操作的代碼可岂。代碼總結(jié)
1.函數(shù)返回值為狀態(tài)碼缕粹,用以判斷函數(shù)是否執(zhí)行成功平斩。
2.函數(shù)需要傳出的值通過全局變量或地址傳出。
現(xiàn)在以函數(shù)先后順序(視頻采集編碼處理流程)對個步驟說明欺税。
2.1 配置視頻緩沖池:
視頻緩存池主要向媒體業(yè)務提供大塊物理內(nèi)存管理功能揭璃,負責內(nèi)存的分配和回收,充分發(fā)揮內(nèi)存緩存池的作用晃虫,讓物理內(nèi)存資源在各個媒體處理模塊中合理使用。一組大小相同扣墩、物理地址連續(xù)的緩存塊組成一個視頻緩存池。對于視頻輸入通道呻惕,則需要使用公共視頻緩存池亚脆。所有的視頻輸入通道都可以從公共視頻緩存池中獲取視頻緩存塊用于保存采集的圖像(如圖2-1中所示從公共視頻緩存池A中獲取視頻緩存塊Bm)。由于視頻輸入通道不提供創(chuàng)建和銷毀公共視頻緩存池功能寺滚,因此屈雄,在系統(tǒng)初始化之前酒奶,必須為視頻輸入通道配置公共視頻緩存池。根據(jù)業(yè)務的不同杠氢,公共緩存池的數(shù)量另伍、緩存塊的大小和數(shù)量會有所不同。
**enPayLoad? 決定編碼格式
enSize? ? ?決定圖像分辨率愕宋。利用不同的編碼通道中贝,可以對同一rowdata編碼出不同的分辨率
緩沖塊的大小根據(jù)圖像制式(PAL/NTSC)臼朗、圖像分辨率、像素格式圖像跨距(字節(jié)對齊)共同決定视哑。函數(shù)SAMPLE_COMM_SYS_CalcPicVbBlaSize 計算緩存快的大小挡毅。
2.2 初始化MPP系統(tǒng)
由于MPP系統(tǒng)的正常運行依賴于緩存池跪呈,因此必須先聲明HI_MPI_VB_init初始化緩存池耗绿,在初始化MPP系統(tǒng)。
如果多次初始化债蜜,仍會返回成功,但實際上系統(tǒng)不會對MP的運行狀態(tài)有任何影響寻定。函數(shù)SAMPLE_COMM_SYS_init完成MPP系統(tǒng)初始化。
2.3 啟動VI設備
分為4步:
????????????1.sensor初始化
????????????2.啟動VI設備
????????????3.啟動ISP
????????????4.使能VI通道
2.4 啟動視頻處理模塊
根據(jù)制式和分辨率獲得圖像寬和高的具體數(shù)據(jù)晶丘。在由此確定通道屬性進行配置唐含。每一個通道對已一系列的硬件和軟件功能模塊沫浆,通道可以進行“串聯(lián)”,以完成一系列處理淮捆。
通道的“串聯(lián)”在開發(fā)文檔中稱為通道綁定攀痊。在整個處理流程中苟径,要先后經(jīng)過如下的通道綁定:
VI--->VPSS VPSS---->VENC(后者綁定前者)
2.4.1 啟動VPSS
主要根據(jù)制式和分辨率獲得圖像寬和高的具體數(shù)據(jù)棘街,在由此確定通道屬性承边,進行配置。然后使能VPP通道险污。
2.4.2 VPSS綁定VI
函數(shù)由MPP提供蛔糯,直接調(diào)用城瞎。
2.5 啟動視頻流編碼
先創(chuàng)建編碼組,再創(chuàng)建編碼通道飒箭。(編碼通道組指的是芯片啟動一次,能夠同時處理的編碼通道的集合肩碟。通道組模塊接受外部原始圖像數(shù)據(jù)削祈,而不關心圖像數(shù)據(jù)是來自哪個外部模塊脑漫。
2.6 獲取編碼碼流
這里專門開了一個線程用于接受碼流
? ? ? ? 思路:把編碼通道映射為一個文件句柄。接著的所有操作都是對文件句柄進行的吨拍。
? ? ? ? ? ? ? ? ? ? 流程如下:
? ? ? ? ? ? ? ? ? ? ? ? ? ? 1.獲取通道的文件句柄
? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.從各通道獲取碼流
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1)查詢編碼碼流的一幀中有多少包
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)根據(jù)包的數(shù)目分配內(nèi)存
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3)獲取一幀數(shù)據(jù)
????????????????????????????????????????4)根據(jù)編碼類型存數(shù)據(jù)
????????????????????????????????????????5)釋放流(如果不釋放网杆,當視頻緩沖池滿時停止編碼)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6)釋放分配的內(nèi)存
????????????????????????????????????????7)關閉文件句柄
????????????????????????????????????????8)循環(huán)以上7步