相機(jī)架構(gòu)概覽
Android系統(tǒng)利用分層思想,將各層的接口定義與實(shí)現(xiàn)分離開(kāi)來(lái),以接口作為各層的脈絡(luò)連接整體框架,將具體實(shí)現(xiàn)的主導(dǎo)權(quán)交由各自有具體實(shí)現(xiàn)需求的平臺(tái)廠商或者Android 開(kāi)發(fā)者,這樣既做到把控全局,也給予了眾多開(kāi)發(fā)者足夠大的創(chuàng)作空間,這體現(xiàn)出了一個(gè)優(yōu)秀的開(kāi)源系統(tǒng)應(yīng)有的胸懷和遠(yuǎn)見(jiàn)。其中,谷歌根據(jù)職能的不同將Camera框架一共劃分成了五層,分別是App、Service、Provider、Driver以及Hardware,下面的Camera的整體架構(gòu)圖很清晰地顯示出了其五層架構(gòu)以及相互的關(guān)聯(lián)接口。
程序員Android轉(zhuǎn)于網(wǎng)絡(luò)
Camera App
應(yīng)用層處于整個(gè)框架的頂端,承擔(dān)著于用戶直接進(jìn)行交互的責(zé)任,承接來(lái)自用戶直接或者間接的比如預(yù)覽/拍照/錄像等一系列具體需求,一旦接收到用戶相關(guān)UI操作,便會(huì)通過(guò)Camera Api v2標(biāo)準(zhǔn)接口將需求發(fā)送至Camera Framework部分,并且等待Camera Framework回傳處理結(jié)果,其中包括了圖像數(shù)據(jù)以及整體相機(jī)系統(tǒng)狀態(tài)參數(shù),之后將結(jié)果以一定方式反饋給用戶,達(dá)到記錄顯示種種美好瞬間的目的。
Camera Framework
該層主要位于Camera App與Camera Service之間,以jar包的形式運(yùn)行在App進(jìn)程中,它封裝了Camera Api v2接口的實(shí)現(xiàn)細(xì)節(jié),暴露接口給App進(jìn)行調(diào)用,進(jìn)而接收來(lái)自App的請(qǐng)求,同時(shí)維護(hù)著請(qǐng)求在內(nèi)部流轉(zhuǎn)的業(yè)務(wù)邏輯,最終通過(guò)調(diào)用Camera AIDL跨進(jìn)程接口將請(qǐng)求發(fā)送至Camera Service中進(jìn)行處理,緊接著,等待Camera Service結(jié)果的回傳,進(jìn)而將最終結(jié)果發(fā)送至App。
Camera Service
該層位于Camera Framework與Camera Provider之間,作為一個(gè)獨(dú)立進(jìn)程存在于Android系統(tǒng)中,在系統(tǒng)啟動(dòng)初期會(huì)運(yùn)行起來(lái),它封裝了Camera AIDL跨進(jìn)程接口,提供給Framework進(jìn)行調(diào)用,進(jìn)而接收來(lái)自Framework的圖像請(qǐng)求,同時(shí)內(nèi)部維護(hù)著關(guān)于請(qǐng)求在該層的處理邏輯,最終通過(guò)調(diào)用Camera HIDL跨進(jìn)程接口將請(qǐng)求再次下發(fā)到Camera Provider中,并且等待結(jié)果的回傳,進(jìn)而將結(jié)果上傳至Framework中。
Camera Provider
該層位于Camera Service與Camera Driver之間,作為一個(gè)獨(dú)立的進(jìn)程存在于Android系統(tǒng)中,同時(shí)在系統(tǒng)啟動(dòng)初期被運(yùn)行,提供Camera HIDL跨進(jìn)程接口供Camera Service進(jìn)行調(diào)用,封裝了該接口的實(shí)現(xiàn)細(xì)節(jié),接收來(lái)自Service的圖像請(qǐng)求,并且內(nèi)部加載了Camera HAL Module,該Module由OEM/ODM實(shí)現(xiàn),遵循谷歌制定的標(biāo)準(zhǔn)Camera HAL3接口,進(jìn)而通過(guò)該接口控制Camera HAL部分,最后等待Camera HAL的結(jié)果回傳,緊接著Provider通過(guò)Camera HIDL接口將結(jié)果發(fā)送至Camera Service。
CamX-CHI(Camera HAL)
該部分是高通對(duì)谷歌Camera HAL3接口的實(shí)現(xiàn),以so庫(kù)的形式被加載至Camera Provider中,之前采用的是QCamera & MM-Camera架構(gòu),但是為了更好靈活性和可擴(kuò)展性,而今高通又提出了CamX-CHI架構(gòu),該架構(gòu)提供HAL3接口給Provider進(jìn)行調(diào)用,接收來(lái)自Provider的請(qǐng)求,而內(nèi)部對(duì)HAL3接口進(jìn)行了實(shí)現(xiàn),并且通過(guò)V4L2標(biāo)準(zhǔn)框架控制著相機(jī)驅(qū)動(dòng)層,將請(qǐng)求下發(fā)至驅(qū)動(dòng)部分,并且等待結(jié)果回傳,進(jìn)而上報(bào)給Camera Provider。
CamX-CHI架構(gòu)由CamX和CHI兩個(gè)部分組成,CamX負(fù)責(zé)一些基礎(chǔ)服務(wù)代碼的實(shí)現(xiàn),不經(jīng)常改動(dòng),CHI負(fù)責(zé)實(shí)現(xiàn)一些可擴(kuò)展性和定制化的需求,方便OEM/ODM添加自己的擴(kuò)展功能。CamX主要包括實(shí)現(xiàn)HAL3入口的hal模塊,實(shí)現(xiàn)與V4L2驅(qū)動(dòng)交互的csl模塊,實(shí)現(xiàn)硬件node的hwl和實(shí)現(xiàn)軟件node的swl。CHI通過(guò)抽象出Usecase、Feature、Session、Pipeline、Node的概念,使廠商可以通過(guò)實(shí)現(xiàn)Node接口來(lái)接入自己的算法,并通過(guò)XML文件靈活配置Usecase、Pipeline、Node的結(jié)構(gòu)關(guān)系。
Camera Driver
Linux為視頻采集設(shè)備制定了標(biāo)準(zhǔn)的V4L2接口,并在內(nèi)核中實(shí)現(xiàn)了其基礎(chǔ)框架V4L2 Core。用戶空間進(jìn)程可以通過(guò)V4L2接口調(diào)用相關(guān)設(shè)備功能,而不用考慮其實(shí)現(xiàn)細(xì)節(jié)。V4L2提出了總設(shè)備和子設(shè)備的概念,并通過(guò)media controller機(jī)制向用戶空間暴露自己的硬件拓?fù)浣Y(jié)構(gòu)。視頻采集設(shè)備驅(qū)動(dòng)廠商按照V4L2 Core的要求開(kāi)發(fā)自己的驅(qū)動(dòng)程序,只需要實(shí)現(xiàn)相應(yīng)的結(jié)構(gòu)體和函數(shù)接口并調(diào)用注冊(cè)函數(shù)注冊(cè)自己就行。
在高通平臺(tái)上,高通對(duì)相機(jī)驅(qū)動(dòng)部分進(jìn)行了實(shí)現(xiàn),利用了V4L2框架的可擴(kuò)展特性,設(shè)計(jì)出了一套獨(dú)特的KMD框架。在該框架內(nèi)部主要包含了三個(gè)部分,CRM、Camera Sync以及一系列子設(shè)備,首先,作為框架頂層管理者,CRM創(chuàng)建了一個(gè)V4L2主設(shè)備用來(lái)管理所有的子設(shè)備,并且暴露設(shè)備節(jié)點(diǎn)video0給用戶空間,同時(shí)內(nèi)部維護(hù)著整個(gè)底層驅(qū)動(dòng)業(yè)務(wù)邏輯。其次,Camera Sync創(chuàng)建了一個(gè)V4L2主設(shè)備,同時(shí)暴露了設(shè)備節(jié)點(diǎn)video1給用戶空間,主要用于向用戶空間反饋圖像數(shù)據(jù)處理狀態(tài)。最后,子設(shè)備模塊被抽象成v4l2_subdev設(shè)備,同樣也暴露設(shè)備節(jié)點(diǎn)v4l2-subdev給用戶空間進(jìn)行更精細(xì)化的控制。另外,在整個(gè)框架初始化的過(guò)程中,通過(guò)media controller機(jī)制,保持了在用戶空間進(jìn)行枚舉底層硬件設(shè)備的能力。
Camera Hardware
相機(jī)硬件處在整個(gè)相機(jī)體系的最底層,是相機(jī)系統(tǒng)的物理實(shí)現(xiàn)部分,該部分包括鏡頭、感光器、ISP三個(gè)最重要的模塊,還有對(duì)焦馬達(dá)、閃光燈、濾光片、光圈等輔助模塊。鏡頭的作用是匯聚光線,利用光的折射性把射入的光線匯聚到感光器上。感光器的作用是負(fù)責(zé)光電轉(zhuǎn)換,通過(guò)內(nèi)部感光元件將接收到的光信號(hào)轉(zhuǎn)換為電子信號(hào)進(jìn)而通過(guò)數(shù)電轉(zhuǎn)換模塊轉(zhuǎn)為數(shù)字信號(hào),并最后傳給ISP。ISP負(fù)責(zé)對(duì)數(shù)字圖像進(jìn)行一些算法處理,如白平衡、降噪、去馬賽克等。
通過(guò)上面的介紹,我們可以發(fā)現(xiàn),谷歌通過(guò)以上五級(jí)分層,形成了整個(gè)相機(jī)框架體系,其中層與層之間通過(guò)行業(yè)協(xié)會(huì)、開(kāi)源社區(qū)或者谷歌制訂的標(biāo)準(zhǔn)接口進(jìn)行連接,上層通過(guò)調(diào)用標(biāo)準(zhǔn)接口下發(fā)請(qǐng)求到下層,下層負(fù)責(zé)對(duì)標(biāo)準(zhǔn)接口進(jìn)行實(shí)現(xiàn),最終將請(qǐng)求再次封裝并調(diào)用下一層級(jí)的對(duì)外接口下發(fā)到下層。所以總得來(lái)說(shuō),谷歌使用標(biāo)準(zhǔn)接口作為骨架搭建整體框架,而其具體實(shí)現(xiàn)交由各層自己負(fù)責(zé),從整體上來(lái)看,職責(zé)劃分明確,界限分明,這樣的設(shè)計(jì),一來(lái)利用標(biāo)準(zhǔn)接口,保持了整個(gè)框架業(yè)務(wù)正常流轉(zhuǎn),二來(lái)極大地降低了各層耦合度,保持了各層的相互獨(dú)立,最終讓整個(gè)框架處于一個(gè)穩(wěn)定同時(shí)高效的運(yùn)行狀態(tài)。
審核編輯:黃飛
-
Android
+關(guān)注
關(guān)注
12文章
3903瀏覽量
126615 -
Linux
+關(guān)注
關(guān)注
87文章
11123瀏覽量
207908 -
Camera
+關(guān)注
關(guān)注
0文章
78瀏覽量
20706 -
開(kāi)源系統(tǒng)
+關(guān)注
關(guān)注
0文章
24瀏覽量
13651
原文標(biāo)題:深入理解Camera 二 (相機(jī)架構(gòu)概覽)
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論