Android Camera 基本分層

從上圖得知,Android手機中Camera軟件主要有大體上有4層:
1.應(yīng)用層:應(yīng)用開發(fā)者調(diào)用AOSP提供的接口即可,AOSP的接口即Android提供的相機應(yīng)用的通用接口,這些接口將通過Binder與Framework層的相機服務(wù)進行操作與數(shù)據(jù)傳遞;
2.Framework層:位于 frameworks/av/services/camera/libcameraservice/CameraService.cpp ,相機Framework服務(wù)是承上啟下的作用,上與應(yīng)用交互,下與HAL曾交互。
3.Hal層:硬件抽象層,Android 定義好了Framework服務(wù)與HAL層通信的協(xié)議及接口,HAL層如何實現(xiàn)有各個Vendor自己實現(xiàn),如Qcom的老架構(gòu)mm-Camera,新架構(gòu)Camx架構(gòu),Mtk的P之后的Hal3架構(gòu).
4.Driver層:驅(qū)動層,數(shù)據(jù)由硬件到驅(qū)動層處理,驅(qū)動層接收HAL層數(shù)據(jù)以及傳遞Sensor數(shù)據(jù)給到HAL層,這里當然是各個Sensor芯片不同驅(qū)動也不同.
Android要適應(yīng)各個手機組裝廠商的不同配置,不同sensor,不管怎么換芯片,從Framework及之上都不需要改變,App也不需要改變就可以在各種配置機器上順利運行,HAL層對上的接口也由Android定義死,各個平臺廠商只需要按照接口實現(xiàn)適合自己平臺的HAL層即可.
Android Camera工作大體流程

綠色框中是應(yīng)用開發(fā)者需要做的操作,藍色為AOSP提供的API,黃色為Native Framework Service,紫色為HAL層Service.
描述一下步驟:
1 App一般在MainActivity中使用SurfaceView或者SurfaceTexture+TextureView或者GLSurfaceView等控件作為顯示預(yù)覽界面的控件,共同點都是包含了一個單獨的Surface作為取相機數(shù)據(jù)的容器.
2 在MainActivity onCreate的時候調(diào)用API 去通知Framework Native Service CameraServer去connect HAL繼而打開Camera硬件sensor.
3 openCamera成功會有回調(diào)從CameraServer通知到App,在onOpenedCamera或類似回調(diào)中去調(diào)用類似startPreview的操作.此時會創(chuàng)建CameraCaptureSession,創(chuàng)建過程中會向CameraServer調(diào)用ConfigureStream的操作,ConfigureStream的參數(shù)中包含了第一步中空間中的Surface的引用,相當于App將Surface容器給到了CameraServer,CameraServer包裝了下該Surface容器為stream,通過HIDL傳遞給HAL,繼而HAL也做configureStream操作
4? ConfigureStream成功后CameraServer會給App回調(diào)通知ConfigStream成功,接下來App便會調(diào)用AOSP setRepeatingRequest接口給到CameraServer,CameraServer初始化時便起來了一個死循環(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的使用者和封裝者,當CameraServer中App設(shè)置來的Surface容器被填滿了BufferQueue機制將會通知到應(yīng)用,此時App中控件取出各自容器中的內(nèi)容消費掉,Preview控件中的Surface中的內(nèi)容將通過View提供到SurfaceFlinger中進行合成最終顯示出來,即預(yù)覽;而ImageReader中的Surface被填了,則App將會取出保存成圖片文件消費掉.
如下圖

二. Camera App層簡述
應(yīng)用層即應(yīng)用開發(fā)者關(guān)注的地方,主要就是利用AOSP提供的應(yīng)用可用的組件實現(xiàn)用戶可見可用的相機應(yīng)用,主要的接口及要點在這
https://developer.android.google.cn/training/camera相機 ?|? Android 開發(fā)者 ?|? Android Developers
應(yīng)用層開發(fā)者需要做的就是按照AOSP的API規(guī)定提供的接口,打開相機,做基本的相機參數(shù)的設(shè)置,發(fā)送request指令,將收到的數(shù)據(jù)顯示在應(yīng)用界面或保存到存儲中.
應(yīng)用層開發(fā)者不需要關(guān)注有手機有幾個攝像頭他們是什么牌子的,他們是怎么組合的,特定模式下哪個攝像頭是開或者是關(guān)的,他們利用AOSP提供的接口通過AIDL binder調(diào)用向Framework層的CameraServer進程下指令,從CameraServer進程中取的數(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機制回調(diào)到引用層對應(yīng)的Surface控件的CallBack處理函數(shù),接下來要顯示預(yù)覽或保圖片App中對應(yīng)的Surface中都有數(shù)據(jù)了.
三. Camera Framework層簡述
Camera Framework層即CameraServer服務(wù)實現(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啟動,簡單過程如下:

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

四 Camera Hal3 子系統(tǒng)
Android 官方講解HAL 子系統(tǒng)
Android 的相機硬件抽象層 (HAL) 可將 android.hardware.camera2 中較高級別的相機框架 API 連接到底層的相機驅(qū)動程序和硬件。
Android 8.0 引入了 Treble,用于將 CameraHal API 切換到由 HAL 接口描述語言 (HIDL) 定義的穩(wěn)定接口。
盜圖一張:
在這里插入圖片描述
1.應(yīng)用向相機子系統(tǒng)發(fā)出request,一個request對應(yīng)一組結(jié)果.request中包含所有配置信息。其中包括分辨率和像素格式;手動傳感器、鏡頭和閃光燈控件;3A 操作模式;RAW 到 YUV 處理控件;以及統(tǒng)計信息的生成等.一次可發(fā)起多個請求,而且提交請求時不會出現(xiàn)阻塞。請求始終按照接收的順序進行處理。
2.圖中看到request中攜帶了數(shù)據(jù)容器Surface,交到framework cameraserver中,打包成Camera3OutputStream實例,在一次CameraCaptureSession中包裝成Hal request交給HAL層處理. Hal層獲取到處理數(shù)據(jù)后返回給CameraServer,即CaptureResult通知到Framework,Framework cameraserver則得到HAL層傳來的數(shù)據(jù)給他放進Stream中的容器Surface中.而這些Surface正是來自應(yīng)用層封裝了Surface的控件,這樣App就得到了相機子系統(tǒng)傳來的數(shù)據(jù).
3.HAL3 基于captureRequest和CaptureResult來實現(xiàn)事件和數(shù)據(jù)的傳遞,一個Request會對應(yīng)一個Result.
4.當然這些是Android原生的HAL3定義,接口放在那,各個芯片廠商實現(xiàn)當然不一樣,其中接觸的便是高通的mm-camera,camx,聯(lián)發(fā)科的mtkcam hal3,后面繼續(xù)整理實現(xiàn)過程.
HAL3接口定義在
http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/camera/