Camera整體架構簡單整理
一.Android Camera整體架構簡述
自Android8.0之後大多機型採用Camera API2 HAL3架構,
先盜改谷歌的一張圖,讀完整部代碼後再看這張圖,真的是很清晰,很簡潔,很到位.
原圖:https://source.android.google.cn/devices/camera
1.1 Android Camera 基本分層
從上圖得知,Android手機中Camera軟件主要有大體上有4層:
1.應用層: 應用開發者調用AOSP提供的接口即可,AOSP的接口即Android提供的相機應用的通用接口,這些接口將通過Binder與Framework層的相機服務進行操作與數據傳遞;
2.Framework層: 位於 frameworks/av/services/camera/libcameraservice/CameraService.cpp ,相機Framework服務是承上啓下的作用,上與應用交互,下與HAL曾交互。
3.Hal層: 硬件抽象層,Android 定義好了Framework服務與HAL層通信的協議及接口,HAL層如何實現有各個Vendor自己實現,如Qcom的老架構mm-Camera,新架構Camx架構,Mtk的P之後的Hal3架構.
4.Driver層: 驅動層,數據由硬件到驅動層處理,驅動層接收HAL層數據以及傳遞Sensor數據給到HAL層,這裏當然是各個Sensor芯片不同驅動也不同.
說到這爲什麼要分這麼多層,大體上還是爲了分清界限,升級方便, AndroidO Treble架構分析.
Android要適應各個手機組裝廠商的不同配置,不同sensor,不管怎麼換芯片,從Framework及之上都不需要改變,App也不需要改變就可以在各種配置機器上順利運行,HAL層對上的接口也由Android定義死,各個平臺廠商只需要按照接口實現適合自己平臺的HAL層即可.
1.2 Android Camera工作大體流程
綠色框中是應用開發者需要做的操作,藍色爲AOSP提供的API,黃色爲Native Framework Service,紫色爲HAL層Service.
描述一下步驟:
1 App一般在MainActivity中使用SurfaceView或者SurfaceTexture+TextureView或者GLSurfaceView等控件作爲顯示預覽界面的控件,共同點都是包含了一個單獨的Surface作爲取相機數據的容器.
2 在MainActivity onCreate的時候調用API 去通知Framework Native Service CameraServer去connect HAL繼而打開Camera硬件sensor.
3 openCamera成功會有回調從CameraServer通知到App,在onOpenedCamera或類似回調中去調用類似startPreview的操作.此時會創建CameraCaptureSession,創建過程中會向CameraServer調用ConfigureStream的操作,ConfigureStream的參數中包含了第一步中空間中的Surface的引用,相當於App將Surface容器給到了CameraServer,CameraServer包裝了下該Surface容器爲stream,通過HIDL傳遞給HAL,繼而HAL也做configureStream操作
4 ConfigureStream成功後CameraServer會給App回調通知ConfigStream成功,接下來App便會調用AOSP setRepeatingRequest接口給到CameraServer,CameraServer初始化時便起來了一個死循環線程等待來接收Request.
5 CameraServer將request交到Hal層去處理,得到HAL處理結果後取出該Request的處理Result中的Buffer填到App給到的容器中,SetRepeatingRequest爲了預覽,則交給Preview的Surface容器,如果是Capture Request則將收到的Buffer交給ImageReader的Surface容器.
6 Surface本質上是BufferQueue的使用者和封裝者,當CameraServer中App設置來的Surface容器被填滿了BufferQueue機制將會通知到應用,此時App中控件取出各自容器中的內容消費掉,Preview控件中的Surface中的內容將通過View提供到SurfaceFlinger中進行合成最終顯示出來,即預覽;而ImageReader中的Surface被填了,則App將會取出保存成圖片文件消費掉.參考
7 錄製視頻可以參考該篇,這裏不再贅述:[Android][MediaRecorder] Android MediaRecorder框架簡潔梳理
再簡單一張圖如下:
二. Camera App層簡述
應用層即應用開發者關注的地方,主要就是利用AOSP提供的應用可用的組件實現用戶可見可用的相機應用,主要的接口及要點在這
Android 開發者/文檔/指南/相機
應用層開發者需要做的就是按照AOSP的API規定提供的接口,打開相機,做基本的相機參數的設置,發送request指令,將收到的數據顯示在應用界面或保存到存儲中.
應用層開發者不需要關注有手機有幾個攝像頭他們是什麼牌子的,他們是怎麼組合的,特定模式下哪個攝像頭是開或者是關的,他們利用AOSP提供的接口通過AIDL binder調用向Framework層的CameraServer進程下指令,從CameraServer進程中取的數據.
基本過程都如下:
- openCamera:Sensor上電
- configureStream: 該步就是將控件如GLSurfaceView,ImageReader等中的Surface容器給到CameraServer.
- request: 預覽使用SetRepeatingRequest,拍一張可以使用Capture,本質都是setRequest給到CameraServer
- CameraServer將Request的處理結果Buffer數據填到對應的Surface容器中,填完後由BufferQueue機制回調到引用層對應的Surface控件的CallBack處理函數,接下來要顯示預覽或保圖片App中對應的Surface中都有數據了.
主要一個預覽控件和拍照保存控件,視頻錄製見[Android][MediaRecorder] Android MediaRecorder框架簡潔梳理
三. Camera Framework層簡述
Camera Framework層即CameraServer服務實現.CameraServer是Native Service,代碼在
frameworks/av/services/camera/libcameraservice/
CameraServer承上啓下,上對應用提供Aosp的接口服務,下和Hal直接交互.一般而言,CamerServer出現問題的概率極低,大部分還是App層及HAL層出現的問題居多.
CameraServer架構主要架構也如第一張圖所示,主要還是Android自己的事.
3.1 CameraServer初始化
frameworks/av/camera/cameraserver/cameraserver.rc
service cameraserver /system/bin/cameraserver
class main
user cameraserver
group audio camera input drmrpc
ioprio rt 4
writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
rlimit rtprio 10 10
CameraServer由init啓動,簡單過程如下:
詳細過程如下:
3.2 App調用CameraServer的相關操作
簡單過程如下:
詳細過程如下:
3.2.1 open Camera:
3.2.2 configurestream
3.2.3 preview and capture request:
3.2.4 flush and close
四 Camera Hal3 子系統
Android 官方講解 HAL 子系統
Android 的相機硬件抽象層 (HAL) 可將 android.hardware.camera2 中較高級別的相機框架 API 連接到底層的相機驅動程序和硬件。
Android 8.0 引入了 Treble,用於將 CameraHal API 切換到由 HAL 接口描述語言 (HIDL) 定義的穩定接口。
盜圖一張:
1.應用向相機子系統發出request,一個request對應一組結果.request中包含所有配置信息。其中包括分辨率和像素格式;手動傳感器、鏡頭和閃光燈控件;3A 操作模式;RAW 到 YUV 處理控件;以及統計信息的生成等.一次可發起多個請求,而且提交請求時不會出現阻塞。請求始終按照接收的順序進行處理。
2.圖中看到request中攜帶了數據容器Surface,交到framework cameraserver中,打包成Camera3OutputStream實例,在一次CameraCaptureSession中包裝成Hal request交給HAL層處理. Hal層獲取到處理數據後返回給CameraServer,即CaptureResult通知到Framework,Framework cameraserver則得到HAL層傳來的數據給他放進Stream中的容器Surface中.而這些Surface正是來自應用層封裝了Surface的控件,這樣App就得到了相機子系統傳來的數據.
3.HAL3 基於captureRequest和CaptureResult來實現事件和數據的傳遞,一個Request會對應一個Result.
4.當然這些是Android原生的HAL3定義,接口放在那,各個芯片廠商實現當然不一樣,其中接觸的便是高通的mm-camera,camx,聯發科的mtkcam hal3,後面繼續整理實現過程.
HAL3接口定義在
http://androidxref.com/9.0.0_r3/xref/hardware/interfaces/camera/
五. 下面需要梳理的重點-正在進行
- Camera App和Framework代碼暫且梳理到這裏,下面HAL層將分爲Qcom和Mtk分別進行代碼梳理與架構總結
- Android相機中事件驅動(request)與數據(Buffer)傳遞,Buffer管理等
- 相機底層相關模塊,如ISP,IPE,JPEG等
- Android Camera開發的debug方法