Camera Android架構(gòu)

Android Camera 基本分層

從上圖得知,Android手機(jī)中Camera軟件主要有大體上有4層:

1.應(yīng)用層:應(yīng)用開發(fā)者調(diào)用AOSP提供的接口即可,AOSP的接口即Android提供的相機(jī)應(yīng)用的通用接口,這些接口將通過Binder與Framework層的相機(jī)服務(wù)進(jìn)行操作與數(shù)據(jù)傳遞;

2.Framework層:位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp ,相機(jī)Framework服務(wù)是承上啟下的作用,上與應(yīng)用交互,下與HAL曾交互。

3.Hal層:硬件抽象層,Android 定義好了Framework服務(wù)與HAL層通信的協(xié)議及接口,HAL層如何實(shí)現(xiàn)有各個(gè)Vendor自己實(shí)現(xiàn),如Qcom的老架構(gòu)mm-Camera,新架構(gòu)Camx架構(gòu),Mtk的P之后的Hal3架構(gòu).

4.Driver層:驅(qū)動(dòng)層,數(shù)據(jù)由硬件到驅(qū)動(dòng)層處理,驅(qū)動(dòng)層接收HAL層數(shù)據(jù)以及傳遞Sensor數(shù)據(jù)給到HAL層,這里當(dāng)然是各個(gè)Sensor芯片不同驅(qū)動(dòng)也不同.

Android要適應(yīng)各個(gè)手機(jī)組裝廠商的不同配置,不同sensor,不管怎么換芯片,從Framework及之上都不需要改變,App也不需要改變就可以在各種配置機(jī)器上順利運(yùn)行,HAL層對上的接口也由Android定義死,各個(gè)平臺(tái)廠商只需要按照接口實(shí)現(xiàn)適合自己平臺(tái)的HAL層即可.

Android Camera工作大體流程

綠色框中是應(yīng)用開發(fā)者需要做的操作,藍(lán)色為AOSP提供的API,黃色為Native Framework Service,紫色為HAL層Service.

描述一下步驟:

1 App一般在MainActivity中使用SurfaceView或者SurfaceTexture+TextureView或者GLSurfaceView等控件作為顯示預(yù)覽界面的控件,共同點(diǎn)都是包含了一個(gè)單獨(dú)的Surface作為取相機(jī)數(shù)據(jù)的容器.

2 在MainActivity onCreate的時(shí)候調(diào)用API 去通知Framework Native Service CameraServer去connect HAL繼而打開Camera硬件sensor.

3 openCamera成功會(huì)有回調(diào)從CameraServer通知到App,在onOpenedCamera或類似回調(diào)中去調(diào)用類似startPreview的操作.此時(shí)會(huì)創(chuàng)建CameraCaptureSession,創(chuàng)建過程中會(huì)向CameraServer調(diào)用ConfigureStream的操作,ConfigureStream的參數(shù)中包含了第一步中空間中的Surface的引用,相當(dāng)于App將Surface容器給到了CameraServer,CameraServer包裝了下該Surface容器為stream,通過HIDL傳遞給HAL,繼而HAL也做configureStream操作

4? ConfigureStream成功后CameraServer會(huì)給App回調(diào)通知ConfigStream成功,接下來App便會(huì)調(diào)用AOSP setRepeatingRequest接口給到CameraServer,CameraServer初始化時(shí)便起來了一個(gè)死循環(huán)線程等待來接收Request.

5 CameraServer將request交到Hal層去處理,得到HAL處理結(jié)果后取出該Request的處理Result中的Buffer填到App給到的容器中,SetRepeatingRequest為了預(yù)覽,則交給Preview的Surface容器,如果是Capture Request則將收到的Buffer交給ImageReader的Surface容器.

6 Surface本質(zhì)上是BufferQueue的使用者和封裝者,當(dāng)CameraServer中App設(shè)置來的Surface容器被填滿了BufferQueue機(jī)制將會(huì)通知到應(yīng)用,此時(shí)App中控件取出各自容器中的內(nèi)容消費(fèi)掉,Preview控件中的Surface中的內(nèi)容將通過View提供到SurfaceFlinger中進(jìn)行合成最終顯示出來,即預(yù)覽;而ImageReader中的Surface被填了,則App將會(huì)取出保存成圖片文件消費(fèi)掉.


如下圖



二. Camera App層簡述

應(yīng)用層即應(yīng)用開發(fā)者關(guān)注的地方,主要就是利用AOSP提供的應(yīng)用可用的組件實(shí)現(xiàn)用戶可見可用的相機(jī)應(yīng)用,主要的接口及要點(diǎn)在這


https://developer.android.google.cn/training/camera相機(jī) ?|? Android 開發(fā)者 ?|? Android Developers

應(yīng)用層開發(fā)者需要做的就是按照AOSP的API規(guī)定提供的接口,打開相機(jī),做基本的相機(jī)參數(shù)的設(shè)置,發(fā)送request指令,將收到的數(shù)據(jù)顯示在應(yīng)用界面或保存到存儲(chǔ)中.

應(yīng)用層開發(fā)者不需要關(guān)注有手機(jī)有幾個(gè)攝像頭他們是什么牌子的,他們是怎么組合的,特定模式下哪個(gè)攝像頭是開或者是關(guān)的,他們利用AOSP提供的接口通過AIDL binder調(diào)用向Framework層的CameraServer進(jìn)程下指令,從CameraServer進(jìn)程中取的數(shù)據(jù).

基本過程都如下:

openCamera:Sensor上電

configureStream: 該步就是將控件如GLSurfaceView,ImageReader等中的Surface容器給到CameraServer.

request: 預(yù)覽使用SetRepeatingRequest,拍一張可以使用Capture,本質(zhì)都是setRequest給到CameraServer

CameraServer將Request的處理結(jié)果Buffer數(shù)據(jù)填到對應(yīng)的Surface容器中,填完后由BufferQueue機(jī)制回調(diào)到引用層對應(yīng)的Surface控件的CallBack處理函數(shù),接下來要顯示預(yù)覽或保圖片App中對應(yīng)的Surface中都有數(shù)據(jù)了.

三. Camera Framework層簡述

Camera Framework層即CameraServer服務(wù)實(shí)現(xiàn).CameraServer是Native Service,代碼在

frameworks/av/services/camera/libcameraservice/

CameraServer承上啟下,上對應(yīng)用提供Aosp的接口服務(wù),下和Hal直接交互.一般而言,CamerServer出現(xiàn)問題的概率極低,大部分還是App層及HAL層出現(xiàn)的問題居多.

CameraServer架構(gòu)主要架構(gòu)也如第一張圖所示,主要還是Android自己的事.

3.1 CameraServer初始化


CameraServer由init啟動(dòng),簡單過程如下:



?App調(diào)用CameraServer的相關(guān)操作


四 Camera Hal3 子系統(tǒng)

Android 官方講解HAL 子系統(tǒng)

Android 的相機(jī)硬件抽象層 (HAL) 可將 android.hardware.camera2 中較高級別的相機(jī)框架 API 連接到底層的相機(jī)驅(qū)動(dòng)程序和硬件。

Android 8.0 引入了 Treble,用于將 CameraHal API 切換到由 HAL 接口描述語言 (HIDL) 定義的穩(wěn)定接口。

盜圖一張:

在這里插入圖片描述

1.應(yīng)用向相機(jī)子系統(tǒng)發(fā)出request,一個(gè)request對應(yīng)一組結(jié)果.request中包含所有配置信息。其中包括分辨率和像素格式;手動(dòng)傳感器、鏡頭和閃光燈控件;3A 操作模式;RAW 到 YUV 處理控件;以及統(tǒng)計(jì)信息的生成等.一次可發(fā)起多個(gè)請求,而且提交請求時(shí)不會(huì)出現(xiàn)阻塞。請求始終按照接收的順序進(jìn)行處理。

2.圖中看到request中攜帶了數(shù)據(jù)容器Surface,交到framework cameraserver中,打包成Camera3OutputStream實(shí)例,在一次CameraCaptureSession中包裝成Hal request交給HAL層處理. Hal層獲取到處理數(shù)據(jù)后返回給CameraServer,即CaptureResult通知到Framework,Framework cameraserver則得到HAL層傳來的數(shù)據(jù)給他放進(jìn)Stream中的容器Surface中.而這些Surface正是來自應(yīng)用層封裝了Surface的控件,這樣App就得到了相機(jī)子系統(tǒng)傳來的數(shù)據(jù).

3.HAL3 基于captureRequest和CaptureResult來實(shí)現(xiàn)事件和數(shù)據(jù)的傳遞,一個(gè)Request會(huì)對應(yīng)一個(gè)Result.

4.當(dāng)然這些是Android原生的HAL3定義,接口放在那,各個(gè)芯片廠商實(shí)現(xiàn)當(dāng)然不一樣,其中接觸的便是高通的mm-camera,camx,聯(lián)發(fā)科的mtkcam hal3,后面繼續(xù)整理實(shí)現(xiàn)過程.

HAL3接口定義在

http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/camera/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容